mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
productivity guide entry for adding carets using DoubleCtrl+arrows
This commit is contained in:
+5
@@ -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;
|
||||
|
||||
+31
-19
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user