mock filetype manager if no application allows running lexer suites.
[fedora-idea.git] / refactoring / impl / com / intellij / refactoring / memberPushDown / PushDownHandler.java
blob99ef3489e38ecd00a184053d2d66d26da3b65394
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.util.CommonRefactoringUtil;
13 import com.intellij.refactoring.util.RefactoringMessageUtil;
14 import com.intellij.refactoring.util.classMembers.MemberInfo;
15 import com.intellij.refactoring.util.classMembers.MemberInfoStorage;
16 import org.jetbrains.annotations.NotNull;
18 import java.util.List;
20 /**
21 * @author dsl
23 public class PushDownHandler implements RefactoringActionHandler {
24 public static final String REFACTORING_NAME = RefactoringBundle.message("push.members.down.title");
26 public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
27 int offset = editor.getCaretModel().getOffset();
28 editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
29 PsiElement element = file.findElementAt(offset);
31 while (true) {
32 if (element == null || element instanceof PsiFile) {
33 String message = RefactoringBundle.getCannotRefactorMessage(
34 RefactoringBundle.message("the.caret.should.be.positioned.inside.a.class.to.push.members.from"));
35 CommonRefactoringUtil.showErrorHint(project, editor, message, REFACTORING_NAME, HelpID.MEMBERS_PUSH_DOWN);
36 return;
39 if (element instanceof PsiClass || element instanceof PsiField || element instanceof PsiMethod) {
40 if (element instanceof JspClass) {
41 RefactoringMessageUtil.showNotSupportedForJspClassesError(project, editor, REFACTORING_NAME, HelpID.MEMBERS_PUSH_DOWN);
42 return;
44 invoke(project, new PsiElement[]{element}, dataContext);
45 return;
47 element = element.getParent();
51 public void invoke(@NotNull final Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
52 if (elements.length != 1) return;
54 PsiElement element = elements[0];
55 PsiClass aClass;
56 PsiElement aMember = null;
58 if (element instanceof PsiClass) {
59 aClass = (PsiClass) element;
60 } else if (element instanceof PsiMethod) {
61 aClass = ((PsiMethod) element).getContainingClass();
62 aMember = element;
63 } else if (element instanceof PsiField) {
64 aClass = ((PsiField) element).getContainingClass();
65 aMember = element;
66 } else
67 return;
69 if (!CommonRefactoringUtil.checkReadOnlyStatus(project, aClass)) return;
70 MemberInfoStorage memberInfoStorage = new MemberInfoStorage(aClass, new MemberInfo.Filter() {
71 public boolean includeMember(PsiMember element) {
72 return true;
74 });
75 List<MemberInfo> members = memberInfoStorage.getClassMemberInfos(aClass);
76 PsiManager manager = aClass.getManager();
78 for (MemberInfo member : members) {
79 if (manager.areElementsEquivalent(member.getMember(), aMember)) {
80 member.setChecked(true);
81 break;
84 PushDownDialog dialog = new PushDownDialog(
85 project,
86 members.toArray(new MemberInfo[members.size()]),
87 aClass);
88 dialog.show();