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
This commit is contained in:
Michael Zhou
2013-07-30 14:27:37 -07:00
parent 2c702aaf5a
commit aa5a928b6e
8 changed files with 256 additions and 23 deletions

View File

@@ -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<JsArray<CommentInfo>> comments,
NativeMap<JsArray<CommentInfo>> drafts) {
JsArray<FileInfo> list = fileMap.values();
Collections.sort(Natives.asList(list), new Comparator<FileInfo>() {
@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);

View File

@@ -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<FileInfo> list) {
Collections.sort(Natives.asList(list), new Comparator<FileInfo>() {
@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() {
}
}

View File

@@ -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<HTMLPanel, NavLinks2> {}
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<NativeMap<FileInfo>>() {
@Override
public void onSuccess(NativeMap<FileInfo> result) {
result.copyKeysIntoChildren("path");
JsArray<FileInfo> 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;
}
}

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<ui:UiBinder
xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ge='urn:import:com.google.gerrit.client.ui'>
<ui:style>
.table {
table-layout: fixed;
width: 100%;
}
.prev {
text-align: left;
}
.up {
text-align: center;
}
.next {
text-align: right;
}
</ui:style>
<g:HTMLPanel>
<table ui:field='table' class='{style.table}'>
<tr>
<td class='{style.prev}'>
<ge:InlineHyperlink ui:field='prevLink'/>
</td>
<td class='{style.up}'>
<ge:InlineHyperlink ui:field='upLink'>
<ui:msg>&#x21e7;Up to change</ui:msg>
</ge:InlineHyperlink>
</td>
<td class='{style.next}'>
<ge:InlineHyperlink ui:field='nextLink'/>
</td>
</tr>
</table>
</g:HTMLPanel>
</ui:UiBinder>

View File

@@ -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);

View File

@@ -19,6 +19,7 @@ limitations under the License.
xmlns:d='urn:import:com.google.gerrit.client.diff'>
<g:HTMLPanel>
<d:ReviewedPanel ui:field='reviewed'/>
<d:DiffTable ui:field='diffTable' />
<d:NavLinks2 ui:field='navLinks'/>
<d:DiffTable ui:field='diffTable'/>
</g:HTMLPanel>
</ui:UiBinder>

View File

@@ -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())));
}
}

View File

@@ -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)) {