InlineEdit: Support Emacs and Vim key maps

Change-Id: I980afc3848f267811ab5890f9447fba16beed5d4
This commit is contained in:
David Ostrovsky
2015-05-14 22:33:16 +02:00
parent 8018fbbc1e
commit c4e01806ff
10 changed files with 98 additions and 7 deletions

View File

@@ -20,6 +20,7 @@ import com.google.gerrit.client.account.AccountApi;
import com.google.gerrit.client.account.EditPreferences;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.NpIntTextBox;
import com.google.gerrit.extensions.client.KeyMapType;
import com.google.gerrit.extensions.client.Theme;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
@@ -61,6 +62,7 @@ class EditPreferencesBox extends Composite {
@UiField ToggleButton whitespaceErrors;
@UiField ToggleButton lineNumbers;
@UiField ListBox theme;
@UiField ListBox keyMap;
@UiField Button apply;
@UiField Button save;
@@ -68,6 +70,7 @@ class EditPreferencesBox extends Composite {
this.view = view;
initWidget(uiBinder.createAndBindUi(this));
initTheme();
initKeyMapType();
}
void set(EditPreferences prefs) {
@@ -81,6 +84,7 @@ class EditPreferencesBox extends Composite {
whitespaceErrors.setValue(prefs.showWhitespaceErrors());
lineNumbers.setValue(prefs.hideLineNumbers());
setTheme(prefs.theme());
setKeyMapType(prefs.keyMapType());
}
@UiHandler("tabWidth")
@@ -150,6 +154,14 @@ class EditPreferencesBox extends Composite {
});
}
@UiHandler("keyMap")
void onKeyMap(@SuppressWarnings("unused") ChangeEvent e) {
KeyMapType keyMapType = KeyMapType.valueOf(
keyMap.getValue(keyMap.getSelectedIndex()));
prefs.keyMapType(keyMapType);
view.getEditor().setOption("keyMap", keyMapType.name().toLowerCase());
}
@UiHandler("apply")
void onApply(@SuppressWarnings("unused") ClickEvent e) {
close();
@@ -210,4 +222,27 @@ class EditPreferencesBox extends Composite {
Theme.TWILIGHT.name().toLowerCase(),
Theme.TWILIGHT.name());
}
private void setKeyMapType(KeyMapType v) {
String name = v != null ? v.name() : KeyMapType.DEFAULT.name();
for (int i = 0; i < keyMap.getItemCount(); i++) {
if (keyMap.getValue(i).equals(name)) {
keyMap.setSelectedIndex(i);
return;
}
}
keyMap.setSelectedIndex(0);
}
private void initKeyMapType() {
keyMap.addItem(
KeyMapType.DEFAULT.name().toLowerCase(),
KeyMapType.DEFAULT.name());
keyMap.addItem(
KeyMapType.EMACS.name().toLowerCase(),
KeyMapType.EMACS.name());
keyMap.addItem(
KeyMapType.VIM.name().toLowerCase(),
KeyMapType.VIM.name());
}
}

View File

@@ -165,6 +165,10 @@ limitations under the License.
<th><ui:msg>Theme</ui:msg></th>
<td><g:ListBox ui:field='theme'/></td>
</tr>
<tr>
<th><ui:msg>Key Map</ui:msg></th>
<td><g:ListBox ui:field='keyMap'/></td>
</tr>
<tr>
<th><ui:msg>Tab Width</ui:msg></th>
<td><x:NpIntTextBox ui:field='tabWidth'

View File

@@ -44,6 +44,7 @@ import com.google.gerrit.client.ui.InlineHyperlink;
import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.extensions.client.EditPreferencesInfo;
import com.google.gerrit.extensions.client.KeyMapType;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.core.client.GWT;
@@ -257,11 +258,18 @@ public class EditScreen extends Screen {
@Override
public void registerKeys() {
super.registerKeys();
cm.addKeyMap(KeyMap.create()
KeyMap localKeyMap = KeyMap.create();
localKeyMap
.on("Ctrl-L", gotoLine())
.on("Cmd-L", gotoLine())
.on("Cmd-S", save())
.on("Ctrl-S", save()));
.on("Cmd-S", save());
// TODO(davido): Find a better way to prevent key maps collisions
if (prefs.keyMapType() != KeyMapType.EMACS) {
localKeyMap.on("Ctrl-S", save());
}
cm.addKeyMap(localKeyMap);
}
private Runnable gotoLine() {
@@ -441,7 +449,7 @@ public class EditScreen extends Screen {
.set("scrollbarStyle", "overlay")
.set("styleSelectedText", true)
.set("showTrailingSpace", prefs.showWhitespaceErrors())
.set("keyMap", "default")
.set("keyMap", prefs.keyMapType().name().toLowerCase())
.set("theme", prefs.theme().name().toLowerCase())
.set("mode", mode != null ? mode.mode() : null));
}