move propagation buttons to actions

This commit is contained in:
Konstantin Bulenkov
2011-06-20 14:07:26 +04:00
parent 992b57a90c
commit d97c45981c
7 changed files with 242 additions and 141 deletions
@@ -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<ParameterInfoImpl, PsiMethod, JavaMethodDescriptor> {
import static com.intellij.refactoring.changeSignature.ChangeSignatureHandler.REFACTORING_NAME;
private ExceptionsTableModel myExceptionsTableModel;
/**
* @author Konstantin Bulenkov
*/
public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<ParameterInfoImpl, PsiMethod, JavaMethodDescriptor> {
private ExceptionsTableModel myExceptionsModel;
protected Set<PsiMethod> 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<Paramet
@Override
protected JComponent createCenterPanel() {
final JComponent centerPanel = super.createCenterPanel();
myPropagateExnChangesButton = new JButton(RefactoringBundle.message("changeSignature.propagate.exceptions.title"));
myPropagateExnChangesButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myPropagateParamChangesButton.setVisible(true);
return centerPanel;
}
@Override
protected void updatePropagateButtons() {
super.updatePropagateButtons();
myPropExceptionsButton.setEnabled(!isGenerateDelegate() && mayPropagateExceptions());
}
protected boolean mayPropagateExceptions() {
final ThrownExceptionInfo[] thrownExceptions = myExceptionsModel.getThrownExceptions();
final PsiClassType[] types = myMethod.getMethod().getThrowsList().getReferencedTypes();
if (thrownExceptions.length <= types.length) return false;
for (int i = 0; i < types.length; i++) {
if (thrownExceptions[i].getOldIndex() != i) return false;
}
return true;
}
@NotNull
protected List<Pair<String,JPanel>> 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<JavaCallerChooser> chooser = new Ref<JavaCallerChooser>();
Consumer<Set<PsiMethod>> callback = new Consumer<Set<PsiMethod>>() {
@Override
@@ -98,64 +140,20 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
myExceptionPropagationTree, callback));
chooser.get().show();
}
});
myPropagatePanel.add(myPropagateExnChangesButton);
};
myPropExceptionsButton.setShortcut(KeyboardShortcut.fromString("alt X"));
return centerPanel;
}
@Override
protected void updatePropagateButtons() {
super.updatePropagateButtons();
myPropagateExnChangesButton.setEnabled(!isGenerateDelegate() && mayPropagateExceptions());
}
private boolean mayPropagateExceptions() {
final ThrownExceptionInfo[] thrownExceptions = myExceptionsTableModel.getThrownExceptions();
final PsiClassType[] types = myMethod.getMethod().getThrowsList().getReferencedTypes();
if (thrownExceptions.length <= types.length) return false;
for (int i = 0; i < types.length; i++) {
if (thrownExceptions[i].getOldIndex() != i) return false;
}
return true;
}
@NotNull
protected List<Pair<String,JPanel>> 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<Pair<String, JPanel>> result = new ArrayList<Pair<String, JPanel>>();
result.add(Pair.create("Exceptions", panel));
@@ -168,15 +166,15 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
}
@Override
protected ParameterTableModelBase<ParameterInfoImpl> createParametersInfoModel(MethodDescriptor<ParameterInfoImpl> method) {
return new JavaParameterTableModel(((JavaMethodDescriptor)method).getMethod().getParameterList(), myDefaultValueContext, this);
protected ParameterTableModelBase<ParameterInfoImpl> createParametersInfoModel(MethodDescriptor<ParameterInfoImpl> 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<Paramet
}
protected ThrownExceptionInfo[] getExceptions() {
return myExceptionsTableModel.getThrownExceptions();
return myExceptionsModel.getThrownExceptions();
}
@Override
@@ -268,12 +266,11 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
final PsiType type;
try {
type = ((PsiTypeCodeFragment)parameterInfos.get(i).typeCodeFragment).getType();
}
catch (PsiTypeCodeFragment.TypeSyntaxException e) {
return RefactoringBundle
.message("changeSignature.wrong.type.for.parameter", item.typeCodeFragment.getText(), item.parameter.getName());
}
catch (PsiTypeCodeFragment.NoTypeException e) {
} catch (PsiTypeCodeFragment.TypeSyntaxException e) {
return RefactoringBundle.message("changeSignature.wrong.type.for.parameter",
item.typeCodeFragment.getText(),
item.parameter.getName());
} catch (PsiTypeCodeFragment.NoTypeException e) {
return RefactoringBundle.message("changeSignature.no.type.for.parameter", item.parameter.getName());
}
@@ -302,8 +299,8 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
}
}
ThrownExceptionInfo[] exceptionInfos = myExceptionsTableModel.getThrownExceptions();
PsiTypeCodeFragment[] typeCodeFragments = myExceptionsTableModel.getTypeCodeFragments();
ThrownExceptionInfo[] exceptionInfos = myExceptionsModel.getThrownExceptions();
PsiTypeCodeFragment[] typeCodeFragments = myExceptionsModel.getTypeCodeFragments();
for (int i = 0; i < exceptionInfos.length; i++) {
ThrownExceptionInfo exceptionInfo = exceptionInfos[i];
PsiTypeCodeFragment typeCodeFragment = typeCodeFragments[i];
@@ -362,24 +359,24 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
}
protected String doCalculateSignature(PsiMethod method) {
@NonNls StringBuilder buffer = new StringBuilder();
PsiModifierList modifierList = method.getModifierList();
final StringBuilder buffer = new StringBuilder();
final PsiModifierList modifierList = method.getModifierList();
String modifiers = modifierList.getText();
String oldModifier = VisibilityUtil.getVisibilityModifier(modifierList);
String newModifier = getVisibility();
final String oldModifier = VisibilityUtil.getVisibilityModifier(modifierList);
final String newModifier = getVisibility();
String newModifierStr = VisibilityUtil.getVisibilityString(newModifier);
if (!newModifier.equals(oldModifier)) {
int index = modifiers.indexOf(oldModifier);
if (index >= 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<Paramet
}
if (!method.isConstructor()) {
final CanonicalTypes.Type returnType = getReturnType();
if (returnType != null) {
buffer.append(returnType.getTypeText());
final CanonicalTypes.Type type = getReturnType();
if (type != null) {
buffer.append(type.getTypeText());
}
buffer.append(" ");
}
@@ -410,15 +407,14 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
List<ParameterTableModelItemBase<ParameterInfoImpl>> items = myParametersTableModel.getItems();
int curIndent = indent.length();
for (int i = 0; i < items.size(); i++) {
ParameterTableModelItemBase<ParameterInfoImpl> item = items.get(i);
final ParameterTableModelItemBase<ParameterInfoImpl> 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<Paramet
// buffer.append("\n");
//}
buffer.append(")");
PsiTypeCodeFragment[] thrownExceptionsFragments = myExceptionsTableModel.getTypeCodeFragments();
PsiTypeCodeFragment[] thrownExceptionsFragments = myExceptionsModel.getTypeCodeFragments();
if (thrownExceptionsFragments.length > 0) {
//buffer.append("\n");
buffer.append(" throws ");
@@ -448,5 +444,4 @@ public class JavaChangeSignatureDialog extends ChangeSignatureDialogBase<Paramet
return buffer.toString();
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

@@ -15,7 +15,10 @@
*/
package com.intellij.refactoring.changeSignature;
import com.intellij.codeInsight.hint.HintUtil;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.KeyboardShortcut;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
@@ -33,21 +36,20 @@ import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.psi.PsiCodeFragment;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.ui.ComboBoxVisibilityPanel;
import com.intellij.refactoring.ui.DelegationPanel;
import com.intellij.refactoring.ui.RefactoringDialog;
import com.intellij.refactoring.ui.VisibilityPanelBase;
import com.intellij.refactoring.ui.*;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.ui.*;
import com.intellij.ui.table.TableView;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.Alarm;
import com.intellij.util.Consumer;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -56,8 +58,8 @@ import javax.swing.event.ChangeListener;
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.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -83,11 +85,10 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
protected VisibilityPanelBase myVisibilityPanel;
protected PsiCodeFragment myReturnTypeCodeFragment;
private DelegationPanel myDelegationPanel;
protected JButton myPropagateParamChangesButton;
protected AnActionButton myPropagateParamChangesButton;
protected Set<M> myMethodsToPropagateParameters = null;
private Tree myParameterPropagationTreeToReuse;
protected JPanel myPropagatePanel;
protected final PsiElement myDefaultValueContext;
@@ -280,9 +281,10 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
panel.add(myDelegationPanel, BorderLayout.WEST);
}
myPropagateParamChangesButton = new JButton(RefactoringBundle.message("changeSignature.propagate.parameters.title"));
myPropagateParamChangesButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myPropagateParamChangesButton = new AnActionButton(RefactoringBundle.message("changeSignature.propagate.parameters.title"), null,
PlatformIcons.NEW_PARAMETER) {
@Override
public void actionPerformed(AnActionEvent e) {
final Ref<CallerChooserBase<M>> chooser = new Ref<CallerChooserBase<M>>();
Consumer<Set<M>> callback = new Consumer<Set<M>>() {
@Override
@@ -294,18 +296,16 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
try {
chooser.set(
createCallerChooser(RefactoringBundle.message("changeSignature.parameter.caller.chooser"), myParameterPropagationTreeToReuse,
callback));
} catch (ProcessCanceledException ex) {
callback));
}
catch (ProcessCanceledException ex) {
// user cancelled initial callers search, don't show dialog
return;
}
chooser.get().show();
}
});
myPropagatePanel = new JPanel();
myPropagatePanel.add(myPropagateParamChangesButton);
};
panel.add(myPropagatePanel, BorderLayout.EAST);
final JPanel result = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP));
result.add(panel);
return result;
@@ -333,7 +333,7 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
return "refactoring.ChangeSignatureDialog";
}
private JPanel createParametersPanel() {
protected JPanel createParametersPanel() {
myParametersTable = new TableView<ParameterTableModelItemBase<P>>(myParametersTableModel) {
@Override
public void editingStopped(ChangeEvent e) {
@@ -358,9 +358,11 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
myParametersTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myParametersTable.getSelectionModel().setSelectionInterval(0, 0);
myParametersTable.setSurrendersFocusOnKeystroke(true);
JPanel buttonsPanel = EditableRowTable.createButtonsTable(myParametersTable, myParametersTableModel, false, true);
myPropagateParamChangesButton.setShortcut(KeyboardShortcut.fromString("alt G"));
final JPanel buttonsPanel = EditableRowTable.createButtonsTable(myParametersTable, myParametersTableModel,
false, true, myPropagateParamChangesButton);
myPropagateParamChangesButton.setEnabled(false);
myPropagateParamChangesButton.setVisible(false);
panel.add(buttonsPanel, BorderLayout.EAST);
myParametersTableModel.addTableModelListener(
@@ -385,13 +387,19 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
panel.add(mySignatureArea, BorderLayout.CENTER);
mySignatureArea.setFont(EditorColorsManager.getInstance().getGlobalScheme().getFont(EditorFontType.PLAIN));
mySignatureArea.setPreferredSize(new Dimension(-1, 130));
mySignatureArea.setBackground(Color.WHITE);
mySignatureArea.setBackground(HintUtil.INFORMATION_COLOR);
mySignatureArea.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
IdeFocusManager.findInstance().requestFocus(myNameField, true);
}
});
updateSignature();
return panel;
}
protected void updateSignature() {
if (mySignatureArea == null) return;
if (mySignatureArea == null || myPropagateParamChangesButton == null) return;
final Runnable updateRunnable = new Runnable() {
public void run() {
@@ -421,7 +429,9 @@ public abstract class ChangeSignatureDialogBase<P extends ParameterInfo, M exten
}
protected void updatePropagateButtons() {
myPropagateParamChangesButton.setEnabled(!isGenerateDelegate() && mayPropagateParameters());
if (myPropagateParamChangesButton != null) {
myPropagateParamChangesButton.setEnabled(!isGenerateDelegate() && mayPropagateParameters());
}
}
private boolean mayPropagateParameters() {
@@ -0,0 +1,75 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.refactoring.ui;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Shortcut;
import com.intellij.openapi.actionSystem.ShortcutProvider;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author Konstantin Bulenkov
*/
public abstract class AnActionButton extends AnAction implements ShortcutProvider {
private boolean myEnabled = true;
private boolean myVisible = true;
private Shortcut myShortcut;
protected AnActionButton(String text) {
super(text);
}
protected AnActionButton(String text, String description, @Nullable Icon icon) {
super(text, description, icon);
}
protected AnActionButton() {
}
public boolean isEnabled() {
return myEnabled;
}
public void setEnabled(boolean enabled) {
myEnabled = enabled;
}
public boolean isVisible() {
return myVisible;
}
public void setVisible(boolean visible) {
myVisible = visible;
}
@Override
public void update(AnActionEvent e) {
e.getPresentation().setEnabled(isEnabled());
e.getPresentation().setVisible(isVisible());
}
@Override
public Shortcut getShortcut() {
return myShortcut;
}
public void setShortcut(Shortcut shortcut) {
myShortcut = shortcut;
}
}
@@ -17,11 +17,13 @@ package com.intellij.ui;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -34,10 +36,10 @@ public class AddRemoveUpDownPanel extends JPanel {
Icon getIcon() {
switch (this) {
case ADD: return IconLoader.getIcon("/actions/addBig.png");
case REMOVE: return IconLoader.getIcon("/actions/removeBig.png");
case UP: return IconLoader.getIcon("/actions/upBig.png");
case DOWN: return IconLoader.getIcon("/actions/downBig.png");
case ADD: return PlatformIcons.ADD_BIG;
case REMOVE: return PlatformIcons.REMOVE_BIG;
case UP: return PlatformIcons.UP_BIG;
case DOWN: return PlatformIcons.DOWN_BIG;
}
return null;
}
@@ -76,7 +78,9 @@ public class AddRemoveUpDownPanel extends JPanel {
}
private Map<Buttons, TableActionButton> myButtons = new HashMap<Buttons, TableActionButton>();
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<AnAction> allActions = new ArrayList<AnAction>(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 {
@@ -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);
}
@@ -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");