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
;
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);
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"));
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()) {
56 public int checkForProblems(@NotNull final MemberInfo member
) {
57 return hasSuperMethods(member
) ? ERROR
: OK
;
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) {
76 panel
.add(selectionPanel
, BorderLayout
.CENTER
);
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
));