diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDialog.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDialog.java index 296f0f580752..661cb28a4def 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDialog.java @@ -15,6 +15,8 @@ */ package com.intellij.refactoring.changeSignature; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.KeyboardShortcut; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; @@ -26,19 +28,19 @@ import com.intellij.psi.*; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.changeSignature.inCallers.JavaCallerChooser; -import com.intellij.refactoring.ui.CodeFragmentTableCellRenderer; -import com.intellij.refactoring.ui.JavaCodeFragmentTableCellEditor; -import com.intellij.refactoring.ui.JavaComboBoxVisibilityPanel; -import com.intellij.refactoring.ui.VisibilityPanelBase; +import com.intellij.refactoring.ui.*; import com.intellij.refactoring.util.CanonicalTypes; import com.intellij.refactoring.util.RefactoringMessageUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.ui.EditableRowTable; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.table.JBTable; import com.intellij.ui.treeStructure.Tree; -import com.intellij.util.*; -import org.jetbrains.annotations.NonNls; +import com.intellij.util.Consumer; +import com.intellij.util.IncorrectOperationException; +import com.intellij.util.PlatformIcons; +import com.intellij.util.VisibilityUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,32 +48,28 @@ import javax.swing.*; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; -public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase { +import static com.intellij.refactoring.changeSignature.ChangeSignatureHandler.REFACTORING_NAME; - private ExceptionsTableModel myExceptionsTableModel; +/** + * @author Konstantin Bulenkov + */ +public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase { + private ExceptionsTableModel myExceptionsModel; protected Set myMethodsToPropagateExceptions; - private JButton myPropagateExnChangesButton; + private AnActionButton myPropExceptionsButton; private Tree myExceptionPropagationTree; - public JavaChangeSignatureDialog(Project project, - final PsiMethod method, - boolean allowDelegation, - PsiElement defaultValueContext) { - this(project, new JavaMethodDescriptor(method), allowDelegation, defaultValueContext); + public JavaChangeSignatureDialog(Project project, PsiMethod method, boolean allowDelegation, PsiElement context) { + this(project, new JavaMethodDescriptor(method), allowDelegation, context); } - protected JavaChangeSignatureDialog(Project project, - final JavaMethodDescriptor methodDescriptor, - boolean allowDelegation, - PsiElement defaultValueContext) { - super(project, methodDescriptor, allowDelegation, defaultValueContext); + protected JavaChangeSignatureDialog(Project project, JavaMethodDescriptor descriptor, boolean allowDelegation, PsiElement context) { + super(project, descriptor, allowDelegation, context); } @Override @@ -82,9 +80,53 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase> createAdditionalPanels() { + // this method is invoked before constructor body + myExceptionsModel = new ExceptionsTableModel(myMethod.getMethod().getThrowsList()); + myExceptionsModel.setTypeInfos(myMethod.getMethod()); + + final JBTable table = new JBTable(myExceptionsModel); + table.getColumnModel().getColumn(0).setCellRenderer(new CodeFragmentTableCellRenderer(myProject)); + table.getColumnModel().getColumn(0).setCellEditor(new JavaCodeFragmentTableCellEditor(myProject)); + final JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(IdeBorderFactory.createTitledBorder(RefactoringBundle.message("changeSignature.exceptions.panel.border.title"))); + final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(table); + final JPanel tablePanel = new JPanel(new BorderLayout()); + tablePanel.add(scrollPane, BorderLayout.CENTER); + + tablePanel.setBorder(IdeBorderFactory.createEmptyBorder(4)); + panel.add(tablePanel, BorderLayout.CENTER); + + table.setPreferredScrollableViewportSize(new Dimension(450, table.getRowHeight() * 8)); + table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + table.getSelectionModel().setSelectionInterval(0, 0); + table.setSurrendersFocusOnKeystroke(true); + + myPropExceptionsButton = new AnActionButton(RefactoringBundle.message("changeSignature.propagate.exceptions.title"), null, + PlatformIcons.EXCEPTION_CLASS_ICON) { + @Override + public void actionPerformed(AnActionEvent e) { final Ref chooser = new Ref(); Consumer> callback = new Consumer>() { @Override @@ -98,64 +140,20 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase> createAdditionalPanels() { - // this method is invoked before constuctor body - myExceptionsTableModel = new ExceptionsTableModel(myMethod.getMethod().getThrowsList()); - myExceptionsTableModel.setTypeInfos(myMethod.getMethod()); - - JBTable exceptionsTable = new JBTable(myExceptionsTableModel); - exceptionsTable.getColumnModel().getColumn(0).setCellRenderer(new CodeFragmentTableCellRenderer(myProject)); - exceptionsTable.getColumnModel().getColumn(0).setCellEditor(new JavaCodeFragmentTableCellEditor(myProject)); - JPanel panel = new JPanel(new BorderLayout()); - //panel.setBorder(IdeBorderFactory.createTitledBorder(RefactoringBundle.message("changeSignature.exceptions.panel.border.title"))); - - JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(exceptionsTable); - - JPanel tablePanel = new JPanel(new BorderLayout()); - tablePanel.add(scrollPane, BorderLayout.CENTER); - - tablePanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); - panel.add(tablePanel, BorderLayout.CENTER); - - exceptionsTable.setPreferredScrollableViewportSize(new Dimension(450, exceptionsTable.getRowHeight() * 8)); - exceptionsTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - exceptionsTable.getSelectionModel().setSelectionInterval(0, 0); - exceptionsTable.setSurrendersFocusOnKeystroke(true); - - final JPanel buttonsPanel = EditableRowTable.createButtonsTable(exceptionsTable, myExceptionsTableModel, false, true); + final JPanel buttonsPanel = EditableRowTable.createButtonsTable(table, myExceptionsModel, false, true, + myPropExceptionsButton); panel.add(buttonsPanel, BorderLayout.EAST); - myExceptionsTableModel.addTableModelListener( - new TableModelListener() { - public void tableChanged(TableModelEvent e) { - JavaChangeSignatureDialog.this.updateSignature(); - } + myExceptionsModel.addTableModelListener(new TableModelListener() { + public void tableChanged(TableModelEvent e) { + JavaChangeSignatureDialog.this.updateSignature(); } - ); + }); final ArrayList> result = new ArrayList>(); result.add(Pair.create("Exceptions", panel)); @@ -168,15 +166,15 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase createParametersInfoModel(MethodDescriptor method) { - return new JavaParameterTableModel(((JavaMethodDescriptor)method).getMethod().getParameterList(), myDefaultValueContext, this); + protected ParameterTableModelBase createParametersInfoModel(MethodDescriptor descriptor) { + final PsiParameterList parameterList = ((JavaMethodDescriptor)descriptor).getMethod().getParameterList(); + return new JavaParameterTableModel(parameterList, myDefaultValueContext, this); } @Override - protected void invokeRefactoring(BaseRefactoringProcessor processor) { + protected void invokeRefactoring(final BaseRefactoringProcessor processor) { if (myMethodsToPropagateExceptions != null && !mayPropagateExceptions()) { - Messages.showWarningDialog(myProject, RefactoringBundle.message("changeSignature.exceptions.wont.propagate"), - ChangeSignatureHandler.REFACTORING_NAME); + Messages.showWarningDialog(myProject, RefactoringBundle.message("changeSignature.exceptions.wont.propagate"), REFACTORING_NAME); myMethodsToPropagateExceptions = null; } super.invokeRefactoring(processor); @@ -216,7 +214,7 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase= 0) { - StringBuilder buf = new StringBuilder(modifiers); + final StringBuilder buf = new StringBuilder(modifiers); buf.replace(index, index + oldModifier.length() + ("".equals(newModifierStr) ? 1 : 0), newModifierStr); modifiers = buf.toString(); - } - else { - if (!"".equals(newModifierStr)) newModifierStr += " "; + } else { + if (!StringUtil.isEmpty(newModifierStr)) { + newModifierStr += " "; + } modifiers = newModifierStr + modifiers; } } @@ -393,9 +390,9 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase> items = myParametersTableModel.getItems(); int curIndent = indent.length(); for (int i = 0; i < items.size(); i++) { - ParameterTableModelItemBase item = items.get(i); + final ParameterTableModelItemBase item = items.get(i); if (i > 0) { buffer.append(","); buffer.append("\n"); buffer.append(indent); } final String text = item.typeCodeFragment.getText(); - buffer.append(text); - buffer.append(" "); + buffer.append(text).append(" "); final String name = item.parameter.getName(); buffer.append(name); curIndent = indent.length() + text.length() + 1 + name.length(); @@ -427,7 +423,7 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase 0) { //buffer.append("\n"); buffer.append(" throws "); @@ -448,5 +444,4 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase myMethodsToPropagateParameters = null; private Tree myParameterPropagationTreeToReuse; - protected JPanel myPropagatePanel; protected final PsiElement myDefaultValueContext; @@ -280,9 +281,10 @@ public abstract class ChangeSignatureDialogBase

> chooser = new Ref>(); Consumer> callback = new Consumer>() { @Override @@ -294,18 +296,16 @@ public abstract class ChangeSignatureDialogBase

>(myParametersTableModel) { @Override public void editingStopped(ChangeEvent e) { @@ -358,9 +358,11 @@ public abstract class ChangeSignatureDialogBase

myButtons = new HashMap(); - public AddRemoveUpDownPanel(Listener listener, @Nullable JComponent contentPane, Buttons... buttons) { + + public AddRemoveUpDownPanel(Listener listener, @Nullable JComponent contentPane, + @Nullable AnAction[] additionalActions, Buttons... buttons) { super(new VerticalFlowLayout(VerticalFlowLayout.TOP)); AnAction[] actions = new AnAction[buttons.length]; for (int i = 0; i < buttons.length; i++) { @@ -89,6 +93,19 @@ public class AddRemoveUpDownPanel extends JPanel { b.registerCustomShortcutSet(new CustomShortcutSet(shortcut), contentPane); } } + if (additionalActions != null && additionalActions.length > 0) { + final ArrayList allActions = new ArrayList(Arrays.asList(actions)); + allActions.addAll(Arrays.asList(additionalActions)); + actions = allActions.toArray(new AnAction[allActions.size()]); + for (final AnAction action : additionalActions) { + if (action instanceof ShortcutProvider && contentPane != null) { + final Shortcut shortcut = ((ShortcutProvider)action).getShortcut(); + if (shortcut != null) { + action.registerCustomShortcutSet(new CustomShortcutSet(shortcut), contentPane); + } + } + } + } add(ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, new DefaultActionGroup(actions), false).getComponent()); } @@ -99,8 +116,8 @@ public class AddRemoveUpDownPanel extends JPanel { } } - public AddRemoveUpDownPanel(Listener listener, @Nullable JComponent contentPane) { - this(listener, contentPane, Buttons.ADD, Buttons.REMOVE, Buttons.UP, Buttons.DOWN); + public AddRemoveUpDownPanel(Listener listener, @Nullable JComponent contentPane, @Nullable AnAction[] additionalActions) { + this(listener, contentPane, additionalActions, Buttons.ADD, Buttons.REMOVE, Buttons.UP, Buttons.DOWN); } static class TableActionButton extends AnAction implements ShortcutProvider { diff --git a/platform/platform-api/src/com/intellij/ui/EditableRowTable.java b/platform/platform-api/src/com/intellij/ui/EditableRowTable.java index 0c01fdaea960..653c6cfa96e9 100644 --- a/platform/platform-api/src/com/intellij/ui/EditableRowTable.java +++ b/platform/platform-api/src/com/intellij/ui/EditableRowTable.java @@ -15,6 +15,7 @@ */ package com.intellij.ui; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.util.Ref; import javax.swing.*; @@ -34,7 +35,9 @@ public class EditableRowTable { return createButtonsTable(table, tableModel, addMnemonics, false); } - public static JPanel createButtonsTable(final JTable table, final RowEditableTableModel tableModel, boolean addMnemonics, boolean iconsOnly) { + public static JPanel createButtonsTable(final JTable table, final RowEditableTableModel tableModel, + boolean addMnemonics, boolean iconsOnly, + AnAction...actions) { JPanel panel = new JPanel(); panel.setBorder(iconsOnly ? IdeBorderFactory.createEmptyBorder(0) : BorderFactory.createEmptyBorder(4, 4, 4, 4)); @@ -158,7 +161,7 @@ public class EditableRowTable { gbConstraints.weighty = 1; panel.add(new JPanel(), gbConstraints); } else { - p.set(new AddRemoveUpDownPanel(listener, table)); + p.set(new AddRemoveUpDownPanel(listener, table, actions)); panel.add(p.get(), BorderLayout.NORTH); } diff --git a/platform/platform-api/src/com/intellij/util/PlatformIcons.java b/platform/platform-api/src/com/intellij/util/PlatformIcons.java index 3cc1b9729ebb..b04254986aee 100644 --- a/platform/platform-api/src/com/intellij/util/PlatformIcons.java +++ b/platform/platform-api/src/com/intellij/util/PlatformIcons.java @@ -89,6 +89,7 @@ public interface PlatformIcons { Icon VARIABLE_RW_ACCESS = IconLoader.getIcon("/nodes/rw-access.png"); Icon CUSTOM_FILE_ICON = IconLoader.getIcon("/fileTypes/custom.png"); Icon PROPERTY_ICON = IconLoader.getIcon("/nodes/property.png"); + Icon NEW_PARAMETER = IconLoader.getIcon("/nodes/newParameter.png"); Icon ASPECT_ICON = IconLoader.getIcon("/nodes/aspect.png"); Icon POINTCUT_ICON = IconLoader.getIcon("/nodes/pointcut.png"); Icon ADVICE_ICON = IconLoader.getIcon("/nodes/advice.png");