2 * Created by IntelliJ IDEA.
6 * To change template for new class use
7 * Code Style | Class Templates options (Tools | IDE Options).
9 package com
.intellij
.refactoring
.memberPullUp
;
11 import com
.intellij
.openapi
.help
.HelpManager
;
12 import com
.intellij
.openapi
.project
.Project
;
13 import com
.intellij
.openapi
.ui
.DialogWrapper
;
14 import com
.intellij
.psi
.*;
15 import com
.intellij
.refactoring
.HelpID
;
16 import com
.intellij
.refactoring
.RefactoringBundle
;
17 import com
.intellij
.refactoring
.JavaRefactoringSettings
;
18 import com
.intellij
.refactoring
.ui
.ClassCellRenderer
;
19 import com
.intellij
.refactoring
.ui
.MemberSelectionPanel
;
20 import com
.intellij
.refactoring
.util
.RefactoringHierarchyUtil
;
21 import com
.intellij
.refactoring
.util
.classMembers
.*;
22 import com
.intellij
.ui
.IdeBorderFactory
;
23 import com
.intellij
.usageView
.UsageViewUtil
;
24 import org
.jetbrains
.annotations
.NotNull
;
28 import java
.awt
.event
.ItemEvent
;
29 import java
.awt
.event
.ItemListener
;
30 import java
.util
.ArrayList
;
31 import java
.util
.List
;
33 public class PullUpDialog
extends DialogWrapper
{
34 private final Callback myCallback
;
35 private MemberSelectionPanel myMemberSelectionPanel
;
36 private MyMemberInfoModel myMemberInfoModel
;
37 private final PsiClass myClass
;
38 private final List
<PsiClass
> mySuperClasses
;
39 private final MemberInfoStorage myMemberInfoStorage
;
40 private MemberInfo
[] myMemberInfos
;
41 private JavaDocPanel myJavaDocPanel
;
43 private JComboBox myClassCombo
;
45 public static interface Callback
{
46 boolean checkConflicts(PullUpDialog dialog
);
50 public PullUpDialog(Project project
, PsiClass aClass
, List
<PsiClass
> superClasses
,
51 MemberInfoStorage memberInfoStorage
, Callback callback
) {
54 mySuperClasses
= superClasses
;
55 myMemberInfoStorage
= memberInfoStorage
;
56 myMemberInfos
= myMemberInfoStorage
.getClassMemberInfos(aClass
).toArray(new MemberInfo
[0]);
57 myCallback
= callback
;
59 setTitle(JavaPullUpHandler
.REFACTORING_NAME
);
64 public PsiClass
getSuperClass() {
65 if (myClassCombo
!= null) {
66 return (PsiClass
) myClassCombo
.getSelectedItem();
73 public int getJavaDocPolicy() {
74 return myJavaDocPanel
.getPolicy();
77 public MemberInfo
[] getSelectedMemberInfos() {
78 ArrayList
<MemberInfo
> list
= new ArrayList
<MemberInfo
>(myMemberInfos
.length
);
79 for (MemberInfo info
: myMemberInfos
) {
80 if (info
.isChecked() && myMemberInfoModel
.isMemberEnabled(info
)) {
84 return list
.toArray(new MemberInfo
[list
.size()]);
87 protected String
getDimensionServiceKey() {
88 return "#com.intellij.refactoring.memberPullUp.PullUpDialog";
91 InterfaceContainmentVerifier
getContainmentVerifier() {
92 return myInterfaceContainmentVerifier
;
95 protected JComponent
createNorthPanel() {
96 JPanel panel
= new JPanel();
98 panel
.setBorder(IdeBorderFactory
.createBorder());
100 panel
.setLayout(new GridBagLayout());
101 GridBagConstraints gbConstraints
= new GridBagConstraints();
103 gbConstraints
.insets
= new Insets(4, 8, 4, 8);
104 gbConstraints
.weighty
= 1;
105 gbConstraints
.weightx
= 1;
106 gbConstraints
.gridy
= 0;
107 gbConstraints
.gridwidth
= GridBagConstraints
.REMAINDER
;
108 gbConstraints
.fill
= GridBagConstraints
.BOTH
;
109 gbConstraints
.anchor
= GridBagConstraints
.WEST
;
110 final JLabel classComboLabel
= new JLabel();
111 panel
.add(classComboLabel
, gbConstraints
);
113 myClassCombo
= new JComboBox(mySuperClasses
.toArray());
114 myClassCombo
.setRenderer(new ClassCellRenderer());
115 classComboLabel
.setText(RefactoringBundle
.message("pull.up.members.to", UsageViewUtil
.getLongName(myClass
)));
116 classComboLabel
.setLabelFor(myClassCombo
);
117 // myClassCombo.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
119 PsiClass nearestBase
= RefactoringHierarchyUtil
.getNearestBaseClass(myClass
, false);
120 int indexToSelect
= 0;
121 if (nearestBase
!= null) {
122 indexToSelect
= mySuperClasses
.indexOf(nearestBase
);
124 myClassCombo
.setSelectedIndex(indexToSelect
);
125 myClassCombo
.addItemListener(new ItemListener() {
126 public void itemStateChanged(ItemEvent e
) {
127 if (e
.getStateChange() == ItemEvent
.SELECTED
) {
129 if (myMemberSelectionPanel
!= null) {
130 myMemberInfoModel
.setSuperClass(getSuperClass());
131 myMemberSelectionPanel
.getTable().setMemberInfos(myMemberInfos
);
132 myMemberSelectionPanel
.getTable().fireExternalDataChange();
137 gbConstraints
.gridy
++;
138 panel
.add(myClassCombo
, gbConstraints
);
143 protected void doHelpAction() {
144 HelpManager
.getInstance().invokeHelp(HelpID
.MEMBERS_PULL_UP
);
147 private void updateMemberInfo() {
148 final PsiClass targetClass
= (PsiClass
) myClassCombo
.getSelectedItem();
149 myMemberInfos
= myMemberInfoStorage
.getMemberInfosList(targetClass
);
150 /*Set duplicated = myMemberInfoStorage.getDuplicatedMemberInfos(targetClass);
151 for (Iterator iterator = duplicated.getSectionsIterator(); getSectionsIterator.hasNext();) {
152 ((MemberInfo) iterator.next()).setChecked(false);
156 protected void doOKAction() {
157 if (!myCallback
.checkConflicts(this)) return;
158 JavaRefactoringSettings
.getInstance().PULL_UP_MEMBERS_JAVADOC
= myJavaDocPanel
.getPolicy();
162 protected JComponent
createCenterPanel() {
163 JPanel panel
= new JPanel(new BorderLayout());
164 myMemberSelectionPanel
= new MemberSelectionPanel(RefactoringBundle
.message("members.to.be.pulled.up"), myMemberInfos
, RefactoringBundle
.message("make.abstract"));
165 myMemberInfoModel
= new MyMemberInfoModel();
166 myMemberInfoModel
.memberInfoChanged(new MemberInfoChange(myMemberInfos
));
167 myMemberSelectionPanel
.getTable().setMemberInfoModel(myMemberInfoModel
);
168 myMemberSelectionPanel
.getTable().addMemberInfoChangeListener(myMemberInfoModel
);
169 panel
.add(myMemberSelectionPanel
, BorderLayout
.CENTER
);
171 myJavaDocPanel
= new JavaDocPanel(RefactoringBundle
.message("javadoc.for.abstracts"));
172 myJavaDocPanel
.setPolicy(JavaRefactoringSettings
.getInstance().PULL_UP_MEMBERS_JAVADOC
);
173 panel
.add(myJavaDocPanel
, BorderLayout
.EAST
);
176 private final InterfaceContainmentVerifier myInterfaceContainmentVerifier
=
177 new InterfaceContainmentVerifier() {
178 public boolean checkedInterfacesContain(PsiMethod psiMethod
) {
179 return PullUpHelper
.checkedInterfacesContain(myMemberInfos
, psiMethod
);
183 private class MyMemberInfoModel
extends UsesAndInterfacesDependencyMemberInfoModel
{
184 public MyMemberInfoModel() {
185 super(myClass
, getSuperClass(), false, myInterfaceContainmentVerifier
);
189 public boolean isMemberEnabled(MemberInfo member
) {
190 PsiClass currentSuperClass
= getSuperClass();
191 if(currentSuperClass
== null) return true;
192 if (myMemberInfoStorage
.getDuplicatedMemberInfos(currentSuperClass
).contains(member
)) return false;
193 if (myMemberInfoStorage
.getExtending(currentSuperClass
).contains(member
.getMember())) return false;
194 if (!currentSuperClass
.isInterface()) return true;
196 PsiElement element
= member
.getMember();
197 if (element
instanceof PsiClass
&& ((PsiClass
) element
).isInterface()) return true;
198 if (element
instanceof PsiField
) {
199 return ((PsiModifierListOwner
) element
).hasModifierProperty(PsiModifier
.STATIC
);
201 if (element
instanceof PsiMethod
) {
202 return !((PsiModifierListOwner
) element
).hasModifierProperty(PsiModifier
.STATIC
);
207 public boolean isAbstractEnabled(MemberInfo member
) {
208 PsiClass currentSuperClass
= getSuperClass();
209 if (currentSuperClass
== null || !currentSuperClass
.isInterface()) return true;
213 public boolean isAbstractWhenDisabled(MemberInfo member
) {
214 PsiClass currentSuperClass
= getSuperClass();
215 if(currentSuperClass
== null) return false;
216 if (currentSuperClass
.isInterface()) {
217 if (member
.getMember() instanceof PsiMethod
) {
224 public int checkForProblems(@NotNull MemberInfo member
) {
225 if (member
.isChecked()) return OK
;
226 PsiClass currentSuperClass
= getSuperClass();
228 if (currentSuperClass
!= null && currentSuperClass
.isInterface()) {
229 PsiElement element
= member
.getMember();
230 if (element
instanceof PsiModifierListOwner
) {
231 if (((PsiModifierListOwner
) element
).hasModifierProperty(PsiModifier
.STATIC
)) {
232 return super.checkForProblems(member
);
238 return super.checkForProblems(member
);
242 public Boolean
isFixedAbstract(MemberInfo member
) {