From a61091911c9ebda06fa148bbc60fac0902a15210 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Mon, 17 Nov 2014 14:34:02 +0300 Subject: [PATCH] productivity guide entry for adding carets using DoubleCtrl+arrows --- .../actions/CloneCaretActionHandler.java | 5 ++ .../impl/ModifierKeyDoubleClickHandler.java | 50 ++++++++++++------- .../FeatureStatisticsBundle.properties | 1 + .../src/ProductivityFeaturesRegistry.xml | 3 ++ 4 files changed, 40 insertions(+), 19 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/actions/CloneCaretActionHandler.java b/platform/platform-impl/src/com/intellij/openapi/editor/actions/CloneCaretActionHandler.java index 5c5528a38153..00950a5fc0b3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/actions/CloneCaretActionHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/actions/CloneCaretActionHandler.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.actions; +import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Caret; @@ -22,6 +23,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorLastActionTracker; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.keymap.impl.ModifierKeyDoubleClickHandler; import com.intellij.openapi.util.Key; import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.Nullable; @@ -54,6 +56,9 @@ public class CloneCaretActionHandler extends EditorActionHandler { @Override protected void doExecute(Editor editor, @Nullable Caret targetCaret, DataContext dataContext) { + if (ModifierKeyDoubleClickHandler.getInstance().isRunningAction() && !isRepeatedActionInvocation()) { + FeatureUsageTracker.getInstance().triggerFeatureUsed("editing.add.carets.using.double.ctrl"); + } if (targetCaret != null) { targetCaret.clone(myCloneAbove); return; 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 428ee596b465..245c212f39cc 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 @@ -45,9 +45,19 @@ import java.util.concurrent.atomic.AtomicLong; * SearchEverywhere behaviour remains intact. */ public class ModifierKeyDoubleClickHandler { + private static final TIntIntHashMap KEY_CODE_TO_MODIFIER_MAP = new TIntIntHashMap(); + static { + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_ALT, InputEvent.ALT_MASK); + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_CONTROL, InputEvent.CTRL_MASK); + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_META, InputEvent.META_MASK); + KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_SHIFT, InputEvent.SHIFT_MASK); + } + private static final ModifierKeyDoubleClickHandler INSTANCE = new ModifierKeyDoubleClickHandler(); private final ConcurrentMap myDispatchers = new ConcurrentHashMap(); + + private boolean myIsRunningAction; private ModifierKeyDoubleClickHandler() { } @@ -78,15 +88,11 @@ public class ModifierKeyDoubleClickHandler { } } - private static class MyDispatcher implements IdeEventQueue.EventDispatcher { - private static final TIntIntHashMap KEY_CODE_TO_MODIFIER_MAP = new TIntIntHashMap(); - static { - KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_ALT, InputEvent.ALT_MASK); - KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_CONTROL, InputEvent.CTRL_MASK); - KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_META, InputEvent.META_MASK); - KEY_CODE_TO_MODIFIER_MAP.put(KeyEvent.VK_SHIFT, InputEvent.SHIFT_MASK); - } + public boolean isRunningAction() { + return myIsRunningAction; + } + private class MyDispatcher implements IdeEventQueue.EventDispatcher { private final String myActionId; private final int myModifierKeyCode; private final int myActionKeyCode; @@ -196,17 +202,23 @@ public class ModifierKeyDoubleClickHandler { } private void run(KeyEvent event) { - final ActionManagerEx actionManager = ActionManagerEx.getInstanceEx(); - final AnAction action = actionManager.getAction(myActionId); - final AnActionEvent anActionEvent = new AnActionEvent(event, - DataManager.getInstance().getDataContext(IdeFocusManager.findInstance().getFocusOwner()), - ActionPlaces.MAIN_MENU, - action.getTemplatePresentation(), - actionManager, - 0); - actionManager.fireBeforeActionPerformed(action, anActionEvent.getDataContext(), anActionEvent); - action.actionPerformed(anActionEvent); - actionManager.fireAfterActionPerformed(action, anActionEvent.getDataContext(), anActionEvent); + myIsRunningAction = true; + try { + final ActionManagerEx actionManager = ActionManagerEx.getInstanceEx(); + final AnAction action = actionManager.getAction(myActionId); + final AnActionEvent anActionEvent = new AnActionEvent(event, + DataManager.getInstance().getDataContext(IdeFocusManager.findInstance().getFocusOwner()), + ActionPlaces.MAIN_MENU, + action.getTemplatePresentation(), + actionManager, + 0); + actionManager.fireBeforeActionPerformed(action, anActionEvent.getDataContext(), anActionEvent); + action.actionPerformed(anActionEvent); + actionManager.fireAfterActionPerformed(action, anActionEvent.getDataContext(), anActionEvent); + } + finally { + myIsRunningAction = false; + } } private boolean isActionBound() { diff --git a/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties b/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties index 71b4935cf4aa..ca949a52cb0b 100644 --- a/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties +++ b/platform/platform-resources-en/src/messages/FeatureStatisticsBundle.properties @@ -61,6 +61,7 @@ editing.completion.changeSorting=Changing completion variants sorting editing.completion.postfix=Postfix completion editing.select.word=Syntax aware selection editing.incremental.search=Editor incremental search +editing.add.carets.using.double.ctrl=Multiple carets codeassists.quickjavadoc=Quick Documentation popup codeassists.quickdefinition=Quick Definition lookup codeassists.quickdefinition.lookup=Quick Definition in lookup lists diff --git a/resources/src/ProductivityFeaturesRegistry.xml b/resources/src/ProductivityFeaturesRegistry.xml index ecb81234f562..50201de3c73d 100644 --- a/resources/src/ProductivityFeaturesRegistry.xml +++ b/resources/src/ProductivityFeaturesRegistry.xml @@ -252,6 +252,9 @@ min-usage-count="10" first-show="2" successive-show="3"/> +