package org.rstudio.core.client.command; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayInteger; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.Command; import com.google.inject.Inject; import com.google.inject.Singleton; import org.rstudio.core.client.command.KeyboardShortcut.KeySequence; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.application.events.EventBus; import org.rstudio.studio.client.server.remote.ExecuteUserCommandEvent; import org.rstudio.studio.client.server.remote.RegisterUserCommandEvent; import org.rstudio.studio.client.workbench.views.source.editors.text.ace.Range; import java.util.HashMap; import java.util.Map; import java.util.Set; @Singleton public class UserCommandManager { public static class UserCommand { public UserCommand(String name, Command command) { name_ = name; command_ = command; } public String getName() { return name_; } public void execute() { command_.execute(); } private final String name_; private final Command command_; } public static class UserCommandResult extends JavaScriptObject { protected UserCommandResult() {} public native final String getAction() /*-{ return this.action; }-*/; public native final String getText() /*-{ return this.text; }-*/; private native final JsArrayInteger getRangeVector() /*-{ return this.range; }-*/; public final Range getRange() { JsArrayInteger rangeVector = getRangeVector(); return Range.create( rangeVector.get(0), rangeVector.get(1), rangeVector.get(2), rangeVector.get(3)); } } public UserCommandManager() { RStudioGinjector.INSTANCE.injectMembers(this); commandMap_ = new HashMap<KeyboardShortcut, UserCommand>(); events_.addHandler( RegisterUserCommandEvent.TYPE, new RegisterUserCommandEvent.Handler() { @Override public void onRegisterUserCommand(RegisterUserCommandEvent event) { UserCommandManager.this.onRegisterUserCommand(event); } }); } @Inject public void initialize(EventBus events) { events_ = events; } public boolean dispatch(KeyboardShortcut shortcut) { if (commandMap_.containsKey(shortcut)) { UserCommand command = commandMap_.get(shortcut); command.execute(); return true; } return false; } private void onRegisterUserCommand(RegisterUserCommandEvent event) { final String name = event.getData().getName(); JsArrayString shortcutStrings = event.getData().getShortcuts(); for (int i = 0; i < shortcutStrings.length(); i++) { String shortcutString = shortcutStrings.get(i); KeySequence sequence = KeySequence.fromShortcutString(shortcutString); assert sequence != null : "Failed to parse string '" + shortcutString + "'"; KeyboardShortcut shortcut = new KeyboardShortcut(sequence); UserCommand command = new UserCommand(name, new Command() { @Override public void execute() { events_.fireEvent(new ExecuteUserCommandEvent(name)); } }); commandMap_.put(shortcut, command); } } public Set<KeyboardShortcut> getKeyboardShortcuts() { return commandMap_.keySet(); } public Map<KeyboardShortcut, UserCommand> getCommands() { return commandMap_; } private final Map<KeyboardShortcut, UserCommand> commandMap_; // Injected ---- private EventBus events_; }