From 23daca5149d47e7083936bb0c84b68380018ebca Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 15 Jul 2011 16:33:35 +0400 Subject: [PATCH] resolve shortcut conflict between several actions with the same shortcut. Prefer an action with focused context component --- .../com/intellij/ui/AddRemoveUpDownPanel.java | 4 +-- .../src/com/intellij/ui/AnActionButton.java | 4 +++ .../src/com/intellij/ui/ToolbarDecorator.java | 29 +++++++++++++++++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/AddRemoveUpDownPanel.java b/platform/platform-api/src/com/intellij/ui/AddRemoveUpDownPanel.java index af2f75865983..7752f2d4451d 100644 --- a/platform/platform-api/src/com/intellij/ui/AddRemoveUpDownPanel.java +++ b/platform/platform-api/src/com/intellij/ui/AddRemoveUpDownPanel.java @@ -89,7 +89,7 @@ class AddRemoveUpDownPanel extends JPanel { private Map myButtons = new HashMap(); private final AnActionButton[] myActions; - AddRemoveUpDownPanel(Listener listener, @Nullable JComponent contentPane, boolean isHorizontal, + AddRemoveUpDownPanel(Listener listener, @Nullable JComponent contextComponent, boolean isHorizontal, @Nullable AnActionButton[] additionalActions, Buttons... buttons) { super(new BorderLayout()); AnActionButton[] actions = new AnActionButton[buttons.length]; @@ -106,7 +106,7 @@ class AddRemoveUpDownPanel extends JPanel { } myActions = actions; for (AnActionButton action : actions) { - action.setContextComponent(contentPane); + action.setContextComponent(contextComponent); } final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, new DefaultActionGroup(myActions), diff --git a/platform/platform-api/src/com/intellij/ui/AnActionButton.java b/platform/platform-api/src/com/intellij/ui/AnActionButton.java index bb6f4fabe524..27064bee3f42 100644 --- a/platform/platform-api/src/com/intellij/ui/AnActionButton.java +++ b/platform/platform-api/src/com/intellij/ui/AnActionButton.java @@ -78,6 +78,10 @@ public abstract class AnActionButton extends AnAction implements ShortcutProvide myContextComponent = contextComponent; } + public JComponent getContextComponent() { + return myContextComponent; + } + private boolean isContextComponentOk() { return myContextComponent == null || (myContextComponent.isVisible() && UIUtil.getParentOfType(JLayeredPane.class, myContextComponent) != null); diff --git a/platform/platform-api/src/com/intellij/ui/ToolbarDecorator.java b/platform/platform-api/src/com/intellij/ui/ToolbarDecorator.java index d14db099ba9b..d3098458be2f 100644 --- a/platform/platform-api/src/com/intellij/ui/ToolbarDecorator.java +++ b/platform/platform-api/src/com/intellij/ui/ToolbarDecorator.java @@ -15,11 +15,12 @@ */ package com.intellij.ui; -import com.intellij.openapi.actionSystem.ActionToolbar; -import com.intellij.openapi.actionSystem.ActionToolbarPosition; +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.border.CustomLineBorder; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NonNls; import javax.swing.*; import javax.swing.border.Border; @@ -29,13 +30,14 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.TableModel; import java.awt.*; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; /** * @author Konstantin Bulenkov */ @SuppressWarnings("UnusedDeclaration") -public class ToolbarDecorator { +public class ToolbarDecorator implements DataProvider { private JTable myTable; private TableModel myTableModel; private ListModel myListModel; @@ -54,6 +56,17 @@ public class ToolbarDecorator { private AddRemoveUpDownPanel myPanel; private JList myList; + private static final Comparator ACTION_BUTTONS_SORTER = new Comparator() { + @Override + public int compare(AnAction a1, AnAction a2) { + if (a1 instanceof AnActionButton && a2 instanceof AnActionButton) { + final JComponent c1 = ((AnActionButton)a1).getContextComponent(); + final JComponent c2 = ((AnActionButton)a2).getContextComponent(); + return c1.hasFocus() ? -1 : c2.hasFocus() ? 1 : 0; + } + return 0; + } + }; private ToolbarDecorator(JTable table) { myTable = table; @@ -330,9 +343,19 @@ public class ToolbarDecorator { } panel.setBorder(new LineBorder(UIUtil.getBorderColor())); panel.putClientProperty(ActionToolbar.ACTION_TOOLBAR_PROPERTY_KEY, myPanel.getComponent(0)); + DataManager.registerDataProvider(panel, this); return panel; } + @Override + public Object getData(@NonNls String dataId) { + if (PlatformDataKeys.ACTIONS_SORTER.is(dataId)) { + return ACTION_BUTTONS_SORTER; + } + return null; + } + + private Object getPlacement() { switch (myToolbarPosition) { case TOP: return BorderLayout.NORTH;