Java tutorial
// Copyright (C) 2015 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.googlesource.gerrit.plugins.xdocs.client; import com.google.gerrit.plugin.client.Plugin; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JsArray; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.InlineHyperlink; import com.google.gwt.user.client.ui.Label; import com.googlesource.gerrit.plugins.xdocs.client.ChangeInfo.RevisionInfo; public class PatchSetSelectBox extends FlowPanel { public enum DisplaySide { A, B } public static enum DiffView { SIDE_BY_SIDE, UNIFIED_DIFF } private final DiffView diffView; private final DisplaySide side; private final ChangeInfo change; private final Integer basePatchSet; private final int patchSet; private final String path; public PatchSetSelectBox(DiffView diffView, DisplaySide side, ChangeInfo change, Integer basePatchSet, int patchSet, String path) { this.diffView = diffView; this.side = side; this.change = change; this.path = path; this.basePatchSet = basePatchSet; this.patchSet = patchSet; init(); } private void init() { setStyleName("xdocs-patch-set-select-box"); if (isSideBySideDiff()) { addStyleName("xdocs-patch-set-select-box-side-by-side"); } addPatchSetLabel(); if (sideA()) { add(createBaseLink()); } else if (isUnifiedDiff()) { // create hidden 'Base' link to align the patch set links with side A add(createHiddenBaseLink()); } JsArray<RevisionInfo> list = change.revisions().values(); RevisionInfo.sortRevisionInfoByNumber(list); for (int i = 0; i < list.length(); i++) { add(createLink(list.get(i))); } if (!FileInfo.COMMIT_MSG.equals(path)) { add(createDownloadLink()); } if (showEditIcon()) { add(createEditIcon()); } } private void addPatchSetLabel() { add(new Label("Patch Set")); if (isUnifiedDiff()) { Label l = new Label(sideA() ? "(-)" : "(+)"); l.addStyleName("xdocs-monospace"); add(l); } } private boolean isSideBySideDiff() { return diffView == DiffView.SIDE_BY_SIDE; } private boolean isUnifiedDiff() { return diffView == DiffView.UNIFIED_DIFF; } private boolean sideA() { return side == DisplaySide.A; } private InlineHyperlink createBaseLink() { InlineHyperlink link = new InlineHyperlink("Base", getUrl(change._number(), null, patchSet, path, diffView)); if (isBaseSelected()) { link.setStyleName("xdocs-patch-set-select-box-selected"); } return link; } private InlineHyperlink createHiddenBaseLink() { InlineHyperlink link = new InlineHyperlink("Base", null); link.addStyleName("xdocs-hidden"); return link; } private InlineHyperlink createLink(RevisionInfo r) { String label = r.is_edit() ? "edit" : Integer.toString(r._number()); Integer patchSetIdA = sideA() ? Integer.valueOf(r._number()) : basePatchSet; int patchSetIdB = sideA() ? patchSet : r._number(); InlineHyperlink link = new InlineHyperlink(label, getUrl(change._number(), patchSetIdA, patchSetIdB, path, diffView)); if (isSelected(r._number())) { link.setStyleName("xdocs-patch-set-select-box-selected"); } return link; } private Anchor createDownloadLink() { String base = GWT.getHostPageBaseURL() + "cat/"; String sideUrl = isBaseSelected() ? "1" : "0"; int ps = isBaseSelected() ? change.revision(change.current_revision())._number() : getSelectedPatchSet(); Anchor anchor = new Anchor(new ImageResourceRenderer().render(XDocsPlugin.RESOURCES.downloadIcon()), base + URL.encode(change._number() + "," + ps + "," + path) + "^" + sideUrl); anchor.setTitle("Download"); return anchor; } private boolean showEditIcon() { if (sideA() || !change.isOpen() || !Plugin.get().isSignedIn()) { return false; } if (change.has_edit()) { return patchSet == 0; } else { return patchSet == change.revision(change.current_revision())._number(); } } private Anchor createEditIcon() { Anchor anchor = new Anchor(new ImageResourceRenderer().render(XDocsPlugin.RESOURCES.edit()), "#" + getEditUrl(change._number(), patchSet, path)); anchor.setTitle("Edit"); return anchor; } private Integer getSelectedPatchSet() { return sideA() ? basePatchSet : Integer.valueOf(patchSet); } private boolean isBaseSelected() { return getSelectedPatchSet() == null; } private boolean isSelected(int ps) { return getSelectedPatchSet() != null && getSelectedPatchSet().intValue() == ps; } private static String getUrl(int changeId, Integer patchSetIdA, int patchSetIdB, String path, DiffView diffView) { StringBuilder url = new StringBuilder(); url.append("/x/"); url.append(Plugin.get().getName()); url.append("/c/"); url.append(changeId); url.append("/"); if (patchSetIdA != null) { url.append(patchSetIdA); url.append(".."); } url.append(patchSetIdB); url.append("/"); url.append(path); if (diffView == DiffView.UNIFIED_DIFF) { url.append(",unified"); } return url.toString(); } private static String getEditUrl(int changeId, int patchSetId, String path) { StringBuilder url = new StringBuilder(); url.append("/c/"); url.append(changeId); url.append("/"); url.append(patchSetId); url.append("/"); url.append(path); url.append(",edit"); return url.toString(); } }