diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java index d106ad5c4d..c45c797735 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java @@ -37,6 +37,9 @@ public interface GerritResources extends ClientBundle { @Source("editText.png") public ImageResource edit(); + @Source("mediaFloppy.png") + public ImageResource save(); + @Source("starOpen.gif") public ImageResource starOpen(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox2.java index d3fce02a44..786df47ecd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox2.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox2.java @@ -16,8 +16,8 @@ package com.google.gerrit.client.diff; import com.google.gerrit.client.Dispatcher; import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.VoidResult; import com.google.gerrit.client.WebLinkInfo; -import com.google.gerrit.client.change.EditFileAction; import com.google.gerrit.client.changes.ChangeFileApi; import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo; import com.google.gerrit.client.patches.PatchUtil; @@ -139,21 +139,35 @@ class PatchSetSelectBox2 extends Composite { } private Widget createEditIcon() { - Anchor anchor = new Anchor( + final Anchor anchor = new Anchor( new ImageResourceRenderer().render(Gerrit.RESOURCES.edit())); anchor.addClickHandler(new ClickHandler() { + boolean editing = false; @Override public void onClick(ClickEvent event) { final PatchSet.Id id = (idActive == null) ? other.idActive : idActive; - ChangeFileApi.getContent(id, path, - new GerritCallback() { - @Override - public void onSuccess(String result) { - EditFileAction edit = new EditFileAction( - id, result, path, style.replyBox(), null, icon); - edit.onEdit(); - } - }); + editing = !editing; + parent.editSideB(editing); + + if (editing) { + ChangeFileApi.getContent(id, path, + new GerritCallback() { + @Override + public void onSuccess(String content) { + parent.setSideBContent(content); + } + }); + anchor.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.save())); + } else { + anchor.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.edit())); + String siteBContent = parent.getSideBContent(); + ChangeFileApi.putContent(id, path, siteBContent, + new GerritCallback() { + @Override + public void onSuccess(VoidResult result) { + } + }); + } } }); anchor.setTitle(PatchUtil.C.edit()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java index 641f5a64a9..2547a4f106 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java @@ -132,6 +132,8 @@ public class SideBySide2 extends Screen { private List handlers; private PreferencesAction prefsAction; private int reloadVersionId; + private KeyMap sbsKeyMap; + private boolean isEdited = false; public SideBySide2( PatchSet.Id base, @@ -338,7 +340,7 @@ public class SideBySide2 extends Screen { cm.on("cursorActivity", updateActiveLine(cm)); cm.on("gutterClick", onGutterClick(cm)); cm.on("focus", updateActiveLine(cm)); - cm.addKeyMap(KeyMap.create() + sbsKeyMap = KeyMap.create() .on("A", upToChange(true)) .on("U", upToChange(false)) .on("[", header.navigate(Direction.PREV)) @@ -403,7 +405,8 @@ public class SideBySide2 extends Screen { public void run() { cm.execCommand("selectAll"); } - })); + }); + cm.addKeyMap(sbsKeyMap); if (prefs.renderEntireFile()) { cm.addKeyMap(RENDER_ENTIRE_FILE_KEYMAP); } @@ -415,6 +418,9 @@ public class SideBySide2 extends Screen { @Override public void handle(CodeMirror cm, LineCharacter anchor, LineCharacter head) { + if (isEdited) { + return; + } if (anchor == head || (anchor.getLine() == head.getLine() && anchor.getCh() == head.getCh())) { @@ -533,6 +539,30 @@ public class SideBySide2 extends Screen { })); } + public void editSideB(boolean state) { + isEdited = state; + cmB.setOption("readOnly", !state); + JumpKeys.enable(!state); + if (state) { + removeKeyHandlerRegistrations(); + cmB.removeKeyMap(sbsKeyMap); + cmB.setOption("keyMap", "default"); + cmB.focus(); + } else { + cmB.setOption("keyMap", "vim_ro"); + cmB.addKeyMap(sbsKeyMap); + registerKeys(); + } + } + + public String getSideBContent() { + return cmB.getValue(); + } + + public void setSideBContent(String content) { + cmB.setValue(content); + } + private void display(final CommentsCollections comments) { setThemeStyles(prefs.theme().isDark()); setShowTabs(prefs.showTabs()); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/mediaFloppy.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/mediaFloppy.png new file mode 100644 index 0000000000..f1d7a19859 Binary files /dev/null and b/gerrit-gwtui/src/main/java/com/google/gerrit/client/mediaFloppy.png differ diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java index 941ef7a30b..4b8970a14b 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java @@ -96,7 +96,15 @@ public class CodeMirror extends JavaScriptObject { private final native void addLineClassNative(LineHandle line, String where, String lineClass) /*-{ - this.addLineClass(line, where, lineClass); + try { + this.addLineClass(line, where, lineClass); + } catch (err) { + if ("TypeError: Cannot read property 'parrent' of undefinded" == err.toString()) { + // ignore CodeMirror bug after going to new line + return; + } + throw err; + } }-*/; public final void removeLineClass(int line, LineClassWhere where, @@ -362,4 +370,8 @@ public class CodeMirror extends JavaScriptObject { public interface BeforeSelectionChangeHandler { public void handle(CodeMirror instance, LineCharacter anchor, LineCharacter head); } + + public final native String getValue() /*-{ + return this.getValue(); + }-*/; }