From aa5a928b6eba1972c1ba800d7130b93ee463407a Mon Sep 17 00:00:00 2001 From: Michael Zhou Date: Tue, 30 Jul 2013 14:27:37 -0700 Subject: [PATCH] SideBySide2: Add NavLinks2 Implementing a new NavLinks. The current implementation is simple and hasn't taken care of PatchValidator yet. Added sortFileInfoByPath() to FileInfo. Change-Id: Ia3e07c613abff391533508f2d553f6b720d9f0db --- .../gerrit/client/change/FileTable.java | 15 +- .../google/gerrit/client/diff/FileInfo.java | 20 +++ .../google/gerrit/client/diff/NavLinks2.java | 128 ++++++++++++++++++ .../gerrit/client/diff/NavLinks2.ui.xml | 53 ++++++++ .../gerrit/client/diff/SideBySide2.java | 15 +- .../gerrit/client/diff/SideBySide2.ui.xml | 3 +- .../client/diff/UpToChangeCommand2.java | 38 ++++++ .../gerrit/client/ui/InlineHyperlink.java | 7 + 8 files changed, 256 insertions(+), 23 deletions(-) create mode 100644 gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.java create mode 100644 gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.ui.xml create mode 100644 gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand2.java diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java index a637fbe2d5..1bcab1af46 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java @@ -23,7 +23,6 @@ import com.google.gerrit.client.diff.FileInfo; import com.google.gerrit.client.patches.PatchUtil; import com.google.gerrit.client.rpc.CallbackGroup; import com.google.gerrit.client.rpc.NativeMap; -import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.rpc.RestApi; import com.google.gerrit.client.ui.NavigationTable; import com.google.gerrit.reviewdb.client.Change; @@ -53,8 +52,6 @@ import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; import com.google.gwtorm.client.KeyUtil; import java.sql.Timestamp; -import java.util.Collections; -import java.util.Comparator; class FileTable extends FlowPanel { static final FileTableResources R = GWT @@ -150,17 +147,7 @@ class FileTable extends FlowPanel { NativeMap> comments, NativeMap> drafts) { JsArray list = fileMap.values(); - Collections.sort(Natives.asList(list), new Comparator() { - @Override - public int compare(FileInfo a, FileInfo b) { - if (Patch.COMMIT_MSG.equals(a.path())) { - return -1; - } else if (Patch.COMMIT_MSG.equals(b.path())) { - return 1; - } - return a.path().compareTo(b.path()); - } - }); + FileInfo.sortFileInfoByPath(list); DisplayCommand cmd = new DisplayCommand(fileMap, list, myLastReply, comments, drafts); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/FileInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/FileInfo.java index d8fffc7fbf..4fa6596956 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/FileInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/FileInfo.java @@ -14,7 +14,13 @@ package com.google.gerrit.client.diff; +import com.google.gerrit.client.rpc.Natives; +import com.google.gerrit.reviewdb.client.Patch; import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.core.client.JsArray; + +import java.util.Collections; +import java.util.Comparator; public class FileInfo extends JavaScriptObject { public final native String path() /*-{ return this.path; }-*/; @@ -26,6 +32,20 @@ public class FileInfo extends JavaScriptObject { public final native int _row() /*-{ return this._row }-*/; public final native void _row(int r) /*-{ this._row = r }-*/; + public static void sortFileInfoByPath(JsArray list) { + Collections.sort(Natives.asList(list), new Comparator() { + @Override + public int compare(FileInfo a, FileInfo b) { + if (Patch.COMMIT_MSG.equals(a.path())) { + return -1; + } else if (Patch.COMMIT_MSG.equals(b.path())) { + return 1; + } + return a.path().compareTo(b.path()); + } + }); + } + protected FileInfo() { } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.java new file mode 100644 index 0000000000..d79531941b --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.java @@ -0,0 +1,128 @@ +// Copyright (C) 2010 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.client.diff; + +import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.changes.ChangeApi; +import com.google.gerrit.client.changes.Util; +import com.google.gerrit.client.patches.PatchUtil; +import com.google.gerrit.client.rpc.GerritCallback; +import com.google.gerrit.client.rpc.NativeMap; +import com.google.gerrit.client.ui.InlineHyperlink; +import com.google.gerrit.common.PageLinks; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.Patch; +import com.google.gerrit.reviewdb.client.PatchSet; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.event.dom.client.KeyPressEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwtexpui.globalkey.client.KeyCommand; +import com.google.gwtexpui.globalkey.client.KeyCommandSet; +import com.google.gwtexpui.safehtml.client.SafeHtml; +import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; +import com.google.gwtorm.client.KeyUtil; + +class NavLinks2 extends Composite { + interface Binder extends UiBinder {} + private static final Binder uiBinder = GWT.create(Binder.class); + + @UiField InlineHyperlink prevLink; + @UiField InlineHyperlink nextLink; + @UiField InlineHyperlink upLink; + + private final KeyCommandSet keys; + private final PatchSet.Id patchSetId; + private final String path; + + NavLinks2(KeyCommandSet keys, PatchSet.Id patchSetId, String path) { + initWidget(uiBinder.createAndBindUi(this)); + this.keys = keys; + this.patchSetId = patchSetId; + this.path = path; + upLink.setTargetHistoryToken(PageLinks.toChange2( + patchSetId.getParentKey(), + String.valueOf(patchSetId.get()))); + } + + @Override + protected void onLoad() { + ChangeApi.revision(patchSetId).view("files").get( + new GerritCallback>() { + @Override + public void onSuccess(NativeMap result) { + result.copyKeysIntoChildren("path"); + JsArray files = result.values(); + FileInfo.sortFileInfoByPath(files); + int index = 0; // TODO: Maybe use patchIndex. + for (int i = 0; i < files.length(); i++) { + if (path.equals(files.get(i).path())) { + index = i; + } + } + setupNav('[', PatchUtil.C.previousFileHelp(), + index == 0 ? null : files.get(index - 1)); + setupNav(']', PatchUtil.C.nextFileHelp(), + index == files.length() - 1 ? null : files.get(index + 1)); + } + }); + } + + private String url(FileInfo info) { + Change.Id c = patchSetId.getParentKey(); + StringBuilder p = new StringBuilder(); + p.append("/c/").append(c).append('/'); + p.append(patchSetId.get()).append('/').append(KeyUtil.encode(info.path())); + p.append(info.binary() ? ",unified" : ",cm"); + return p.toString(); + } + + private void setupNav(int key, String help, FileInfo info) { + if (info != null) { + final String url = url(info); + String fileName = getFileNameOnly(info.path()); + if (key == '[') { + prevLink.setTargetHistoryToken(url); + prevLink.setHTML(new SafeHtmlBuilder() + .append(SafeHtml.asis(Util.C.prevPatchLinkIcon())) + .append(fileName)); + } else { + nextLink.setTargetHistoryToken(url); + nextLink.setHTML(new SafeHtmlBuilder() + .append(fileName) + .append(SafeHtml.asis(Util.C.nextPatchLinkIcon()))); + } + keys.add(new KeyCommand(0, key, help) { + @Override + public void onKeyPress(KeyPressEvent event) { + Gerrit.display(url); + } + }); + } else { + keys.add(new UpToChangeCommand2(patchSetId, 0, key)); + } + } + + private static String getFileNameOnly(String path) { + String fileName = Patch.COMMIT_MSG.equals(path) + ? Util.C.commitMessage() + : path; + int s = fileName.lastIndexOf('/'); + return s >= 0 ? fileName.substring(s + 1) : fileName; + } +} diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.ui.xml new file mode 100644 index 0000000000..f8259799a3 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/NavLinks2.ui.xml @@ -0,0 +1,53 @@ + + + + + .table { + table-layout: fixed; + width: 100%; + } + .prev { + text-align: left; + } + .up { + text-align: center; + } + .next { + text-align: right; + } + + + + + + + + +
+ + + + ⇧Up to change + + + +
+
+
\ No newline at end of file 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 0551c7db58..93c0b83f94 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 @@ -94,6 +94,9 @@ public class SideBySide2 extends Screen { @UiField(provided = true) ReviewedPanel reviewed; + @UiField(provided = true) + NavLinks2 navLinks; + @UiField(provided = true) DiffTable diffTable; @@ -137,6 +140,8 @@ public class SideBySide2 extends Screen { // TODO: Re-implement necessary GlobalKey bindings. addDomHandler(GlobalKey.STOP_PROPAGATION, KeyPressEvent.getType()); reviewed = new ReviewedPanel(revision, path); + keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation()); + add(navLinks = new NavLinks2(keysNavigation, revision, path)); add(diffTable = new DiffTable(this, path)); add(uiBinder.createAndBindUi(this)); } @@ -276,13 +281,7 @@ public class SideBySide2 extends Screen { public void registerKeys() { super.registerKeys(); - keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation()); - keysNavigation.add(new KeyCommand(0, 'u', PatchUtil.C.upToChange()) { - @Override - public void onKeyPress(KeyPressEvent event) { - upToChange().run(); - } - }); + keysNavigation.add(new UpToChangeCommand2(revision, 0, 'u')); keysNavigation.add(new NoOpKeyCommand(0, 'j', PatchUtil.C.lineNext())); keysNavigation.add(new NoOpKeyCommand(0, 'k', PatchUtil.C.linePrev())); @@ -1029,7 +1028,7 @@ public class SideBySide2 extends Screen { return; } int h = Gerrit.getHeaderFooterHeight() + reviewed.getOffsetHeight() + - diffTable.getHeaderHeight() + 10; // Estimate + navLinks.getOffsetHeight() + diffTable.getHeaderHeight() + 10; // Estimate cmA.setHeight(Window.getClientHeight() - h); cmA.refresh(); cmB.setHeight(Window.getClientHeight() - h); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.ui.xml index 3b06ccd2bd..8719ecd11c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.ui.xml +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.ui.xml @@ -19,6 +19,7 @@ limitations under the License. xmlns:d='urn:import:com.google.gerrit.client.diff'> - + + diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand2.java new file mode 100644 index 0000000000..f40c4c1f86 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UpToChangeCommand2.java @@ -0,0 +1,38 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.client.diff; + +import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.patches.PatchUtil; +import com.google.gerrit.common.PageLinks; +import com.google.gerrit.reviewdb.client.PatchSet; +import com.google.gwt.event.dom.client.KeyPressEvent; +import com.google.gwtexpui.globalkey.client.KeyCommand; + +class UpToChangeCommand2 extends KeyCommand { + private final PatchSet.Id revision; + + UpToChangeCommand2(PatchSet.Id revision, int mask, int key) { + super(mask, key, PatchUtil.C.upToChange()); + this.revision = revision; + } + + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.toChange2( + revision.getParentKey(), + String.valueOf(revision.get()))); + } +} diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java index 8f64887e78..c2de9df440 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/InlineHyperlink.java @@ -33,6 +33,13 @@ public class InlineHyperlink extends super(text, token); } + /** + * Creates an empty link. + */ + public InlineHyperlink() { + super(); + } + @Override public void onBrowserEvent(final Event event) { if (DOM.eventGetType(event) == Event.ONCLICK && impl.handleAsClick(event)) {