productivity guide entry for adding carets using DoubleCtrl+arrows

This commit is contained in:
Dmitry Batrak
2014-11-17 14:34:47 +03:00
parent 3070183594
commit a61091911c
4 changed files with 40 additions and 19 deletions
@@ -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;
@@ -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<String, IdeEventQueue.EventDispatcher> myDispatchers = new ConcurrentHashMap<String, IdeEventQueue.EventDispatcher>();
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() {
@@ -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
@@ -252,6 +252,9 @@
min-usage-count="10"
first-show="2"
successive-show="3"/>
<feature
id="editing.add.carets.using.double.ctrl"
tip-file="Multicursor.html"/>
</group>
<group id="codeassists">