diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java index f3c4c66eb25b..42952af733a3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ModifierKeyDoubleClickHandler.java @@ -4,14 +4,12 @@ package com.intellij.openapi.keymap.impl; import com.intellij.ide.DataManager; import com.intellij.ide.IdeEventQueue; import com.intellij.ide.actions.ActionsCollector; -import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionManagerEx; import com.intellij.openapi.actionSystem.ex.AnActionListener; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Couple; -import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.IdeFrame; @@ -39,7 +37,7 @@ import static com.intellij.openapi.keymap.KeymapUtil.getActiveKeymapShortcuts; * @author Dmitry Batrak * @author Konstantin Bulenkov */ -public final class ModifierKeyDoubleClickHandler implements Disposable { +public final class ModifierKeyDoubleClickHandler { private static final Logger LOG = Logger.getInstance(ModifierKeyDoubleClickHandler.class); private static final TIntIntHashMap KEY_CODE_TO_MODIFIER_MAP = new TIntIntHashMap(); @@ -62,14 +60,33 @@ public final class ModifierKeyDoubleClickHandler implements Disposable { registerAction(IdeActions.ACTION_EDITOR_MOVE_CARET_RIGHT_WITH_SELECTION, modifierKeyCode, KeyEvent.VK_RIGHT); registerAction(IdeActions.ACTION_EDITOR_MOVE_LINE_START_WITH_SELECTION, modifierKeyCode, KeyEvent.VK_HOME); registerAction(IdeActions.ACTION_EDITOR_MOVE_LINE_END_WITH_SELECTION, modifierKeyCode, KeyEvent.VK_END); - } - @Override - public void dispose() { - for (MyDispatcher dispatcher : myDispatchers.values()) { - Disposer.dispose(dispatcher); - } - myDispatchers.clear(); + ApplicationManager.getApplication().getMessageBus().connect().subscribe(AnActionListener.TOPIC, new AnActionListener() { + @Override + public void beforeActionPerformed(@NotNull AnAction action, @NotNull DataContext dataContext, @NotNull AnActionEvent event) { + if (myIsRunningAction) { + return; + } + + for (MyDispatcher dispatcher : myDispatchers.values()) { + dispatcher.resetState(); + } + } + }); + IdeEventQueue.getInstance().addDispatcher(event -> { + if (!(event instanceof KeyEvent)) { + return false; + } + + boolean result = false; + KeyEvent keyEvent = (KeyEvent)event; + for (MyDispatcher dispatcher : myDispatchers.values()) { + if (dispatcher.dispatch(keyEvent)) { + result = true; + } + } + return result; + }, ApplicationManager.getApplication()); } public static ModifierKeyDoubleClickHandler getInstance() { @@ -90,13 +107,7 @@ public final class ModifierKeyDoubleClickHandler implements Disposable { int modifierKeyCode, int actionKeyCode, boolean skipIfActionHasShortcut) { - MyDispatcher dispatcher = new MyDispatcher(actionId, modifierKeyCode, actionKeyCode, skipIfActionHasShortcut); - MyDispatcher oldDispatcher = myDispatchers.put(actionId, dispatcher); - IdeEventQueue.getInstance().addDispatcher(dispatcher, dispatcher); - ApplicationManager.getApplication().getMessageBus().connect(dispatcher).subscribe(AnActionListener.TOPIC, dispatcher); - if (oldDispatcher != null) { - Disposer.dispose(oldDispatcher); - } + myDispatchers.put(actionId, new MyDispatcher(actionId, modifierKeyCode, actionKeyCode, skipIfActionHasShortcut)); } /** @@ -109,17 +120,14 @@ public final class ModifierKeyDoubleClickHandler implements Disposable { } public void unregisterAction(@NotNull String actionId) { - MyDispatcher oldDispatcher = myDispatchers.remove(actionId); - if (oldDispatcher != null) { - Disposer.dispose(oldDispatcher); - } + myDispatchers.remove(actionId); } public boolean isRunningAction() { return myIsRunningAction; } - private final class MyDispatcher implements IdeEventQueue.EventDispatcher, Disposable, AnActionListener { + private final class MyDispatcher { private final String myActionId; private final int myModifierKeyCode; private final int myActionKeyCode; @@ -137,44 +145,45 @@ public final class ModifierKeyDoubleClickHandler implements Disposable { mySkipIfActionHasShortcut = skipIfActionHasShortcut; } - @Override - public boolean dispatch(@NotNull AWTEvent event) { - if (event instanceof KeyEvent) { - final KeyEvent keyEvent = (KeyEvent)event; - final int keyCode = keyEvent.getKeyCode(); - LOG.debug("", this, event); - if (keyCode == myModifierKeyCode) { - if (hasOtherModifiers(keyEvent)) { - resetState(); - return false; - } - if (myActionKeyCode == -1 && ourOtherKeyWasPressed.get() && keyEvent.getWhen() - ourLastTimePressed.get() < 100) { - resetState(); - return false; - } - ourOtherKeyWasPressed.set(false); - if (ourPressed.first.get() && keyEvent.getWhen() - ourLastTimePressed.get() > 500) { - resetState(); - } - handleModifier((KeyEvent)event); + public boolean dispatch(@NotNull KeyEvent event) { + int keyCode = event.getKeyCode(); + LOG.debug("", this, event); + if (keyCode == myModifierKeyCode) { + if (hasOtherModifiers(event)) { + resetState(); return false; - } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get() && myActionKeyCode != -1) { - if (keyCode == myActionKeyCode && !hasOtherModifiers(keyEvent)) { - if (event.getID() == KeyEvent.KEY_PRESSED) { - return run(keyEvent); - } - return true; - } - return false; - } else { - ourLastTimePressed.set(keyEvent.getWhen()); - ourOtherKeyWasPressed.set(true); - if (keyCode == KeyEvent.VK_ESCAPE || keyCode == KeyEvent.VK_TAB) { - ourLastTimePressed.set(0); - } } - resetState(); + + if (myActionKeyCode == -1 && ourOtherKeyWasPressed.get() && event.getWhen() - ourLastTimePressed.get() < 100) { + resetState(); + return false; + } + + ourOtherKeyWasPressed.set(false); + if (ourPressed.first.get() && event.getWhen() - ourLastTimePressed.get() > 500) { + resetState(); + } + + handleModifier(event); + return false; } + else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get() && myActionKeyCode != -1) { + if (keyCode == myActionKeyCode && !hasOtherModifiers(event)) { + if (event.getID() == KeyEvent.KEY_PRESSED) { + return run(event); + } + return true; + } + return false; + } + else { + ourLastTimePressed.set(event.getWhen()); + ourOtherKeyWasPressed.set(true); + if (keyCode == KeyEvent.VK_ESCAPE || keyCode == KeyEvent.VK_TAB) { + ourLastTimePressed.set(0); + } + } + resetState(); return false; } @@ -200,19 +209,22 @@ public final class ModifierKeyDoubleClickHandler implements Disposable { ourPressed.first.set(true); ourLastTimePressed.set(event.getWhen()); return; - } else { + } + else { if (ourPressed.first.get() && ourReleased.first.get()) { ourPressed.second.set(true); ourLastTimePressed.set(event.getWhen()); return; } } - } else if (event.getID() == KeyEvent.KEY_RELEASED) { + } + else if (event.getID() == KeyEvent.KEY_RELEASED) { if (ourPressed.first.get() && !ourReleased.first.get()) { ourReleased.first.set(true); ourLastTimePressed.set(event.getWhen()); return; - } else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get()) { + } + else if (ourPressed.first.get() && ourReleased.first.get() && ourPressed.second.get()) { resetState(); if (myActionKeyCode == -1 && !shouldSkipIfActionHasShortcut()) { run(event); @@ -273,15 +285,6 @@ public final class ModifierKeyDoubleClickHandler implements Disposable { return mySkipIfActionHasShortcut && getActiveKeymapShortcuts(myActionId).getShortcuts().length > 0; } - @Override - public void beforeActionPerformed(@NotNull AnAction action, @NotNull DataContext dataContext, @NotNull AnActionEvent event) { - if (!myIsRunningAction) resetState(); - } - - @Override - public void dispose() { - } - @Override public String toString() { return "modifier double-click dispatcher [modifierKeyCode=" + myModifierKeyCode + diff --git a/platform/platform-resources/src/componentSets/Editor.xml b/platform/platform-resources/src/componentSets/Editor.xml index d3eeec30b575..8beff2d28abd 100644 --- a/platform/platform-resources/src/componentSets/Editor.xml +++ b/platform/platform-resources/src/componentSets/Editor.xml @@ -6,11 +6,9 @@ com.intellij.openapi.editor.impl.VisibleEditorsTracker - - com.intellij.openapi.keymap.impl.ModifierKeyDoubleClickHandler - +