From 7aa9dd9539911382744c7fc96435d0506e95f05e Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Fri, 6 Nov 2015 19:12:10 +0300 Subject: [PATCH] IDEA-146427 Do not create a Keymap copy if dialog is cancelled --- .../openapi/keymap/impl/ui/KeymapPanel.java | 36 +++++++++++++------ .../keymap/impl/ui/ShortcutDialog.java | 4 +++ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java index 3083d4f6508b..702ac30fb01d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapPanel.java @@ -467,25 +467,25 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi } private void addKeyboardShortcut(@NotNull String actionId, @Nullable Shortcut shortcut) { - Keymap keymap = createKeymapCopyIfNeeded(); - addKeyboardShortcut(actionId, shortcut, keymap, this, myQuickLists); + Keymap keymapSelected = myEditor.getModel().getSelected(); + addKeyboardShortcut(actionId, shortcut, keymapSelected, this, myQuickLists); repaintLists(); currentKeymapChanged(); } public static void addKeyboardShortcut(@NotNull String actionId, @Nullable Shortcut shortcut, - @NotNull Keymap keymap, + @NotNull Keymap keymapSelected, @NotNull Component parent, @NotNull QuickList[] quickLists) { KeyboardShortcutDialog dialog = new KeyboardShortcutDialog(parent); - KeyboardShortcut keyboardShortcut = dialog.showAndGet(shortcut, actionId, keymap, quickLists); + KeyboardShortcut keyboardShortcut = dialog.showAndGet(shortcut, actionId, keymapSelected, quickLists); if (keyboardShortcut == null) { return; } - Map> conflicts = keymap.getConflicts(actionId, keyboardShortcut); - if (!conflicts.isEmpty()) { + Keymap keymap = null; + if (dialog.hasConflicts()) { int result = Messages.showYesNoCancelDialog( parent, KeyMapBundle.message("conflict.shortcut.dialog.message"), @@ -496,6 +496,8 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi Messages.getWarningIcon()); if (result == Messages.YES) { + keymap = createKeymapCopyIfNeededAndPossible(parent, keymapSelected); + Map> conflicts = keymap.getConflicts(actionId, keyboardShortcut); for (String id : conflicts.keySet()) { for (KeyboardShortcut s : conflicts.get(id)) { keymap.removeShortcut(id, s); @@ -508,6 +510,8 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi } // if shortcut is already registered to this action, just select it in the list + + if (keymap == null) keymap = createKeymapCopyIfNeededAndPossible(parent, keymapSelected); Shortcut[] shortcuts = keymap.getShortcuts(actionId); for (Shortcut s : shortcuts) { if (s.equals(keyboardShortcut)) { @@ -527,16 +531,16 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi return; } - Keymap keymap = createKeymapCopyIfNeeded(); + Keymap keymapSelected = myEditor.getModel().getSelected(); MouseShortcutDialog dialog = new MouseShortcutDialog(this, restrictions.allowMouseDoubleClick); - MouseShortcut mouseShortcut = dialog.showAndGet(shortcut, actionId, keymap, myQuickLists); + MouseShortcut mouseShortcut = dialog.showAndGet(shortcut, actionId, keymapSelected, myQuickLists); if (mouseShortcut == null) { return; } - String[] actionIds = keymap.getActionIds(mouseShortcut); - if (actionIds.length > 1 || (actionIds.length == 1 && !actionId.equals(actionIds[0]))) { + Keymap keymap = null; + if (dialog.hasConflicts()) { int result = Messages.showYesNoCancelDialog( this, KeyMapBundle.message("conflict.shortcut.dialog.message"), @@ -547,6 +551,8 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi Messages.getWarningIcon()); if (result == Messages.YES) { + keymap = createKeymapCopyIfNeededAndPossible(this, keymapSelected); + String[] actionIds = keymap.getActionIds(mouseShortcut); for (String id : actionIds) { keymap.removeShortcut(id, mouseShortcut); } @@ -558,6 +564,7 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi // if shortcut is already registered to this action, just select it in the list + if (keymap == null) keymap = createKeymapCopyIfNeededAndPossible(this, keymapSelected); Shortcut[] shortcuts = keymap.getShortcuts(actionId); for (Shortcut shortcut1 : shortcuts) { if (shortcut1.equals(mouseShortcut)) { @@ -578,6 +585,15 @@ public class KeymapPanel extends JPanel implements SearchableConfigurable, Confi myActionsTree.getComponent().repaint(); } + @NotNull + private static Keymap createKeymapCopyIfNeededAndPossible(Component parent, Keymap keymap) { + if (parent instanceof KeymapPanel) { + KeymapPanel panel = (KeymapPanel)parent; + keymap = panel.createKeymapCopyIfNeeded(); + } + return keymap; + } + @NotNull private Keymap createKeymapCopyIfNeeded() { Keymap keymap = myEditor.getModel().getSelected(); diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ShortcutDialog.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ShortcutDialog.java index c3ade8b94c5e..b0713fe96cfc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ShortcutDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/ShortcutDialog.java @@ -74,6 +74,10 @@ abstract class ShortcutDialog extends DialogWrapper { return myGroup == null ? null : myGroup.getActionQualifiedPath(actionId); } + boolean hasConflicts() { + return myConflictsPanel.isVisible(); + } + abstract Collection getConflicts(T shortcut, String actionId, Keymap keymap); abstract T toShortcut(Object value); -- 2.32.0