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
;
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
);
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
);
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
);
46 invoke(project
, new PsiElement
[]{element
}, dataContext
);
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];
58 PsiElement aMember
= null;
60 if (element
instanceof PsiClass
) {
61 aClass
= (PsiClass
) element
;
62 } else if (element
instanceof PsiMethod
) {
63 aClass
= ((PsiMethod
) element
).getContainingClass();
65 } else if (element
instanceof PsiField
) {
66 aClass
= ((PsiField
) element
).getContainingClass();
71 if (!CommonRefactoringUtil
.checkReadOnlyStatus(project
, aClass
)) return;
72 MemberInfoStorage memberInfoStorage
= new MemberInfoStorage(aClass
, new MemberInfo
.Filter
<PsiMember
>() {
73 public boolean includeMember(PsiMember element
) {
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);
86 PushDownDialog dialog
= new PushDownDialog(
88 members
.toArray(new MemberInfo
[members
.size()]),
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;
107 // todo: multiple selection etc
108 return elements
.length
== 1 && elements
[0] instanceof PsiClass
;