class members refactoring refactoring
[fedora-idea.git] / refactoring / impl / com / intellij / refactoring / memberPushDown / JavaPushDownHandler.java
blob30abf62cdbfadd931290524963d804caf8ff3d47
1 package com.intellij.refactoring.memberPushDown;
3 import com.intellij.openapi.actionSystem.DataContext;
4 import com.intellij.openapi.editor.Editor;
5 import com.intellij.openapi.editor.ScrollType;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.psi.*;
8 import com.intellij.psi.impl.source.jsp.jspJava.JspClass;
9 import com.intellij.refactoring.HelpID;
10 import com.intellij.refactoring.RefactoringActionHandler;
11 import com.intellij.refactoring.RefactoringBundle;
12 import com.intellij.refactoring.classMembers.MemberInfoBase;
13 import com.intellij.refactoring.lang.ElementsHandler;
14 import com.intellij.refactoring.util.CommonRefactoringUtil;
15 import com.intellij.refactoring.util.RefactoringMessageUtil;
16 import com.intellij.refactoring.util.classMembers.MemberInfo;
17 import com.intellij.refactoring.util.classMembers.MemberInfoStorage;
18 import org.jetbrains.annotations.NotNull;
20 import java.util.List;
22 /**
23 * @author dsl
25 public class JavaPushDownHandler implements RefactoringActionHandler, ElementsHandler {
26 public static final String REFACTORING_NAME = RefactoringBundle.message("push.members.down.title");
28 public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
29 int offset = editor.getCaretModel().getOffset();
30 editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
31 PsiElement element = file.findElementAt(offset);
33 while (true) {
34 if (element == null || element instanceof PsiFile) {
35 String message = RefactoringBundle.getCannotRefactorMessage(
36 RefactoringBundle.message("the.caret.should.be.positioned.inside.a.class.to.push.members.from"));
37 CommonRefactoringUtil.showErrorHint(project, editor, message, REFACTORING_NAME, HelpID.MEMBERS_PUSH_DOWN);
38 return;
41 if (element instanceof PsiClass || element instanceof PsiField || element instanceof PsiMethod) {
42 if (element instanceof JspClass) {
43 RefactoringMessageUtil.showNotSupportedForJspClassesError(project, editor, REFACTORING_NAME, HelpID.MEMBERS_PUSH_DOWN);
44 return;
46 invoke(project, new PsiElement[]{element}, dataContext);
47 return;
49 element = element.getParent();
53 public void invoke(@NotNull final Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
54 if (elements.length != 1) return;
56 PsiElement element = elements[0];
57 PsiClass aClass;
58 PsiElement aMember = null;
60 if (element instanceof PsiClass) {
61 aClass = (PsiClass) element;
62 } else if (element instanceof PsiMethod) {
63 aClass = ((PsiMethod) element).getContainingClass();
64 aMember = element;
65 } else if (element instanceof PsiField) {
66 aClass = ((PsiField) element).getContainingClass();
67 aMember = element;
68 } else
69 return;
71 if (!CommonRefactoringUtil.checkReadOnlyStatus(project, aClass)) return;
72 MemberInfoStorage memberInfoStorage = new MemberInfoStorage(aClass, new MemberInfo.Filter<PsiMember>() {
73 public boolean includeMember(PsiMember element) {
74 return true;
76 });
77 List<MemberInfo> members = memberInfoStorage.getClassMemberInfos(aClass);
78 PsiManager manager = aClass.getManager();
80 for (MemberInfoBase<PsiMember> member : members) {
81 if (manager.areElementsEquivalent(member.getMember(), aMember)) {
82 member.setChecked(true);
83 break;
86 PushDownDialog dialog = new PushDownDialog(
87 project,
88 members.toArray(new MemberInfo[members.size()]),
89 aClass);
90 dialog.show();
93 public boolean isEnabledOnElements(PsiElement[] elements) {
95 if (elements.length == 1) {
96 return elements[0] instanceof PsiClass || elements[0] instanceof PsiField || elements[0] instanceof PsiMethod;
98 else if (elements.length > 1){
99 for (int idx = 0; idx < elements.length; idx++) {
100 PsiElement element = elements[idx];
101 if (!(element instanceof PsiField || element instanceof PsiMethod)) return false;
103 return true;
105 return false;
107 // todo: multiple selection etc
108 return elements.length == 1 && elements[0] instanceof PsiClass;