Merge branch 'stable-2.8'

* stable-2.8:
  SideBySide2: Save all drafts when leaving / semi-auto focus on drafts
This commit is contained in:
Shawn Pearce
2013-11-28 14:47:48 -08:00
3 changed files with 68 additions and 12 deletions

View File

@@ -18,6 +18,7 @@ import com.google.gerrit.client.FormatUtil;
import com.google.gerrit.client.changes.CommentApi;
import com.google.gerrit.client.changes.CommentInfo;
import com.google.gerrit.client.changes.CommentInput;
import com.google.gerrit.client.rpc.CallbackGroup;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -175,7 +176,7 @@ class DraftBox extends CommentBox {
resizePaddingWidget();
}
private boolean isEdit() {
boolean isEdit() {
return UIObject.isVisible(p_edit);
}
@@ -205,6 +206,7 @@ class DraftBox extends CommentBox {
} else {
expandTimer.cancel();
}
parent.updateUnsaved(this, edit);
resizePaddingWidget();
}
@@ -257,10 +259,10 @@ class DraftBox extends CommentBox {
@UiHandler("save")
void onSave(ClickEvent e) {
e.stopPropagation();
onSave();
save(null);
}
private void onSave() {
void save(CallbackGroup group) {
String message = editArea.getValue().trim();
if (message.length() == 0) {
return;
@@ -280,6 +282,7 @@ class DraftBox extends CommentBox {
if (autoClosed) {
setOpen(false);
}
parent.updateUnsaved(DraftBox.this, false);
}
@Override
@@ -289,9 +292,10 @@ class DraftBox extends CommentBox {
}
};
if (original.id() == null) {
CommentApi.createDraft(psId, input, cb);
CommentApi.createDraft(psId, input, group == null ? cb : group.add(cb));
} else {
CommentApi.updateDraft(psId, original.id(), input, cb);
CommentApi.updateDraft(
psId, original.id(), input, group == null ? cb : group.add(cb));
}
getCm().focus();
}
@@ -342,7 +346,7 @@ class DraftBox extends CommentBox {
case 's':
case 'S':
e.preventDefault();
onSave();
save(null);
return;
}
} else if (e.getNativeKeyCode() == KeyCodes.KEY_ESCAPE && !isDirty()) {

View File

@@ -87,8 +87,10 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SideBySide2 extends Screen {
interface Binder extends UiBinder<FlowPanel, SideBySide2> {}
@@ -127,6 +129,7 @@ public class SideBySide2 extends Screen {
private Map<LineHandle, LinePaddingWidgetWrapper> linePaddingOnOtherSideMap;
private List<DiffChunkInfo> diffChunks;
private List<SkippedLine> skips;
private Set<DraftBox> unsaved;
private int context;
private KeyCommandSet keysNavigation;
@@ -150,6 +153,7 @@ public class SideBySide2 extends Screen {
}
context = pref.getContext();
unsaved = new HashSet<DraftBox>();
handlers = new ArrayList<HandlerRegistration>(6);
// TODO: Re-implement necessary GlobalKey bindings.
addDomHandler(GlobalKey.STOP_PROPAGATION, KeyPressEvent.getType());
@@ -249,6 +253,7 @@ public class SideBySide2 extends Screen {
protected void onUnload() {
super.onUnload();
saveAllDrafts(null);
removeKeyHandlerRegs();
if (resizeHandler != null) {
resizeHandler.removeHandler();
@@ -605,7 +610,7 @@ public class SideBySide2 extends Screen {
return box;
}
CommentBox addCommentBox(CommentInfo info, CommentBox box) {
CommentBox addCommentBox(CommentInfo info, final CommentBox box) {
box.setParent(this);
diffTable.add(box);
DisplaySide side = box.getSide();
@@ -652,6 +657,17 @@ public class SideBySide2 extends Screen {
box instanceof DraftBox
? SidePanel.GutterType.DRAFT
: SidePanel.GutterType.COMMENT));
if (box instanceof DraftBox) {
boxWidget.onRedraw(new Runnable() {
@Override
public void run() {
DraftBox draftBox = (DraftBox) box;
if (draftBox.isEdit()) {
draftBox.editArea.setFocus(true);
}
}
});
}
return box;
}
@@ -662,6 +678,21 @@ public class SideBySide2 extends Screen {
List<PublishedBox> list = linePublishedBoxesMap.get(handle);
lineActiveBoxMap.put(handle, list.get(list.size() - 1));
}
unsaved.remove(box);
}
void updateUnsaved(DraftBox box, boolean isUnsaved) {
if (isUnsaved) {
unsaved.add(box);
} else {
unsaved.remove(box);
}
}
private void saveAllDrafts(CallbackGroup cb) {
for (DraftBox box : unsaved) {
box.save(cb);
}
}
void addFileCommentBox(CommentBox box) {
@@ -1057,15 +1088,30 @@ public class SideBySide2 extends Screen {
private Runnable upToChange(final boolean openReplyBox) {
return new Runnable() {
public void run() {
String b = base != null ? String.valueOf(base.get()) : null;
String rev = String.valueOf(revision.get());
Gerrit.display(
PageLinks.toChange(changeId, rev),
new ChangeScreen2(changeId, b, rev, openReplyBox));
if (unsaved.isEmpty()) {
goUpToChange(openReplyBox);
} else {
CallbackGroup group = new CallbackGroup();
saveAllDrafts(group);
group.addFinal(new GerritCallback<Void>() {
@Override
public void onSuccess(Void result) {
goUpToChange(openReplyBox);
}
}).onSuccess(null);
}
}
};
}
private void goUpToChange(boolean openReplyBox) {
String b = base != null ? String.valueOf(base.get()) : null;
String rev = String.valueOf(revision.get());
Gerrit.display(
PageLinks.toChange(changeId, rev),
new ChangeScreen2(changeId, b, rev, openReplyBox));
}
private Runnable openClosePublished(final CodeMirror cm) {
return new Runnable() {
@Override

View File

@@ -25,6 +25,12 @@ public class LineWidget extends JavaScriptObject {
public final native void clear() /*-{ this.clear(); }-*/;
public final native void changed() /*-{ this.changed(); }-*/;
public final native void onRedraw(Runnable thunk) /*-{
this.on("redraw", $entry(function() {
thunk.@java.lang.Runnable::run()();
}));
}-*/;
public final native void onFirstRedraw(Runnable thunk) /*-{
var w = this;
var h = $entry(function() {