class members refactoring refactoring
[fedora-idea.git] / refactoring / impl / com / intellij / refactoring / removemiddleman / RemoveMiddlemanDialog.java
blob58ac93a2c4570c6e41346b4669cb5af2915523a0
1 package com.intellij.refactoring.removemiddleman;
3 import com.intellij.openapi.help.HelpManager;
4 import com.intellij.psi.PsiField;
5 import com.intellij.psi.PsiMember;
6 import com.intellij.psi.PsiMethod;
7 import com.intellij.psi.PsiSubstitutor;
8 import com.intellij.psi.util.PsiFormatUtil;
9 import com.intellij.refactoring.HelpID;
10 import com.intellij.refactoring.RefactorJBundle;
11 import com.intellij.refactoring.classMembers.DelegatingMemberInfoModel;
12 import com.intellij.refactoring.ui.MemberSelectionPanel;
13 import com.intellij.refactoring.ui.MemberSelectionTable;
14 import com.intellij.refactoring.ui.RefactoringDialog;
15 import com.intellij.refactoring.util.classMembers.MemberInfo;
16 import org.jetbrains.annotations.NotNull;
18 import javax.swing.*;
19 import java.awt.*;
20 import java.util.Arrays;
21 import java.util.List;
23 @SuppressWarnings({"OverridableMethodCallInConstructor"})
24 public class RemoveMiddlemanDialog extends RefactoringDialog {
26 private final JTextField fieldNameLabel;
28 private final List<MemberInfo> delegateMethods;
30 private final PsiField myField;
33 RemoveMiddlemanDialog(PsiField field, MemberInfo[] delegateMethods) {
34 super(field.getProject(), true);
35 myField = field;
36 this.delegateMethods = Arrays.asList(delegateMethods);
37 fieldNameLabel = new JTextField();
38 fieldNameLabel.setText(
39 PsiFormatUtil.formatVariable(myField, PsiFormatUtil.SHOW_TYPE | PsiFormatUtil.SHOW_NAME, PsiSubstitutor.EMPTY));
40 setTitle(RefactorJBundle.message("remove.middleman.title"));
41 init();
44 protected String getDimensionServiceKey() {
45 return "RefactorJ.RemoveMiddleman";
49 protected JComponent createCenterPanel() {
50 final JPanel panel = new JPanel(new BorderLayout());
51 panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0));
52 final MemberSelectionPanel selectionPanel = new MemberSelectionPanel("Methods to inline", delegateMethods, "Delete");
53 final MemberSelectionTable table = selectionPanel.getTable();
54 table.setMemberInfoModel(new DelegatingMemberInfoModel<PsiMember, MemberInfo>(table.getMemberInfoModel()) {
55 @Override
56 public int checkForProblems(@NotNull final MemberInfo member) {
57 return hasSuperMethods(member) ? ERROR : OK;
60 @Override
61 public String getTooltipText(final MemberInfo member) {
62 if (hasSuperMethods(member)) return "Deletion will break type hierarchy";
63 return super.getTooltipText(member);
66 private boolean hasSuperMethods(final MemberInfo member) {
67 if (member.isChecked() && member.isToAbstract()) {
68 final PsiMember psiMember = member.getMember();
69 if (psiMember instanceof PsiMethod && ((PsiMethod)psiMember).findDeepestSuperMethods().length > 0) {
70 return true;
73 return false;
75 });
76 panel.add(selectionPanel, BorderLayout.CENTER);
77 return panel;
80 protected JComponent createNorthPanel() {
81 fieldNameLabel.setEditable(false);
82 final JPanel sourceClassPanel = new JPanel(new BorderLayout());
83 sourceClassPanel.add(new JLabel("Delegating field"), BorderLayout.NORTH);
84 sourceClassPanel.add(fieldNameLabel, BorderLayout.CENTER);
85 return sourceClassPanel;
88 protected void doHelpAction() {
89 HelpManager.getInstance().invokeHelp(HelpID.RemoveMiddleman);
92 protected void doAction() {
93 invokeRefactoring(new RemoveMiddlemanProcessor(myField, delegateMethods));