From 4abdb7aedf769ef177bf7e19d8a5c9fb6ebb0091 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 12 Dec 2016 16:01:30 +0100 Subject: [PATCH] on remove shortcut we put empty list to actionIdToShortcuts, our mouseShortcutToActionIds doesn't contain mapping so, we add actions from parent keymap only if they are absent in this keymap --- .../com/intellij/openapi/keymap/impl/KeymapImpl.kt | 14 ++++++++++---- .../intellij/openapi/keymap/impl/KeymapTest.java | 13 +++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.kt b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.kt index 8dcf6f328c15..4e7ae031c0e2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapImpl.kt @@ -86,7 +86,7 @@ open class KeymapImpl @JvmOverloads constructor(private var dataHolder: SchemeDa get() = actionIdToShortcuts.keys.toTypedArray() private var _mouseShortcutToListOfIds: Map>? = null - private val mouseShortcutIds: Map> + private val mouseShortcutToActionIds: Map> get() { var result = _mouseShortcutToListOfIds if (result == null) { @@ -406,7 +406,7 @@ open class KeymapImpl @JvmOverloads constructor(private var dataHolder: SchemeDa var convertedShortcut = shortcut var keymap = this do { - val list = keymap.mouseShortcutIds.get(convertedShortcut) + val list = keymap.mouseShortcutToActionIds.get(convertedShortcut) if (list != null && list.contains(actionId)) { return true } @@ -419,12 +419,18 @@ open class KeymapImpl @JvmOverloads constructor(private var dataHolder: SchemeDa } override fun getActionIds(shortcut: MouseShortcut): Array { - var list = mouseShortcutIds.get(shortcut) + var list = mouseShortcutToActionIds.get(shortcut) var originalListInstance = list != null var keymap = parent ?: return sortInRegistrationOrder(list) var convertedShortcut = convertMouseShortcut(shortcut) do { - for (id in (keymap.mouseShortcutIds.get(convertedShortcut) ?: emptyList())) { + for (id in (keymap.mouseShortcutToActionIds.get(convertedShortcut) ?: emptyList())) { + if (actionIdToShortcuts.containsKey(id)) { + // on remove shortcut we put empty list to actionIdToShortcuts, our mouseShortcutToActionIds doesn't contain mapping + // so, we add actions from parent keymap only if they are absent in this keymap + continue + } + if (list != null && list.contains(id)) { continue } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/KeymapTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/KeymapTest.java index 5f1e3f098d97..5a3be02ef8c0 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/KeymapTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/keymap/impl/KeymapTest.java @@ -16,10 +16,12 @@ package com.intellij.openapi.keymap.impl; import com.intellij.openapi.actionSystem.KeyboardShortcut; +import com.intellij.openapi.actionSystem.MouseShortcut; import com.intellij.openapi.keymap.ex.KeymapManagerEx; import com.intellij.testFramework.PlatformTestCase; import javax.swing.*; +import java.awt.event.InputEvent; import static org.assertj.core.api.Assertions.assertThat; @@ -151,6 +153,17 @@ public class KeymapTest extends PlatformTestCase { assertThat(myChild.getShortcuts(ACTION_2)).containsExactly(shortcutA, shortcutB); } + public void testRemoveMouseShortcut() throws Exception { + myParent.clearOwnActionsIds(); + myChild.clearOwnActionsIds(); + + MouseShortcut mouseShortcut = new MouseShortcut(1, InputEvent.BUTTON2_MASK, 1); + myParent.addShortcut(ACTION_2, mouseShortcut); + assertThat(myChild.getActionIds(mouseShortcut)).containsExactly(ACTION_2); + myChild.removeShortcut(ACTION_2, mouseShortcut); + assertThat(myChild.getActionIds(mouseShortcut)).isEmpty(); + } + public void testRemovingShortcutLast() throws Exception { myParent.clearOwnActionsIds(); myChild.clearOwnActionsIds();