extensibility for Pull Up and Push Down
[fedora-idea.git] / refactoring / impl / com / intellij / refactoring / memberPullUp / PullUpDialog.java
blob97ec60bbf1505724eea55fbea5ed5cbe2af3f59e
1 /*
2 * Created by IntelliJ IDEA.
3 * User: dsl
4 * Date: 18.06.2002
5 * Time: 13:16:29
6 * To change template for new class use
7 * Code Style | Class Templates options (Tools | IDE Options).
8 */
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;
26 import javax.swing.*;
27 import java.awt.*;
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) {
52 super(project, true);
53 myClass = aClass;
54 mySuperClasses = superClasses;
55 myMemberInfoStorage = memberInfoStorage;
56 myMemberInfos = myMemberInfoStorage.getClassMemberInfos(aClass).toArray(new MemberInfo[0]);
57 myCallback = callback;
59 setTitle(JavaPullUpHandler.REFACTORING_NAME);
61 init();
64 public PsiClass getSuperClass() {
65 if (myClassCombo != null) {
66 return (PsiClass) myClassCombo.getSelectedItem();
68 else {
69 return null;
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)) {
81 list.add(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) {
128 updateMemberInfo();
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);
140 return panel;
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();
159 close(OK_EXIT_CODE);
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);
174 return panel;
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);
204 return true;
207 public boolean isAbstractEnabled(MemberInfo member) {
208 PsiClass currentSuperClass = getSuperClass();
209 if (currentSuperClass == null || !currentSuperClass.isInterface()) return true;
210 return false;
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) {
218 return true;
221 return false;
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);
235 return OK;
237 else {
238 return super.checkForProblems(member);
242 public Boolean isFixedAbstract(MemberInfo member) {
243 return Boolean.TRUE;