Search in sources :

Example 1 with CommandBinding

use of org.rstudio.core.client.command.KeyMap.CommandBinding in project rstudio by rstudio.

the class ShortcutManager method handleKeyDown.

private boolean handleKeyDown(NativeEvent event) {
    // generated by Qt when commands executed from menu.
    if (activeEditEventType_ != EditEvent.TYPE_NONE) {
        final int type = activeEditEventType_;
        Scheduler.get().scheduleDeferred(new ScheduledCommand() {

            @Override
            public void execute() {
                events_.fireEvent(new EditEvent(false, type));
            }
        });
        activeEditEventType_ = EditEvent.TYPE_NONE;
        keyBuffer_.clear();
        return false;
    }
    // modal dialogs)
    if (!isEnabled())
        return false;
    // Don't dispatch on bare modifier keypresses.
    if (KeyboardHelper.isModifierKey(event.getKeyCode()))
        return false;
    // practice, this is better than breaking copy + paste everywhere else...
    if (isEditKeyCombination(event)) {
        Element target = Element.as(event.getEventTarget());
        AceEditorNative editor = AceEditorNative.getEditor(target);
        if (editor == null) {
            keyBuffer_.clear();
            return false;
        }
    }
    // Escape key should always clear the keybuffer.
    if (event.getKeyCode() == KeyCodes.KEY_ESCAPE) {
        keyBuffer_.clear();
        return false;
    }
    int keyCode = event.getKeyCode();
    int modifier = KeyboardShortcut.getModifierValue(event);
    // since we have code wired to that expectation
    if (keyCode == 173)
        keyCode = 189;
    KeyCombination keyCombination = new KeyCombination(keyCode, modifier);
    // is focused.
    if (keyCombination.getKeyCode() == KeyCodes.KEY_F && keyCombination.getModifier() == KeyboardShortcut.CTRL) {
        Element target = Element.as(event.getEventTarget());
        AceEditorNative editor = AceEditorNative.getEditor(target);
        if (editor != null && editor.isVimModeOn()) {
            keyBuffer_.clear();
            return false;
        }
    }
    // Bail if this is an ignored key combination.
    if (isIgnoredKeyCombination(keyCombination)) {
        keyBuffer_.clear();
        return false;
    }
    keyBuffer_.add(keyCombination);
    // Loop through all active key maps, and attempt to find an active
    // binding. 'pending' is used to indicate whether there are any bindings
    // following the current state of the keybuffer.
    boolean pending = false;
    for (Map.Entry<KeyMapType, KeyMap> entry : keyMaps_.entrySet()) {
        KeyMap map = entry.getValue();
        CommandBinding binding = map.getActiveBinding(keyBuffer_);
        if (binding != null) {
            keyBuffer_.clear();
            if (XTermWidget.isXTerm(Element.as(event.getEventTarget()))) {
                if (binding.getId() == "consoleClear") {
                    // special case; we expect users will try to use Ctrl+L to
                    // clear the terminal, and don't want that to actually
                    // clear the currently hidden console instead
                    event.stopPropagation();
                    commands_.clearTerminalScrollbackBuffer().execute();
                    return false;
                } else if (binding.getId() == "closeSourceDoc") {
                    // when focus is in the terminal and let terminal see keys
                    return false;
                }
                if (binding.getContext() != AppCommand.Context.Workbench && binding.getContext() != AppCommand.Context.Addin && binding.getContext() != AppCommand.Context.PackageDevelopment) {
                    // Let terminal see the keyboard input and don't execute command.
                    return false;
                }
            }
            event.stopPropagation();
            binding.execute();
            return true;
        }
        if (map.isPrefix(keyBuffer_))
            pending = true;
    }
    if (!(pending || isPrefixForEditor(keyCombination, event)))
        keyBuffer_.clear();
    // 'I', and some other cases)
    if (!keyBuffer_.isEmpty()) {
        KeyCombination keys = keyBuffer_.get(keyBuffer_.size() - 1);
        if (keys.getModifier() == KeyboardShortcut.NONE)
            keyBuffer_.clear();
    }
    return false;
}
Also used : Element(com.google.gwt.dom.client.Element) KeyCombination(org.rstudio.core.client.command.KeyboardShortcut.KeyCombination) CommandBinding(org.rstudio.core.client.command.KeyMap.CommandBinding) AceEditorNative(org.rstudio.studio.client.workbench.views.source.editors.text.ace.AceEditorNative) ScheduledCommand(com.google.gwt.core.client.Scheduler.ScheduledCommand) EditEvent(org.rstudio.studio.client.events.EditEvent) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) KeyMapType(org.rstudio.core.client.command.KeyMap.KeyMapType)

Example 2 with CommandBinding

use of org.rstudio.core.client.command.KeyMap.CommandBinding in project rstudio by rstudio.

the class AddinsCommandManager method registerBindings.

private void registerBindings(final EditorKeyBindings bindings, final CommandWithArg<EditorKeyBindings> afterLoad) {
    List<Pair<List<KeySequence>, CommandBinding>> commands = new ArrayList<Pair<List<KeySequence>, CommandBinding>>();
    RAddins rAddins = MainWindowObject.rAddins().get();
    for (String id : bindings.iterableKeys()) {
        List<KeySequence> keyList = bindings.get(id).getKeyBindings();
        RAddin addin = rAddins.get(id);
        if (addin == null)
            continue;
        CommandBinding binding = new AddinCommandBinding(addin);
        commands.add(new Pair<List<KeySequence>, CommandBinding>(keyList, binding));
    }
    KeyMap map = ShortcutManager.INSTANCE.getKeyMap(KeyMapType.ADDIN);
    for (int i = 0; i < commands.size(); i++) {
        map.setBindings(commands.get(i).first, commands.get(i).second);
    }
    if (afterLoad != null)
        afterLoad.execute(bindings);
}
Also used : RAddin(org.rstudio.studio.client.workbench.addins.Addins.RAddin) RAddins(org.rstudio.studio.client.workbench.addins.Addins.RAddins) ArrayList(java.util.ArrayList) AddinCommandBinding(org.rstudio.core.client.command.AddinCommandBinding) CommandBinding(org.rstudio.core.client.command.KeyMap.CommandBinding) AddinCommandBinding(org.rstudio.core.client.command.AddinCommandBinding) ArrayList(java.util.ArrayList) List(java.util.List) KeySequence(org.rstudio.core.client.command.KeyboardShortcut.KeySequence) Pair(org.rstudio.core.client.Pair) KeyMap(org.rstudio.core.client.command.KeyMap)

Aggregations

CommandBinding (org.rstudio.core.client.command.KeyMap.CommandBinding)2 ScheduledCommand (com.google.gwt.core.client.Scheduler.ScheduledCommand)1 Element (com.google.gwt.dom.client.Element)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 Map (java.util.Map)1 Pair (org.rstudio.core.client.Pair)1 AddinCommandBinding (org.rstudio.core.client.command.AddinCommandBinding)1 KeyMap (org.rstudio.core.client.command.KeyMap)1 KeyMapType (org.rstudio.core.client.command.KeyMap.KeyMapType)1 KeyCombination (org.rstudio.core.client.command.KeyboardShortcut.KeyCombination)1 KeySequence (org.rstudio.core.client.command.KeyboardShortcut.KeySequence)1 EditEvent (org.rstudio.studio.client.events.EditEvent)1 RAddin (org.rstudio.studio.client.workbench.addins.Addins.RAddin)1 RAddins (org.rstudio.studio.client.workbench.addins.Addins.RAddins)1 AceEditorNative (org.rstudio.studio.client.workbench.views.source.editors.text.ace.AceEditorNative)1