Remove old change screen

The following code was removed:

UI:

  * ChangeScreen (1)
  * SideBySide (1)
  * NewChangeScreenBar

Database columns in the accounts table:

  * change_screen
  * reverse_patch_set_order
  * comment_visibility_strategy

Change-Id: I7ec4a0beb51dd6cb2f7c364df40e7cb5bea786d2
This commit is contained in:
David Ostrovsky 2013-09-08 19:14:58 +02:00 committed by Shawn Pearce
parent d9d64ecd6a
commit 36934dc6ef
59 changed files with 161 additions and 6120 deletions

View File

@ -1550,11 +1550,6 @@ Only used when `gerrit.reportBugUrl` is set.
+
Defaults to "Report Bug".
[[gerrit.changeScreen]]gerrit.changeScreen::
+
Default change screen UI to direct users to. Valid values are
`OLD_UI` and `CHANGE_SCREEN2`. Default is `CHANGE_SCREEN2`.
[[gerrit.disableReverseDnsLookup]]gerrit.disableReverseDnsLookup::
+
Disables reverse DNS lookup during computing ref log entry for identified user.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@ -902,7 +902,6 @@ link:#preferences-info[PreferencesInfo] entity.
"time_format": "HHMM_12",
"size_bar_in_change_table": true,
"review_category_strategy": "ABBREV",
"comment_visibility_strategy": "EXPAND_RECENT",
"diff_view": "SIDE_BY_SIDE",
"my": [
{
@ -957,7 +956,6 @@ link:#preferences-input[PreferencesInput] entity.
"time_format": "HHMM_12",
"size_bar_in_change_table": true,
"review_category_strategy": "NAME",
"comment_visibility_strategy": "EXPAND_RECENT",
"diff_view": "SIDE_BY_SIDE",
"my": [
{
@ -1006,7 +1004,6 @@ link:#preferences-info[PreferencesInfo] entity.
"time_format": "HHMM_12",
"size_bar_in_change_table": true,
"review_category_strategy": "NAME",
"comment_visibility_strategy": "EXPAND_RECENT",
"diff_view": "SIDE_BY_SIDE",
"my": [
{
@ -1380,8 +1377,6 @@ Allowed values are `STD`, `US`, `ISO`, `EURO`, `UK`.
|`time_format` ||
The format to display the time in.
Allowed values are `HHMM_12`, `HHMM_24`.
|`reverse_patch_set_order` |not set if `false`|
Whether to display the patch sets in reverse order.
|`relative_date_in_change_table` |not set if `false`|
Whether to show relative dates in the changes table.
|`size_bar_in_change_table` |not set if `false`|
@ -1391,15 +1386,9 @@ Whether to show change number in the change table.
|`review_category_strategy` ||
The strategy used to displayed info in the review category column.
Allowed values are `NONE`, `NAME`, `EMAIL`, `USERNAME`, `ABBREV`.
|`comment_visibility_strategy` ||
The strategy used to display the comments.
Allowed values are `COLLAPSE_ALL`, `EXPAND_MOST_RECENT`, `EXPAND_RECENT`, `EXPAND_ALL`.
|`diff_view` ||
The type of diff view to show.
Allowed values are `SIDE_BY_SIDE`, `UNIFIED_DIFF`.
|`change_screen` ||
The change screen to use.
Allowed values are `OLD_UI`, `CHANGE_SCREEN2`.
|=====================================
[[preferences-input]]
@ -1429,8 +1418,6 @@ Allowed values are `STD`, `US`, `ISO`, `EURO`, `UK`.
|`time_format` |optional|
The format to display the time in.
Allowed values are `HHMM_12`, `HHMM_24`.
|`reverse_patch_set_order` |optional|
Whether to display the patch sets in reverse order.
|`relative_date_in_change_table` |optional|
Whether to show relative dates in the changes table.
|`size_bar_in_change_table` |optional|
@ -1440,15 +1427,9 @@ Whether to show change number in the change table.
|`review_category_strategy` |optional|
The strategy used to displayed info in the review category column.
Allowed values are `NONE`, `NAME`, `EMAIL`, `USERNAME`, `ABBREV`.
|`comment_visibility_strategy` |optional|
The strategy used to display the comments.
Allowed values are `COLLAPSE_ALL`, `EXPAND_MOST_RECENT`, `EXPAND_RECENT`, `EXPAND_ALL`.
|`diff_view` |optional|
The type of diff view to show.
Allowed values are `SIDE_BY_SIDE`, `UNIFIED_DIFF`.
|`change_screen` |optional|
The change screen to use.
Allowed values are `OLD_UI`, `CHANGE_SCREEN2`.
|=====================================
[[diff-preferences-info]]

View File

@ -698,20 +698,6 @@ controls below the change info block.
image::images/user-review-ui-change-screen-plugin-extensions.png[width=800, link="images/user-review-ui-change-screen-plugin-extensions.png"]
[[old-change-screen]]
=== Old Change Screen
In addition to the normal change screen, this Gerrit version still
includes the old change screen that was used in earlier Gerrit
versions. Users that want to continue using the old change screen can
configure it in their preferences under
`Settings` > `Preferences` > `Change View`:
image::images/user-review-ui-change-view-preference.png[width=800, link="images/user-review-ui-change-view-preference.png"]
[WARNING]
The old change screen will be removed in a later version of Gerrit.
[[side-by-side]]
== Side-by-Side Diff Screen
@ -1156,15 +1142,6 @@ Limitations of the new review UI:
- The new side-by-side diff screen isn't able to highlight line
endings.
- Unified diff view is missing:
+
By setting `Diff View (New Change Screen)` in the user preferences to
`Unified Diff` the new change screen can be configured to open the file
diffs in the old unified diff view.
Users preferring the old review UI can link:#old-change-screen[
configure the change view] in their preferences.
GERRIT
------
Part of link:index.html[Gerrit Code Review]

View File

@ -1,127 +0,0 @@
// Copyright (C) 2008 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.common.data;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ApprovalDetail {
public static List<ApprovalDetail> sort(Collection<ApprovalDetail> ads,
final int owner) {
List<ApprovalDetail> sorted = new ArrayList<>(ads);
Collections.sort(sorted, new Comparator<ApprovalDetail>() {
@Override
public int compare(ApprovalDetail o1, ApprovalDetail o2) {
int byOwner = (o2.account.get() == owner ? 1 : 0)
- (o1.account.get() == owner ? 1 : 0);
return byOwner != 0 ? byOwner : (o1.hasNonZero - o2.hasNonZero);
}
});
return sorted;
}
protected Account.Id account;
protected List<PatchSetApproval> approvals;
protected boolean canRemove;
private Set<String> votable;
private transient Set<String> approved;
private transient Set<String> rejected;
private transient Map<String, Integer> values;
private transient int hasNonZero;
protected ApprovalDetail() {
}
public ApprovalDetail(final Account.Id id) {
account = id;
approvals = new ArrayList<>();
}
public Account.Id getAccount() {
return account;
}
public boolean canRemove() {
return canRemove;
}
public void setCanRemove(boolean removeable) {
canRemove = removeable;
}
public void approved(String label) {
if (approved == null) {
approved = new HashSet<>();
}
approved.add(label);
hasNonZero = 1;
}
public void rejected(String label) {
if (rejected == null) {
rejected = new HashSet<>();
}
rejected.add(label);
hasNonZero = 1;
}
public void votable(String label) {
if (votable == null) {
votable = new HashSet<>();
}
votable.add(label);
}
public void value(String label, int value) {
if (values == null) {
values = new HashMap<>();
}
values.put(label, value);
if (value != 0) {
hasNonZero = 1;
}
}
public boolean isApproved(String label) {
return approved != null && approved.contains(label);
}
public boolean isRejected(String label) {
return rejected != null && rejected.contains(label);
}
public boolean canVote(String label) {
return votable != null && votable.contains(label);
}
public int getValue(String label) {
if (values == null) {
return 0;
}
Integer v = values.get(label);
return v != null ? v : 0;
}
}

View File

@ -1,286 +0,0 @@
// Copyright (C) 2008 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.common.data;
import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchSet;
import java.util.List;
import java.util.Set;
/** Detail necessary to display a change. */
public class ChangeDetail {
protected AccountInfoCache accounts;
protected boolean allowsAnonymous;
protected boolean canAbandon;
protected boolean canEditCommitMessage;
protected boolean canCherryPick;
protected boolean canEditHashtags;
protected boolean canPublish;
protected boolean canRebase;
protected boolean canRestore;
protected boolean canRevert;
protected boolean canDeleteDraft;
protected Change change;
protected boolean starred;
protected List<ChangeInfo> dependsOn;
protected List<ChangeInfo> neededBy;
protected List<PatchSet> patchSets;
protected Set<PatchSet.Id> patchSetsWithDraftComments;
protected List<SubmitRecord> submitRecords;
protected SubmitType submitType;
protected SubmitTypeRecord submitTypeRecord;
protected boolean canSubmit;
protected boolean mergeable;
protected List<ChangeMessage> messages;
protected PatchSet.Id currentPatchSetId;
protected PatchSetDetail currentDetail;
protected boolean canEdit;
protected boolean canEditTopicName;
public ChangeDetail() {
}
public AccountInfoCache getAccounts() {
return accounts;
}
public void setAccounts(AccountInfoCache aic) {
accounts = aic;
}
public boolean isAllowsAnonymous() {
return allowsAnonymous;
}
public void setAllowsAnonymous(final boolean anon) {
allowsAnonymous = anon;
}
public boolean canAbandon() {
return canAbandon;
}
public void setCanAbandon(final boolean a) {
canAbandon = a;
}
public boolean canEditCommitMessage() {
return canEditCommitMessage;
}
public void setCanEditCommitMessage(final boolean a) {
canEditCommitMessage = a;
}
public boolean canCherryPick() {
return canCherryPick;
}
public void setCanCherryPick(final boolean a) {
canCherryPick = a;
}
public boolean getCanEditHashtags() {
return canEditHashtags;
}
public void setCanEditHashtags(final boolean a) {
canEditHashtags = a;
}
public boolean canPublish() {
return canPublish;
}
public void setCanPublish(final boolean a) {
canPublish = a;
}
public boolean canRebase() {
return canRebase;
}
public void setCanRebase(final boolean a) {
canRebase = a;
}
public boolean canRestore() {
return canRestore;
}
public void setCanRestore(final boolean a) {
canRestore = a;
}
public boolean canRevert() {
return canRevert;
}
public void setCanRevert(boolean a) {
canRevert = a;
}
public boolean canSubmit() {
return canSubmit;
}
public void setCanSubmit(boolean a) {
canSubmit = a;
}
public boolean canDeleteDraft() {
return canDeleteDraft;
}
public void setCanDeleteDraft(boolean a) {
canDeleteDraft = a;
}
public boolean canEditTopicName() {
return canEditTopicName;
}
public void setCanEditTopicName(boolean a) {
canEditTopicName = a;
}
public Change getChange() {
return change;
}
public void setChange(final Change change) {
this.change = change;
this.currentPatchSetId = change.currentPatchSetId();
}
public boolean isStarred() {
return starred;
}
public void setStarred(final boolean s) {
starred = s;
}
public List<ChangeInfo> getDependsOn() {
return dependsOn;
}
public void setDependsOn(List<ChangeInfo> d) {
dependsOn = d;
}
public List<ChangeInfo> getNeededBy() {
return neededBy;
}
public void setNeededBy(List<ChangeInfo> d) {
neededBy = d;
}
public List<ChangeMessage> getMessages() {
return messages;
}
public void setMessages(List<ChangeMessage> m) {
messages = m;
}
public List<PatchSet> getPatchSets() {
return patchSets;
}
public void setPatchSets(List<PatchSet> s) {
patchSets = s;
}
public void setPatchSetsWithDraftComments(Set<PatchSet.Id> pwdc) {
this.patchSetsWithDraftComments = pwdc;
}
public boolean hasDraftComments(PatchSet.Id id) {
return patchSetsWithDraftComments.contains(id);
}
public void setSubmitRecords(List<SubmitRecord> all) {
submitRecords = all;
}
public List<SubmitRecord> getSubmitRecords() {
return submitRecords;
}
public void setSubmitTypeRecord(SubmitTypeRecord submitTypeRecord) {
this.submitTypeRecord = submitTypeRecord;
}
public SubmitTypeRecord getSubmitTypeRecord() {
return submitTypeRecord;
}
public boolean isCurrentPatchSet(final PatchSetDetail detail) {
return currentPatchSetId != null
&& detail.getPatchSet().getId().equals(currentPatchSetId);
}
public PatchSet getCurrentPatchSet() {
if (currentPatchSetId != null) {
// We search through the list backwards because its *very* likely
// that the current patch set is also the last patch set.
//
for (int i = patchSets.size() - 1; i >= 0; i--) {
final PatchSet ps = patchSets.get(i);
if (ps.getId().equals(currentPatchSetId)) {
return ps;
}
}
}
return null;
}
public PatchSetDetail getCurrentPatchSetDetail() {
return currentDetail;
}
public void setCurrentPatchSetDetail(PatchSetDetail d) {
currentDetail = d;
}
public void setCurrentPatchSetId(final PatchSet.Id id) {
currentPatchSetId = id;
}
public String getDescription() {
return currentDetail != null ? currentDetail.getInfo().getMessage() : "";
}
public void setCanEdit(boolean a) {
canEdit = a;
}
public boolean canEdit() {
return canEdit;
}
public void setMergeable(boolean m) {
mergeable = m;
}
public boolean isMergeable() {
return mergeable;
}
}

View File

@ -16,7 +16,6 @@ package com.google.gerrit.common.data;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Account.FieldName;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme;
import com.google.gerrit.reviewdb.client.AuthType;
@ -53,7 +52,6 @@ public class GerritConfig implements Cloneable {
protected String anonymousCowardName;
protected int suggestFrom;
protected int changeUpdateDelay;
protected AccountGeneralPreferences.ChangeScreen changeScreen;
protected List<String> archiveFormats;
protected int largeChangeSize;
protected String replyLabel;
@ -278,14 +276,6 @@ public class GerritConfig implements Cloneable {
changeUpdateDelay = seconds;
}
public AccountGeneralPreferences.ChangeScreen getChangeScreen() {
return changeScreen;
}
public void setChangeScreen(AccountGeneralPreferences.ChangeScreen ui) {
this.changeScreen = ui;
}
public int getLargeChangeSize() {
return largeChangeSize;
}

View File

@ -1,117 +0,0 @@
// Copyright (C) 2009 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.common.data;
import java.util.ArrayList;
import java.util.List;
/**
* Result from adding or removing a reviewer from a change.
*/
public class ReviewerResult {
protected List<Error> errors;
protected ChangeDetail change;
protected int memberCount;
protected boolean askForConfirmation;
public ReviewerResult() {
errors = new ArrayList<>();
}
public void addError(final Error e) {
errors.add(e);
}
public List<Error> getErrors() {
return errors;
}
public ChangeDetail getChange() {
return change;
}
public void setChange(final ChangeDetail d) {
change = d;
}
public int getMemberCount() {
return memberCount;
}
public void setMemberCount(final int memberCount) {
this.memberCount = memberCount;
}
public boolean askForConfirmation() {
return askForConfirmation;
}
public void setAskForConfirmation(final boolean askForConfirmation) {
this.askForConfirmation = askForConfirmation;
}
public static class Error {
public static enum Type {
/** Name supplied does not match to a registered account or account group. */
REVIEWER_NOT_FOUND,
/** The account is inactive. */
ACCOUNT_INACTIVE,
/** The account is not permitted to see the change. */
CHANGE_NOT_VISIBLE,
/** The groups has no members. */
GROUP_EMPTY,
/** The groups has too many members. */
GROUP_HAS_TOO_MANY_MEMBERS,
/** The group is not allowed to be added as reviewer. */
GROUP_NOT_ALLOWED,
/** Could not remove this reviewer from the change due to ORMException. */
COULD_NOT_REMOVE,
/** Not permitted to remove this reviewer from the change. */
REMOVE_NOT_PERMITTED
}
protected Type type;
protected String name;
protected Error() {
}
public Error(final Type type, final String who) {
this.type = type;
this.name = who;
}
public Type getType() {
return type;
}
public String getName() {
return name;
}
@Override
public String toString() {
return type + " " + name;
}
}
}

View File

@ -68,11 +68,8 @@ import com.google.gerrit.client.api.ExtensionScreen;
import com.google.gerrit.client.change.ChangeScreen2;
import com.google.gerrit.client.change.FileTable;
import com.google.gerrit.client.changes.AccountDashboardScreen;
import com.google.gerrit.client.changes.ChangeScreen;
import com.google.gerrit.client.changes.CustomDashboardScreen;
import com.google.gerrit.client.changes.PatchTable;
import com.google.gerrit.client.changes.ProjectDashboardScreen;
import com.google.gerrit.client.changes.PublishCommentScreen;
import com.google.gerrit.client.changes.QueryScreen;
import com.google.gerrit.client.dashboards.DashboardInfo;
import com.google.gerrit.client.dashboards.DashboardList;
@ -82,14 +79,12 @@ import com.google.gerrit.client.documentation.DocScreen;
import com.google.gerrit.client.editor.EditScreen;
import com.google.gerrit.client.groups.GroupApi;
import com.google.gerrit.client.groups.GroupInfo;
import com.google.gerrit.client.patches.PatchScreen;
import com.google.gerrit.client.patches.UnifiedPatchScreen;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.PatchSetDetail;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Change;
@ -99,19 +94,11 @@ import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwtorm.client.KeyUtil;
public class Dispatcher {
public static final String COOKIE_CS2 = "gerrit_cs2";
public static boolean changeScreen2;
public static String toPatchSideBySide(final Patch.Key id) {
return toPatch("", null, id);
}
public static String toPatchSideBySide(PatchSet.Id diffBase, Patch.Key id) {
public static String toSideBySide(PatchSet.Id diffBase, Patch.Key id) {
return toPatch("", diffBase, id);
}
@ -130,18 +117,18 @@ public class Dispatcher {
return toPatch("unified", diffBase, revision, fileName, null, 0);
}
public static String toPatchUnified(final Patch.Key id) {
return toPatch("unified", null, id);
}
public static String toPatchUnified(PatchSet.Id diffBase, Patch.Key id) {
public static String toUnified(PatchSet.Id diffBase, Patch.Key id) {
return toPatch("unified", diffBase, id);
}
private static String toPatch(String type, PatchSet.Id diffBase, Patch.Key id) {
public static String toPatch(String type, PatchSet.Id diffBase, Patch.Key id) {
return toPatch(type, diffBase, id.getParentKey(), id.get(), null, 0);
}
public static String toEditScreen(PatchSet.Id revision, String fileName) {
return toPatch("edit", null, revision, fileName, null, 0);
}
private static String toPatch(String type, PatchSet.Id diffBase,
PatchSet.Id revision, String fileName, DisplaySide side, int line) {
Change.Id c = revision.getParentKey();
@ -151,7 +138,8 @@ public class Dispatcher {
p.append(diffBase.get()).append("..");
}
p.append(revision.getId()).append("/").append(KeyUtil.encode(fileName));
if (type != null && !type.isEmpty()) {
if (type != null && !type.isEmpty()
&& (!"sidebyside".equals(type) || preferUnified())) {
p.append(",").append(type);
}
if (side == DisplaySide.A && line > 0) {
@ -162,28 +150,6 @@ public class Dispatcher {
return p.toString();
}
public static String toPatch(final PatchScreen.Type type, final Patch.Key id) {
if (type == PatchScreen.Type.SIDE_BY_SIDE) {
return toPatchSideBySide(id);
} else {
return toPatchUnified(id);
}
}
public static String toEditScreen(PatchSet.Id revision, String fileName) {
Change.Id c = revision.getParentKey();
StringBuilder p = new StringBuilder();
p.append("/c/").append(c).append("/");
p.append(revision.getId()).append("/").append(KeyUtil.encode(fileName));
p.append(",edit");
return p.toString();
}
public static String toPublish(PatchSet.Id ps) {
Change.Id c = ps.getParentKey();
return "/c/" + c + "/" + ps.get() + ",publish";
}
public static String toGroup(final AccountGroup.Id id) {
return ADMIN_GROUPS + id.toString();
}
@ -275,7 +241,6 @@ public class Dispatcher {
Gerrit.display(token, new MyGroupsListScreen());
} else if (/* DEPRECATED URL */matchPrefix("/c2/", token)) {
changeScreen2 = true;
change(token);
} else if (/* LEGACY URL */matchPrefix("all,", token)) {
redirectFromLegacyToken(token, legacyAll(token));
@ -384,11 +349,11 @@ public class Dispatcher {
private static String legacyPatch(String token) {
if (/* LEGACY URL */matchPrefix("patch,sidebyside,", token)) {
return toPatchSideBySide(Patch.Key.parse(skip(token)));
return toPatch("", null, Patch.Key.parse(skip(token)));
}
if (/* LEGACY URL */matchPrefix("patch,unified,", token)) {
return toPatchUnified(Patch.Key.parse(skip(token)));
return toPatch("unified", null, Patch.Key.parse(skip(token)));
}
return null;
@ -553,9 +518,7 @@ public class Dispatcher {
panel = null;
}
Gerrit.display(token, panel == null
? (isChangeScreen2()
? new ChangeScreen2(id, null, null, false, mode)
: new ChangeScreen(id))
? new ChangeScreen2(id, null, null, false, mode)
: new NotFoundScreen());
return;
}
@ -593,19 +556,15 @@ public class Dispatcher {
rest = rest.substring(0, at);
}
Patch.Key p = new Patch.Key(ps, KeyUtil.decode(rest));
patch(token, base, p, side, line, 0,
null, null, null, panel);
patch(token, base, p, side, line, panel);
} else {
if (panel == null) {
Gerrit.display(token, isChangeScreen2()
? new ChangeScreen2(id,
Gerrit.display(token,
new ChangeScreen2(id,
base != null
? String.valueOf(base.get())
: null,
String.valueOf(ps.get()), false, FileTable.Mode.REVIEW)
: new ChangeScreen(id));
} else if ("publish".equals(panel)) {
publish(ps);
String.valueOf(ps.get()), false, FileTable.Mode.REVIEW));
} else {
Gerrit.display(token, new NotFoundScreen());
}
@ -627,125 +586,50 @@ public class Dispatcher {
}
}
public static boolean isChangeScreen2() {
if (changeScreen2) {
return true;
}
AccountGeneralPreferences.ChangeScreen ui = null;
if (Gerrit.isSignedIn()) {
ui = Gerrit.getUserAccount()
.getGeneralPreferences()
.getChangeScreen();
}
String v = Cookies.getCookie(Dispatcher.COOKIE_CS2);
if (v != null) {
changeScreen2 = "1".equals(v);
return changeScreen2;
}
if (ui == null) {
ui = Gerrit.getConfig().getChangeScreen();
}
return ui == AccountGeneralPreferences.ChangeScreen.CHANGE_SCREEN2;
}
private static void publish(final PatchSet.Id ps) {
String token = toPublish(ps);
new AsyncSplit(token) {
@Override
public void onSuccess() {
Gerrit.display(token, select());
}
private Screen select() {
return new PublishCommentScreen(ps);
}
}.onSuccess();
}
public static void patch(String token, PatchSet.Id base, Patch.Key id,
int patchIndex, PatchSetDetail patchSetDetail,
PatchTable patchTable, PatchScreen.TopView topView) {
patch(token, base, id, null, 0, patchIndex,
patchSetDetail, patchTable, topView, null);
}
public static void patch(String token, PatchSet.Id baseId,
Patch.Key id, DisplaySide side, int line,
int patchIndex, PatchSetDetail patchSetDetail,
PatchTable patchTable, PatchScreen.TopView topView,
private static void patch(String token,
PatchSet.Id baseId,
Patch.Key id,
DisplaySide side,
int line,
String panelType) {
if (id == null) {
Gerrit.display(token, new NotFoundScreen());
return;
}
String panel = panelType;
if (panel == null) {
int c = token.lastIndexOf(',');
panel = 0 <= c ? token.substring(c + 1) : "";
}
if ("".equals(panel)) {
if (isChangeScreen2()) {
if (Gerrit.isSignedIn()
&& DiffView.UNIFIED_DIFF.equals(Gerrit.getUserAccount()
.getGeneralPreferences().getDiffView())) {
sbs1(token, baseId, id, patchIndex, patchSetDetail, patchTable,
topView, PatchScreen.Type.UNIFIED);
return;
}
if ("".equals(panel) || /* DEPRECATED URL */"cm".equals(panel)) {
if (preferUnified()) {
unified1(token, baseId, id);
} else {
sbs2(token, baseId, id, side, line, false);
return;
}
sbs1(token, baseId, id, patchIndex, patchSetDetail, patchTable, topView,
PatchScreen.Type.SIDE_BY_SIDE);
return;
} else if ("sidebyside".equals(panel)) {
sbs2(token, null, id, side, line, false);
} else if ("unified".equals(panel)) {
sbs1(token, baseId, id, patchIndex, patchSetDetail, patchTable, topView,
PatchScreen.Type.UNIFIED);
return;
} else if ("cm".equals(panel)) {
if (Gerrit.isSignedIn()
&& DiffView.UNIFIED_DIFF.equals(Gerrit.getUserAccount()
.getGeneralPreferences().getDiffView())) {
sbs1(token, baseId, id, patchIndex, patchSetDetail, patchTable,
topView, PatchScreen.Type.UNIFIED);
return;
}
sbs2(token, baseId, id, side, line, false);
return;
} else if ("".equals(panel) || "sidebyside".equals(panel)) {
sbs1(token, baseId, id, patchIndex, patchSetDetail, patchTable, topView,
PatchScreen.Type.SIDE_BY_SIDE);
return;
} else if (panel.equals("edit")) {
sbs2(token, null, id, null, 0, true);
return;
unified1(token, baseId, id);
} else if ("edit".equals(panel)) {
sbs2(token, null, id, side, line, true);
} else {
Gerrit.display(token, new NotFoundScreen());
}
Gerrit.display(token, new NotFoundScreen());
}
private static void sbs1(final String token, final PatchSet.Id baseId,
final Patch.Key id, final int patchIndex,
final PatchSetDetail patchSetDetail, final PatchTable patchTable,
final PatchScreen.TopView topView, final PatchScreen.Type type) {
private static boolean preferUnified() {
return Gerrit.isSignedIn()
&& DiffView.UNIFIED_DIFF.equals(Gerrit.getUserAccount()
.getGeneralPreferences()
.getDiffView());
}
private static void unified1(final String token,
final PatchSet.Id baseId,
final Patch.Key id) {
GWT.runAsync(new AsyncSplit(token) {
@Override
public void onSuccess() {
PatchScreen.TopView top = topView == null
? Gerrit.getPatchScreenTopView()
: topView;
switch (type) {
case SIDE_BY_SIDE:
Gerrit.display(token, new PatchScreen.SideBySide(id, patchIndex,
patchSetDetail, patchTable, top, baseId));
break;
case UNIFIED:
Gerrit.display(token, new PatchScreen.Unified(id, patchIndex,
patchSetDetail, patchTable, top, baseId));
break;
}
UnifiedPatchScreen.TopView top = Gerrit.getPatchScreenTopView();
Gerrit.display(token, new UnifiedPatchScreen(id, top, baseId));
}
});
}

View File

@ -31,14 +31,13 @@ import com.google.gerrit.client.config.ConfigServerApi;
import com.google.gerrit.client.extensions.TopMenu;
import com.google.gerrit.client.extensions.TopMenuItem;
import com.google.gerrit.client.extensions.TopMenuList;
import com.google.gerrit.client.patches.PatchScreen;
import com.google.gerrit.client.patches.UnifiedPatchScreen;
import com.google.gerrit.client.rpc.CallbackGroup;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.LinkMenuBar;
import com.google.gerrit.client.ui.LinkMenuItem;
import com.google.gerrit.client.ui.MorphingTabPanel;
import com.google.gerrit.client.ui.PatchLink;
import com.google.gerrit.client.ui.ProjectLinkMenuItem;
import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.common.PageLinks;
@ -125,7 +124,7 @@ public class Gerrit implements EntryPoint {
private static SearchPanel searchPanel;
private static final Dispatcher dispatcher = new Dispatcher();
private static ViewSite<Screen> body;
private static PatchScreen patchScreen;
private static UnifiedPatchScreen patchScreen;
private static String lastChangeListToken;
private static String lastViewToken;
@ -139,7 +138,7 @@ public class Gerrit implements EntryPoint {
Window.Location.reload();
}
public static PatchScreen.TopView getPatchScreenTopView() {
public static UnifiedPatchScreen.TopView getPatchScreenTopView() {
if (patchScreen == null) {
return null;
}
@ -205,8 +204,8 @@ public class Gerrit implements EntryPoint {
*/
public static void updateMenus(Screen view) {
LinkMenuBar diffBar = menuBars.get(GerritTopMenu.DIFFERENCES.menuName);
if (view instanceof PatchScreen) {
patchScreen = (PatchScreen) view;
if (view instanceof UnifiedPatchScreen) {
patchScreen = (UnifiedPatchScreen) view;
menuLeft.setVisible(diffBar, true);
menuLeft.selectTab(menuLeft.getWidgetIndex(diffBar));
} else {
@ -637,12 +636,10 @@ public class Gerrit implements EntryPoint {
LinkMenuBar diffBar = new LinkMenuBar();
menuBars.put(GerritTopMenu.DIFFERENCES.menuName, diffBar);
menuLeft.addInvisible(diffBar, C.menuDiff());
addDiffLink(diffBar, CC.patchTableDiffSideBySide(), PatchScreen.Type.SIDE_BY_SIDE);
addDiffLink(diffBar, CC.patchTableDiffUnified(), PatchScreen.Type.UNIFIED);
addDiffLink(diffBar, C.menuDiffCommit(), PatchScreen.TopView.COMMIT);
addDiffLink(diffBar, C.menuDiffPreferences(), PatchScreen.TopView.PREFERENCES);
addDiffLink(diffBar, C.menuDiffPatchSets(), PatchScreen.TopView.PATCH_SETS);
addDiffLink(diffBar, C.menuDiffFiles(), PatchScreen.TopView.FILES);
addDiffLink(diffBar, C.menuDiffCommit(), UnifiedPatchScreen.TopView.COMMIT);
addDiffLink(diffBar, C.menuDiffPreferences(), UnifiedPatchScreen.TopView.PREFERENCES);
addDiffLink(diffBar, C.menuDiffPatchSets(), UnifiedPatchScreen.TopView.PATCH_SETS);
addDiffLink(diffBar, C.menuDiffFiles(), UnifiedPatchScreen.TopView.FILES);
final LinkMenuBar projectsBar = new LinkMenuBar();
menuBars.put(GerritTopMenu.PROJECTS.menuName, projectsBar);
@ -890,7 +887,7 @@ public class Gerrit implements EntryPoint {
}
private static void addDiffLink(final LinkMenuBar m, final String text,
final PatchScreen.TopView tv) {
final UnifiedPatchScreen.TopView tv) {
m.addItem(new LinkMenuItem(text, "") {
@Override
public void go() {
@ -943,23 +940,6 @@ public class Gerrit implements EntryPoint {
return i;
}
private static void addDiffLink(final LinkMenuBar m, final String text,
final PatchScreen.Type type) {
m.addItem(new LinkMenuItem(text, "") {
@Override
public void go() {
if (patchScreen != null) {
patchScreen.setTopView(PatchScreen.TopView.MAIN);
if (type == patchScreen.getPatchScreenType()) {
AnchorElement.as(getElement()).blur();
} else {
new PatchLink("", type, patchScreen).go();
}
}
}
});
}
private static void addDocLink(final LinkMenuBar m, final String text,
final String href) {
final Anchor atag = anchor(text, selfRedirect("/Documentation/" + href));

View File

@ -221,8 +221,6 @@ public interface GerritCss extends CssResource {
String sectionHeader();
String selectPatchSetOldVersion();
String sideBySideScreenLinkTable();
String sideBySideScreenSideBySideTable();
String sideBySideTableBinaryHeader();
String singleLine();
String skipLine();
String smallHeading();

View File

@ -25,8 +25,6 @@ public interface AccountConstants extends Constants {
String registeredOn();
String accountId();
String commentVisibilityLabel();
String changeScreenLabel();
String diffViewLabel();
String maximumPageSizeFieldLabel();
String dateFormatLabel();
@ -34,7 +32,6 @@ public interface AccountConstants extends Constants {
String showSiteHeader();
String useFlashClipboard();
String copySelfOnEmails();
String reversePatchSetOrder();
String reviewCategoryLabel();
String messageShowInReviewCategoryNone();
String messageShowInReviewCategoryName();
@ -51,9 +48,6 @@ public interface AccountConstants extends Constants {
String myMenuUrl();
String myMenuReset();
String changeScreenOldUi();
String changeScreenNewUi();
String tabAccountSummary();
String tabPreferences();
String tabWatchedProjects();

View File

@ -8,8 +8,6 @@ accountId = Account ID
showSiteHeader = Show Site Header
useFlashClipboard = Use Flash Clipboard Widget
copySelfOnEmails = CC Me On Comments I Write
reversePatchSetOrder = Display Patch Sets In Reverse Order (deprecated: Old Change Screen)
reviewCategoryLabel = Display In Review Category
messageShowInReviewCategoryNone = None (default)
messageShowInReviewCategoryName = Show Name
@ -18,9 +16,7 @@ messageShowInReviewCategoryUsername = Show Username
messageShowInReviewCategoryAbbrev = Show Abbreviated Name
maximumPageSizeFieldLabel = Maximum Page Size:
commentVisibilityLabel = Comment Visibility (deprecated: Old Change Screen):
changeScreenLabel = Change View:
diffViewLabel = Diff View (New Change Screen):
diffViewLabel = Diff View:
dateFormatLabel = Date/Time Format:
contextWholeFile = Whole File
buttonSaveChanges = Save Changes

View File

@ -17,7 +17,6 @@ package com.google.gerrit.client.account;
import static com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DEFAULT_PAGESIZE;
import static com.google.gerrit.reviewdb.client.AccountGeneralPreferences.PAGESIZE_CHOICES;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.StringListPanel;
import com.google.gerrit.client.config.ConfigServerApi;
@ -27,7 +26,6 @@ import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ReviewCategoryStrategy;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ClickEvent;
@ -49,7 +47,6 @@ public class MyPreferencesScreen extends SettingsScreen {
private CheckBox showSiteHeader;
private CheckBox useFlashClipboard;
private CheckBox copySelfOnEmails;
private CheckBox reversePatchSetOrder;
private CheckBox relativeDateInChangeTable;
private CheckBox sizeBarInChangeTable;
private CheckBox legacycidInChangeTable;
@ -57,8 +54,6 @@ public class MyPreferencesScreen extends SettingsScreen {
private ListBox dateFormat;
private ListBox timeFormat;
private ListBox reviewCategoryStrategy;
private ListBox commentVisibilityStrategy;
private ListBox changeScreen;
private ListBox diffView;
private StringListPanel myMenus;
private Button save;
@ -70,7 +65,6 @@ public class MyPreferencesScreen extends SettingsScreen {
showSiteHeader = new CheckBox(Util.C.showSiteHeader());
useFlashClipboard = new CheckBox(Util.C.useFlashClipboard());
copySelfOnEmails = new CheckBox(Util.C.copySelfOnEmails());
reversePatchSetOrder = new CheckBox(Util.C.reversePatchSetOrder());
maximumPageSize = new ListBox();
for (final short v : PAGESIZE_CHOICES) {
maximumPageSize.addItem(Util.M.rowsPerPage(v), String.valueOf(v));
@ -93,32 +87,6 @@ public class MyPreferencesScreen extends SettingsScreen {
Util.C.messageShowInReviewCategoryAbbrev(),
AccountGeneralPreferences.ReviewCategoryStrategy.ABBREV.name());
commentVisibilityStrategy = new ListBox();
commentVisibilityStrategy.addItem(
com.google.gerrit.client.changes.Util.C.messageCollapseAll(),
AccountGeneralPreferences.CommentVisibilityStrategy.COLLAPSE_ALL.name());
commentVisibilityStrategy.addItem(
com.google.gerrit.client.changes.Util.C.messageExpandMostRecent(),
AccountGeneralPreferences.CommentVisibilityStrategy.EXPAND_MOST_RECENT.name());
commentVisibilityStrategy.addItem(
com.google.gerrit.client.changes.Util.C.messageExpandRecent(),
AccountGeneralPreferences.CommentVisibilityStrategy.EXPAND_RECENT.name());
commentVisibilityStrategy.addItem(
com.google.gerrit.client.changes.Util.C.messageExpandAll(),
AccountGeneralPreferences.CommentVisibilityStrategy.EXPAND_ALL.name());
changeScreen = new ListBox();
changeScreen.addItem(
Util.M.changeScreenServerDefault(
getLabel(Gerrit.getConfig().getChangeScreen())),
"");
changeScreen.addItem(
Util.C.changeScreenOldUi(),
AccountGeneralPreferences.ChangeScreen.OLD_UI.name());
changeScreen.addItem(
Util.C.changeScreenNewUi(),
AccountGeneralPreferences.ChangeScreen.CHANGE_SCREEN2.name());
diffView = new ListBox();
diffView.addItem(
com.google.gerrit.client.changes.Util.C.sideBySide(),
@ -165,7 +133,7 @@ public class MyPreferencesScreen extends SettingsScreen {
sizeBarInChangeTable = new CheckBox(Util.C.showSizeBarInChangeTable());
legacycidInChangeTable = new CheckBox(Util.C.showLegacycidInChangeTable());
final Grid formGrid = new Grid(13, 2);
final Grid formGrid = new Grid(11, 2);
int row = 0;
formGrid.setText(row, labelIdx, "");
@ -181,11 +149,6 @@ public class MyPreferencesScreen extends SettingsScreen {
row++;
formGrid.setText(row, labelIdx, "");
formGrid.setWidget(row, fieldIdx, reversePatchSetOrder);
row++;
formGrid.setText(row, labelIdx, Util.C.reviewCategoryLabel());
formGrid.setWidget(row, fieldIdx, reviewCategoryStrategy);
row++;
formGrid.setText(row, labelIdx, Util.C.maximumPageSizeFieldLabel());
@ -208,12 +171,8 @@ public class MyPreferencesScreen extends SettingsScreen {
formGrid.setWidget(row, fieldIdx, legacycidInChangeTable);
row++;
formGrid.setText(row, labelIdx, Util.C.commentVisibilityLabel());
formGrid.setWidget(row, fieldIdx, commentVisibilityStrategy);
row++;
formGrid.setText(row, labelIdx, Util.C.changeScreenLabel());
formGrid.setWidget(row, fieldIdx, changeScreen);
formGrid.setText(row, labelIdx, "");
formGrid.setWidget(row, fieldIdx, legacycidInChangeTable);
row++;
formGrid.setText(row, labelIdx, Util.C.diffViewLabel());
@ -239,16 +198,12 @@ public class MyPreferencesScreen extends SettingsScreen {
e.listenTo(showSiteHeader);
e.listenTo(useFlashClipboard);
e.listenTo(copySelfOnEmails);
e.listenTo(reversePatchSetOrder);
e.listenTo(maximumPageSize);
e.listenTo(dateFormat);
e.listenTo(timeFormat);
e.listenTo(relativeDateInChangeTable);
e.listenTo(sizeBarInChangeTable);
e.listenTo(legacycidInChangeTable);
e.listenTo(reviewCategoryStrategy);
e.listenTo(commentVisibilityStrategy);
e.listenTo(changeScreen);
e.listenTo(diffView);
}
@ -268,7 +223,6 @@ public class MyPreferencesScreen extends SettingsScreen {
showSiteHeader.setEnabled(on);
useFlashClipboard.setEnabled(on);
copySelfOnEmails.setEnabled(on);
reversePatchSetOrder.setEnabled(on);
maximumPageSize.setEnabled(on);
dateFormat.setEnabled(on);
timeFormat.setEnabled(on);
@ -276,8 +230,6 @@ public class MyPreferencesScreen extends SettingsScreen {
sizeBarInChangeTable.setEnabled(on);
legacycidInChangeTable.setEnabled(on);
reviewCategoryStrategy.setEnabled(on);
commentVisibilityStrategy.setEnabled(on);
changeScreen.setEnabled(on);
diffView.setEnabled(on);
}
@ -285,7 +237,6 @@ public class MyPreferencesScreen extends SettingsScreen {
showSiteHeader.setValue(p.showSiteHeader());
useFlashClipboard.setValue(p.useFlashClipboard());
copySelfOnEmails.setValue(p.copySelfOnEmail());
reversePatchSetOrder.setValue(p.reversePatchSetOrder());
setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.changesPerPage());
setListBox(dateFormat, AccountGeneralPreferences.DateFormat.STD, //
p.dateFormat());
@ -297,12 +248,6 @@ public class MyPreferencesScreen extends SettingsScreen {
setListBox(reviewCategoryStrategy,
AccountGeneralPreferences.ReviewCategoryStrategy.NONE,
p.reviewCategoryStrategy());
setListBox(commentVisibilityStrategy,
AccountGeneralPreferences.CommentVisibilityStrategy.EXPAND_RECENT,
p.commentVisibilityStrategy());
setListBox(changeScreen,
null,
p.changeScreen());
setListBox(diffView,
AccountGeneralPreferences.DiffView.SIDE_BY_SIDE,
p.diffView());
@ -373,7 +318,6 @@ public class MyPreferencesScreen extends SettingsScreen {
p.setShowSiteHeader(showSiteHeader.getValue());
p.setUseFlashClipboard(useFlashClipboard.getValue());
p.setCopySelfOnEmails(copySelfOnEmails.getValue());
p.setReversePatchSetOrder(reversePatchSetOrder.getValue());
p.setMaximumPageSize(getListBox(maximumPageSize, DEFAULT_PAGESIZE));
p.setDateFormat(getListBox(dateFormat,
AccountGeneralPreferences.DateFormat.STD,
@ -387,15 +331,9 @@ public class MyPreferencesScreen extends SettingsScreen {
p.setReviewCategoryStrategy(getListBox(reviewCategoryStrategy,
ReviewCategoryStrategy.NONE,
ReviewCategoryStrategy.values()));
p.setCommentVisibilityStrategy(getListBox(commentVisibilityStrategy,
CommentVisibilityStrategy.EXPAND_RECENT,
CommentVisibilityStrategy.values()));
p.setDiffView(getListBox(diffView,
AccountGeneralPreferences.DiffView.SIDE_BY_SIDE,
AccountGeneralPreferences.DiffView.values()));
p.setChangeScreen(getListBox(changeScreen,
null,
AccountGeneralPreferences.ChangeScreen.values()));
enable(false);
save.setEnabled(false);
@ -411,7 +349,6 @@ public class MyPreferencesScreen extends SettingsScreen {
public void onSuccess(Preferences prefs) {
Gerrit.getUserAccount().setGeneralPreferences(p);
Gerrit.applyUserPreferences();
Dispatcher.changeScreen2 = false;
enable(true);
display(prefs);
Gerrit.refreshMenuBar();
@ -426,20 +363,6 @@ public class MyPreferencesScreen extends SettingsScreen {
});
}
private static String getLabel(AccountGeneralPreferences.ChangeScreen ui) {
if (ui == null) {
return "";
}
switch (ui) {
case OLD_UI:
return Util.C.changeScreenOldUi();
case CHANGE_SCREEN2:
return Util.C.changeScreenNewUi();
default:
return ui.name();
}
}
private class MyMenuPanel extends StringListPanel {
MyMenuPanel(Button save) {
super(Util.C.myMenu(), Arrays.asList(Util.C.myMenuName(),

View File

@ -16,8 +16,6 @@ package com.google.gerrit.client.account;
import com.google.gerrit.client.extensions.TopMenuItem;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
@ -43,14 +41,11 @@ public class Preferences extends JavaScriptObject {
p.copySelfOnEmail(in.isCopySelfOnEmails());
p.dateFormat(in.getDateFormat());
p.timeFormat(in.getTimeFormat());
p.reversePatchSetOrder(in.isReversePatchSetOrder());
p.relativeDateInChangeTable(in.isRelativeDateInChangeTable());
p.sizeBarInChangeTable(in.isSizeBarInChangeTable());
p.legacycidInChangeTable(in.isLegacycidInChangeTable());
p.commentVisibilityStrategy(in.getCommentVisibilityStrategy());
p.reviewCategoryStrategy(in.getReviewCategoryStrategy());
p.diffView(in.getDiffView());
p.changeScreen(in.getChangeScreen());
p.setMyMenus(myMenus);
return p;
}
@ -98,9 +93,6 @@ public class Preferences extends JavaScriptObject {
private final native String timeFormatRaw()
/*-{ return this.time_format }-*/;
public final native boolean reversePatchSetOrder()
/*-{ return this.reverse_patch_set_order || false }-*/;
public final native boolean relativeDateInChangeTable()
/*-{ return this.relative_date_in_change_table || false }-*/;
@ -117,13 +109,6 @@ public class Preferences extends JavaScriptObject {
private final native String reviewCategeoryStrategyRaw()
/*-{ return this.review_category_strategy }-*/;
public final CommentVisibilityStrategy commentVisibilityStrategy() {
String s = commentVisibilityStrategyRaw();
return s != null ? CommentVisibilityStrategy.valueOf(s) : null;
}
private final native String commentVisibilityStrategyRaw()
/*-{ return this.comment_visibility_strategy }-*/;
public final DiffView diffView() {
String s = diffViewRaw();
return s != null ? DiffView.valueOf(s) : null;
@ -131,13 +116,6 @@ public class Preferences extends JavaScriptObject {
private final native String diffViewRaw()
/*-{ return this.diff_view }-*/;
public final ChangeScreen changeScreen() {
String s = changeScreenRaw();
return s != null ? ChangeScreen.valueOf(s) : null;
}
private final native String changeScreenRaw()
/*-{ return this.change_screen }-*/;
public final native JsArray<TopMenuItem> my()
/*-{ return this.my; }-*/;
@ -177,9 +155,6 @@ public class Preferences extends JavaScriptObject {
private final native void timeFormatRaw(String f)
/*-{ this.time_format = f }-*/;
public final native void reversePatchSetOrder(boolean r)
/*-{ this.reverse_patch_set_order = r }-*/;
public final native void relativeDateInChangeTable(boolean d)
/*-{ this.relative_date_in_change_table = d }-*/;
@ -195,24 +170,12 @@ public class Preferences extends JavaScriptObject {
private final native void reviewCategoryStrategyRaw(String s)
/*-{ this.review_category_strategy = s }-*/;
public final void commentVisibilityStrategy(CommentVisibilityStrategy s) {
commentVisibilityStrategyRaw(s != null ? s.toString() : null);
}
private final native void commentVisibilityStrategyRaw(String s)
/*-{ this.comment_visibility_strategy = s }-*/;
public final void diffView(DiffView d) {
diffViewRaw(d != null ? d.toString() : null);
}
private final native void diffViewRaw(String d)
/*-{ this.diff_view = d }-*/;
public final void changeScreen(ChangeScreen s) {
changeScreenRaw(s != null ? s.toString() : null);
}
private final native void changeScreenRaw(String s)
/*-{ this.change_screen = s }-*/;
final void setMyMenus(List<TopMenuItem> myMenus) {
initMy();
for (TopMenuItem n : myMenus) {

View File

@ -27,7 +27,7 @@ class CreateChangeAction {
static void call(Button b, final String project) {
// TODO Replace CreateChangeDialog with a nicer looking display.
b.setEnabled(false);
new CreateChangeDialog(b, new Project.NameKey(project)) {
new CreateChangeDialog(new Project.NameKey(project)) {
{
sendButton.setText(Util.C.buttonCreate());
message.setText(Util.C.buttonCreateDescription());

View File

@ -579,9 +579,6 @@ public class ChangeScreen2 extends Screen {
ChangeGlue.fireShowChange(changeInfo, changeInfo.revision(revision));
CodeMirror.preload();
startPoller();
if (NewChangeScreenBar.show()) {
add(new NewChangeScreenBar(changeId));
}
}
private void scrollToPath(String token) {

View File

@ -30,7 +30,7 @@ class CherryPickAction {
String project, final String commitMessage) {
// TODO Replace CherryPickDialog with a nicer looking display.
b.setEnabled(false);
new CherryPickDialog(b, new Project.NameKey(project)) {
new CherryPickDialog(new Project.NameKey(project)) {
{
sendButton.setText(Util.C.buttonCherryPickChangeSend());
if (info.status() == Change.Status.MERGED) {

View File

@ -1,105 +0,0 @@
// 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.change;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.account.AccountApi;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.UIObject;
import java.util.Date;
/** Displays a welcome to the new change screen bar. */
class NewChangeScreenBar extends Composite {
interface Binder extends UiBinder<HTMLPanel, NewChangeScreenBar> {}
private static final Binder uiBinder = GWT.create(Binder.class);
static boolean show() {
if (Gerrit.isSignedIn()) {
return Gerrit.getUserAccount()
.getGeneralPreferences()
.getChangeScreen() == null;
}
return Cookies.getCookie(Dispatcher.COOKIE_CS2) == null;
}
private final Change.Id id;
@UiField Element docs;
@UiField Element settings;
@UiField Anchor keepNew;
@UiField Anchor keepOld;
NewChangeScreenBar(Change.Id id) {
this.id = id;
initWidget(uiBinder.createAndBindUi(this));
UIObject.setVisible(docs, Gerrit.getConfig().isDocumentationAvailable());
UIObject.setVisible(settings, Gerrit.isSignedIn());
}
@UiHandler("keepOld")
void onKeepOld(@SuppressWarnings("unused") ClickEvent e) {
save(ChangeScreen.OLD_UI);
Gerrit.display(PageLinks.toChange(id));
}
@UiHandler("keepNew")
void onKeepNew(@SuppressWarnings("unused") ClickEvent e) {
save(ChangeScreen.CHANGE_SCREEN2);
}
private void save(ChangeScreen sel) {
removeFromParent();
Dispatcher.changeScreen2 = sel == ChangeScreen.CHANGE_SCREEN2;
if (Gerrit.isSignedIn()) {
Gerrit.getUserAccount().getGeneralPreferences().setChangeScreen(sel);
Prefs in = Prefs.createObject().cast();
in.change_screen(sel.name());
AccountApi.self().view("preferences").background().put(in,
new AsyncCallback<JavaScriptObject>() {
@Override public void onFailure(Throwable caught) {}
@Override public void onSuccess(JavaScriptObject result) {}
});
} else {
Cookies.setCookie(
Dispatcher.COOKIE_CS2,
Dispatcher.changeScreen2 ? "1" : "0",
new Date(System.currentTimeMillis() + 7 * 24 * 3600 * 1000));
}
}
private static class Prefs extends JavaScriptObject {
final native void change_screen(String n) /*-{ this.change_screen=n }-*/;
protected Prefs() {
}
}
}

View File

@ -1,78 +0,0 @@
<?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:c='urn:import:com.google.gwtexpui.globalkey.client'
xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<ui:style>
.popup {
position: fixed;
top: 5px;
left: 50%;
margin-left: -200px;
z-index: 201;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 12px;
padding-right: 12px;
text-align: center;
background: #FFF1A8;
border-radius: 10px;
}
@if user.agent safari {
.popup {
\-webkit-border-radius: 10px;
}
}
@if user.agent gecko1_8 {
.popup {
\-moz-border-radius: 10px;
}
}
a.action {
color: #222;
text-decoration: underline;
display: inline-block;
margin-left: 0.5em;
}
.welcome { font-weight: bold; }
</ui:style>
<g:HTMLPanel styleName='{style.popup}'>
<div><ui:msg><span class='{style.welcome}'>Welcome to the new change screen!</span>
<a ui:field='docs'
class='{style.action}'
href='Documentation/user-review-ui.html'
target='_blank'>Learn more</a></ui:msg>
</div>
<div>
<ui:msg>You can<g:Anchor ui:field='keepOld'
styleName='{style.action}'
href='javascript:;'
title='Switch back to the old screen'><ui:attribute name='title'/>revert
to the old screen</g:Anchor><span ui:field='settings'>&#160;in Settings &gt; Preferences</span>.
<g:Anchor ui:field='keepNew'
styleName='{style.action}'
href='javascript:;'
title='Keep the new change screen'>
<ui:attribute name='title'/>
Got it!
</g:Anchor></ui:msg>
</div>
</g:HTMLPanel>
</ui:UiBinder>

View File

@ -19,7 +19,7 @@ import com.google.gerrit.client.changes.ChangeApi;
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.ActionDialog;
import com.google.gerrit.client.ui.CommentedActionDialog;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.user.client.ui.Button;
@ -29,7 +29,7 @@ class RevertAction {
final String commitSubject) {
// TODO Replace ActionDialog with a nicer looking display.
b.setEnabled(false);
new ActionDialog(b, false,
new CommentedActionDialog(
Util.C.revertChangeTitle(),
Util.C.headingRevertMessage()) {
{

View File

@ -1,395 +0,0 @@
// Copyright (C) 2008 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.changes;
import static com.google.gerrit.common.data.LabelValue.formatValue;
import com.google.gerrit.client.ConfirmationCallback;
import com.google.gerrit.client.ConfirmationDialog;
import com.google.gerrit.client.ErrorDialog;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.account.AccountInfo;
import com.google.gerrit.client.change.ReviewerSuggestOracle;
import com.google.gerrit.client.change.Reviewers.PostInput;
import com.google.gerrit.client.change.Reviewers.PostResult;
import com.google.gerrit.client.changes.ChangeInfo.ApprovalInfo;
import com.google.gerrit.client.changes.ChangeInfo.LabelInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.AccountLinkPanel;
import com.google.gerrit.client.ui.AddMemberBox;
import com.google.gerrit.common.data.ApprovalDetail;
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/** Displays a table of {@link ApprovalDetail} objects for a change record. */
public class ApprovalTable extends Composite {
private final Grid table;
private final Widget missing;
private final Panel addReviewer;
private final ReviewerSuggestOracle reviewerSuggestOracle;
private final AddMemberBox addMemberBox;
private ChangeInfo lastChange;
private Map<Integer, Integer> rows;
public ApprovalTable() {
rows = new HashMap<>();
table = new Grid(1, 3);
table.addStyleName(Gerrit.RESOURCES.css().infoTable());
missing = new Widget() {
{
setElement((Element)(DOM.createElement("ul")));
}
};
missing.setStyleName(Gerrit.RESOURCES.css().missingApprovalList());
addReviewer = new FlowPanel();
addReviewer.setStyleName(Gerrit.RESOURCES.css().addReviewer());
reviewerSuggestOracle = new ReviewerSuggestOracle();
addMemberBox =
new AddMemberBox(Util.C.approvalTableAddReviewer(),
Util.C.approvalTableAddReviewerHint(), reviewerSuggestOracle);
addMemberBox.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
doAddReviewer();
}
});
addReviewer.add(addMemberBox);
addReviewer.setVisible(false);
final FlowPanel fp = new FlowPanel();
fp.add(table);
fp.add(missing);
fp.add(addReviewer);
initWidget(fp);
setStyleName(Gerrit.RESOURCES.css().approvalTable());
}
/**
* Sets the header row
*
* @param labels The list of labels to display in the header. This list does
* not get resorted, so be sure that the list's elements are in the same
* order as the list of labels passed to the {@code displayRow} method.
*/
private void displayHeader(Collection<String> labels) {
table.resizeColumns(2 + labels.size());
final CellFormatter fmt = table.getCellFormatter();
int col = 0;
table.setText(0, col, Util.C.approvalTableReviewer());
fmt.setStyleName(0, col, Gerrit.RESOURCES.css().header());
col++;
table.clearCell(0, col);
fmt.setStyleName(0, col, Gerrit.RESOURCES.css().header());
col++;
for (String name : labels) {
table.setText(0, col, name);
fmt.setStyleName(0, col, Gerrit.RESOURCES.css().header());
col++;
}
fmt.addStyleName(0, col - 1, Gerrit.RESOURCES.css().rightmost());
}
void display(ChangeInfo change) {
lastChange = change;
reviewerSuggestOracle.setChange(change.legacy_id());
Map<Integer, ApprovalDetail> byUser = new LinkedHashMap<>();
Map<Integer, AccountInfo> accounts = new LinkedHashMap<>();
List<String> missingLabels = initLabels(change, accounts, byUser);
removeAllChildren(missing.getElement());
for (String label : missingLabels) {
addMissingLabel(Util.M.needApproval(label));
}
if (byUser.isEmpty()) {
table.setVisible(false);
} else {
List<String> labels = new ArrayList<>(change.labels());
Collections.sort(labels);
displayHeader(labels);
table.resizeRows(1 + byUser.size());
int i = 1;
for (ApprovalDetail ad : ApprovalDetail.sort(
byUser.values(), change.owner()._account_id())) {
displayRow(i++, ad, labels, accounts.get(ad.getAccount().get()));
}
table.setVisible(true);
}
if (change.status() != Change.Status.MERGED
&& !change.mergeable()) {
addMissingLabel(Util.C.messageNeedsRebaseOrHasDependency());
}
missing.setVisible(missing.getElement().getChildCount() > 0);
addReviewer.setVisible(Gerrit.isSignedIn());
}
private void removeAllChildren(Element el) {
for (int i = DOM.getChildCount(el) - 1; i >= 0; i--) {
el.removeChild(DOM.getChild(el, i));
}
}
private void addMissingLabel(String text) {
Element li = DOM.createElement("li");
li.setClassName(Gerrit.RESOURCES.css().missingApproval());
li.setInnerText(text);
DOM.appendChild(missing.getElement(), li);
}
private Set<Integer> removableReviewers(ChangeInfo change) {
Set<Integer> result =
new HashSet<>(change.removable_reviewers().length());
for (int i = 0; i < change.removable_reviewers().length(); i++) {
result.add(change.removable_reviewers().get(i)._account_id());
}
return result;
}
private List<String> initLabels(ChangeInfo change,
Map<Integer, AccountInfo> accounts,
Map<Integer, ApprovalDetail> byUser) {
Set<Integer> removableReviewers = removableReviewers(change);
List<String> missing = new ArrayList<>();
for (String name : change.labels()) {
LabelInfo label = change.label(name);
String min = null;
String max = null;
for (String v : label.values()) {
if (min == null) {
min = v;
}
if (v.startsWith("+")) {
max = v;
}
}
if (label.status() == SubmitRecord.Label.Status.NEED) {
missing.add(name);
}
if (label.all() != null) {
for (ApprovalInfo ai : Natives.asList(label.all())) {
if (!accounts.containsKey(ai._account_id())) {
accounts.put(ai._account_id(), ai);
}
int id = ai._account_id();
ApprovalDetail ad = byUser.get(id);
if (ad == null) {
ad = new ApprovalDetail(new Account.Id(id));
ad.setCanRemove(removableReviewers.contains(id));
byUser.put(id, ad);
}
if (ai.has_value()) {
ad.votable(name);
ad.value(name, ai.value());
String fv = formatValue(ai.value());
if (fv.equals(max)) {
ad.approved(name);
} else if (ai.value() < 0 && fv.equals(min)) {
ad.rejected(name);
}
}
}
}
}
return missing;
}
private void doAddReviewer() {
String reviewer = addMemberBox.getText();
if (!reviewer.isEmpty()) {
addMemberBox.setEnabled(false);
addReviewer(reviewer, false);
}
}
private void addReviewer(final String reviewer, boolean confirmed) {
ChangeApi.reviewers(lastChange.legacy_id().get()).post(
PostInput.create(reviewer, confirmed),
new GerritCallback<PostResult>() {
@Override
public void onSuccess(PostResult result) {
addMemberBox.setEnabled(true);
addMemberBox.setText("");
if (result.error() == null) {
reload();
} else if (result.confirm()) {
askForConfirmation(result.error());
} else {
new ErrorDialog(new SafeHtmlBuilder().append(result.error()));
}
}
private void askForConfirmation(String text) {
String title = Util.C
.approvalTableAddManyReviewersConfirmationDialogTitle();
ConfirmationDialog confirmationDialog = new ConfirmationDialog(
title, new SafeHtmlBuilder().append(text),
new ConfirmationCallback() {
@Override
public void onOk() {
addReviewer(reviewer, true);
}
});
confirmationDialog.center();
}
@Override
public void onFailure(final Throwable caught) {
addMemberBox.setEnabled(true);
if (isNoSuchEntity(caught)) {
new ErrorDialog(Util.M.reviewerNotFound(reviewer)).center();
} else {
super.onFailure(caught);
}
}
});
}
/**
* Sets the reviewer data for a row.
*
* @param row The number of the row on which to set the reviewer.
* @param ad The details for this reviewer's approval.
* @param labels The list of labels to show. This list does not get resorted,
* so be sure that the list's elements are in the same order as the list
* of labels passed to the {@code displayHeader} method.
* @param account The account information for the approval.
*/
private void displayRow(int row, final ApprovalDetail ad,
List<String> labels, AccountInfo account) {
final CellFormatter fmt = table.getCellFormatter();
int col = 0;
table.setWidget(row, col++, new AccountLinkPanel(account));
rows.put(account._account_id(), row);
if (ad.canRemove()) {
final PushButton remove = new PushButton( //
new Image(Util.R.removeReviewerNormal()), //
new Image(Util.R.removeReviewerPressed()));
remove.setTitle(Util.M.removeReviewer(account.name()));
remove.setStyleName(Gerrit.RESOURCES.css().removeReviewer());
remove.addStyleName(Gerrit.RESOURCES.css().link());
remove.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doRemove(ad, remove);
}
});
table.setWidget(row, col, remove);
} else {
table.clearCell(row, col);
}
fmt.setStyleName(row, col++, Gerrit.RESOURCES.css().removeReviewerCell());
for (String labelName : labels) {
fmt.setStyleName(row, col, Gerrit.RESOURCES.css().approvalscore());
if (!ad.canVote(labelName)) {
fmt.addStyleName(row, col, Gerrit.RESOURCES.css().notVotable());
fmt.getElement(row, col).setTitle(Gerrit.C.userCannotVoteToolTip());
}
if (ad.isRejected(labelName)) {
table.setWidget(row, col, new Image(Gerrit.RESOURCES.redNot()));
} else if (ad.isApproved(labelName)) {
table.setWidget(row, col, new Image(Gerrit.RESOURCES.greenCheck()));
} else {
int v = ad.getValue(labelName);
if (v == 0) {
table.clearCell(row, col);
col++;
continue;
}
String vstr = String.valueOf(ad.getValue(labelName));
if (v > 0) {
vstr = "+" + vstr;
fmt.addStyleName(row, col, Gerrit.RESOURCES.css().posscore());
} else {
fmt.addStyleName(row, col, Gerrit.RESOURCES.css().negscore());
}
table.setText(row, col, vstr);
}
col++;
}
fmt.addStyleName(row, col - 1, Gerrit.RESOURCES.css().rightmost());
}
private void reload() {
ChangeApi.detail(lastChange.legacy_id().get(),
new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
display(result);
}
});
}
private void doRemove(ApprovalDetail ad, final PushButton remove) {
remove.setEnabled(false);
ChangeApi.reviewer(lastChange.legacy_id().get(), ad.getAccount().get())
.delete(new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
reload();
}
@Override
public void onFailure(final Throwable caught) {
remove.setEnabled(true);
super.onFailure(caught);
}
});
}
}

View File

@ -1,62 +0,0 @@
// Copyright (C) 2012 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.changes;
import com.google.gerrit.client.ui.ListenableValue;
import com.google.gerrit.common.data.ChangeInfo;
import com.google.gerrit.reviewdb.client.Change;
import java.util.HashMap;
import java.util.Map;
/** A Cache to store common client side data by change */
public class ChangeCache {
private static Map<Change.Id, ChangeCache> caches = new HashMap<>();
public static ChangeCache get(Change.Id chg) {
ChangeCache cache = caches.get(chg);
if (cache == null) {
cache = new ChangeCache(chg);
caches.put(chg, cache);
}
return cache;
}
private Change.Id changeId;
private ChangeDetailCache detail;
private ListenableValue<ChangeInfo> info;
protected ChangeCache(Change.Id chg) {
changeId = chg;
}
public Change.Id getChangeId() {
return changeId;
}
public ChangeDetailCache getChangeDetailCache() {
if (detail == null) {
detail = new ChangeDetailCache(changeId);
}
return detail;
}
public ListenableValue<ChangeInfo> getChangeInfoCache() {
if (info == null) {
info = new ListenableValue<>();
}
return info;
}
}

View File

@ -1,48 +0,0 @@
// Copyright (C) 2008 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.changes;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.common.data.AccountInfoCache;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.reviewdb.client.PatchSetInfo;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwtexpui.globalkey.client.KeyCommandSet;
public class ChangeDescriptionBlock extends Composite {
private final ChangeInfoBlock infoBlock;
private final CommitMessageBlock messageBlock;
public ChangeDescriptionBlock(KeyCommandSet keysAction) {
infoBlock = new ChangeInfoBlock();
messageBlock = new CommitMessageBlock(keysAction);
final HorizontalPanel hp = new HorizontalPanel();
hp.add(infoBlock);
hp.add(messageBlock);
initWidget(hp);
}
public void display(ChangeDetail changeDetail, Boolean starred, Boolean canEditCommitMessage,
PatchSetInfo info, AccountInfoCache acc,
SubmitTypeRecord submitTypeRecord,
CommentLinkProcessor commentLinkProcessor) {
infoBlock.display(changeDetail, acc, submitTypeRecord);
messageBlock.display(changeDetail.getChange().currentPatchSetId(), info.getRevId(), starred,
canEditCommitMessage, info.getMessage(), commentLinkProcessor);
}
}

View File

@ -1,261 +0,0 @@
// Copyright (C) 2012 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.changes;
import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.changes.ChangeInfo.CommitInfo;
import com.google.gerrit.client.changes.ChangeInfo.GitPerson;
import com.google.gerrit.client.changes.ChangeInfo.MessageInfo;
import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo;
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.ListenableValue;
import com.google.gerrit.common.data.AccountInfo;
import com.google.gerrit.common.data.AccountInfoCache;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.PatchSetDetail;
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.common.data.UiCommandDetail;
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetInfo;
import com.google.gerrit.reviewdb.client.PatchSetInfo.ParentInfo;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.client.UserIdentity;
import com.google.gwt.core.client.JsArray;
import com.google.gwtjsonrpc.common.AsyncCallback;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
public class ChangeDetailCache extends ListenableValue<ChangeDetail> {
public static class NewGerritCallback extends
com.google.gerrit.client.rpc.GerritCallback<ChangeInfo> {
@Override
public void onSuccess(ChangeInfo detail) {
setChangeDetail(reverse(detail));
}
}
public static class IgnoreErrorCallback implements AsyncCallback<ChangeDetail> {
@Override
public void onSuccess(ChangeDetail info) {
setChangeDetail(info);
}
@Override
public void onFailure(Throwable caught) {
}
}
public static ChangeDetail reverse(ChangeInfo info) {
info.revisions().copyKeysIntoChildren("name");
RevisionInfo rev = current(info);
ChangeDetail r = new ChangeDetail();
r.setAllowsAnonymous(rev.has_fetch() && rev.fetch().containsKey("http"));
r.setCanAbandon(can(info.actions(), "abandon"));
r.setCanEditCommitMessage(can(rev.actions(), "message"));
r.setCanCherryPick(can(rev.actions(), "cherrypick"));
r.setCanPublish(can(rev.actions(), "publish"));
r.setCanRebase(can(rev.actions(), "rebase"));
r.setCanRestore(can(info.actions(), "restore"));
r.setCanRevert(can(info.actions(), "revert"));
r.setCanDeleteDraft(can(info.actions(), "/"));
r.setCanEditTopicName(can(info.actions(), "topic"));
r.setCanSubmit(can(rev.actions(), "submit"));
r.setCanEdit(true);
r.setChange(toChange(info));
r.setStarred(info.starred());
r.setPatchSets(toPatchSets(info));
r.setMergeable(info.mergeable());
r.setMessages(toMessages(info));
r.setAccounts(users(info));
r.setCurrentPatchSetId(new PatchSet.Id(info.legacy_id(), rev._number()));
r.setCurrentPatchSetDetail(toPatchSetDetail(info));
r.setSubmitRecords(new ArrayList<SubmitRecord>());
// Obtained later in ChangeScreen.
r.setSubmitTypeRecord(new SubmitTypeRecord());
r.getSubmitTypeRecord().status = SubmitTypeRecord.Status.RULE_ERROR;
r.setPatchSetsWithDraftComments(new HashSet<PatchSet.Id>());
r.setDependsOn(new ArrayList<com.google.gerrit.common.data.ChangeInfo>());
r.setNeededBy(new ArrayList<com.google.gerrit.common.data.ChangeInfo>());
return r;
}
private static PatchSetDetail toPatchSetDetail(ChangeInfo info) {
RevisionInfo rev = current(info);
PatchSetDetail p = new PatchSetDetail();
p.setPatchSet(toPatchSet(info, rev));
p.setProject(info.project_name_key());
p.setInfo(new PatchSetInfo(p.getPatchSet().getId()));
p.getInfo().setRevId(rev.name());
p.getInfo().setParents(new ArrayList<ParentInfo>());
p.getInfo().setAuthor(toUser(rev.commit().author()));
p.getInfo().setCommitter(toUser(rev.commit().committer()));
p.getInfo().setSubject(rev.commit().subject());
p.getInfo().setMessage(rev.commit().message());
if (rev.commit().parents() != null) {
for (CommitInfo c : Natives.asList(rev.commit().parents())) {
p.getInfo().getParents().add(new ParentInfo(
new RevId(c.commit()),
c.subject()));
}
}
p.setPatches(new ArrayList<Patch>());
p.setCommands(new ArrayList<UiCommandDetail>());
rev.files();
return p;
}
private static UserIdentity toUser(GitPerson p) {
UserIdentity u = new UserIdentity();
u.setName(p.name());
u.setEmail(p.email());
u.setDate(p.date());
return u;
}
public static AccountInfoCache users(ChangeInfo info) {
Map<Integer, AccountInfo> r = new HashMap<>();
add(r, info.owner());
if (info.messages() != null) {
for (MessageInfo m : Natives.asList(info.messages())) {
add(r, m.author());
}
}
return new AccountInfoCache(r.values());
}
private static void add(Map<Integer, AccountInfo> r,
com.google.gerrit.client.account.AccountInfo user) {
if (user != null && !r.containsKey(user._account_id())) {
AccountInfo a = new AccountInfo(new Account.Id(user._account_id()));
a.setPreferredEmail(user.email());
a.setFullName(user.name());
r.put(user._account_id(), a);
}
}
private static boolean can(NativeMap<ActionInfo> m, String n) {
return m != null && m.containsKey(n) && m.get(n).enabled();
}
private static List<ChangeMessage> toMessages(ChangeInfo info) {
List<ChangeMessage> msgs = new ArrayList<>();
for (MessageInfo m : Natives.asList(info.messages())) {
ChangeMessage o = new ChangeMessage(
new ChangeMessage.Key(
info.legacy_id(),
m.date().toString()),
m.author() != null
? new Account.Id(m.author()._account_id())
: null,
m.date(),
m._revisionNumber() > 0
? new PatchSet.Id(info.legacy_id(), m._revisionNumber())
: null);
o.setMessage(m.message());
msgs.add(o);
}
return msgs;
}
private static List<PatchSet> toPatchSets(ChangeInfo info) {
JsArray<RevisionInfo> all = info.revisions().values();
RevisionInfo.sortRevisionInfoByNumber(all);
List<PatchSet> r = new ArrayList<>(all.length());
for (RevisionInfo rev : Natives.asList(all)) {
r.add(toPatchSet(info, rev));
}
return r;
}
private static PatchSet toPatchSet(ChangeInfo info, RevisionInfo rev) {
PatchSet p = new PatchSet(
new PatchSet.Id(info.legacy_id(), rev._number()));
p.setCreatedOn(rev.commit().committer().date());
p.setDraft(rev.draft());
p.setRevision(new RevId(rev.name()));
return p;
}
public static Change toChange(ChangeInfo info) {
RevisionInfo rev = current(info);
PatchSetInfo p = new PatchSetInfo(
new PatchSet.Id(
info.legacy_id(),
rev._number()));
p.setSubject(info.subject());
Change c = new Change(
new Change.Key(info.change_id()),
info.legacy_id(),
new Account.Id(info.owner()._account_id()),
new Branch.NameKey(
info.project_name_key(),
info.branch()),
info.created());
c.setTopic(info.topic());
c.setStatus(info.status());
c.setCurrentPatchSet(p);
c.setLastUpdatedOn(info.updated());
return c;
}
private static RevisionInfo current(ChangeInfo info) {
RevisionInfo rev = info.revision(info.current_revision());
if (rev == null) {
JsArray<RevisionInfo> all = info.revisions().values();
RevisionInfo.sortRevisionInfoByNumber(all);
rev = all.get(all.length() - 1);
}
return rev;
}
public static void setChangeDetail(ChangeDetail detail) {
Change.Id chgId = detail.getChange().getId();
ChangeCache.get(chgId).getChangeDetailCache().set(detail);
StarredChanges.fireChangeStarEvent(chgId, detail.isStarred());
}
private final Change.Id changeId;
public ChangeDetailCache(final Change.Id chg) {
changeId = chg;
}
public void refresh() {
RestApi call = ChangeApi.detail(changeId.get());
ChangeList.addOptions(call, EnumSet.of(
ListChangesOption.CURRENT_ACTIONS,
ListChangesOption.ALL_REVISIONS,
ListChangesOption.ALL_COMMITS));
call.get(new NewGerritCallback());
}
}

View File

@ -1,222 +0,0 @@
// Copyright (C) 2008 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.changes;
import static com.google.gerrit.client.FormatUtil.mediumFormat;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountLinkPanel;
import com.google.gerrit.client.ui.BranchLink;
import com.google.gerrit.client.ui.CommentedActionDialog;
import com.google.gerrit.client.ui.InlineHyperlink;
import com.google.gerrit.client.ui.ProjectSearchLink;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.AccountInfoCache;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.clippy.client.CopyableLabel;
public class ChangeInfoBlock extends Composite {
private static final int R_CHANGE_ID = 0;
private static final int R_OWNER = 1;
private static final int R_PROJECT = 2;
private static final int R_BRANCH = 3;
private static final int R_TOPIC = 4;
private static final int R_UPLOADED = 5;
private static final int R_UPDATED = 6;
private static final int R_SUBMIT_TYPE = 7;
private static final int R_STATUS = 8;
private static final int R_MERGE_TEST = 9;
private static final int R_CNT = 10;
private final Grid table;
public ChangeInfoBlock() {
table = new Grid(R_CNT, 2);
table.setStyleName(Gerrit.RESOURCES.css().infoBlock());
table.addStyleName(Gerrit.RESOURCES.css().changeInfoBlock());
initRow(R_CHANGE_ID, "Change-Id: ");
initRow(R_OWNER, Util.C.changeInfoBlockOwner());
initRow(R_PROJECT, Util.C.changeInfoBlockProject());
initRow(R_BRANCH, Util.C.changeInfoBlockBranch());
initRow(R_TOPIC, Util.C.changeInfoBlockTopic());
initRow(R_UPLOADED, Util.C.changeInfoBlockUploaded());
initRow(R_UPDATED, Util.C.changeInfoBlockUpdated());
initRow(R_STATUS, Util.C.changeInfoBlockStatus());
initRow(R_SUBMIT_TYPE, Util.C.changeInfoBlockSubmitType());
initRow(R_MERGE_TEST, Util.C.changeInfoBlockCanMerge());
final CellFormatter fmt = table.getCellFormatter();
fmt.addStyleName(0, 0, Gerrit.RESOURCES.css().topmost());
fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().topmost());
fmt.addStyleName(R_CHANGE_ID, 1, Gerrit.RESOURCES.css().changeid());
fmt.addStyleName(R_CNT - 2, 0, Gerrit.RESOURCES.css().bottomheader());
initWidget(table);
}
private void initRow(final int row, final String name) {
table.setText(row, 0, name);
table.getCellFormatter().addStyleName(row, 0, Gerrit.RESOURCES.css().header());
}
public void display(final ChangeDetail changeDetail,
final AccountInfoCache acc, SubmitTypeRecord submitTypeRecord) {
final Change chg = changeDetail.getChange();
final Branch.NameKey dst = chg.getDest();
CopyableLabel changeIdLabel =
new CopyableLabel("Change-Id: " + chg.getKey().get());
changeIdLabel.setPreviewText(chg.getKey().get());
table.setWidget(R_CHANGE_ID, 1, changeIdLabel);
table.setWidget(R_OWNER, 1, AccountLinkPanel.link(acc, chg.getOwner()));
final FlowPanel p = new FlowPanel();
p.add(new ProjectSearchLink(chg.getProject()));
p.add(new InlineHyperlink(chg.getProject().get(),
PageLinks.toProject(chg.getProject())));
table.setWidget(R_PROJECT, 1, p);
table.setWidget(R_BRANCH, 1, new BranchLink(dst.getShortName(), chg
.getProject(), chg.getStatus(), dst.get(), null));
table.setWidget(R_TOPIC, 1, topic(changeDetail));
table.setText(R_UPLOADED, 1, mediumFormat(chg.getCreatedOn()));
table.setText(R_UPDATED, 1, mediumFormat(chg.getLastUpdatedOn()));
table.setText(R_STATUS, 1, Util.toLongString(chg.getStatus()));
String submitType;
if (submitTypeRecord.status == SubmitTypeRecord.Status.OK) {
submitType = com.google.gerrit.client.admin.Util
.toLongString(submitTypeRecord.type);
} else {
submitType = submitTypeRecord.status.name();
}
table.setText(R_SUBMIT_TYPE, 1, submitType);
final Change.Status status = chg.getStatus();
if (status.equals(Change.Status.NEW) || status.equals(Change.Status.DRAFT)) {
table.getRowFormatter().setVisible(R_MERGE_TEST, true);
table.setText(R_MERGE_TEST, 1, changeDetail.isMergeable() ? Util.C
.changeInfoBlockCanMergeYes() : Util.C.changeInfoBlockCanMergeNo());
} else {
table.getRowFormatter().setVisible(R_MERGE_TEST, false);
}
if (status.isClosed()) {
table.getCellFormatter().addStyleName(R_STATUS, 1, Gerrit.RESOURCES.css().closedstate());
table.getRowFormatter().setVisible(R_SUBMIT_TYPE, false);
} else {
table.getCellFormatter().removeStyleName(R_STATUS, 1, Gerrit.RESOURCES.css().closedstate());
table.getRowFormatter().setVisible(R_SUBMIT_TYPE, true);
}
}
public Widget topic(final ChangeDetail changeDetail) {
final Change chg = changeDetail.getChange();
final Branch.NameKey dst = chg.getDest();
FlowPanel fp = new FlowPanel();
fp.addStyleName(Gerrit.RESOURCES.css().changeInfoTopicPanel());
fp.add(new BranchLink(chg.getTopic(), chg.getProject(), chg.getStatus(),
dst.get(), chg.getTopic()));
if (changeDetail.canEditTopicName()) {
final Image edit = new Image(Gerrit.RESOURCES.edit());
edit.addStyleName(Gerrit.RESOURCES.css().link());
edit.setTitle(Util.C.changeInfoBlockTopicAlterTopicToolTip());
edit.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
new AlterTopicDialog(chg).center();
}
});
fp.add(edit);
}
return fp;
}
private class AlterTopicDialog extends CommentedActionDialog<ChangeDetail>
implements KeyPressHandler {
TextBox newTopic;
Change change;
AlterTopicDialog(Change chg) {
super(Util.C.alterTopicTitle(), Util.C.headingAlterTopicMessage(),
new ChangeDetailCache.IgnoreErrorCallback());
change = chg;
message.setVisible(false);
newTopic = new TextBox();
newTopic.addKeyPressHandler(this);
setFocusOn(newTopic);
panel.insert(newTopic, 0);
panel.insert(new InlineLabel(Util.C.alterTopicLabel()), 0);
}
@Override
protected void onLoad() {
super.onLoad();
newTopic.setText(change.getTopic());
}
private void doTopicEdit() {
String topic = newTopic.getText();
ChangeApi.topic(change.getId().get(), topic,
new GerritCallback<String>() {
@Override
public void onSuccess(String result) {
sent = true;
Gerrit.display(PageLinks.toChange(change.getId()));
hide();
}
@Override
public void onFailure(final Throwable caught) {
enableButtons(true);
super.onFailure(caught);
}});
}
@Override
public void onSend() {
doTopicEdit();
}
@Override
public void onKeyPress(KeyPressEvent event) {
if (event.getSource() == newTopic
&& event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
doTopicEdit();
}
}
}
}

View File

@ -1,774 +0,0 @@
// Copyright (C) 2008 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.changes;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.FormatUtil;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.account.AccountInfo;
import com.google.gerrit.client.change.RelatedChanges;
import com.google.gerrit.client.change.RelatedChanges.ChangeAndCommit;
import com.google.gerrit.client.changes.ChangeInfo.CommitInfo;
import com.google.gerrit.client.diff.DiffApi;
import com.google.gerrit.client.diff.FileInfo;
import com.google.gerrit.client.projects.ConfigInfoCache;
import com.google.gerrit.client.rpc.CallbackGroup;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.client.ui.CommentPanel;
import com.google.gerrit.client.ui.ComplexDisclosurePanel;
import com.google.gerrit.client.ui.ExpandAllCommand;
import com.google.gerrit.client.ui.LinkMenuBar;
import com.google.gerrit.client.ui.NeedsSignInKeyCommand;
import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.common.data.AccountInfoCache;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.ChangeInfo;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Change.Status;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.Patch.ChangeType;
import com.google.gerrit.reviewdb.client.Patch.PatchType;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.globalkey.client.KeyCommand;
import com.google.gwtexpui.globalkey.client.KeyCommandSet;
import java.sql.Timestamp;
import java.util.ArrayList;
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 ChangeScreen extends Screen
implements ValueChangeHandler<ChangeDetail> {
private final Change.Id changeId;
private final PatchSet.Id openPatchSetId;
private ChangeDetailCache detailCache;
private com.google.gerrit.client.changes.ChangeInfo changeInfo;
private ChangeDescriptionBlock descriptionBlock;
private ApprovalTable approvals;
private IncludedInTable includedInTable;
private DisclosurePanel includedInPanel;
private ComplexDisclosurePanel dependenciesPanel;
private ChangeTable dependencies;
private ChangeTable.Section dependsOn;
private ChangeTable.Section neededBy;
private PatchSetsBlock patchSetsBlock;
private Panel comments;
private CommentLinkProcessor commentLinkProcessor;
private KeyCommandSet keysNavigation;
private KeyCommandSet keysAction;
private HandlerRegistration regNavigation;
private HandlerRegistration regAction;
private HandlerRegistration regDetailCache;
private Grid patchesGrid;
private ListBox patchesList;
/**
* The change id for which the old version history is valid.
*/
private static Change.Id currentChangeId;
/**
* Which patch set id is the diff base.
*/
private static PatchSet.Id diffBaseId;
public ChangeScreen(final Change.Id toShow) {
changeId = toShow;
openPatchSetId = null;
}
public ChangeScreen(final PatchSet.Id toShow) {
changeId = toShow.getParentKey();
openPatchSetId = toShow;
}
public ChangeScreen(final ChangeInfo c) {
this(c.getId());
}
@Override
protected void onLoad() {
super.onLoad();
detailCache.refresh();
}
@Override
protected void onUnload() {
if (regNavigation != null) {
regNavigation.removeHandler();
regNavigation = null;
}
if (regAction != null) {
regAction.removeHandler();
regAction = null;
}
if (regDetailCache != null) {
regDetailCache.removeHandler();
regDetailCache = null;
}
super.onUnload();
}
@Override
public void registerKeys() {
super.registerKeys();
regNavigation = GlobalKey.add(this, keysNavigation);
regAction = GlobalKey.add(this, keysAction);
if (openPatchSetId != null) {
patchSetsBlock.activate(openPatchSetId);
}
}
@Override
protected void onInitUI() {
super.onInitUI();
ChangeCache cache = ChangeCache.get(changeId);
detailCache = cache.getChangeDetailCache();
regDetailCache = detailCache.addValueChangeHandler(this);
addStyleName(Gerrit.RESOURCES.css().changeScreen());
addStyleName(Gerrit.RESOURCES.css().screenNoHeader());
keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation());
keysAction = new KeyCommandSet(Gerrit.C.sectionActions());
keysNavigation.add(new UpToListKeyCommand(0, 'u', Util.C.upToChangeList()));
keysNavigation.add(new ExpandCollapseDependencySectionKeyCommand(0, 'd', Util.C.expandCollapseDependencies()));
if (Gerrit.isSignedIn()) {
keysAction.add(new PublishCommentsKeyCommand(0, 'r', Util.C
.keyPublishComments()));
}
descriptionBlock = new ChangeDescriptionBlock(keysAction);
add(descriptionBlock);
approvals = new ApprovalTable();
add(approvals);
includedInPanel = new DisclosurePanel(Util.C.changeScreenIncludedIn());
includedInTable = new IncludedInTable(changeId);
includedInPanel.setContent(includedInTable);
add(includedInPanel);
dependencies = new ChangeTable() {
{
table.setWidth("auto");
}
};
dependsOn = new ChangeTable.Section(Util.C.changeScreenDependsOn());
dependsOn.setChangeRowFormatter(new ChangeTable.ChangeRowFormatter() {
@Override
public String getRowStyle(ChangeInfo c) {
if (! c.isLatest() || Change.Status.ABANDONED.equals(c.getStatus())) {
return Gerrit.RESOURCES.css().outdated();
}
return null;
}
@Override
public String getDisplayText(final ChangeInfo c, final String displayText) {
if (! c.isLatest()) {
return displayText + " [OUTDATED]";
}
return displayText;
}
});
neededBy = new ChangeTable.Section(Util.C.changeScreenNeededBy());
dependencies.addSection(dependsOn);
dependencies.addSection(neededBy);
dependenciesPanel = new ComplexDisclosurePanel(
Util.C.changeScreenDependencies(), false);
dependenciesPanel.setContent(dependencies);
add(dependenciesPanel);
patchesList = new ListBox();
patchesList.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
final int index = patchesList.getSelectedIndex();
final String selectedPatchSet = patchesList.getValue(index);
if (index == 0) {
diffBaseId = null;
} else {
diffBaseId = PatchSet.Id.parse(selectedPatchSet);
}
if (patchSetsBlock != null) {
patchSetsBlock.refresh(diffBaseId);
}
}
});
patchesGrid = new Grid(1, 2);
patchesGrid.setStyleName(Gerrit.RESOURCES.css().selectPatchSetOldVersion());
patchesGrid.setText(0, 0, Util.C.referenceVersion());
patchesGrid.setWidget(0, 1, patchesList);
add(patchesGrid);
patchSetsBlock = new PatchSetsBlock();
add(patchSetsBlock);
comments = new FlowPanel();
comments.setStyleName(Gerrit.RESOURCES.css().changeComments());
add(comments);
}
private void displayTitle(final Change.Key changeId, final String subject) {
final StringBuilder titleBuf = new StringBuilder();
if (LocaleInfo.getCurrentLocale().isRTL()) {
if (subject != null) {
titleBuf.append(subject);
titleBuf.append(" :");
}
titleBuf.append(Util.M.changeScreenTitleId(changeId.abbreviate()));
} else {
titleBuf.append(Util.M.changeScreenTitleId(changeId.abbreviate()));
if (subject != null) {
titleBuf.append(": ");
titleBuf.append(subject);
}
}
setPageTitle(titleBuf.toString());
setHeaderVisible(false);
}
@Override
public void onValueChange(final ValueChangeEvent<ChangeDetail> event) {
if (isAttached() && isLastValueChangeHandler()) {
// Until this screen is fully migrated to the new API, these calls must
// happen sequentially after the ChangeDetail lookup, because we can't
// start an async get at the source of every call that might trigger a
// value change.
CallbackGroup cbs1 = new CallbackGroup();
final CallbackGroup cbs2 = new CallbackGroup();
final PatchSet.Id psId = event.getValue().getCurrentPatchSet().getId();
final Map<String, Patch> patches = new HashMap<>();
String revId =
event.getValue().getCurrentPatchSetDetail().getInfo().getRevId();
if (event.getValue().getChange().getStatus().isOpen()) {
ChangeApi.revision(changeId.get(), "current")
.view("submit_type")
.get(cbs1.add(new GerritCallback<NativeString>() {
@Override
public void onSuccess(NativeString result) {
event.getValue().setSubmitTypeRecord(SubmitTypeRecord.OK(
SubmitType.valueOf(result.asString())));
}
@Override
public void onFailure(Throwable caught) {}
}));
}
if (Gerrit.isSignedIn()) {
ChangeApi.revision(changeId.get(), "" + psId.get())
.view("related")
.get(cbs1.add(new AsyncCallback<RelatedChanges.RelatedInfo>() {
@Override
public void onSuccess(RelatedChanges.RelatedInfo info) {
if (info.changes() != null) {
dependsOn(info);
neededBy(info);
}
}
private void dependsOn(RelatedChanges.RelatedInfo info) {
ChangeAndCommit self = null;
Map<String, ChangeAndCommit> m = new HashMap<>();
for (int i = 0; i < info.changes().length(); i++) {
ChangeAndCommit c = info.changes().get(i);
if (changeId.equals(c.legacy_id())) {
self = c;
}
if (c.commit() != null && c.commit().commit() != null) {
m.put(c.commit().commit(), c);
}
}
if (self != null && self.commit() != null
&& self.commit().parents() != null) {
List<ChangeInfo> d = new ArrayList<>();
for (CommitInfo p : Natives.asList(self.commit().parents())) {
ChangeAndCommit pc = m.get(p.commit());
if (pc != null && pc.has_change_number()) {
ChangeInfo i = new ChangeInfo();
load(pc, i);
d.add(i);
}
}
event.getValue().setDependsOn(d);
}
}
private void neededBy(RelatedChanges.RelatedInfo info) {
Set<String> mine = new HashSet<>();
for (PatchSet ps : event.getValue().getPatchSets()) {
mine.add(ps.getRevision().get());
}
List<ChangeInfo> n = new ArrayList<>();
for (int i = 0; i < info.changes().length(); i++) {
ChangeAndCommit c = info.changes().get(i);
if (c.has_change_number()
&& c.commit() != null
&& c.commit().parents() != null) {
for (int j = 0; j < c.commit().parents().length(); j++) {
CommitInfo p = c.commit().parents().get(j);
if (mine.contains(p.commit())) {
ChangeInfo u = new ChangeInfo();
load(c, u);
n.add(u);
break;
}
}
}
}
event.getValue().setNeededBy(n);
}
private void load(final ChangeAndCommit pc, final ChangeInfo i) {
RestApi call = ChangeApi.change(pc.legacy_id().get());
ChangeList.addOptions(call, EnumSet.of(
ListChangesOption.DETAILED_ACCOUNTS,
ListChangesOption.CURRENT_REVISION));
call.get(cbs2.add(new AsyncCallback<
com.google.gerrit.client.changes.ChangeInfo>() {
@Override
public void onFailure(Throwable caught) {}
@Override
public void onSuccess(
com.google.gerrit.client.changes.ChangeInfo result) {
i.set(ChangeDetailCache.toChange(result),
pc.patch_set_id());
i.setStarred(result.starred());
event.getValue().getAccounts()
.merge(ChangeDetailCache.users(result));
}}));
}
@Override
public void onFailure(Throwable caught) {}
}));
ChangeApi.revision(changeId.get(), revId)
.view("files")
.addParameterTrue("reviewed")
.get(cbs1.add(new AsyncCallback<JsArrayString>() {
@Override
public void onSuccess(JsArrayString result) {
for(int i = 0; i < result.length(); i++) {
String path = result.get(i);
Patch p = patches.get(path);
if (p == null) {
p = new Patch(new Patch.Key(psId, path));
patches.put(path, p);
}
p.setReviewedByCurrentUser(true);
}
}
@Override
public void onFailure(Throwable caught) {}
}));
final Set<PatchSet.Id> withDrafts = new HashSet<>();
event.getValue().setPatchSetsWithDraftComments(withDrafts);
for (PatchSet ps : event.getValue().getPatchSets()) {
if (!ps.getId().equals(psId)) {
final PatchSet.Id id = ps.getId();
ChangeApi.revision(changeId.get(), "" + id.get())
.view("drafts")
.get(cbs1.add(new AsyncCallback<NativeMap<JsArray<CommentInfo>>>() {
@Override
public void onSuccess(NativeMap<JsArray<CommentInfo>> result) {
if (!result.isEmpty()) {
withDrafts.add(id);
}
}
@Override
public void onFailure(Throwable caught) {}
}));
}
}
ChangeApi.revision(changeId.get(), "" + psId.get())
.view("drafts")
.get(cbs1.add(new AsyncCallback<NativeMap<JsArray<CommentInfo>>>() {
@Override
public void onSuccess(NativeMap<JsArray<CommentInfo>> result) {
for (String path : result.keySet()) {
Patch p = patches.get(path);
if (p == null) {
p = new Patch(new Patch.Key(psId, path));
patches.put(path, p);
}
p.setDraftCount(result.get(path).length());
}
if (!result.isEmpty()) {
withDrafts.add(psId);
}
}
@Override
public void onFailure(Throwable caught) {}
}));
}
ChangeApi.revision(changeId.get(), revId)
.view("comments")
.get(cbs1.add(new AsyncCallback<NativeMap<JsArray<CommentInfo>>>() {
@Override
public void onSuccess(NativeMap<JsArray<CommentInfo>> result) {
for (String path : result.keySet()) {
Patch p = patches.get(path);
if (p == null) {
p = new Patch(new Patch.Key(psId, path));
patches.put(path, p);
}
p.setCommentCount(result.get(path).length());
}
}
@Override
public void onFailure(Throwable caught) {}
}));
DiffApi.list(changeId.get(), null, revId,
new AsyncCallback<NativeMap<FileInfo>>() {
@Override
public void onSuccess(NativeMap<FileInfo> result) {
JsArray<FileInfo> fileInfos = result.values();
FileInfo.sortFileInfoByPath(fileInfos);
List<Patch> list = new ArrayList<>(fileInfos.length());
for (FileInfo f : Natives.asList(fileInfos)) {
Patch p = patches.get(f.path());
if (p == null) {
p = new Patch(new Patch.Key(psId, f.path()));
patches.put(f.path(), p);
}
p.setInsertions(f.lines_inserted());
p.setDeletions(f.lines_deleted());
p.setPatchType(f.binary() ? PatchType.BINARY : PatchType.UNIFIED);
if (f.status() == null) {
p.setChangeType(ChangeType.MODIFIED);
} else {
p.setChangeType(ChangeType.forCode(f.status().charAt(0)));
}
list.add(p);
}
event.getValue().getCurrentPatchSetDetail().setPatches(list);
}
@Override
public void onFailure(Throwable caught) {}
});
ConfigInfoCache.get(
event.getValue().getChange().getProject(),
cbs1.add(new GerritCallback<ConfigInfoCache.Entry>() {
@Override
public void onSuccess(ConfigInfoCache.Entry result) {
commentLinkProcessor = result.getCommentLinkProcessor();
setTheme(result.getTheme());
}
@Override
public void onFailure(Throwable caught) {
// Handled by last callback's onFailure.
}
}));
ChangeApi.detail(changeId.get(), cbs1.addFinal(
new GerritCallback<com.google.gerrit.client.changes.ChangeInfo>() {
@Override
public void onSuccess(
com.google.gerrit.client.changes.ChangeInfo result) {
changeInfo = result;
cbs2.addFinal(new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
display(event.getValue());
}
@Override
public void onFailure(Throwable caught) {}
}).onSuccess(null);
}
}));
}
}
// Find the last attached screen.
// When DialogBox is used (i. e. CommentedActionDialog) then the original
// ChangeScreen is still in attached state.
// Use here the fact, that the handlers (ChangeScreen) are sorted.
private boolean isLastValueChangeHandler() {
int count = detailCache.getHandlerCount();
return count > 0 && detailCache.getHandler(count - 1) == this;
}
private void display(final ChangeDetail detail) {
displayTitle(detail.getChange().getKey(), detail.getChange().getSubject());
discardDiffBaseIfNotApplicable(detail.getChange().getId());
if (Status.MERGED == detail.getChange().getStatus()) {
includedInPanel.setVisible(true);
includedInPanel.addOpenHandler(includedInTable);
} else {
includedInPanel.setVisible(false);
}
dependencies.setAccountInfoCache(detail.getAccounts());
descriptionBlock.display(detail,
detail.isStarred(),
detail.canEditCommitMessage(),
detail.getCurrentPatchSetDetail().getInfo(),
detail.getAccounts(), detail.getSubmitTypeRecord(),
commentLinkProcessor);
dependsOn.display(detail.getDependsOn());
neededBy.display(detail.getNeededBy());
approvals.display(changeInfo);
patchesList.clear();
if (detail.getCurrentPatchSetDetail().getInfo().getParents().size() > 1) {
patchesList.addItem(Util.C.autoMerge());
} else {
patchesList.addItem(Util.C.baseDiffItem());
}
for (PatchSet pId : detail.getPatchSets()) {
patchesList.addItem(Util.M.patchSetHeader(pId.getPatchSetId()), pId
.getId().toString());
}
if (diffBaseId != null) {
patchesList.setSelectedIndex(diffBaseId.get());
}
patchSetsBlock.display(detail, diffBaseId);
addComments(detail);
// If any dependency change is still open, or is outdated,
// or the change is needed by a change that is new or submitted,
// show our dependency list.
//
boolean depsOpen = false;
int outdated = 0;
if (!detail.getChange().getStatus().isClosed()) {
final List<ChangeInfo> dependsOn = detail.getDependsOn();
if (dependsOn != null) {
for (final ChangeInfo ci : dependsOn) {
if (!ci.isLatest()) {
depsOpen = true;
outdated++;
} else if (ci.getStatus() != Change.Status.MERGED) {
depsOpen = true;
}
}
}
}
final List<ChangeInfo> neededBy = detail.getNeededBy();
if (neededBy != null) {
for (final ChangeInfo ci : neededBy) {
if ((ci.getStatus() == Change.Status.NEW) ||
(ci.getStatus() == Change.Status.SUBMITTED) ||
(ci.getStatus() == Change.Status.DRAFT)) {
depsOpen = true;
}
}
}
dependenciesPanel.setOpen(depsOpen);
dependenciesPanel.getHeader().clear();
if (outdated > 0) {
dependenciesPanel.getHeader().add(new InlineLabel(
Util.M.outdatedHeader(outdated)));
}
if (!isCurrentView()) {
display();
}
patchSetsBlock.setRegisterKeys(true);
}
private static void discardDiffBaseIfNotApplicable(final Change.Id toShow) {
if (currentChangeId != null && !currentChangeId.equals(toShow)) {
diffBaseId = null;
}
currentChangeId = toShow;
}
private void addComments(final ChangeDetail detail) {
comments.clear();
final AccountInfoCache accts = detail.getAccounts();
final List<ChangeMessage> msgList = detail.getMessages();
HorizontalPanel title = new HorizontalPanel();
title.setWidth("100%");
title.add(new Label(Util.C.changeScreenComments()));
if (msgList.size() > 1) {
title.add(messagesMenuBar());
}
title.setStyleName(Gerrit.RESOURCES.css().blockHeader());
comments.add(title);
final long AGE = 7 * 24 * 60 * 60 * 1000L;
final Timestamp aged = new Timestamp(System.currentTimeMillis() - AGE);
CommentVisibilityStrategy commentVisibilityStrategy =
CommentVisibilityStrategy.EXPAND_RECENT;
if (Gerrit.isSignedIn()) {
commentVisibilityStrategy = Gerrit.getUserAccount()
.getGeneralPreferences().getCommentVisibilityStrategy();
}
for (int i = 0; i < msgList.size(); i++) {
final ChangeMessage msg = msgList.get(i);
AccountInfo author;
if (msg.getAuthor() != null) {
author = FormatUtil.asInfo(accts.get(msg.getAuthor()));
} else {
author = AccountInfo.create(0, Util.C.messageNoAuthor(), null, null);
}
boolean isRecent;
if (i == msgList.size() - 1) {
isRecent = true;
} else {
// TODO Instead of opening messages by strict age, do it by "unread"?
isRecent = msg.getWrittenOn().after(aged);
}
final CommentPanel cp = new CommentPanel(author, msg.getWrittenOn(),
msg.getMessage(), commentLinkProcessor);
cp.setRecent(isRecent);
cp.addStyleName(Gerrit.RESOURCES.css().commentPanelBorder());
if (i == msgList.size() - 1) {
cp.addStyleName(Gerrit.RESOURCES.css().commentPanelLast());
}
boolean isOpen = false;
switch (commentVisibilityStrategy) {
case COLLAPSE_ALL:
break;
case EXPAND_ALL:
isOpen = true;
break;
case EXPAND_MOST_RECENT:
isOpen = i == msgList.size() - 1;
break;
case EXPAND_RECENT:
default:
isOpen = isRecent;
break;
}
cp.setOpen(isOpen);
comments.add(cp);
}
final Button b = new Button(Util.C.changeScreenAddComment());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
PatchSet.Id currentPatchSetId = patchSetsBlock.getCurrentPatchSet().getId();
Gerrit.display(Dispatcher.toPublish(currentPatchSetId));
}
});
comments.add(b);
comments.setVisible(msgList.size() > 0);
}
private LinkMenuBar messagesMenuBar() {
final Panel c = comments;
final LinkMenuBar menuBar = new LinkMenuBar();
menuBar.addItem(Util.C.messageExpandRecent(), new ExpandAllCommand(c, true) {
@Override
protected void expand(final CommentPanel w) {
w.setOpen(w.isRecent());
}
});
menuBar.addItem(Util.C.messageExpandAll(), new ExpandAllCommand(c, true));
menuBar.addItem(Util.C.messageCollapseAll(), new ExpandAllCommand(c, false));
menuBar.addStyleName(Gerrit.RESOURCES.css().commentPanelMenuBar());
return menuBar;
}
public class UpToListKeyCommand extends KeyCommand {
public UpToListKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
Gerrit.displayLastChangeList();
}
}
public class ExpandCollapseDependencySectionKeyCommand extends KeyCommand {
public ExpandCollapseDependencySectionKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(KeyPressEvent event) {
dependenciesPanel.setOpen(!dependenciesPanel.isOpen());
}
}
public class PublishCommentsKeyCommand extends NeedsSignInKeyCommand {
public PublishCommentsKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
PatchSet.Id currentPatchSetId = patchSetsBlock.getCurrentPatchSet().getId();
Gerrit.display(Dispatcher.toPublish(currentPatchSetId));
}
}
}

View File

@ -1,350 +0,0 @@
// Copyright (C) 2008 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.changes;
import static com.google.gerrit.client.FormatUtil.shortFormat;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.ui.AccountLinkPanel;
import com.google.gerrit.client.ui.BranchLink;
import com.google.gerrit.client.ui.ChangeLink;
import com.google.gerrit.client.ui.NavigationTable;
import com.google.gerrit.client.ui.NeedsSignInKeyCommand;
import com.google.gerrit.client.ui.ProjectLink;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.AccountInfoCache;
import com.google.gerrit.common.data.ChangeInfo;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ChangeTable extends NavigationTable<ChangeInfo> {
private static final int C_STAR = 1;
private static final int C_SUBJECT = 2;
private static final int C_OWNER = 3;
private static final int C_PROJECT = 4;
private static final int C_BRANCH = 5;
private static final int C_LAST_UPDATE = 6;
private static final int COLUMNS = 7;
private final List<Section> sections;
private AccountInfoCache accountCache = AccountInfoCache.empty();
public ChangeTable() {
super(Util.C.changeItemHelp());
if (Gerrit.isSignedIn()) {
keysAction.add(new StarKeyCommand(0, 's', Util.C.changeTableStar()));
}
sections = new ArrayList<>();
table.setText(0, C_STAR, "");
table.setText(0, C_SUBJECT, Util.C.changeTableColumnSubject());
table.setText(0, C_OWNER, Util.C.changeTableColumnOwner());
table.setText(0, C_PROJECT, Util.C.changeTableColumnProject());
table.setText(0, C_BRANCH, Util.C.changeTableColumnBranch());
table.setText(0, C_LAST_UPDATE, Util.C.changeTableColumnLastUpdate());
final FlexCellFormatter fmt = table.getFlexCellFormatter();
fmt.addStyleName(0, C_STAR, Gerrit.RESOURCES.css().iconHeader());
for (int i = C_SUBJECT; i < COLUMNS; i++) {
fmt.addStyleName(0, i, Gerrit.RESOURCES.css().dataHeader());
}
table.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
final Cell cell = table.getCellForEvent(event);
if (cell == null) {
return;
}
if (cell.getCellIndex() == C_STAR) {
// Don't do anything (handled by star itself).
} else if (cell.getCellIndex() == C_OWNER) {
// Don't do anything.
} else if (getRowItem(cell.getRowIndex()) != null) {
movePointerTo(cell.getRowIndex());
}
}
});
}
protected void onStarClick(final int row) {
final ChangeInfo c = getRowItem(row);
if (c != null && Gerrit.isSignedIn()) {
((StarredChanges.Icon) table.getWidget(row, C_STAR)).toggleStar();
}
}
@Override
protected Object getRowItemKey(final ChangeInfo item) {
return item.getId();
}
@Override
protected void onOpenRow(final int row) {
final ChangeInfo c = getRowItem(row);
Gerrit.display(PageLinks.toChange(c), new ChangeScreen(c));
}
private void insertNoneRow(final int row) {
insertRow(row);
table.setText(row, 0, Util.C.changeTableNone());
final FlexCellFormatter fmt = table.getFlexCellFormatter();
fmt.setColSpan(row, 0, COLUMNS);
fmt.setStyleName(row, 0, Gerrit.RESOURCES.css().emptySection());
}
private void insertChangeRow(final int row) {
insertRow(row);
applyDataRowStyle(row);
}
@Override
protected void applyDataRowStyle(final int row) {
super.applyDataRowStyle(row);
final CellFormatter fmt = table.getCellFormatter();
fmt.addStyleName(row, C_STAR, Gerrit.RESOURCES.css().iconCell());
for (int i = C_SUBJECT; i < COLUMNS; i++) {
fmt.addStyleName(row, i, Gerrit.RESOURCES.css().dataCell());
}
fmt.addStyleName(row, C_SUBJECT, Gerrit.RESOURCES.css().cSUBJECT());
fmt.addStyleName(row, C_OWNER, Gerrit.RESOURCES.css().cOWNER());
fmt.addStyleName(row, C_LAST_UPDATE, Gerrit.RESOURCES.css().cLastUpdate());
}
private void populateChangeRow(final int row, final ChangeInfo c,
final ChangeRowFormatter changeRowFormatter) {
ChangeCache cache = ChangeCache.get(c.getId());
cache.getChangeInfoCache().set(c);
table.setWidget(row, C_ARROW, null);
if (Gerrit.isSignedIn()) {
table.setWidget(row, C_STAR, StarredChanges.createIcon(c.getId(), c.isStarred()));
}
String s = Util.cropSubject(c.getSubject());
if (c.getStatus() != null && c.getStatus() != Change.Status.NEW) {
s += " (" + c.getStatus().name() + ")";
}
if (changeRowFormatter != null) {
removeChangeStyle(row, changeRowFormatter);
final String rowStyle = changeRowFormatter.getRowStyle(c);
if (rowStyle != null) {
table.getRowFormatter().addStyleName(row, rowStyle);
}
s = changeRowFormatter.getDisplayText(c, s);
}
table.setWidget(row, C_SUBJECT, new TableChangeLink(s, c));
table.setWidget(row, C_OWNER, link(c.getOwner()));
table.setWidget(row, C_PROJECT, new ProjectLink(c.getProject().getKey()));
table.setWidget(row, C_BRANCH, new BranchLink(c.getProject().getKey(), c
.getStatus(), c.getBranch(), c.getTopic()));
table.setText(row, C_LAST_UPDATE, shortFormat(c.getLastUpdatedOn()));
setRowItem(row, c);
}
private void removeChangeStyle(int row,
final ChangeRowFormatter changeRowFormatter) {
final ChangeInfo oldChange = getRowItem(row);
if (oldChange == null) {
return;
}
final String oldRowStyle = changeRowFormatter.getRowStyle(oldChange);
if (oldRowStyle != null) {
table.getRowFormatter().removeStyleName(row, oldRowStyle);
}
}
private AccountLinkPanel link(final Account.Id id) {
return AccountLinkPanel.link(accountCache, id);
}
public void addSection(final Section s) {
assert s.parent == null;
if (s.titleText != null) {
s.titleRow = table.getRowCount();
table.setText(s.titleRow, 0, s.titleText);
final FlexCellFormatter fmt = table.getFlexCellFormatter();
fmt.setColSpan(s.titleRow, 0, COLUMNS);
fmt.addStyleName(s.titleRow, 0, Gerrit.RESOURCES.css().sectionHeader());
} else {
s.titleRow = -1;
}
s.parent = this;
s.dataBegin = table.getRowCount();
insertNoneRow(s.dataBegin);
sections.add(s);
}
public void setAccountInfoCache(final AccountInfoCache aic) {
assert aic != null;
accountCache = aic;
}
private int insertRow(final int beforeRow) {
for (final Section s : sections) {
if (beforeRow <= s.titleRow) {
s.titleRow++;
}
if (beforeRow < s.dataBegin) {
s.dataBegin++;
}
}
return table.insertRow(beforeRow);
}
private void removeRow(final int row) {
for (final Section s : sections) {
if (row < s.titleRow) {
s.titleRow--;
}
if (row < s.dataBegin) {
s.dataBegin--;
}
}
table.removeRow(row);
}
public class StarKeyCommand extends NeedsSignInKeyCommand {
public StarKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
onStarClick(getCurrentRow());
}
}
private final class TableChangeLink extends ChangeLink {
private TableChangeLink(final String text, final ChangeInfo c) {
super(text, c);
}
@Override
public void go() {
movePointerTo(cid);
super.go();
}
}
public static class Section {
String titleText;
ChangeTable parent;
final Account.Id ownerId;
int titleRow = -1;
int dataBegin;
int rows;
private ChangeRowFormatter changeRowFormatter;
public Section() {
this(null, null);
}
public Section(final String titleText) {
this(titleText, null);
}
public Section(final String titleText, final Account.Id owner) {
setTitleText(titleText);
ownerId = owner;
}
public void setTitleText(final String text) {
titleText = text;
if (titleRow >= 0) {
parent.table.setText(titleRow, 0, titleText);
}
}
public void setChangeRowFormatter(final ChangeRowFormatter changeRowFormatter) {
this.changeRowFormatter = changeRowFormatter;
}
public void display(final List<ChangeInfo> changeList) {
final int sz = changeList != null ? changeList.size() : 0;
final boolean hadData = rows > 0;
if (hadData) {
while (sz < rows) {
parent.removeRow(dataBegin);
rows--;
}
}
if (sz == 0) {
if (hadData) {
parent.insertNoneRow(dataBegin);
}
} else {
Set<Change.Id> cids = new HashSet<>();
if (!hadData) {
parent.removeRow(dataBegin);
}
while (rows < sz) {
parent.insertChangeRow(dataBegin + rows);
rows++;
}
for (int i = 0; i < sz; i++) {
ChangeInfo c = changeList.get(i);
parent.populateChangeRow(dataBegin + i, c, changeRowFormatter);
cids.add(c.getId());
}
}
}
}
public static interface ChangeRowFormatter {
/**
* Returns the name of the CSS style that should be applied to the change
* row.
*
* @param c the change for which the styling should be returned
* @return the name of the CSS style that should be applied to the change
* row
*/
String getRowStyle(ChangeInfo c);
/**
* Returns the text that should be displayed for the change.
*
* @param c the change for which the display text should be returned
* @param displayText the current display text
* @return the new display text
*/
String getDisplayText(ChangeInfo c, String displayText);
}
}

View File

@ -15,32 +15,23 @@
package com.google.gerrit.client.changes;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.ChangeLink;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.client.ui.CommentedActionDialog;
import com.google.gerrit.client.ui.TextBoxChangeListener;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.PreElement;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
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.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwtexpui.clippy.client.CopyableLabel;
import com.google.gwtexpui.globalkey.client.KeyCommandSet;
import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtjsonrpc.common.AsyncCallback;
public class CommitMessageBlock extends Composite {
interface Binder extends UiBinder<HTMLPanel, CommitMessageBlock> {
@ -70,44 +61,11 @@ public class CommitMessageBlock extends Composite {
public void display(String commitMessage,
CommentLinkProcessor commentLinkProcessor) {
display(null, null, null, false, commitMessage, commentLinkProcessor);
}
private abstract class CommitMessageEditDialog
extends CommentedActionDialog<JavaScriptObject> {
private final String originalMessage;
public CommitMessageEditDialog(final String title, final String heading,
final String commitMessage, AsyncCallback<JavaScriptObject> callback) {
super(title, heading, callback);
originalMessage = commitMessage.trim();
message.setCharacterWidth(72);
message.setVisibleLines(20);
message.setText(originalMessage);
message.addStyleName(Gerrit.RESOURCES.css().changeScreenDescription());
sendButton.setEnabled(false);
new TextBoxChangeListener(message) {
@Override
public void onTextChanged(String newText) {
// Trim the new text so we don't consider trailing
// newlines as changes
sendButton.setEnabled(!newText.trim().equals(originalMessage));
}
};
}
@Override
public String getMessageText() {
// As we rely on commit message lines ending in LF, we convert CRLF to
// LF. Additionally, the commit message should be trimmed to remove any
// excess newlines at the end, but we need to make sure it still has at
// least one trailing newline.
return message.getText().replaceAll("\r\n", "\n").trim() + '\n';
}
display(null, null, null, commitMessage, commentLinkProcessor);
}
public void display(final PatchSet.Id patchSetId, final String revision,
Boolean starred, Boolean canEditCommitMessage, final String commitMessage,
Boolean starred, final String commitMessage,
CommentLinkProcessor commentLinkProcessor) {
starPanel.clear();
if (patchSetId != null && starred != null && Gerrit.isSignedIn()) {
@ -127,37 +85,6 @@ public class CommitMessageBlock extends Composite {
permalinkPanel.add(new ChangeLink(Util.C.changePermalink(), changeId));
permalinkPanel.add(new CopyableLabel(ChangeLink.permalink(changeId),
false));
if (canEditCommitMessage) {
final Image edit = new Image(Gerrit.RESOURCES.edit());
edit.setTitle(Util.C.editCommitMessageToolTip());
edit.addStyleName(Gerrit.RESOURCES.css().link());
edit.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
new CommitMessageEditDialog(Util.C.titleEditCommitMessage(),
Util.C.headingEditCommitMessage(),
commitMessage,
new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {}
}) {
@Override
public void onSend() {
ChangeApi.message(changeId.get(), revision, getMessageText(),
new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject msg) {
Gerrit.display(PageLinks.toChange(changeId));
hide();
}
});
}
}.center();
}
});
permalinkPanel.add(edit);
}
}
String[] splitCommitMessage = commitMessage.split("\n", 2);

View File

@ -1,103 +0,0 @@
// 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.changes;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.changes.ChangeInfo.IncludedInInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.common.data.IncludedInDetail;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import java.util.ArrayList;
import java.util.List;
/** Displays a table of Branches and Tags containing the change record. */
public class IncludedInTable extends Composite implements
OpenHandler<DisclosurePanel> {
private final Grid table;
private final Change.Id changeId;
private boolean loaded = false;
public IncludedInTable(final Change.Id chId) {
changeId = chId;
table = new Grid(1, 1);
initWidget(table);
}
public void loadTable(final IncludedInDetail detail) {
int row = 0;
table.resizeRows(detail.getBranches().size() + 1);
table.addStyleName(Gerrit.RESOURCES.css().changeTable());
final CellFormatter fmt = table.getCellFormatter();
fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().dataHeader());
table.setText(row, 0, Util.C.includedInTableBranch());
for (final String branch : detail.getBranches()) {
fmt.addStyleName(++row, 0, Gerrit.RESOURCES.css().dataCell());
fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().leftMostCell());
table.setText(row, 0, branch);
}
if (!detail.getTags().isEmpty()) {
table.resizeRows(table.getRowCount() + 2 + detail.getTags().size());
row++;
fmt.addStyleName(++row, 0, Gerrit.RESOURCES.css().dataHeader());
table.setText(row, 0, Util.C.includedInTableTag());
for (final String tag : detail.getTags()) {
fmt.addStyleName(++row, 0, Gerrit.RESOURCES.css().dataCell());
fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().leftMostCell());
table.setText(row, 0, tag);
}
}
table.setVisible(true);
loaded = true;
}
@Override
public void onOpen(OpenEvent<DisclosurePanel> event) {
if (!loaded) {
ChangeApi.includedIn(changeId.get(),
new GerritCallback<IncludedInInfo>() {
@Override
public void onSuccess(IncludedInInfo r) {
IncludedInDetail result = new IncludedInDetail();
result.setBranches(toList(r.branches()));
result.setTags(toList(r.tags()));
loadTable(result);
}
private List<String> toList(JsArrayString in) {
List<String> r = new ArrayList<>();
if (in != null) {
for (int i = 0; i < in.length(); i++) {
r.add(in.get(i));
}
}
return r;
}
});
}
}
}

View File

@ -1,736 +0,0 @@
// Copyright (C) 2008 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.changes;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.ErrorDialog;
import com.google.gerrit.client.FormatUtil;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.GitwebLink;
import com.google.gerrit.client.change.DraftActions;
import com.google.gerrit.client.download.DownloadPanel;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.ui.AccountLinkPanel;
import com.google.gerrit.client.ui.ActionDialog;
import com.google.gerrit.client.ui.CherryPickDialog;
import com.google.gerrit.client.ui.ComplexDisclosurePanel;
import com.google.gerrit.client.ui.ListenableAccountDiffPreference;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.PatchSetDetail;
import com.google.gerrit.common.data.UiCommandDetail;
import com.google.gerrit.reviewdb.client.AccountDiffPreference;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetInfo;
import com.google.gerrit.reviewdb.client.UserIdentity;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.Panel;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel
implements OpenHandler<DisclosurePanel> {
private static final int R_AUTHOR = 0;
private static final int R_COMMITTER = 1;
private static final int R_PARENTS = 2;
private static final int R_DOWNLOAD = 3;
private static final int R_CNT = 4;
private final ChangeDetailCache detailCache;
private final ChangeDetail changeDetail;
private final PatchSet patchSet;
private final FlowPanel body;
private Grid infoTable;
private Panel actionsPanel;
private PatchTable patchTable;
private final Set<ClickHandler> registeredClickHandler = new HashSet<>();
private PatchSet.Id diffBaseId;
/**
* Creates a closed complex disclosure panel for a patch set.
* The patch set details are loaded when the complex disclosure panel is opened.
*/
public PatchSetComplexDisclosurePanel(final PatchSet ps, boolean isOpen,
boolean hasDraftComments) {
super(Util.M.patchSetHeader(ps.getPatchSetId()), isOpen);
detailCache = ChangeCache.get(ps.getId().getParentKey()).getChangeDetailCache();
changeDetail = detailCache.get();
patchSet = ps;
body = new FlowPanel();
setContent(body);
if (hasDraftComments) {
final Image draftComments = new Image(Gerrit.RESOURCES.draftComments());
draftComments.setTitle(Util.C.patchSetWithDraftCommentsToolTip());
getHeader().add(draftComments);
}
final GitwebLink gw = Gerrit.getGitwebLink();
final InlineLabel revtxt = new InlineLabel(ps.getRevision().get() + " ");
revtxt.addStyleName(Gerrit.RESOURCES.css().patchSetRevision());
getHeader().add(revtxt);
if (gw != null && gw.canLink(ps)) {
final Anchor revlink =
new Anchor(gw.getLinkName(), false, gw.toRevision(changeDetail.getChange()
.getProject(), ps));
revlink.addStyleName(Gerrit.RESOURCES.css().patchSetLink());
getHeader().add(revlink);
}
if (ps.isDraft()) {
final InlineLabel draftLabel = new InlineLabel(Util.C.draftPatchSetLabel());
draftLabel.addStyleName(Gerrit.RESOURCES.css().patchSetRevision());
getHeader().add(draftLabel);
}
if (isOpen) {
ensureLoaded(changeDetail.getCurrentPatchSetDetail());
} else {
addOpenHandler(this);
}
}
public void setDiffBaseId(PatchSet.Id diffBaseId) {
this.diffBaseId = diffBaseId;
}
/**
* Display the table showing the Author, Committer and Download links,
* followed by the action buttons.
*/
public void ensureLoaded(final PatchSetDetail detail) {
loadInfoTable(detail);
loadActionPanel(detail);
loadPatchTable(detail);
}
public void loadInfoTable(final PatchSetDetail detail) {
infoTable = new Grid(R_CNT, 2);
infoTable.setStyleName(Gerrit.RESOURCES.css().infoBlock());
infoTable.addStyleName(Gerrit.RESOURCES.css().patchSetInfoBlock());
initRow(R_AUTHOR, Util.C.patchSetInfoAuthor());
initRow(R_COMMITTER, Util.C.patchSetInfoCommitter());
initRow(R_PARENTS, Util.C.patchSetInfoParents());
initRow(R_DOWNLOAD, Util.C.patchSetInfoDownload());
final CellFormatter itfmt = infoTable.getCellFormatter();
itfmt.addStyleName(0, 0, Gerrit.RESOURCES.css().topmost());
itfmt.addStyleName(0, 1, Gerrit.RESOURCES.css().topmost());
itfmt.addStyleName(R_CNT - 1, 0, Gerrit.RESOURCES.css().bottomheader());
itfmt.addStyleName(R_AUTHOR, 1, Gerrit.RESOURCES.css().useridentity());
itfmt.addStyleName(R_COMMITTER, 1, Gerrit.RESOURCES.css().useridentity());
itfmt.addStyleName(R_DOWNLOAD, 1, Gerrit.RESOURCES.css()
.downloadLinkListCell());
final PatchSetInfo info = detail.getInfo();
displayUserIdentity(R_AUTHOR, info.getAuthor());
displayUserIdentity(R_COMMITTER, info.getCommitter());
displayParents(info.getParents());
displayDownload();
body.add(infoTable);
}
public void loadActionPanel(final PatchSetDetail detail) {
if (!patchSet.getId().equals(diffBaseId)) {
actionsPanel = new FlowPanel();
actionsPanel.setStyleName(Gerrit.RESOURCES.css().patchSetActions());
actionsPanel.setVisible(true);
if (Gerrit.isSignedIn()) {
if (changeDetail.canEdit()) {
populateReviewAction();
if (changeDetail.isCurrentPatchSet(detail)) {
populateActions(detail);
}
populateCommands(detail);
}
if (detail.getPatchSet().isDraft()) {
if (changeDetail.canPublish()) {
populatePublishAction();
}
if (changeDetail.canDeleteDraft()
&& changeDetail.getPatchSets().size() > 1) {
populateDeleteDraftPatchSetAction();
}
}
}
body.add(actionsPanel);
}
}
public void loadPatchTable(final PatchSetDetail detail) {
if (!patchSet.getId().equals(diffBaseId)) {
patchTable = new PatchTable();
patchTable.setSavePointerId("PatchTable " + patchSet.getId());
patchTable.display(diffBaseId, detail);
for (ClickHandler clickHandler : registeredClickHandler) {
patchTable.addClickHandler(clickHandler);
}
patchTable.setRegisterKeys(true);
setActive(true);
body.add(patchTable);
}
}
public class ChangeDownloadPanel extends DownloadPanel {
public ChangeDownloadPanel(String project, String ref, boolean allowAnonymous) {
super(project, ref, allowAnonymous);
}
@Override
public void populateDownloadCommandLinks() {
// This site prefers usage of the 'repo' tool, so suggest
// that for easy fetch.
//
if (allowedSchemes.contains(DownloadScheme.REPO_DOWNLOAD)) {
commands.add(cmdLinkfactory.new RepoCommandLink(projectName,
changeDetail.getChange().getChangeId() + "/"
+ patchSet.getPatchSetId()));
}
if (!urls.isEmpty()) {
if (allowedCommands.contains(DownloadCommand.CHECKOUT)
|| allowedCommands.contains(DownloadCommand.DEFAULT_DOWNLOADS)) {
commands.add(cmdLinkfactory.new CheckoutCommandLink());
}
if (allowedCommands.contains(DownloadCommand.PULL)
|| allowedCommands.contains(DownloadCommand.DEFAULT_DOWNLOADS)) {
commands.add(cmdLinkfactory.new PullCommandLink());
}
if (allowedCommands.contains(DownloadCommand.CHERRY_PICK)
|| allowedCommands.contains(DownloadCommand.DEFAULT_DOWNLOADS)) {
commands.add(cmdLinkfactory.new CherryPickCommandLink());
}
if (allowedCommands.contains(DownloadCommand.FORMAT_PATCH)
|| allowedCommands.contains(DownloadCommand.DEFAULT_DOWNLOADS)) {
commands.add(cmdLinkfactory.new FormatPatchCommandLink());
}
}
}
}
private void displayDownload() {
ChangeDownloadPanel dp = new ChangeDownloadPanel(
changeDetail.getChange().getProject().get(),
patchSet.getRefName(),
changeDetail.isAllowsAnonymous());
infoTable.setWidget(R_DOWNLOAD, 1, dp);
}
private void displayUserIdentity(final int row, final UserIdentity who) {
if (who == null) {
infoTable.clearCell(row, 1);
return;
}
final FlowPanel fp = new FlowPanel();
fp.setStyleName(Gerrit.RESOURCES.css().patchSetUserIdentity());
if (who.getName() != null) {
if (who.getAccount() != null) {
fp.add(new AccountLinkPanel(who));
} else {
final InlineLabel lbl = new InlineLabel(who.getName());
lbl.setStyleName(Gerrit.RESOURCES.css().accountName());
fp.add(lbl);
}
}
if (who.getEmail() != null) {
fp.add(new InlineLabel("<" + who.getEmail() + ">"));
}
if (who.getDate() != null) {
fp.add(new InlineLabel(FormatUtil.mediumFormat(who.getDate())));
}
infoTable.setWidget(row, 1, fp);
}
private void displayParents(final List<PatchSetInfo.ParentInfo> parents) {
if (parents.size() == 0) {
infoTable.setWidget(R_PARENTS, 1, new InlineLabel(Util.C.initialCommit()));
return;
}
final Grid parentsTable = new Grid(parents.size(), 2);
parentsTable.setStyleName(Gerrit.RESOURCES.css().parentsTable());
parentsTable.addStyleName(Gerrit.RESOURCES.css().noborder());
final CellFormatter ptfmt = parentsTable.getCellFormatter();
int row = 0;
for (PatchSetInfo.ParentInfo parent : parents) {
parentsTable.setWidget(row, 0, new InlineLabel(parent.id.get()));
ptfmt.addStyleName(row, 0, Gerrit.RESOURCES.css().noborder());
ptfmt.addStyleName(row, 0, Gerrit.RESOURCES.css().monospace());
parentsTable.setWidget(row, 1,
new InlineLabel(Util.cropSubject(parent.shortMessage)));
ptfmt.addStyleName(row, 1, Gerrit.RESOURCES.css().noborder());
row++;
}
infoTable.setWidget(R_PARENTS, 1, parentsTable);
}
private void populateActions(final PatchSetDetail detail) {
final boolean isOpen = changeDetail.getChange().getStatus().isOpen();
if (isOpen && changeDetail.canSubmit()) {
final Button b =
new Button(Util.M
.submitPatchSet(detail.getPatchSet().getPatchSetId()));
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
ChangeApi.submit(
patchSet.getId().getParentKey().get(),
patchSet.getRevision().get(),
new GerritCallback<SubmitInfo>() {
@Override
public void onSuccess(SubmitInfo result) {
redisplay();
}
@Override
public void onFailure(Throwable err) {
if (SubmitFailureDialog.isConflict(err)) {
new SubmitFailureDialog(err.getMessage()).center();
redisplay();
} else {
b.setEnabled(true);
super.onFailure(err);
}
}
private void redisplay() {
Gerrit.display(
PageLinks.toChange(patchSet.getId().getParentKey()),
new ChangeScreen(patchSet.getId().getParentKey()));
}
});
}
});
actionsPanel.add(b);
}
if (changeDetail.canRevert()) {
final Button b = new Button(Util.C.buttonRevertChangeBegin());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
new ActionDialog(b, true, Util.C.revertChangeTitle(),
Util.C.headingRevertMessage()) {
{
sendButton.setText(Util.C.buttonRevertChangeSend());
message.setText(Util.M.revertChangeDefaultMessage(
detail.getInfo().getSubject(),
detail.getPatchSet().getRevision().get())
);
}
@Override
public void onSend() {
ChangeApi.revert(changeDetail.getChange().getChangeId(),
getMessageText(), new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
sent = true;
Gerrit.display(PageLinks.toChange(new Change.Id(result
._number())));
hide();
}
@Override
public void onFailure(Throwable caught) {
enableButtons(true);
super.onFailure(caught);
}
});
}
}.center();
}
});
actionsPanel.add(b);
}
if (changeDetail.canCherryPick()) {
final Button b = new Button(Util.C.buttonCherryPickChangeBegin());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
new CherryPickDialog(b, changeDetail.getChange().getProject()) {
{
sendButton.setText(Util.C.buttonCherryPickChangeSend());
if (changeDetail.getChange().getStatus().isClosed()) {
message.setText(Util.M.cherryPickedChangeDefaultMessage(
detail.getInfo().getMessage().trim(),
detail.getPatchSet().getRevision().get()));
} else {
message.setText(detail.getInfo().getMessage().trim());
}
}
@Override
public void onSend() {
ChangeApi.cherrypick(changeDetail.getChange().getChangeId(),
patchSet.getRevision().get(),
getDestinationBranch(),
getMessageText(),
new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
sent = true;
Gerrit.display(PageLinks.toChange(new Change.Id(result
._number())));
hide();
}
@Override
public void onFailure(Throwable caught) {
enableButtons(true);
super.onFailure(caught);
}
});
}
}.center();
}
});
actionsPanel.add(b);
}
if (changeDetail.canAbandon()) {
final Button b = new Button(Util.C.buttonAbandonChangeBegin());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
new ActionDialog(b, false, Util.C.abandonChangeTitle(),
Util.C.headingAbandonMessage()) {
{
sendButton.setText(Util.C.buttonAbandonChangeSend());
}
@Override
public void onSend() {
// TODO: once the other users of ActionDialog have converted to
// REST APIs, we can use createCallback() rather than providing
// them directly.
ChangeApi.abandon(changeDetail.getChange().getChangeId(),
getMessageText(), new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
sent = true;
Gerrit.display(PageLinks.toChange(new Change.Id(result
._number())));
hide();
}
@Override
public void onFailure(Throwable caught) {
enableButtons(true);
super.onFailure(caught);
}
});
}
}.center();
}
});
actionsPanel.add(b);
}
if (changeDetail.getChange().getStatus() == Change.Status.DRAFT
&& changeDetail.canDeleteDraft()) {
final Button b = new Button(Util.C.buttonDeleteDraftChange());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
ChangeApi.deleteChange(patchSet.getId().getParentKey().get(),
new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
Gerrit.display(PageLinks.MINE);
}
@Override
public void onFailure(Throwable err) {
if (SubmitFailureDialog.isConflict(err)) {
new SubmitFailureDialog(err.getMessage()).center();
Gerrit.display(PageLinks.MINE);
} else {
b.setEnabled(true);
super.onFailure(err);
}
}
});
}
});
actionsPanel.add(b);
}
if (changeDetail.canRestore()) {
final Button b = new Button(Util.C.buttonRestoreChangeBegin());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
new ActionDialog(b, false, Util.C.restoreChangeTitle(),
Util.C.headingRestoreMessage()) {
{
sendButton.setText(Util.C.buttonRestoreChangeSend());
}
@Override
public void onSend() {
ChangeApi.restore(changeDetail.getChange().getChangeId(),
getMessageText(), new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
sent = true;
Gerrit.display(PageLinks.toChange(new Change.Id(result
._number())));
hide();
}
@Override
public void onFailure(Throwable caught) {
enableButtons(true);
super.onFailure(caught);
}
});
}
}.center();
}
});
actionsPanel.add(b);
}
if (changeDetail.canRebase()) {
final Button b = new Button(Util.C.buttonRebaseChange());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
final Change.Id id = patchSet.getId().getParentKey();
ChangeApi.rebase(id.get(), patchSet.getRevision().get(),
new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
Gerrit.display(PageLinks.toChange(id));
}
});
}
});
actionsPanel.add(b);
}
}
private void populateCommands(final PatchSetDetail detail) {
for (final UiCommandDetail cmd : detail.getCommands()) {
final Button b = new Button();
b.setText(cmd.label);
b.setEnabled(cmd.enabled);
b.setTitle(cmd.title);
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
AsyncCallback<NativeString> cb =
new AsyncCallback<NativeString>() {
@Override
public void onFailure(Throwable caught) {
b.setEnabled(true);
new ErrorDialog(caught).center();
}
@Override
public void onSuccess(NativeString msg) {
b.setEnabled(true);
if (msg != null && !msg.asString().isEmpty()) {
Window.alert(msg.asString());
}
Gerrit.display(PageLinks.toChange(patchSet.getId()));
}
};
RestApi api = ChangeApi.revision(patchSet.getId()).view(cmd.id);
if ("PUT".equalsIgnoreCase(cmd.method)) {
api.put(JavaScriptObject.createObject(), cb);
} else if ("DELETE".equalsIgnoreCase(cmd.method)) {
api.delete(cb);
} else {
api.post(JavaScriptObject.createObject(), cb);
}
}
});
actionsPanel.add(b);
}
}
private void populateReviewAction() {
final Button b = new Button(Util.C.buttonReview());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
Gerrit.display(Dispatcher.toPublish(patchSet.getId()));
}
});
actionsPanel.add(b);
}
private void populatePublishAction() {
final Button b = new Button(Util.C.buttonPublishPatchSet());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
final Change.Id id = patchSet.getId().getParentKey();
ChangeApi.publish(id.get(),
patchSet.getRevision().get(),
DraftActions.cs(id));
}
});
actionsPanel.add(b);
}
private void populateDeleteDraftPatchSetAction() {
final Button b = new Button(Util.C.buttonDeleteDraftPatchSet());
b.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
b.setEnabled(false);
final Change.Id id = patchSet.getId().getParentKey();
ChangeApi.deleteRevision(id.get(),
patchSet.getRevision().get(),
DraftActions.cs(id));
}
});
actionsPanel.add(b);
}
public void refresh() {
if (patchSet.getId().equals(diffBaseId)) {
if (patchTable != null) {
patchTable.setVisible(false);
}
if (actionsPanel != null) {
actionsPanel.setVisible(false);
}
} else {
if (patchTable != null) {
if (patchTable.getBase() == null && diffBaseId == null
|| patchTable.getBase() != null
&& patchTable.getBase().equals(diffBaseId)) {
actionsPanel.setVisible(true);
patchTable.setVisible(true);
return;
}
}
AccountDiffPreference diffPrefs;
if (patchTable == null) {
diffPrefs = new ListenableAccountDiffPreference().get();
} else {
diffPrefs = patchTable.getPreferences().get();
patchTable.setVisible(false);
}
Util.DETAIL_SVC.patchSetDetail2(diffBaseId, patchSet.getId(), diffPrefs,
new GerritCallback<PatchSetDetail>() {
@Override
public void onSuccess(PatchSetDetail result) {
if (actionsPanel != null) {
actionsPanel.setVisible(true);
} else {
loadActionPanel(result);
}
loadPatchTable(result);
}
});
}
}
@Override
public void onOpen(final OpenEvent<DisclosurePanel> event) {
if (infoTable == null) {
AccountDiffPreference diffPrefs;
if (diffBaseId == null) {
diffPrefs = null;
} else {
diffPrefs = new ListenableAccountDiffPreference().get();
}
Util.DETAIL_SVC.patchSetDetail2(diffBaseId, patchSet.getId(), diffPrefs,
new GerritCallback<PatchSetDetail>() {
@Override
public void onSuccess(final PatchSetDetail result) {
loadInfoTable(result);
loadActionPanel(result);
}
});
}
}
private void initRow(final int row, final String name) {
infoTable.setText(row, 0, name);
infoTable.getCellFormatter().addStyleName(row, 0,
Gerrit.RESOURCES.css().header());
}
public PatchSet getPatchSet() {
return patchSet;
}
/**
* Adds a click handler to the patch table.
* If the patch table is not yet initialized it is guaranteed that the click handler
* is added to the patch table after initialization.
*/
public void addClickHandler(final ClickHandler clickHandler) {
registeredClickHandler.add(clickHandler);
if (patchTable != null) {
patchTable.addClickHandler(clickHandler);
}
}
/** Activates / Deactivates the key navigation and the highlighting of the current row for the patch table */
public void setActive(boolean active) {
if (patchTable != null) {
patchTable.setActive(active);
}
}
}

View File

@ -1,272 +0,0 @@
// 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.changes;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.globalkey.client.KeyCommand;
import com.google.gwtexpui.globalkey.client.KeyCommandSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Composite that displays the patch sets of a change. This composite ensures
* that keyboard navigation to each changed file in all patch sets is possible.
*/
public class PatchSetsBlock extends Composite {
private final Map<PatchSet.Id, PatchSetComplexDisclosurePanel> patchSetPanels =
new HashMap<>();
private final FlowPanel body;
private HandlerRegistration regNavigation;
private List<PatchSetComplexDisclosurePanel> patchSetPanelsList;
/**
* the patch set id of the patch set for which is the keyboard navigation is
* currently enabled
*/
private PatchSet.Id activePatchSetId;
/** the patch set id of the current (latest) patch set */
private PatchSet.Id currentPatchSetId;
/** Patch sets on this change, in order. */
private List<PatchSet> patchSets;
PatchSetsBlock() {
body = new FlowPanel();
initWidget(body);
}
/** Adds UI elements for each patch set of the given change to this composite. */
public void display(final ChangeDetail detail, final PatchSet.Id diffBaseId) {
clear();
final PatchSet currps = detail.getCurrentPatchSet();
currentPatchSetId = currps.getId();
patchSets = detail.getPatchSets();
if (Gerrit.isSignedIn()) {
final AccountGeneralPreferences p =
Gerrit.getUserAccount().getGeneralPreferences();
if (p.isReversePatchSetOrder()) {
Collections.reverse(patchSets);
}
}
patchSetPanelsList = new ArrayList<>();
for (final PatchSet ps : patchSets) {
final PatchSetComplexDisclosurePanel p =
new PatchSetComplexDisclosurePanel(ps, ps == currps,
detail.hasDraftComments(ps.getId()));
if (diffBaseId != null) {
p.setDiffBaseId(diffBaseId);
if (ps == currps) {
p.refresh();
}
}
add(p);
patchSetPanelsList.add(p);
}
}
private void clear() {
setRegisterKeys(false);
body.clear();
patchSetPanels.clear();
}
public void refresh(final PatchSet.Id diffBaseId) {
if (patchSetPanelsList != null) {
for (final PatchSetComplexDisclosurePanel p : patchSetPanelsList) {
p.setDiffBaseId(diffBaseId);
if (p.isOpen()) {
p.refresh();
}
}
}
}
/**
* Adds the given patch set panel to this composite and ensures that handler
* to activate / deactivate keyboard navigation for the patch set panel are
* registered.
*/
private void add(final PatchSetComplexDisclosurePanel patchSetPanel) {
body.add(patchSetPanel);
final PatchSet.Id id = patchSetPanel.getPatchSet().getId();
ActivationHandler activationHandler = new ActivationHandler(id);
patchSetPanel.addOpenHandler(activationHandler);
patchSetPanel.addClickHandler(activationHandler);
patchSetPanels.put(id, patchSetPanel);
}
public void setRegisterKeys(final boolean on) {
if (on) {
KeyCommandSet keysNavigation =
new KeyCommandSet(Gerrit.C.sectionNavigation());
keysNavigation.add(new PreviousPatchSetKeyCommand(0, 'p', Util.C
.previousPatchSet()));
keysNavigation.add(new NextPatchSetKeyCommand(0, 'n', Util.C
.nextPatchSet()));
regNavigation = GlobalKey.add(this, keysNavigation);
if (activePatchSetId != null) {
activate(activePatchSetId);
} else {
activate(currentPatchSetId);
}
} else {
if (regNavigation != null) {
regNavigation.removeHandler();
regNavigation = null;
}
deactivate();
}
}
@Override
protected void onUnload() {
setRegisterKeys(false);
super.onUnload();
}
/**
* Activates keyboard navigation for the patch set panel that displays the
* patch set with the given patch set id.
* The keyboard navigation for the previously active patch set panel is
* automatically deactivated.
* This method also ensures that the current row is only highlighted in the
* table of the active patch set panel.
*/
public void activate(final PatchSet.Id patchSetId) {
if (indexOf(patchSetId) != -1) {
if (!patchSetId.equals(activePatchSetId)) {
deactivate();
PatchSetComplexDisclosurePanel patchSetPanel =
patchSetPanels.get(patchSetId);
patchSetPanel.setActive(true);
patchSetPanel.setOpen(true);
activePatchSetId = patchSetId;
}
} else {
Gerrit.display(PageLinks.toChange(patchSetId.getParentKey()));
}
}
/** Deactivates the keyboard navigation for the currently active patch set panel. */
private void deactivate() {
if (activePatchSetId != null) {
PatchSetComplexDisclosurePanel patchSetPanel =
patchSetPanels.get(activePatchSetId);
patchSetPanel.setActive(false);
activePatchSetId = null;
}
}
public PatchSet getCurrentPatchSet() {
PatchSetComplexDisclosurePanel patchSetPanel =
patchSetPanels.get(currentPatchSetId);
if (patchSetPanel != null) {
return patchSetPanel.getPatchSet();
} else {
return null;
}
}
private int indexOf(PatchSet.Id id) {
for (int i = 0; i < patchSets.size(); i++) {
if (patchSets.get(i).getId().equals(id)) {
return i;
}
}
return -1;
}
private class ActivationHandler implements OpenHandler<DisclosurePanel>,
ClickHandler {
private final PatchSet.Id patchSetId;
ActivationHandler(PatchSet.Id patchSetId) {
this.patchSetId = patchSetId;
}
@Override
public void onOpen(OpenEvent<DisclosurePanel> event) {
// when a patch set panel is opened by the user
// it should automatically become active
PatchSetComplexDisclosurePanel patchSetPanel =
patchSetPanels.get(patchSetId);
patchSetPanel.refresh();
activate(patchSetId);
}
@Override
public void onClick(ClickEvent event) {
// when a user clicks on a patch table the corresponding
// patch set panel should automatically become active
activate(patchSetId);
}
}
public class PreviousPatchSetKeyCommand extends KeyCommand {
public PreviousPatchSetKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
int index = indexOf(activePatchSetId) - 1;
if (0 <= index) {
activate(patchSets.get(index).getId());
}
}
}
public class NextPatchSetKeyCommand extends KeyCommand {
public NextPatchSetKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
int index = indexOf(activePatchSetId) + 1;
if (index < patchSets.size()) {
activate(patchSets.get(index).getId());
}
}
}
}

View File

@ -16,7 +16,6 @@ package com.google.gerrit.client.changes;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.patches.PatchScreen;
import com.google.gerrit.client.ui.InlineHyperlink;
import com.google.gerrit.client.ui.ListenableAccountDiffPreference;
import com.google.gerrit.client.ui.NavigationTable;
@ -213,46 +212,42 @@ public class PatchTable extends Composite {
/**
* @return a link to the previous file in this patch set, or null.
*/
public InlineHyperlink getPreviousPatchLink(int index,
PatchScreen.Type patchType) {
public InlineHyperlink getPreviousPatchLink(int index) {
int previousPatchIndex = getPreviousPatch(index, PREFERENCE_VALIDATOR);
if (previousPatchIndex < 0) {
return null;
}
return createLink(previousPatchIndex, patchType,
return createLink(previousPatchIndex,
SafeHtml.asis(Util.C.prevPatchLinkIcon()), null);
}
/**
* @return a link to the next file in this patch set, or null.
*/
public InlineHyperlink getNextPatchLink(int index, PatchScreen.Type patchType) {
public InlineHyperlink getNextPatchLink(int index) {
int nextPatchIndex = getNextPatch(index, false, PREFERENCE_VALIDATOR);
if (nextPatchIndex < 0) {
return null;
}
return createLink(nextPatchIndex, patchType, null,
return createLink(nextPatchIndex, null,
SafeHtml.asis(Util.C.nextPatchLinkIcon()));
}
/**
* @return a link to the the given patch.
* @param index The patch to link to
* @param screenType The screen type of patch display
* @param before A string to display at the beginning of the href text
* @param after A string to display at the end of the href text
*/
public PatchLink createLink(int index, PatchScreen.Type screenType,
SafeHtml before, SafeHtml after) {
public PatchLink createLink(int index, SafeHtml before, SafeHtml after) {
Patch patch = patchList.get(index);
Patch.Key thisKey = patch.getKey();
PatchLink link;
if (isUnifiedPatchLink(patch, screenType)) {
link = new PatchLink.Unified("", base, thisKey, index, detail, this);
if (isUnifiedPatchLink(patch)) {
link = new PatchLink.Unified("", base, thisKey);
} else {
link = new PatchLink.SideBySide("", base, thisKey, index, detail, this);
link = new PatchLink.SideBySide("", base, thisKey);
}
SafeHtmlBuilder text = new SafeHtmlBuilder();
@ -263,15 +258,10 @@ public class PatchTable extends Composite {
return link;
}
private static boolean isUnifiedPatchLink(final Patch patch,
final PatchScreen.Type screenType) {
if (Dispatcher.isChangeScreen2()) {
return (patch.getPatchType().equals(PatchType.BINARY)
|| (Gerrit.isSignedIn()
&& Gerrit.getUserAccount().getGeneralPreferences().getDiffView()
.equals(DiffView.UNIFIED_DIFF)));
}
return screenType == PatchScreen.Type.UNIFIED;
private static boolean isUnifiedPatchLink(final Patch patch) {
return (patch.getPatchType().equals(PatchType.BINARY)
|| Gerrit.getUserAccount().getGeneralPreferences().getDiffView()
.equals(DiffView.UNIFIED_DIFF));
}
private static String getFileNameOnly(Patch patch) {
@ -403,9 +393,8 @@ public class PatchTable extends Composite {
Patch patch = PatchTable.this.patchList.get(row - 1);
setRowItem(row, patch);
Widget nameCol;
nameCol = new PatchLink.SideBySide(getDisplayFileName(patch), base,
patch.getKey(), row - 1, detail, PatchTable.this);
Widget nameCol = new PatchLink.SideBySide(getDisplayFileName(patch), base,
patch.getKey());
if (patch.getSourceFileName() != null) {
final String text;
@ -427,14 +416,12 @@ public class PatchTable extends Composite {
int C_UNIFIED = C_SIDEBYSIDE + 1;
PatchLink sideBySide =
new PatchLink.SideBySide(Util.C.patchTableDiffSideBySide(), base,
patch.getKey(), row - 1, detail, PatchTable.this);
PatchLink sideBySide = new PatchLink.SideBySide(
Util.C.patchTableDiffSideBySide(), base, patch.getKey());
sideBySide.setStyleName("gwt-Anchor");
PatchLink unified =
new PatchLink.Unified(Util.C.patchTableDiffUnified(), base,
patch.getKey(), row - 1, detail, PatchTable.this);
PatchLink unified = new PatchLink.Unified(Util.C.patchTableDiffUnified(),
base, patch.getKey());
unified.setStyleName("gwt-Anchor");
table.setWidget(row, C_SIDEBYSIDE, sideBySide);
@ -447,7 +434,7 @@ public class PatchTable extends Composite {
@Override
public void onClick(ClickEvent event) {
for (Patch p : detail.getPatches()) {
openWindow(Dispatcher.toPatchSideBySide(base, p.getKey()));
openWindow(Dispatcher.toSideBySide(base, p.getKey()));
}
}
});
@ -459,7 +446,7 @@ public class PatchTable extends Composite {
@Override
public void onClick(ClickEvent event) {
for (Patch p : detail.getPatches()) {
openWindow(Dispatcher.toPatchUnified(base, p.getKey()));
openWindow(Dispatcher.toUnified(base, p.getKey()));
}
}
});

View File

@ -1,526 +0,0 @@
// Copyright (C) 2009 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.changes;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.changes.ChangeInfo.ApprovalInfo;
import com.google.gerrit.client.changes.ChangeInfo.LabelInfo;
import com.google.gerrit.client.patches.AbstractPatchContentTable;
import com.google.gerrit.client.patches.CommentEditorContainer;
import com.google.gerrit.client.patches.CommentEditorPanel;
import com.google.gerrit.client.projects.ConfigInfoCache;
import com.google.gerrit.client.rpc.CallbackGroup;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.AccountScreen;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.client.ui.PatchLink;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.globalkey.client.NpTextArea;
import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import com.google.gwtjsonrpc.common.VoidResult;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PublishCommentScreen extends AccountScreen implements
ClickHandler, CommentEditorContainer {
private static SavedState lastState;
private final PatchSet.Id patchSetId;
private Collection<ValueRadioButton> approvalButtons;
private ChangeDescriptionBlock descBlock;
private ApprovalTable approvals;
private Panel approvalPanel;
private NpTextArea message;
private FlowPanel draftsPanel;
private Button send;
private Button cancel;
private boolean saveStateOnUnload = true;
private List<CommentEditorPanel> commentEditors;
private ChangeInfo change;
private ChangeInfo detail;
private NativeMap<JsArray<CommentInfo>> drafts;
private SubmitTypeRecord submitTypeRecord;
private CommentLinkProcessor commentLinkProcessor;
public PublishCommentScreen(final PatchSet.Id psi) {
patchSetId = psi;
}
@Override
protected void onInitUI() {
super.onInitUI();
addStyleName(Gerrit.RESOURCES.css().publishCommentsScreen());
approvalButtons = new ArrayList<>();
descBlock = new ChangeDescriptionBlock(null);
add(descBlock);
approvals = new ApprovalTable();
add(approvals);
final FormPanel form = new FormPanel();
final FlowPanel body = new FlowPanel();
form.setWidget(body);
form.addSubmitHandler(new FormPanel.SubmitHandler() {
@Override
public void onSubmit(final SubmitEvent event) {
event.cancel();
}
});
add(form);
approvalPanel = new FlowPanel();
body.add(approvalPanel);
initMessage(body);
draftsPanel = new FlowPanel();
body.add(draftsPanel);
final FlowPanel buttonRow = new FlowPanel();
buttonRow.setStyleName(Gerrit.RESOURCES.css().patchSetActions());
body.add(buttonRow);
send = new Button(Util.C.buttonPublishCommentsSend());
send.addClickHandler(this);
buttonRow.add(send);
cancel = new Button(Util.C.buttonPublishCommentsCancel());
cancel.addClickHandler(this);
buttonRow.add(cancel);
}
private void enableForm(final boolean enabled) {
for (final ValueRadioButton approvalButton : approvalButtons) {
approvalButton.setEnabled(enabled);
}
message.setEnabled(enabled);
for (final CommentEditorPanel commentEditor : commentEditors) {
commentEditor.enableButtons(enabled);
}
send.setEnabled(enabled);
cancel.setEnabled(enabled);
}
@Override
protected void onLoad() {
super.onLoad();
CallbackGroup group = new CallbackGroup();
RestApi call = ChangeApi.detail(patchSetId.getParentKey().get());
ChangeList.addOptions(call, EnumSet.of(
ListChangesOption.CURRENT_ACTIONS,
ListChangesOption.ALL_REVISIONS,
ListChangesOption.ALL_COMMITS));
call.get(group.add(new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
detail = result;
}
}));
ChangeApi.revision(patchSetId)
.view("submit_type")
.get(group.add(new GerritCallback<NativeString>() {
@Override
public void onSuccess(NativeString result) {
submitTypeRecord = SubmitTypeRecord.OK(
SubmitType.valueOf(result.asString()));
}
@Override
public void onFailure(Throwable caught) {}
}));
ChangeApi.revision(patchSetId.getParentKey().get(), "" + patchSetId.get())
.view("drafts")
.get(group.add(new AsyncCallback<NativeMap<JsArray<CommentInfo>>>() {
@Override
public void onSuccess(NativeMap<JsArray<CommentInfo>> result) {
drafts = result;
}
@Override
public void onFailure(Throwable caught) {}
}));
ChangeApi.revision(patchSetId).view("review")
.get(group.addFinal(new GerritCallback<ChangeInfo>() {
@Override
public void onSuccess(ChangeInfo result) {
result.init();
change = result;
preDisplay(result);
}
}));
}
private void preDisplay(final ChangeInfo info) {
ConfigInfoCache.get(info.project_name_key(),
new ScreenLoadCallback<ConfigInfoCache.Entry>(this) {
@Override
protected void preDisplay(ConfigInfoCache.Entry result) {
send.setEnabled(true);
commentLinkProcessor = result.getCommentLinkProcessor();
setTheme(result.getTheme());
displayScreen();
}
@Override
protected void postDisplay() {
message.setFocus(true);
}
});
}
@Override
protected void onUnload() {
super.onUnload();
lastState = saveStateOnUnload ? new SavedState(this) : null;
}
@Override
public void onClick(final ClickEvent event) {
final Widget sender = (Widget) event.getSource();
if (send == sender) {
onSend(false);
} else if (cancel == sender) {
saveStateOnUnload = false;
goChange();
}
}
@Override
public void notifyDraftDelta(int delta) {
}
@Override
public void remove(CommentEditorPanel editor) {
commentEditors.remove(editor);
// The editor should be embedded into a panel holding all
// editors for the same file.
//
FlowPanel parent = (FlowPanel) editor.getParent();
parent.remove(editor);
// If the panel now holds no editors, remove it.
//
int editorCount = 0;
for (Widget w : parent) {
if (w instanceof CommentEditorPanel) {
editorCount++;
}
}
if (editorCount == 0) {
parent.removeFromParent();
}
// If that was the last file with a draft, remove the heading.
//
if (draftsPanel.getWidgetCount() == 1) {
draftsPanel.clear();
}
}
private void initMessage(final Panel body) {
body.add(new SmallHeading(Util.C.headingCoverMessage()));
final VerticalPanel mwrap = new VerticalPanel();
mwrap.setStyleName(Gerrit.RESOURCES.css().coverMessage());
body.add(mwrap);
message = new NpTextArea();
message.setCharacterWidth(60);
message.setVisibleLines(10);
message.setSpellCheck(true);
mwrap.add(message);
}
private void initApprovals(Panel body) {
for (String labelName : change.labels()) {
initLabel(labelName, body);
}
}
private void initLabel(String labelName, Panel body) {
if (!change.has_permitted_labels()) {
return;
}
JsArrayString nativeValues = change.permitted_values(labelName);
if (nativeValues == null || nativeValues.length() == 0) {
return;
}
List<String> values = new ArrayList<>(nativeValues.length());
for (int i = 0; i < nativeValues.length(); i++) {
values.add(nativeValues.get(i));
}
Collections.reverse(values);
LabelInfo label = change.label(labelName);
body.add(new SmallHeading(label.name() + ":"));
VerticalPanel vp = new VerticalPanel();
vp.setStyleName(Gerrit.RESOURCES.css().labelList());
Short prior = null;
if (label.all() != null) {
for (ApprovalInfo app : Natives.asList(label.all())) {
if (app._account_id() == Gerrit.getUserAccount().getId().get()) {
prior = app.value();
break;
}
}
}
for (String value : values) {
ValueRadioButton b = new ValueRadioButton(label, value);
SafeHtml buf = new SafeHtmlBuilder().append(b.format());
buf = commentLinkProcessor.apply(buf);
SafeHtml.set(b, buf);
if (lastState != null && patchSetId.equals(lastState.patchSetId)
&& lastState.approvals.containsKey(label.name())) {
b.setValue(lastState.approvals.get(label.name()).equals(value));
} else {
b.setValue(b.parseValue() == (prior != null ? prior : 0));
}
approvalButtons.add(b);
vp.add(b);
}
body.add(vp);
}
private void displayScreen() {
ChangeDetail r = ChangeDetailCache.reverse(detail);
setPageTitle(Util.M.publishComments(r.getChange().getKey().abbreviate(),
patchSetId.get()));
descBlock.display(r, null, false, r.getCurrentPatchSetDetail().getInfo(),
r.getAccounts(), submitTypeRecord, commentLinkProcessor);
if (r.getChange().getStatus().isOpen()) {
initApprovals(approvalPanel);
approvals.display(change);
} else {
approvals.setVisible(false);
}
if (lastState != null && patchSetId.equals(lastState.patchSetId)) {
message.setText(lastState.message);
}
draftsPanel.clear();
commentEditors = new ArrayList<>();
if (!drafts.isEmpty()) {
draftsPanel.add(new SmallHeading(Util.C.headingPatchComments()));
Panel panel = null;
String priorFile = "";
for (final PatchLineComment c : draftList()) {
final Patch.Key patchKey = c.getKey().getParentKey();
final String fn = patchKey.get();
if (!fn.equals(priorFile)) {
panel = new FlowPanel();
panel.addStyleName(Gerrit.RESOURCES.css().patchComments());
draftsPanel.add(panel);
// Parent table can be null here since we are not showing any
// next/previous links
panel.add(new PatchLink.SideBySide(
PatchTable.getDisplayFileName(patchKey), null, patchKey, 0, null, null));
priorFile = fn;
}
final CommentEditorPanel editor =
new CommentEditorPanel(c, commentLinkProcessor);
if (c.getLine() == AbstractPatchContentTable.R_HEAD) {
editor.setAuthorNameText(Gerrit.getUserAccountInfo(),
Util.C.fileCommentHeader());
} else {
editor.setAuthorNameText(Gerrit.getUserAccountInfo(),
Util.M.lineHeader(c.getLine()));
}
editor.setOpen(true);
commentEditors.add(editor);
panel.add(editor);
}
}
}
private void onSend(final boolean submit) {
if (commentEditors.isEmpty()) {
onSend2(submit);
} else {
final GerritCallback<VoidResult> afterSaveDraft =
new GerritCallback<VoidResult>() {
private int done;
@Override
public void onSuccess(final VoidResult result) {
if (++done == commentEditors.size()) {
onSend2(submit);
}
}
};
for (final CommentEditorPanel p : commentEditors) {
p.saveDraft(afterSaveDraft);
}
}
}
private void onSend2(final boolean submit) {
ReviewInput data = ReviewInput.create();
data.message(ChangeApi.emptyToNull(message.getText().trim()));
for (final ValueRadioButton b : approvalButtons) {
if (b.getValue()) {
data.label(b.label.name(), b.parseValue());
}
}
enableForm(false);
new RestApi("/changes/")
.id(String.valueOf(patchSetId.getParentKey().get()))
.view("revisions").id(patchSetId.get()).view("review")
.post(data, new GerritCallback<ReviewInput>() {
@Override
public void onSuccess(ReviewInput result) {
if (submit) {
submit();
} else {
saveStateOnUnload = false;
goChange();
}
}
@Override
public void onFailure(Throwable caught) {
super.onFailure(caught);
enableForm(true);
}
});
}
private void submit() {
ChangeApi.submit(
patchSetId.getParentKey().get(),
"" + patchSetId.get(),
new GerritCallback<SubmitInfo>() {
@Override
public void onSuccess(SubmitInfo result) {
saveStateOnUnload = false;
goChange();
}
@Override
public void onFailure(Throwable err) {
if (SubmitFailureDialog.isConflict(err)) {
new SubmitFailureDialog(err.getMessage()).center();
} else {
super.onFailure(err);
}
goChange();
}
});
}
private void goChange() {
final Change.Id ck = patchSetId.getParentKey();
Gerrit.display(PageLinks.toChange(ck), new ChangeScreen(ck));
}
private List<PatchLineComment> draftList() {
List<PatchLineComment> d = new ArrayList<>();
List<String> paths = new ArrayList<>(drafts.keySet());
Collections.sort(paths);
for (String path : paths) {
JsArray<CommentInfo> comments = drafts.get(path);
for (int i = 0; i < comments.length(); i++) {
d.add(CommentEditorPanel.toComment(patchSetId, path, comments.get(i)));
}
}
return d;
}
private static class ValueRadioButton extends RadioButton {
final LabelInfo label;
final String value;
ValueRadioButton(LabelInfo label, String value) {
super(label.name());
this.label = label;
this.value = value;
}
String format() {
return new StringBuilder().append(value).append(' ')
.append(label.value_text(value)).toString();
}
short parseValue() {
String value = this.value;
if (value.startsWith(" ") || value.startsWith("+")) {
value = value.substring(1);
}
return Short.parseShort(value);
}
}
private static class SavedState {
final PatchSet.Id patchSetId;
final String message;
final Map<String, String> approvals;
SavedState(final PublishCommentScreen p) {
patchSetId = p.patchSetId;
message = p.message.getText();
approvals = new HashMap<>();
for (final ValueRadioButton b : p.approvalButtons) {
if (b.getValue()) {
approvals.put(b.label.name(), b.value);
}
}
}
}
}

View File

@ -14,27 +14,17 @@
package com.google.gerrit.client.changes;
import com.google.gerrit.common.data.ChangeDetailService;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.GWT;
import com.google.gwtjsonrpc.client.JsonUtil;
public class Util {
public static final ChangeConstants C = GWT.create(ChangeConstants.class);
public static final ChangeMessages M = GWT.create(ChangeMessages.class);
public static final ChangeResources R = GWT.create(ChangeResources.class);
public static final ChangeDetailService DETAIL_SVC;
private static final int SUBJECT_MAX_LENGTH = 80;
private static final String SUBJECT_CROP_APPENDIX = "...";
private static final int SUBJECT_CROP_RANGE = 10;
static {
DETAIL_SVC = GWT.create(ChangeDetailService.class);
JsonUtil.bind(DETAIL_SVC, "rpc/ChangeDetailService");
}
public static String toLongString(final Change.Status status) {
if (status == null) {
return "";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

View File

@ -979,13 +979,6 @@ a:hover {
border-right: 1px solid trimColor;
}
.sideBySideTableBinaryHeader {
border-left: thin solid #b0bdcc;
width: 100%;
color: grey;
font-weight: bold;
}
.infoTable td.approvalrole {
width: 5em;
border-left: none;
@ -1243,17 +1236,6 @@ a:hover.downloadLink {
display: table;
}
/** SideBySideScreen **/
.sideBySideScreenSideBySideTable {
width: 100%;
border: 1px solid #B0BDCC;
display: table;
}
.sideBySideScreenSideBySideTable .fileLine {
width: 50%;
}
.sideBySideScreenLinkTable {
width: 100%;
}

View File

@ -14,14 +14,12 @@
package com.google.gerrit.client.patches;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.FormatUtil;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.account.AccountInfo;
import com.google.gerrit.client.changes.CommentApi;
import com.google.gerrit.client.changes.CommentInfo;
import com.google.gerrit.client.changes.PatchTable;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.client.ui.CommentPanel;
@ -72,7 +70,7 @@ import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractPatchContentTable extends NavigationTable<Object>
abstract class AbstractPatchContentTable extends NavigationTable<Object>
implements CommentEditorContainer, FocusHandler, BlurHandler {
public static final int R_HEAD = 0;
static final short FILE_SIDE_A = (short) 0;
@ -110,8 +108,6 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
if (Gerrit.isSignedIn()) {
keysAction.add(new InsertCommentCommand(0, 'c', PatchUtil.C
.commentInsert()));
keysAction.add(new PublishCommentsKeyCommand(0, 'r', Util.C
.keyPublishComments()));
// See CommentEditorPanel
//
@ -131,11 +127,8 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
abstract void createFileCommentEditorOnSideB();
abstract PatchScreen.Type getPatchScreenType();
protected void initHeaders(PatchScript script, PatchSetDetail detail) {
PatchScreen.Type type = getPatchScreenType();
headerSideA = new PatchSetSelectBox(PatchSetSelectBox.Side.A, type);
headerSideA = new PatchSetSelectBox(PatchSetSelectBox.Side.A);
headerSideA.display(detail, script, patchKey, idSideA, idSideB);
headerSideA.addDoubleClickHandler(new DoubleClickHandler() {
@Override
@ -145,7 +138,7 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
}
}
});
headerSideB = new PatchSetSelectBox(PatchSetSelectBox.Side.B, type);
headerSideB = new PatchSetSelectBox(PatchSetSelectBox.Side.B);
headerSideB.display(detail, script, patchKey, idSideA, idSideB);
headerSideB.addDoubleClickHandler(new DoubleClickHandler() {
@Override
@ -838,18 +831,6 @@ public abstract class AbstractPatchContentTable extends NavigationTable<Object>
}
}
public class PublishCommentsKeyCommand extends NeedsSignInKeyCommand {
public PublishCommentsKeyCommand(int mask, char key, String help) {
super(mask, key, help);
}
@Override
public void onKeyPress(final KeyPressEvent event) {
final PatchSet.Id id = patchKey.getParentKey();
Gerrit.display(Dispatcher.toPublish(id));
}
}
public class PrevChunkKeyCmd extends KeyCommand {
public PrevChunkKeyCmd(int mask, int key, String help) {
super(mask, key, help);

View File

@ -33,10 +33,10 @@ import java.util.List;
* A table used to specify which two patch sets should be diff'ed.
*/
class HistoryTable extends FancyFlexTable<Patch> {
private final PatchScreen screen;
private final UnifiedPatchScreen screen;
final List<HistoryRadio> all = new ArrayList<>();
HistoryTable(final PatchScreen parent) {
HistoryTable(final UnifiedPatchScreen parent) {
setStyleName(Gerrit.RESOURCES.css().patchHistoryTable());
screen = parent;
table.setWidth("auto");
@ -58,14 +58,7 @@ class HistoryTable extends FancyFlexTable<Patch> {
}
enableAll(false);
Patch.Key k = new Patch.Key(sideB, screen.getPatchKey().get());
switch (screen.getPatchScreenType()) {
case SIDE_BY_SIDE:
Gerrit.display(Dispatcher.toPatchSideBySide(sideA, k));
break;
case UNIFIED:
Gerrit.display(Dispatcher.toPatchUnified(sideA, k));
break;
}
Gerrit.display(Dispatcher.toUnified(sideA, k));
}
void enableAll(final boolean on) {

View File

@ -75,11 +75,11 @@ class NavLinks extends Composite {
table.setWidget(0, 1, up);
}
void display(int patchIndex, PatchScreen.Type type, PatchTable fileList,
void display(int patchIndex, PatchTable fileList,
List<InlineHyperlink> links, List<WebLinkInfo> webLinks) {
if (fileList != null) {
setupNav(Nav.PREV, fileList.getPreviousPatchLink(patchIndex, type));
setupNav(Nav.NEXT, fileList.getNextPatchLink(patchIndex, type));
setupNav(Nav.PREV, fileList.getPreviousPatchLink(patchIndex));
setupNav(Nav.NEXT, fileList.getNextPatchLink(patchIndex));
} else {
setupNav(Nav.PREV, null);
setupNav(Nav.NEXT, null);

View File

@ -41,18 +41,13 @@ import java.util.HashMap;
import java.util.Map;
public class PatchSetSelectBox extends Composite {
interface Binder extends UiBinder<HTMLPanel, PatchSetSelectBox> {
}
interface Binder extends UiBinder<HTMLPanel, PatchSetSelectBox> {}
private static final Binder uiBinder = GWT.create(Binder.class);
interface BoxStyle extends CssResource {
String selected();
String hidden();
String sideMarker();
String patchSetLabel();
}
@ -66,7 +61,6 @@ public class PatchSetSelectBox extends Composite {
PatchSet.Id idSideB;
PatchSet.Id idActive;
Side side;
PatchScreen.Type screenType;
Map<Integer, Anchor> links;
private Label patchSet;
@ -76,9 +70,8 @@ public class PatchSetSelectBox extends Composite {
@UiField
BoxStyle style;
public PatchSetSelectBox(Side side, final PatchScreen.Type type) {
public PatchSetSelectBox(Side side) {
this.side = side;
this.screenType = type;
initWidget(uiBinder.createAndBindUi(this));
}
@ -102,11 +95,9 @@ public class PatchSetSelectBox extends Composite {
patchSet.addStyleName(style.patchSetLabel());
linkPanel.add(patchSet);
if (screenType == PatchScreen.Type.UNIFIED) {
Label sideMarker = new Label((side == Side.A) ? "(-)" : "(+)");
sideMarker.addStyleName(style.sideMarker());
linkPanel.add(sideMarker);
}
Label sideMarker = new Label((side == Side.A) ? "(-)" : "(+)");
sideMarker.addStyleName(style.sideMarker());
linkPanel.add(sideMarker);
Anchor baseLink;
if (detail.getInfo().getParents().size() > 1) {
@ -116,9 +107,7 @@ public class PatchSetSelectBox extends Composite {
}
links.put(0, baseLink);
if (screenType == PatchScreen.Type.UNIFIED || side == Side.A) {
linkPanel.add(baseLink);
}
linkPanel.add(baseLink);
if (side == Side.B) {
links.get(0).setStyleName(style.hidden());
@ -161,19 +150,9 @@ public class PatchSetSelectBox extends Composite {
}
Patch.Key keySideB = new Patch.Key(idSideB, patchKey.get());
switch (screenType) {
case SIDE_BY_SIDE:
Gerrit.display(Dispatcher.toPatchSideBySide(idSideA, keySideB));
break;
case UNIFIED:
Gerrit.display(Dispatcher.toPatchUnified(idSideA, keySideB));
break;
}
Gerrit.display(Dispatcher.toUnified(idSideA, keySideB));
}
});
return anchor;
}

View File

@ -14,6 +14,7 @@
package com.google.gerrit.client.patches;
import com.google.gerrit.common.data.ChangeDetailService;
import com.google.gerrit.common.data.PatchDetailService;
import com.google.gwt.core.client.GWT;
import com.google.gwtjsonrpc.client.JsonUtil;
@ -21,10 +22,14 @@ import com.google.gwtjsonrpc.client.JsonUtil;
public class PatchUtil {
public static final PatchConstants C = GWT.create(PatchConstants.class);
public static final PatchMessages M = GWT.create(PatchMessages.class);
public static final PatchDetailService DETAIL_SVC;
public static final ChangeDetailService CHANGE_SVC;
public static final PatchDetailService PATCH_SVC;
static {
DETAIL_SVC = GWT.create(PatchDetailService.class);
JsonUtil.bind(DETAIL_SVC, "rpc/PatchDetailService");
CHANGE_SVC = GWT.create(ChangeDetailService.class);
JsonUtil.bind(CHANGE_SVC, "rpc/ChangeDetailService");
PATCH_SVC = GWT.create(PatchDetailService.class);
JsonUtil.bind(PATCH_SVC, "rpc/PatchDetailService");
}
}

View File

@ -52,11 +52,10 @@ public class ReviewedPanels {
this.bottom.setStyleName(Gerrit.RESOURCES.css().reviewedPanelBottom());
}
public void populate(Patch.Key pk, PatchTable pt, int patchIndex,
PatchScreen.Type patchScreenType) {
public void populate(Patch.Key pk, PatchTable pt, int patchIndex) {
patchKey = pk;
fileList = pt;
reviewedLink = createReviewedLink(patchIndex, patchScreenType);
reviewedLink = createReviewedLink(patchIndex);
top.clear();
checkBoxTop = createReviewedCheckbox();
@ -132,8 +131,7 @@ public class ReviewedPanels {
}
}
private InlineHyperlink createReviewedLink(final int patchIndex,
final PatchScreen.Type patchScreenType) {
private InlineHyperlink createReviewedLink(final int patchIndex) {
final PatchValidator unreviewedValidator = new PatchValidator() {
@Override
public boolean isValid(Patch patch) {
@ -150,8 +148,7 @@ public class ReviewedPanels {
if (nextUnreviewedPatchIndex > -1) {
// Create invisible patch link to change page
reviewedLink =
fileList.createLink(nextUnreviewedPatchIndex, patchScreenType,
null, null);
fileList.createLink(nextUnreviewedPatchIndex, null, null);
reviewedLink.setText("");
}
}

View File

@ -1,684 +0,0 @@
// Copyright (C) 2008 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.patches;
import static com.google.gerrit.client.patches.PatchLine.Type.CONTEXT;
import static com.google.gerrit.client.patches.PatchLine.Type.DELETE;
import static com.google.gerrit.client.patches.PatchLine.Type.INSERT;
import static com.google.gerrit.client.patches.PatchLine.Type.REPLACE;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.common.data.CommentDetail;
import com.google.gerrit.common.data.PatchScript;
import com.google.gerrit.common.data.PatchScript.DisplayMethod;
import com.google.gerrit.common.data.PatchScript.FileMode;
import com.google.gerrit.common.data.PatchSetDetail;
import com.google.gerrit.prettify.client.SparseHtmlFile;
import com.google.gerrit.prettify.common.EditList;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwtexpui.safehtml.client.SafeHtml;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
import org.eclipse.jgit.diff.Edit;
import java.util.ArrayList;
import java.util.Iterator;
public class SideBySideTable extends AbstractPatchContentTable {
private static final int A = 2;
private static final int B = 3;
private static final int NUM_ROWS_TO_EXPAND = 10;
private SparseHtmlFile a;
private SparseHtmlFile b;
private boolean isHugeFile;
protected boolean isFileCommentBorderRowExist;
@Override
protected void createFileCommentEditorOnSideA() {
createCommentEditor(R_HEAD + 1, A, R_HEAD, FILE_SIDE_A);
}
@Override
protected void createFileCommentEditorOnSideB() {
createCommentEditor(R_HEAD + 1, B, R_HEAD, FILE_SIDE_B);
}
@Override
protected void onCellDoubleClick(final int row, int column) {
if (column > C_ARROW && getRowItem(row) instanceof PatchLine) {
final PatchLine line = (PatchLine) getRowItem(row);
if (column == 1 || column == A) {
createCommentEditor(row + 1, A, line.getLineA(), (short) 0);
} else if (column == B || column == 4) {
createCommentEditor(row + 1, B, line.getLineB(), (short) 1);
}
}
}
@Override
protected void onCellSingleClick(Event event, int row, int column) {
super.onCellSingleClick(event, row, column);
if (column == 1 || column == 4) {
onCellDoubleClick(row, column);
}
}
@Override
protected void onInsertComment(final PatchLine line) {
final int row = getCurrentRow();
createCommentEditor(row + 1, B, line.getLineB(), (short) 1);
}
@Override
protected void render(final PatchScript script, final PatchSetDetail detail) {
final ArrayList<Object> lines = new ArrayList<>();
final SafeHtmlBuilder nc = new SafeHtmlBuilder();
isHugeFile = script.isHugeFile();
allocateTableHeader(nc);
lines.add(null);
if (!isDisplayBinary) {
if (script.getFileModeA() != FileMode.FILE
|| script.getFileModeB() != FileMode.FILE) {
openLine(nc);
appendModeLine(nc, script.getFileModeA());
appendModeLine(nc, script.getFileModeB());
closeLine(nc);
lines.add(null);
}
if (hasDifferences(script)) {
int lastA = 0;
int lastB = 0;
final boolean ignoreWS = script.isIgnoreWhitespace();
a = getSparseHtmlFileA(script);
b = getSparseHtmlFileB(script);
final boolean intraline =
script.getDiffPrefs().isIntralineDifference()
&& script.hasIntralineDifference();
for (final EditList.Hunk hunk : script.getHunks()) {
if (!hunk.isStartOfFile()) {
appendSkipLine(nc);
lines.add(new SkippedLine(lastA, lastB, hunk.getCurB() - lastB));
}
while (hunk.next()) {
if (hunk.isContextLine()) {
openLine(nc);
final SafeHtml ctx = a.getSafeHtmlLine(hunk.getCurA());
appendLineNumber(nc, hunk.getCurA(), false);
appendLineText(nc, CONTEXT, ctx, false, false);
if (ignoreWS && b.contains(hunk.getCurB())) {
appendLineText(nc, CONTEXT, b, hunk.getCurB(), false);
} else {
appendLineText(nc, CONTEXT, ctx, false, false);
}
appendLineNumber(nc, hunk.getCurB(), true);
closeLine(nc);
hunk.incBoth();
lines.add(new PatchLine(CONTEXT, hunk.getCurA(), hunk.getCurB()));
} else if (hunk.isModifiedLine()) {
final boolean del = hunk.isDeletedA();
final boolean ins = hunk.isInsertedB();
final boolean full =
intraline && hunk.getCurEdit().getType() != Edit.Type.REPLACE;
openLine(nc);
if (del) {
appendLineNumber(nc, hunk.getCurA(), false);
appendLineText(nc, DELETE, a, hunk.getCurA(), full);
hunk.incA();
} else if (hunk.getCurEdit().getType() == Edit.Type.REPLACE) {
appendLineNumber(nc, false);
appendLineNone(nc, DELETE);
} else {
appendLineNumber(nc, false);
appendLineNone(nc, CONTEXT);
}
if (ins) {
appendLineText(nc, INSERT, b, hunk.getCurB(), full);
appendLineNumber(nc, hunk.getCurB(), true);
hunk.incB();
} else if (hunk.getCurEdit().getType() == Edit.Type.REPLACE) {
appendLineNone(nc, INSERT);
appendLineNumber(nc, true);
} else {
appendLineNone(nc, CONTEXT);
appendLineNumber(nc, true);
}
closeLine(nc);
if (del && ins) {
lines.add(new PatchLine(REPLACE, hunk.getCurA(), hunk.getCurB()));
} else if (del) {
lines.add(new PatchLine(DELETE, hunk.getCurA(), -1));
} else if (ins) {
lines.add(new PatchLine(INSERT, -1, hunk.getCurB()));
}
}
}
lastA = hunk.getCurA();
lastB = hunk.getCurB();
}
if (lastB != b.size()) {
appendSkipLine(nc);
lines.add(new SkippedLine(lastA, lastB, b.size() - lastB));
}
}
} else {
// Display the patch header for binary
for (final String line : script.getPatchHeader()) {
appendFileHeader(nc, line);
}
// If there is a safe picture involved, we show it
if (script.getDisplayMethodA() == DisplayMethod.IMG
|| script.getDisplayMethodB() == DisplayMethod.IMG) {
appendImageLine(script, nc);
}
}
if (!hasDifferences(script)) {
appendNoDifferences(nc);
}
resetHtml(nc);
populateTableHeader(script, detail);
if (hasDifferences(script)) {
initScript(script);
if (!isDisplayBinary) {
for (int row = 0; row < lines.size(); row++) {
setRowItem(row, lines.get(row));
if (lines.get(row) instanceof SkippedLine) {
createSkipLine(row, (SkippedLine) lines.get(row), isHugeFile);
}
}
}
}
}
private SafeHtml createImage(String url) {
SafeHtmlBuilder m = new SafeHtmlBuilder();
m.openElement("img");
m.setAttribute("src", url);
m.closeElement("img");
return m.toSafeHtml();
}
private void appendImageLine(final PatchScript script,
final SafeHtmlBuilder m) {
m.openTr();
m.setAttribute("valign", "center");
m.setAttribute("align", "center");
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().iconCell());
m.closeTd();
appendLineNumber(m, false);
if (script.getDisplayMethodA() == DisplayMethod.IMG) {
final String url = getUrlA();
appendLineText(m, DELETE, createImage(url), false, true);
} else {
appendLineNone(m, DELETE);
}
if (script.getDisplayMethodB() == DisplayMethod.IMG) {
final String url = getUrlB();
appendLineText(m, INSERT, createImage(url), false, true);
} else {
appendLineNone(m, INSERT);
}
appendLineNumber(m, true);
m.closeTr();
}
private void populateTableHeader(final PatchScript script,
final PatchSetDetail detail) {
initHeaders(script, detail);
table.setWidget(R_HEAD, A, headerSideA);
table.setWidget(R_HEAD, B, headerSideB);
// Populate icons to lineNumber column header.
if (headerSideA.isFileOrCommitMessage()) {
table.setWidget(R_HEAD, A - 1, iconA);
}
if (headerSideB.isFileOrCommitMessage()) {
table.setWidget(R_HEAD, B + 1, iconB);
}
}
private void appendModeLine(final SafeHtmlBuilder nc, final FileMode mode) {
nc.openTd();
nc.setStyleName(Gerrit.RESOURCES.css().lineNumber());
nc.nbsp();
nc.closeTd();
nc.openTd();
nc.addStyleName(Gerrit.RESOURCES.css().fileLine());
nc.addStyleName(Gerrit.RESOURCES.css().fileLineMode());
switch(mode){
case FILE:
nc.nbsp();
break;
case SYMLINK:
nc.append(PatchUtil.C.fileTypeSymlink());
break;
case GITLINK:
nc.append(PatchUtil.C.fileTypeGitlink());
break;
}
nc.closeTd();
}
@Override
protected PatchScreen.Type getPatchScreenType() {
return PatchScreen.Type.SIDE_BY_SIDE;
}
@Override
public void display(final CommentDetail cd, boolean expandComments) {
if (cd.isEmpty()) {
return;
}
setAccountInfoCache(cd.getAccounts());
for (int row = 0; row < table.getRowCount();) {
final Iterator<PatchLineComment> ai;
final Iterator<PatchLineComment> bi;
if (row == R_HEAD) {
ai = cd.getForA(R_HEAD).iterator();
bi = cd.getForB(R_HEAD).iterator();
} else if (getRowItem(row) instanceof PatchLine) {
final PatchLine pLine = (PatchLine) getRowItem(row);
ai = cd.getForA(pLine.getLineA()).iterator();
bi = cd.getForB(pLine.getLineB()).iterator();
} else {
row++;
continue;
}
row++;
while (ai.hasNext() && bi.hasNext()) {
final PatchLineComment ac = ai.next();
final PatchLineComment bc = bi.next();
if (ac.getLine() == R_HEAD) {
insertFileCommentRow(row);
} else {
insertRow(row);
}
bindComment(row, A, ac, !ai.hasNext());
bindComment(row, B, bc, !bi.hasNext());
row++;
}
row = finish(ai, row, A);
row = finish(bi, row, B);
}
}
private void defaultStyle(final int row, final CellFormatter fmt) {
fmt.addStyleName(row, A - 1, Gerrit.RESOURCES.css().lineNumber());
fmt.addStyleName(row, A, Gerrit.RESOURCES.css().diffText());
if (isDisplayBinary) {
fmt.addStyleName(row, A, Gerrit.RESOURCES.css().diffTextForBinaryInSideBySide());
}
fmt.addStyleName(row, B, Gerrit.RESOURCES.css().diffText());
fmt.addStyleName(row, B + 1, Gerrit.RESOURCES.css().lineNumber());
fmt.addStyleName(row, B + 1, Gerrit.RESOURCES.css().rightmost());
}
@Override
protected void insertRow(final int row) {
super.insertRow(row);
final CellFormatter fmt = table.getCellFormatter();
defaultStyle(row, fmt);
}
@Override
protected void insertFileCommentRow(final int row) {
table.insertRow(row);
final CellFormatter fmt = table.getCellFormatter();
fmt.addStyleName(row, C_ARROW, Gerrit.RESOURCES.css().iconCellOfFileCommentRow());
defaultStyle(row, fmt);
fmt.addStyleName(row, C_ARROW, //
Gerrit.RESOURCES.css().cellsNextToFileComment());
fmt.addStyleName(row, A - 1, //
Gerrit.RESOURCES.css().cellsNextToFileComment());
fmt.addStyleName(row, B + 1, //
Gerrit.RESOURCES.css().cellsNextToFileComment());
createFileCommentBorderRow(row);
}
private void createFileCommentBorderRow(final int row) {
if (row == 1 && !isFileCommentBorderRowExist) {
isFileCommentBorderRowExist = true;
table.insertRow(R_HEAD + 2);
final CellFormatter fmt = table.getCellFormatter();
fmt.addStyleName(R_HEAD + 2, C_ARROW, //
Gerrit.RESOURCES.css().iconCellOfFileCommentRow());
defaultStyle(R_HEAD + 2, fmt);
final Element iconCell = fmt.getElement(R_HEAD + 2, C_ARROW);
UIObject.setStyleName(DOM.getParent(iconCell), Gerrit.RESOURCES.css()
.fileCommentBorder(), true);
}
}
private int finish(final Iterator<PatchLineComment> i, int row, final int col) {
while (i.hasNext()) {
final PatchLineComment c = i.next();
if (c.getLine() == R_HEAD) {
insertFileCommentRow(row);
} else {
insertRow(row);
}
bindComment(row, col, c, !i.hasNext());
row++;
}
return row;
}
private void allocateTableHeader(final SafeHtmlBuilder m) {
m.openTr();
m.openTd();
m.addStyleName(Gerrit.RESOURCES.css().iconCell());
m.addStyleName(Gerrit.RESOURCES.css().fileColumnHeader());
m.closeTd();
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().lineNumber());
m.addStyleName(Gerrit.RESOURCES.css().fileColumnHeader());
m.nbsp();
m.closeTd();
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().fileColumnHeader());
m.addStyleName(Gerrit.RESOURCES.css().fileLine());
m.closeTd();
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().fileColumnHeader());
m.addStyleName(Gerrit.RESOURCES.css().fileLine());
m.closeTd();
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().lineNumber());
m.addStyleName(Gerrit.RESOURCES.css().fileColumnHeader());
m.addStyleName(Gerrit.RESOURCES.css().rightmost());
m.closeTd();
m.closeTr();
}
private void appendFileHeader(final SafeHtmlBuilder m, final String line) {
m.openTr();
m.openTd();
m.addStyleName(Gerrit.RESOURCES.css().iconCell());
m.closeTd();
appendLineNumber(m, false);
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().sideBySideTableBinaryHeader());
m.setAttribute("colspan", 2);
m.append(line);
m.closeTd();
appendLineNumber(m, true);
m.closeTr();
}
private void appendSkipLine(final SafeHtmlBuilder m) {
m.openTr();
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().iconCell());
m.addStyleName(Gerrit.RESOURCES.css().skipLine());
m.closeTd();
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().skipLine());
m.setAttribute("colspan", 4);
m.closeTd();
m.closeTr();
}
private ClickHandler expandAllListener = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
expand(event, 0);
}
};
private ClickHandler expandBeforeListener = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
expand(event, NUM_ROWS_TO_EXPAND);
}
};
private ClickHandler expandAfterListener = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
expand(event, -NUM_ROWS_TO_EXPAND);
}
};
private void expand(ClickEvent event, final int numRows) {
int row = table.getCellForEvent(event).getRowIndex();
if (!(getRowItem(row) instanceof SkippedLine)) {
return;
}
SkippedLine line = (SkippedLine) getRowItem(row);
int loopTo = numRows;
if (numRows == 0) {
loopTo = line.getSize();
} else if (numRows < 0) {
loopTo = -numRows;
}
int offset = 0;
if (numRows < 0) {
offset = 1;
}
CellFormatter fmt = table.getCellFormatter();
for (int i = 0 + offset; i < loopTo + offset; i++) {
insertRow(row + i);
table.getRowFormatter().setVerticalAlign(row + i,
HasVerticalAlignment.ALIGN_TOP);
int lineA = line.getStartA() + i;
int lineB = line.getStartB() + i;
if (numRows < 0) {
lineA = line.getStartA() + line.getSize() + numRows + i - offset;
lineB = line.getStartB() + line.getSize() + numRows + i - offset;
}
table.setHTML(row + i, A - 1, "<a href=\"javascript:;\">" + (lineA + 1) + "</a>");
fmt.addStyleName(row + i, A - 1, Gerrit.RESOURCES.css().lineNumber());
table.setHTML(row + i, A, a.getSafeHtmlLine(lineA).asString());
fmt.addStyleName(row + i, A, Gerrit.RESOURCES.css().fileLine());
fmt.addStyleName(row + i, A, Gerrit.RESOURCES.css().fileLineCONTEXT());
table.setHTML(row + i, B, b.getSafeHtmlLine(lineB).asString());
fmt.addStyleName(row + i, B, Gerrit.RESOURCES.css().fileLine());
fmt.addStyleName(row + i, B, Gerrit.RESOURCES.css().fileLineCONTEXT());
table.setHTML(row + i, B + 1, "<a href=\"javascript:;\">" + (lineB + 1) + "</a>");
fmt.addStyleName(row + i, B + 1, Gerrit.RESOURCES.css().lineNumber());
setRowItem(row + i, new PatchLine(CONTEXT, lineA, lineB));
}
if (numRows > 0) {
line.incrementStart(numRows);
createSkipLine(row + loopTo, line, isHugeFile);
} else if (numRows < 0) {
line.reduceSize(-numRows);
createSkipLine(row, line, isHugeFile);
} else {
table.removeRow(row + loopTo);
}
}
private void createSkipLine(int row, SkippedLine line, boolean isHugeFile) {
FlowPanel p = new FlowPanel();
InlineLabel l1 = new InlineLabel(" " + PatchUtil.C.patchSkipRegionStart() + " ");
InlineLabel l2 = new InlineLabel(" " + PatchUtil.C.patchSkipRegionEnd() + " ");
Anchor all = new Anchor(String.valueOf(line.getSize()));
all.addClickHandler(expandAllListener);
all.setStyleName(Gerrit.RESOURCES.css().skipLine());
if (line.getSize() > 30) {
// Only show the expand before/after if skipped more than 30 lines.
Anchor b = new Anchor(PatchUtil.M.expandBefore(NUM_ROWS_TO_EXPAND), true);
Anchor a = new Anchor(PatchUtil.M.expandAfter(NUM_ROWS_TO_EXPAND), true);
b.addClickHandler(expandBeforeListener);
a.addClickHandler(expandAfterListener);
b.setStyleName(Gerrit.RESOURCES.css().skipLine());
a.setStyleName(Gerrit.RESOURCES.css().skipLine());
p.add(b);
p.add(l1);
if (isHugeFile) {
p.add(new InlineLabel(" " + line.getSize() + " "));
} else {
p.add(all);
}
p.add(l2);
p.add(a);
} else {
p.add(l1);
p.add(all);
p.add(l2);
}
table.setWidget(row, 1, p);
}
private void openLine(final SafeHtmlBuilder m) {
m.openTr();
m.setAttribute("valign", "top");
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().iconCell());
m.closeTd();
}
private void appendLineNumber(SafeHtmlBuilder m, boolean right) {
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().lineNumber());
if (right) {
m.addStyleName(Gerrit.RESOURCES.css().rightmost());
}
m.closeTd();
}
private void appendLineNumber(SafeHtmlBuilder m, int lineNumberMinusOne, boolean right) {
m.openTd();
m.setStyleName(Gerrit.RESOURCES.css().lineNumber());
if (right) {
m.addStyleName(Gerrit.RESOURCES.css().rightmost());
}
m.append(SafeHtml.asis("<a href=\"javascript:;\">"+ (lineNumberMinusOne + 1) + "</a>"));
m.closeTd();
}
private void appendLineText(final SafeHtmlBuilder m,
final PatchLine.Type type, final SparseHtmlFile src, final int i,
final boolean fullBlock) {
appendLineText(m, type, src.getSafeHtmlLine(i), src.hasTrailingEdit(i), fullBlock);
}
private void appendLineText(final SafeHtmlBuilder m,
final PatchLine.Type type, final SafeHtml lineHtml,
final boolean trailingEdit, final boolean fullBlock) {
m.openTd();
m.addStyleName(Gerrit.RESOURCES.css().fileLine());
switch (type) {
case CONTEXT:
m.addStyleName(Gerrit.RESOURCES.css().fileLineCONTEXT());
break;
case DELETE:
m.addStyleName(Gerrit.RESOURCES.css().fileLineDELETE());
if (trailingEdit || fullBlock) {
m.addStyleName("wdd");
}
break;
case INSERT:
m.addStyleName(Gerrit.RESOURCES.css().fileLineINSERT());
if (trailingEdit || fullBlock) {
m.addStyleName("wdi");
}
break;
case REPLACE:
break;
}
m.append(lineHtml);
m.closeTd();
}
private void appendLineNone(final SafeHtmlBuilder m, final PatchLine.Type type) {
m.openTd();
m.addStyleName(Gerrit.RESOURCES.css().fileLine());
switch (type != null ? type : PatchLine.Type.CONTEXT) {
case DELETE:
m.addStyleName(Gerrit.RESOURCES.css().fileLineDELETE());
break;
case INSERT:
m.addStyleName(Gerrit.RESOURCES.css().fileLineINSERT());
break;
default:
m.addStyleName(Gerrit.RESOURCES.css().fileLineNone());
break;
}
m.closeTd();
}
private void closeLine(final SafeHtmlBuilder m) {
m.closeTr();
}
@Override
protected void destroyCommentRow(final int row) {
super.destroyCommentRow(row);
if (row == R_HEAD + 1) {
table.removeRow(row);
isFileCommentBorderRowExist = false;
}
}
}

View File

@ -420,11 +420,6 @@ public class UnifiedDiffTable extends AbstractPatchContentTable {
defaultStyle(row, fmt);
}
@Override
protected PatchScreen.Type getPatchScreenType() {
return PatchScreen.Type.UNIFIED;
}
private int insert(final List<PatchLineComment> in, int row) {
for (Iterator<PatchLineComment> ci = in.iterator(); ci.hasNext();) {
final PatchLineComment c = ci.next();

View File

@ -21,7 +21,6 @@ import com.google.gerrit.client.RpcStatus;
import com.google.gerrit.client.WebLinkInfo;
import com.google.gerrit.client.changes.CommitMessageBlock;
import com.google.gerrit.client.changes.PatchTable;
import com.google.gerrit.client.changes.Util;
import com.google.gerrit.client.diff.DiffApi;
import com.google.gerrit.client.diff.DiffInfo;
import com.google.gerrit.client.projects.ConfigInfoCache;
@ -55,47 +54,11 @@ import com.google.gwtexpui.globalkey.client.KeyCommandSet;
import java.util.Collections;
import java.util.List;
public abstract class PatchScreen extends Screen implements
public class UnifiedPatchScreen extends Screen implements
CommentEditorContainer {
static final PrettyFactory PRETTY = ClientSideFormatter.FACTORY;
static final short LARGE_FILE_CONTEXT = 100;
public static class SideBySide extends PatchScreen {
public SideBySide(final Patch.Key id, final int patchIndex,
final PatchSetDetail patchSetDetail, final PatchTable patchTable,
final TopView topView, final PatchSet.Id baseId) {
super(id, patchIndex, patchSetDetail, patchTable, topView, baseId);
}
@Override
protected SideBySideTable createContentTable() {
return new SideBySideTable();
}
@Override
public PatchScreen.Type getPatchScreenType() {
return PatchScreen.Type.SIDE_BY_SIDE;
}
}
public static class Unified extends PatchScreen {
public Unified(final Patch.Key id, final int patchIndex,
final PatchSetDetail patchSetDetail, final PatchTable patchTable,
final TopView topView, final PatchSet.Id baseId) {
super(id, patchIndex, patchSetDetail, patchTable, topView, baseId);
}
@Override
protected UnifiedDiffTable createContentTable() {
return new UnifiedDiffTable();
}
@Override
public PatchScreen.Type getPatchScreenType() {
return PatchScreen.Type.UNIFIED;
}
}
/**
* What should be displayed in the top of the screen
*/
@ -116,7 +79,7 @@ public abstract class PatchScreen extends Screen implements
private HistoryTable historyTable;
private FlowPanel topPanel;
private FlowPanel contentPanel;
private AbstractPatchContentTable contentTable;
private UnifiedDiffTable contentTable;
private CommitMessageBlock commitMessageBlock;
private NavLinks topNav;
private NavLinks bottomNav;
@ -137,24 +100,12 @@ public abstract class PatchScreen extends Screen implements
private boolean intralineFailure;
private boolean intralineTimeout;
/**
* How this patch should be displayed in the patch screen.
*/
public static enum Type {
UNIFIED, SIDE_BY_SIDE
}
protected PatchScreen(final Patch.Key id, final int patchIndex,
final PatchSetDetail detail, final PatchTable patchTable,
final TopView top, final PatchSet.Id baseId) {
public UnifiedPatchScreen(Patch.Key id, TopView top, PatchSet.Id baseId) {
patchKey = id;
patchSetDetail = detail;
fileList = patchTable;
topView = top;
idSideA = baseId; // null here means we're diff'ing from the Base
idSideB = id.getParentKey();
this.patchIndex = patchIndex;
prefs = fileList != null
? fileList.getPreferences()
@ -256,7 +207,7 @@ public abstract class PatchScreen extends Screen implements
topPanel = new FlowPanel();
add(topPanel);
contentTable = createContentTable();
contentTable = new UnifiedDiffTable();
contentTable.fileList = fileList;
topNav = new NavLinks(keysNavigation, patchKey.getParentKey());
@ -264,12 +215,7 @@ public abstract class PatchScreen extends Screen implements
add(topNav);
contentPanel = new FlowPanel();
if (getPatchScreenType() == PatchScreen.Type.SIDE_BY_SIDE) {
contentPanel.setStyleName(//
Gerrit.RESOURCES.css().sideBySideScreenSideBySideTable());
} else {
contentPanel.setStyleName(Gerrit.RESOURCES.css().unifiedTable());
}
contentPanel.setStyleName(Gerrit.RESOURCES.css().unifiedTable());
contentPanel.add(contentTable);
add(contentPanel);
@ -290,61 +236,29 @@ public abstract class PatchScreen extends Screen implements
.get(new GerritCallback<DiffInfo>() {
@Override
public void onSuccess(DiffInfo diffInfo) {
topNav.display(patchIndex, getPatchScreenType(), fileList,
topNav.display(patchIndex, fileList,
getLinks(), getWebLinks(diffInfo));
bottomNav.display(patchIndex, getPatchScreenType(), fileList,
bottomNav.display(patchIndex, fileList,
getLinks(), getWebLinks(diffInfo));
}
});
}
private List<InlineHyperlink> getLinks() {
if (contentTable instanceof SideBySideTable) {
InlineHyperlink toUnifiedDiffLink = new InlineHyperlink();
toUnifiedDiffLink.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.unifiedDiff()));
toUnifiedDiffLink.setTargetHistoryToken(getUnifiedDiffUrl());
toUnifiedDiffLink.setTitle(PatchUtil.C.unifiedDiff());
return Collections.singletonList(toUnifiedDiffLink);
} else if (contentTable instanceof UnifiedDiffTable) {
InlineHyperlink toSideBySideDiffLink = new InlineHyperlink();
toSideBySideDiffLink.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.sideBySideDiff()));
toSideBySideDiffLink.setTargetHistoryToken(getSideBySideDiffUrl());
toSideBySideDiffLink.setTitle(PatchUtil.C.sideBySideDiff());
return Collections.singletonList(toSideBySideDiffLink);
} else {
throw new IllegalStateException("unknown table type: "
+ contentTable.getClass().getSimpleName());
}
InlineHyperlink toSideBySideDiffLink = new InlineHyperlink();
toSideBySideDiffLink.setHTML(new ImageResourceRenderer().render(Gerrit.RESOURCES.sideBySideDiff()));
toSideBySideDiffLink.setTargetHistoryToken(getSideBySideDiffUrl());
toSideBySideDiffLink.setTitle(PatchUtil.C.sideBySideDiff());
return Collections.singletonList(toSideBySideDiffLink);
}
private List<WebLinkInfo> getWebLinks(DiffInfo diffInfo) {
if (contentTable instanceof SideBySideTable) {
return diffInfo.side_by_side_web_links();
} else if (contentTable instanceof UnifiedDiffTable) {
return diffInfo.unified_web_links();
} else {
throw new IllegalStateException("unknown table type: "
+ contentTable.getClass().getSimpleName());
}
return diffInfo.unified_web_links();
}
private String getSideBySideDiffUrl() {
StringBuilder url = new StringBuilder();
url.append("/c/");
url.append(patchKey.getParentKey().getParentKey().get());
url.append("/");
if (idSideA != null) {
url.append(idSideA.get());
url.append("..");
}
url.append(idSideB.get());
url.append("/");
url.append(patchKey.getFileName());
return url.toString();
}
private String getUnifiedDiffUrl() {
return getSideBySideDiffUrl() + ",unified";
return Dispatcher.toPatch("sidebyside", idSideA,
new Patch.Key(idSideB, patchKey.getFileName()));
}
@Override
@ -352,7 +266,7 @@ public abstract class PatchScreen extends Screen implements
super.onLoad();
if (patchSetDetail == null) {
Util.DETAIL_SVC.patchSetDetail(idSideB,
PatchUtil.CHANGE_SVC.patchSetDetail(idSideB,
new GerritCallback<PatchSetDetail>() {
@Override
public void onSuccess(PatchSetDetail result) {
@ -405,10 +319,6 @@ public abstract class PatchScreen extends Screen implements
}
}
protected abstract AbstractPatchContentTable createContentTable();
public abstract PatchScreen.Type getPatchScreenType();
public PatchSet.Id getSideA() {
return idSideA;
}
@ -437,7 +347,7 @@ public abstract class PatchScreen extends Screen implements
final int rpcseq = ++rpcSequence;
lastScript = null;
settingsPanel.setEnabled(false);
reviewedPanels.populate(patchKey, fileList, patchIndex, getPatchScreenType());
reviewedPanels.populate(patchKey, fileList, patchIndex);
if (isFirst && fileList != null && fileList.isLoaded()) {
fileList.movePointerTo(patchKey);
}
@ -457,7 +367,7 @@ public abstract class PatchScreen extends Screen implements
// Handled by ScreenLoadCallback.onFailure.
}
}));
PatchUtil.DETAIL_SVC.patchScript(patchKey, idSideA, idSideB,
PatchUtil.PATCH_SVC.patchScript(patchKey, idSideA, idSideB,
settingsPanel.getValue(), cb.addFinal(
new ScreenLoadCallback<PatchScript>(this) {
@Override
@ -494,7 +404,7 @@ public abstract class PatchScreen extends Screen implements
commentLinkProcessor);
} else {
commitMessageBlock.setVisible(false);
Util.DETAIL_SVC.patchSetDetail(idSideB,
PatchUtil.CHANGE_SVC.patchSetDetail(idSideB,
new GerritCallback<PatchSetDetail>() {
@Override
public void onSuccess(PatchSetDetail result) {
@ -516,22 +426,6 @@ public abstract class PatchScreen extends Screen implements
}
}
if (contentTable instanceof SideBySideTable
&& contentTable.isPureMetaChange(script)
&& !contentTable.isDisplayBinary) {
// User asked for SideBySide (or a link guessed, wrong) and we can't
// show a pure-rename change there accurately. Switch to
// the unified view instead. User can set file comments on binary file
// in SideBySide view.
//
contentTable.removeFromParent();
contentTable = new UnifiedDiffTable();
contentTable.fileList = fileList;
contentTable.setCommentLinkProcessor(commentLinkProcessor);
contentPanel.add(contentTable);
setToken(Dispatcher.toPatchUnified(idSideA, patchKey));
}
if (script.isHugeFile()) {
AccountDiffPreference dp = script.getDiffPrefs();
int context = dp.getContext();
@ -632,7 +526,7 @@ public abstract class PatchScreen extends Screen implements
final PatchSet.Id psid = patchKey.getParentKey();
fileList = new PatchTable(prefs);
fileList.setSavePointerId("PatchTable " + psid);
Util.DETAIL_SVC.patchSetDetail(psid,
PatchUtil.CHANGE_SVC.patchSetDetail(psid,
new GerritCallback<PatchSetDetail>() {
@Override
public void onSuccess(final PatchSetDetail result) {

View File

@ -1,42 +0,0 @@
// 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.ui;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.changes.ChangeDetailCache;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gwt.user.client.ui.FocusWidget;
public abstract class ActionDialog extends CommentedActionDialog<ChangeDetail> {
public ActionDialog(final FocusWidget enableOnFailure, final boolean redirect,
String dialogTitle, String dialogHeading) {
super(dialogTitle, dialogHeading, new ChangeDetailCache.IgnoreErrorCallback() {
@Override
public void onSuccess(ChangeDetail result) {
if (redirect) {
Gerrit.display(PageLinks.toChange(result.getChange().getId()));
} else {
super.onSuccess(result);
}
}
@Override
public void onFailure(Throwable caught) {
enableOnFailure.setEnabled(true);
}
});
}
}

View File

@ -23,7 +23,6 @@ import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwtexpui.globalkey.client.GlobalKey;
@ -32,12 +31,12 @@ import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle;
import java.util.LinkedList;
import java.util.List;
public abstract class CherryPickDialog extends ActionDialog {
public abstract class CherryPickDialog extends CommentedActionDialog {
private SuggestBox newBranch;
private List<BranchInfo> branches;
public CherryPickDialog(final FocusWidget enableOnFailure, Project.NameKey project) {
super(enableOnFailure, true, Util.C.cherryPickTitle(), Util.C
public CherryPickDialog(Project.NameKey project) {
super(Util.C.cherryPickTitle(), Util.C
.cherryPickCommitMessage());
ProjectApi.getBranches(project,
new GerritCallback<JsArray<BranchInfo>>() {

View File

@ -15,7 +15,6 @@
package com.google.gerrit.client.ui;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
@ -27,24 +26,20 @@ import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.globalkey.client.NpTextArea;
import com.google.gwtexpui.user.client.AutoCenterDialogBox;
import com.google.gwtjsonrpc.common.AsyncCallback;
public abstract class CommentedActionDialog<T> extends AutoCenterDialogBox
public abstract class CommentedActionDialog extends AutoCenterDialogBox
implements CloseHandler<PopupPanel> {
protected final FlowPanel panel;
protected final NpTextArea message;
protected final Button sendButton;
protected final Button cancelButton;
protected final FlowPanel buttonPanel;
protected AsyncCallback<T> callback;
protected FocusWidget focusOn;
protected boolean sent = false;
public CommentedActionDialog(final String title, final String heading,
AsyncCallback<T> callback) {
public CommentedActionDialog(final String title, final String heading) {
super(/* auto hide */false, /* modal */true);
this.callback = callback;
setGlassEnabled(true);
setText(title);
@ -111,13 +106,6 @@ public abstract class CommentedActionDialog<T> extends AutoCenterDialogBox
@Override
public void onClose(CloseEvent<PopupPanel> event) {
if (!sent) {
// the dialog was closed without the send button being pressed
// e.g. the user pressed Cancel or ESC to close the dialog
if (callback != null) {
callback.onFailure(null);
}
}
sent = false;
}
@ -126,23 +114,4 @@ public abstract class CommentedActionDialog<T> extends AutoCenterDialogBox
public String getMessageText() {
return message.getText().trim();
}
public AsyncCallback<T> createCallback() {
return new GerritCallback<T>(){
@Override
public void onSuccess(T result) {
sent = true;
if (callback != null) {
callback.onSuccess(result);
}
hide();
}
@Override
public void onFailure(Throwable caught) {
enableButtons(true);
super.onFailure(caught);
}
};
}
}

View File

@ -23,7 +23,6 @@ import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwtexpui.globalkey.client.GlobalKey;
@ -32,12 +31,12 @@ import com.google.gwtexpui.safehtml.client.HighlightSuggestOracle;
import java.util.ArrayList;
import java.util.List;
public abstract class CreateChangeDialog extends ActionDialog {
public abstract class CreateChangeDialog extends CommentedActionDialog {
private SuggestBox newChange;
private List<BranchInfo> branches;
public CreateChangeDialog(final FocusWidget enableOnFailure, Project.NameKey project) {
super(enableOnFailure, true, Util.C.dialogCreateChangeTitle(),
public CreateChangeDialog(Project.NameKey project) {
super(Util.C.dialogCreateChangeTitle(),
Util.C.dialogCreateChangeHeading());
ProjectApi.getBranches(project,
new GerritCallback<JsArray<BranchInfo>>() {

View File

@ -15,90 +15,23 @@
package com.google.gerrit.client.ui;
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.changes.PatchTable;
import com.google.gerrit.client.patches.PatchScreen;
import com.google.gerrit.common.data.PatchSetDetail;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchSet;
public class PatchLink extends InlineHyperlink {
protected PatchSet.Id base;
protected Patch.Key patchKey;
protected int patchIndex;
protected PatchSetDetail patchSetDetail;
protected PatchTable parentPatchTable;
protected PatchScreen.TopView topView;
/**
* @param text The text of this link
* @param base optional base to compare against.
* @param patchKey The key for this patch
* @param patchIndex The index of the current patch in the patch set
* @param historyToken The history token
* @param patchSetDetail Detailed information about the patch set.
* @param parentPatchTable The table used to display this link
*/
protected PatchLink(String text, PatchSet.Id base, Patch.Key patchKey,
int patchIndex, String historyToken,
PatchSetDetail patchSetDetail, PatchTable parentPatchTable,
PatchScreen.TopView topView) {
private PatchLink(String text, String historyToken) {
super(text, historyToken);
this.base = base;
this.patchKey = patchKey;
this.patchIndex = patchIndex;
this.patchSetDetail = patchSetDetail;
this.parentPatchTable = parentPatchTable;
this.parentPatchTable = parentPatchTable;
this.topView = topView;
}
/**
* @param text The text of this link
* @param type The type of the link to create (unified/side-by-side)
* @param patchScreen The patchScreen to grab contents to link to from
*/
public PatchLink(String text, PatchScreen.Type type, PatchScreen patchScreen) {
this(text, //
patchScreen.getSideA(), //
patchScreen.getPatchKey(), //
patchScreen.getPatchIndex(), //
Dispatcher.toPatch(type, patchScreen.getPatchKey()), //
patchScreen.getPatchSetDetail(), //
patchScreen.getFileList(), //
patchScreen.getTopView() //
);
}
@Override
public void go() {
Dispatcher.patch( //
getTargetHistoryToken(), //
base, //
patchKey, //
patchIndex, //
patchSetDetail, //
parentPatchTable,
topView //
);
}
public static class SideBySide extends PatchLink {
public SideBySide(String text, PatchSet.Id base, Patch.Key patchKey,
int patchIndex, PatchSetDetail patchSetDetail,
PatchTable parentPatchTable) {
super(text, base, patchKey, patchIndex,
Dispatcher.toPatchSideBySide(base, patchKey),
patchSetDetail, parentPatchTable, null);
public SideBySide(String text, PatchSet.Id base, Patch.Key id) {
super(text, Dispatcher.toSideBySide(base, id));
}
}
public static class Unified extends PatchLink {
public Unified(String text, PatchSet.Id base, final Patch.Key patchKey,
int patchIndex, PatchSetDetail patchSetDetail,
PatchTable parentPatchTable) {
super(text, base, patchKey, patchIndex,
Dispatcher.toPatchUnified(base, patchKey),
patchSetDetail, parentPatchTable, null);
public Unified(String text, PatchSet.Id base, Patch.Key id) {
super(text, Dispatcher.toUnified(base, id));
}
}
}

View File

@ -21,7 +21,6 @@ import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GerritConfig;
import com.google.gerrit.common.data.GitwebConfig;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.server.account.Realm;
import com.google.gerrit.server.change.ArchiveFormat;
import com.google.gerrit.server.change.GetArchive;
@ -133,9 +132,6 @@ class GerritConfigProvider implements Provider<GerritConfig> {
config.setSuggestFrom(cfg.getInt("suggest", "from", 0));
config.setChangeUpdateDelay((int) ConfigUtil.getTimeUnit(
cfg, "change", null, "updateDelay", 30, TimeUnit.SECONDS));
config.setChangeScreen(cfg.getEnum(
"gerrit", null, "changeScreen",
AccountGeneralPreferences.ChangeScreen.CHANGE_SCREEN2));
config.setLargeChangeSize(cfg.getInt("change", "largeChange", 500));
config.setArchiveFormats(Lists.newArrayList(Iterables.transform(
archiveFormats.getAllowed(),

View File

@ -68,13 +68,6 @@ public final class AccountGeneralPreferences {
}
}
public static enum CommentVisibilityStrategy {
COLLAPSE_ALL,
EXPAND_MOST_RECENT,
EXPAND_RECENT,
EXPAND_ALL
}
public static enum ReviewCategoryStrategy {
NONE,
NAME,
@ -88,11 +81,6 @@ public final class AccountGeneralPreferences {
UNIFIED_DIFF
}
public static enum ChangeScreen {
OLD_UI,
CHANGE_SCREEN2
}
public static enum TimeFormat {
/** 12-hour clock: 1:15 am, 2:13 pm */
HHMM_12("h:mm a"),
@ -147,26 +135,18 @@ public final class AccountGeneralPreferences {
@Column(id = 9, length = 10, notNull = false)
protected String timeFormat;
/**
* If true display the patch sets in the ChangeScreen in reverse order
* (show latest patch set on top).
*/
@Column(id = 10)
protected boolean reversePatchSetOrder;
// DELETED: id = 10 (reversePatchSetOrder)
// DELETED: id = 11 (showUserInReview)
@Column(id = 12)
protected boolean relativeDateInChangeTable;
@Column(id = 13, length = 20, notNull = false)
protected String commentVisibilityStrategy;
// DELETED: id = 13 (commentVisibilityStrategy)
@Column(id = 14, length = 20, notNull = false)
protected String diffView;
@Column(id = 15, length = 20, notNull = false)
protected String changeScreen;
// DELETED: id = 15 (changeScreen)
@Column(id = 16)
protected boolean sizeBarInChangeTable;
@ -242,14 +222,6 @@ public final class AccountGeneralPreferences {
copySelfOnEmail = includeSelfOnEmail;
}
public boolean isReversePatchSetOrder() {
return reversePatchSetOrder;
}
public void setReversePatchSetOrder(final boolean reversePatchSetOrder) {
this.reversePatchSetOrder = reversePatchSetOrder;
}
public boolean isShowInfoInReviewCategory() {
return getReviewCategoryStrategy() != ReviewCategoryStrategy.NONE;
}
@ -296,18 +268,6 @@ public final class AccountGeneralPreferences {
reviewCategoryStrategy = strategy.name();
}
public CommentVisibilityStrategy getCommentVisibilityStrategy() {
if (commentVisibilityStrategy == null) {
return CommentVisibilityStrategy.EXPAND_RECENT;
}
return CommentVisibilityStrategy.valueOf(commentVisibilityStrategy);
}
public void setCommentVisibilityStrategy(
CommentVisibilityStrategy strategy) {
commentVisibilityStrategy = strategy.name();
}
public DiffView getDiffView() {
if (diffView == null) {
return DiffView.SIDE_BY_SIDE;
@ -319,14 +279,6 @@ public final class AccountGeneralPreferences {
this.diffView = diffView.name();
}
public ChangeScreen getChangeScreen() {
return changeScreen != null ? ChangeScreen.valueOf(changeScreen) : null;
}
public void setChangeScreen(ChangeScreen ui) {
changeScreen = ui != null ? ui.name() : null;
}
public boolean isSizeBarInChangeTable() {
return sizeBarInChangeTable;
}
@ -348,16 +300,13 @@ public final class AccountGeneralPreferences {
showSiteHeader = true;
useFlashClipboard = true;
copySelfOnEmail = false;
reversePatchSetOrder = false;
reviewCategoryStrategy = null;
downloadUrl = null;
downloadCommand = null;
dateFormat = null;
timeFormat = null;
relativeDateInChangeTable = false;
commentVisibilityStrategy = null;
diffView = null;
changeScreen = null;
sizeBarInChangeTable = true;
legacycidInChangeTable = false;
}

View File

@ -21,8 +21,6 @@ import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
@ -108,14 +106,11 @@ public class GetPreferences implements RestReadView<AccountResource> {
Boolean copySelfOnEmail;
DateFormat dateFormat;
TimeFormat timeFormat;
Boolean reversePatchSetOrder;
Boolean relativeDateInChangeTable;
Boolean sizeBarInChangeTable;
Boolean legacycidInChangeTable;
ReviewCategoryStrategy reviewCategoryStrategy;
CommentVisibilityStrategy commentVisibilityStrategy;
DiffView diffView;
ChangeScreen changeScreen;
List<TopMenu.MenuItem> my;
public PreferenceInfo(AccountGeneralPreferences p,
@ -129,14 +124,11 @@ public class GetPreferences implements RestReadView<AccountResource> {
copySelfOnEmail = p.isCopySelfOnEmails() ? true : null;
dateFormat = p.getDateFormat();
timeFormat = p.getTimeFormat();
reversePatchSetOrder = p.isReversePatchSetOrder() ? true : null;
relativeDateInChangeTable = p.isRelativeDateInChangeTable() ? true : null;
sizeBarInChangeTable = p.isSizeBarInChangeTable() ? true : null;
legacycidInChangeTable = p.isLegacycidInChangeTable() ? true : null;
reviewCategoryStrategy = p.getReviewCategoryStrategy();
commentVisibilityStrategy = p.getCommentVisibilityStrategy();
diffView = p.getDiffView();
changeScreen = p.getChangeScreen();
}
my = my(v, allUsers);
}

View File

@ -26,8 +26,6 @@ import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
@ -62,14 +60,11 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
public Boolean copySelfOnEmail;
public DateFormat dateFormat;
public TimeFormat timeFormat;
public Boolean reversePatchSetOrder;
public Boolean relativeDateInChangeTable;
public Boolean sizeBarInChangeTable;
public Boolean legacycidInChangeTable;
public CommentVisibilityStrategy commentVisibilityStrategy;
public ReviewCategoryStrategy reviewCategoryStrategy;
public DiffView diffView;
public ChangeScreen changeScreen;
public List<TopMenu.MenuItem> my;
}
@ -146,9 +141,6 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
if (i.timeFormat != null) {
p.setTimeFormat(i.timeFormat);
}
if (i.reversePatchSetOrder != null) {
p.setReversePatchSetOrder(i.reversePatchSetOrder);
}
if (i.relativeDateInChangeTable != null) {
p.setRelativeDateInChangeTable(i.relativeDateInChangeTable);
}
@ -161,15 +153,9 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
if (i.reviewCategoryStrategy != null) {
p.setReviewCategoryStrategy(i.reviewCategoryStrategy);
}
if (i.commentVisibilityStrategy != null) {
p.setCommentVisibilityStrategy(i.commentVisibilityStrategy);
}
if (i.diffView != null) {
p.setDiffView(i.diffView);
}
if (i.changeScreen != null) {
p.setChangeScreen(i.changeScreen);
}
db.get().accounts().update(Collections.singleton(a));
db.get().commit();

View File

@ -49,13 +49,10 @@ public class SetPreferences implements RestModifyView<ConfigResource, Input> {
|| i.useFlashClipboard != null || i.downloadScheme != null
|| i.downloadCommand != null || i.copySelfOnEmail != null
|| i.dateFormat != null || i.timeFormat != null
|| i.reversePatchSetOrder != null
|| i.relativeDateInChangeTable != null
|| i.sizeBarInChangeTable != null
|| i.legacycidInChangeTable != null
|| i.reviewCategoryStrategy != null
|| i.commentVisibilityStrategy != null || i.diffView != null
|| i.changeScreen != null) {
|| i.reviewCategoryStrategy != null) {
throw new BadRequestException("unsupported option");
}

View File

@ -32,7 +32,7 @@ import java.util.List;
/** A version of the database schema. */
public abstract class SchemaVersion {
/** The current schema version. */
public static final Class<Schema_103> C = Schema_103.class;
public static final Class<Schema_104> C = Schema_104.class;
public static int getBinaryVersion() {
return guessVersion(C);

View File

@ -1,4 +1,4 @@
// Copyright (C) 2010 The Android Open Source Project
// 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.
@ -12,15 +12,16 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.client.changes;
package com.google.gerrit.server.schema;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.inject.Inject;
import com.google.inject.Provider;
public interface ChangeResources extends ClientBundle {
@Source("removeReviewerNormal.png")
public ImageResource removeReviewerNormal();
public class Schema_104 extends SchemaVersion {
@Inject
Schema_104(Provider<Schema_103> prior) {
super(prior);
}
@Source("removeReviewerPressed.png")
public ImageResource removeReviewerPressed();
// Remove old change screen
}