diff options
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java')
-rw-r--r-- | gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java | 361 |
1 files changed, 245 insertions, 116 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java index 740e08ce97..81b4f140d5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java @@ -17,56 +17,59 @@ 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.GitwebLink; +import com.google.gerrit.client.patches.PatchUtil; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.ui.AccountDashboardLink; +import com.google.gerrit.client.ui.CommentedActionDialog; 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.GitwebLink; import com.google.gerrit.common.data.PatchSetDetail; -import com.google.gerrit.reviewdb.Account; -import com.google.gerrit.reviewdb.AccountDiffPreference; -import com.google.gerrit.reviewdb.AccountGeneralPreferences; -import com.google.gerrit.reviewdb.ApprovalCategory; -import com.google.gerrit.reviewdb.Change; -import com.google.gerrit.reviewdb.ChangeMessage; -import com.google.gerrit.reviewdb.Patch; -import com.google.gerrit.reviewdb.PatchSet; -import com.google.gerrit.reviewdb.PatchSetInfo; -import com.google.gerrit.reviewdb.Project; -import com.google.gerrit.reviewdb.UserIdentity; -import com.google.gerrit.reviewdb.AccountGeneralPreferences.DownloadCommand; -import com.google.gerrit.reviewdb.AccountGeneralPreferences.DownloadScheme; +import com.google.gerrit.reviewdb.client.Account; +import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; +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.Project; +import com.google.gerrit.reviewdb.client.UserIdentity; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; +import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme; import com.google.gwt.core.client.GWT; 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.FocusWidget; import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; import com.google.gwt.user.client.ui.InlineLabel; import com.google.gwt.user.client.ui.Panel; -import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; import com.google.gwtexpui.clippy.client.CopyableLabel; +import com.google.gwtjsonrpc.common.VoidResult; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; -class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements OpenHandler<DisclosurePanel> { +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 ChangeScreen changeScreen; + private final ChangeDetailCache detailCache; private final ChangeDetail changeDetail; private final PatchSet patchSet; private final FlowPanel body; @@ -82,42 +85,38 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O * Creates a closed complex disclosure panel for a patch set. * The patch set details are loaded when the complex disclosure panel is opened. */ - PatchSetComplexDisclosurePanel(final ChangeScreen parent, final ChangeDetail detail, - final PatchSet ps) { - this(parent, detail, ps, false); - addOpenHandler(this); - } - - /** - * Creates an open complex disclosure panel for a patch set. - */ - PatchSetComplexDisclosurePanel(final ChangeScreen parent, final ChangeDetail detail, - final PatchSetDetail psd) { - this(parent, detail, psd.getPatchSet(), true); - ensureLoaded(psd); - } - - private PatchSetComplexDisclosurePanel(final ChangeScreen parent, final ChangeDetail detail, - final PatchSet ps, boolean isOpen) { + public PatchSetComplexDisclosurePanel(final PatchSet ps, boolean isOpen) { super(Util.M.patchSetHeader(ps.getPatchSetId()), isOpen); - changeScreen = parent; - changeDetail = detail; + detailCache = ChangeCache.get(ps.getId().getParentKey()).getChangeDetailCache(); + changeDetail = detailCache.get(); patchSet = ps; + body = new FlowPanel(); setContent(body); - final GitwebLink gw = Gerrit.getConfig().getGitwebLink(); - + 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) { final Anchor revlink = - new Anchor("(gitweb)", false, gw.toRevision(detail.getChange() + 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) { @@ -158,16 +157,26 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O if (!patchSet.getId().equals(diffBaseId)) { patchTable = new PatchTable(); patchTable.setSavePointerId("PatchTable " + patchSet.getId()); - patchTable.setPatchSetIdToCompareWith(diffBaseId); - patchTable.display(detail); + patchTable.display(diffBaseId, detail); actionsPanel = new FlowPanel(); actionsPanel.setStyleName(Gerrit.RESOURCES.css().patchSetActions()); body.add(actionsPanel); if (Gerrit.isSignedIn()) { - populateReviewAction(); - if (changeDetail.isCurrentPatchSet(detail)) { - populateActions(detail); + if (changeDetail.canEdit()) { + populateReviewAction(); + if (changeDetail.isCurrentPatchSet(detail)) { + populateActions(detail); + } + } + if (detail.getPatchSet().isDraft()) { + if (changeDetail.canPublish()) { + populatePublishAction(); + } + if (changeDetail.canDeleteDraft() && + changeDetail.getPatchSets().size() > 1) { + populateDeleteDraftPatchSetAction(); + } } } populateDiffAllActions(detail); @@ -202,12 +211,20 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O .anonymousDownload("Git"), r.toString())); } + String hostPageUrl = GWT.getHostPageBaseURL(); + if (!hostPageUrl.endsWith("/")) { + hostPageUrl += "/"; + } + if (changeDetail.isAllowsAnonymous() && (allowedSchemes.contains(DownloadScheme.ANON_HTTP) || allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) { StringBuilder r = new StringBuilder(); - r.append(GWT.getHostPageBaseURL()); - r.append("p/"); + if (Gerrit.getConfig().getGitHttpUrl() != null) { + r.append(Gerrit.getConfig().getGitHttpUrl()); + } else { + r.append(hostPageUrl); + } r.append(projectName); r.append(" "); r.append(patchSet.getRefName()); @@ -243,24 +260,28 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O && Gerrit.getUserAccount().getUserName().length() > 0 && (allowedSchemes.contains(DownloadScheme.HTTP) || allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) { - String base = GWT.getHostPageBaseURL(); - int p = base.indexOf("://"); - int s = base.indexOf('/', p + 3); - if (s < 0) { - s = base.length(); - } - String host = base.substring(p + 3, s); - if (host.contains("@")) { - host = host.substring(host.indexOf('@') + 1); - } - final StringBuilder r = new StringBuilder(); - r.append(base.substring(0, p + 3)); - r.append(Gerrit.getUserAccount().getUserName()); - r.append('@'); - r.append(host); - r.append(base.substring(s)); - r.append("p/"); + if (Gerrit.getConfig().getGitHttpUrl() != null + && changeDetail.isAllowsAnonymous()) { + r.append(Gerrit.getConfig().getGitHttpUrl()); + } else { + String base = hostPageUrl; + int p = base.indexOf("://"); + int s = base.indexOf('/', p + 3); + if (s < 0) { + s = base.length(); + } + String host = base.substring(p + 3, s); + if (host.contains("@")) { + host = host.substring(host.indexOf('@') + 1); + } + + r.append(base.substring(0, p + 3)); + r.append(Gerrit.getUserAccount().getUserName()); + r.append('@'); + r.append(host); + r.append(base.substring(s)); + } r.append(projectName); r.append(" "); r.append(patchSet.getRefName()); @@ -402,15 +423,15 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O private void populateActions(final PatchSetDetail detail) { final boolean isOpen = changeDetail.getChange().getStatus().isOpen(); - Set<ApprovalCategory.Id> allowed = changeDetail.getCurrentActions(); - if (allowed == null) { - allowed = Collections.emptySet(); - } - if (isOpen && allowed.contains(ApprovalCategory.SUBMIT)) { + if (isOpen && changeDetail.canSubmit()) { final Button b = new Button(Util.M .submitPatchSet(detail.getPatchSet().getPatchSetId())); + if (Gerrit.getConfig().testChangeMerge()) { + b.setEnabled(changeDetail.getChange().isMergeable()); + } + b.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { @@ -438,15 +459,22 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O @Override public void onClick(final ClickEvent event) { b.setEnabled(false); - new CommentedChangeActionDialog(patchSet.getId(), createCommentedCallback(b), - Util.C.revertChangeTitle(), Util.C.headingRevertMessage(), - Util.C.buttonRevertChangeSend(), Util.C.buttonRevertChangeCancel(), - Gerrit.RESOURCES.css().revertChangeDialog(), Gerrit.RESOURCES.css().revertMessage(), - Util.M.revertChangeDefaultMessage(detail.getInfo().getSubject(), detail.getPatchSet().getRevision().get())) { - public void onSend() { - Util.MANAGE_SVC.revertChange(getPatchSetId() , getMessageText(), createCallback()); - } - }.center(); + 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() { + Util.MANAGE_SVC.revertChange(patchSet.getId(), getMessageText(), + createCallback()); + } + }.center(); } }); actionsPanel.add(b); @@ -458,14 +486,42 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O @Override public void onClick(final ClickEvent event) { b.setEnabled(false); - new CommentedChangeActionDialog(patchSet.getId(), createCommentedCallback(b), - Util.C.abandonChangeTitle(), Util.C.headingAbandonMessage(), - Util.C.buttonAbandonChangeSend(), Util.C.buttonAbandonChangeCancel(), - Gerrit.RESOURCES.css().abandonChangeDialog(), Gerrit.RESOURCES.css().abandonMessage()) { - public void onSend() { - Util.MANAGE_SVC.abandonChange(getPatchSetId() , getMessageText(), createCallback()); + new ActionDialog(b, false, Util.C.abandonChangeTitle(), + Util.C.headingAbandonMessage()) { + { + sendButton.setText(Util.C.buttonAbandonChangeSend()); + } + + @Override + public void onSend() { + Util.MANAGE_SVC.abandonChange(patchSet.getId(), getMessageText(), + createCallback()); + } + }.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); + Util.MANAGE_SVC.deleteDraftChange(patchSet.getId(), + new GerritCallback<VoidResult>() { + public void onSuccess(VoidResult result) { + Gerrit.display(PageLinks.MINE); + } + + @Override + public void onFailure(Throwable caught) { + b.setEnabled(true); + super.onFailure(caught); } - }.center(); + }); } }); actionsPanel.add(b); @@ -477,14 +533,31 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O @Override public void onClick(final ClickEvent event) { b.setEnabled(false); - new CommentedChangeActionDialog(patchSet.getId(), createCommentedCallback(b), - Util.C.restoreChangeTitle(), Util.C.headingRestoreMessage(), - Util.C.buttonRestoreChangeSend(), Util.C.buttonRestoreChangeCancel(), - Gerrit.RESOURCES.css().abandonChangeDialog(), Gerrit.RESOURCES.css().abandonMessage()) { - public void onSend() { - Util.MANAGE_SVC.restoreChange(getPatchSetId(), getMessageText(), createCallback()); - } - }.center(); + new ActionDialog(b, false, Util.C.restoreChangeTitle(), + Util.C.headingRestoreMessage()) { + { + sendButton.setText(Util.C.buttonRestoreChangeSend()); + } + + @Override + public void onSend() { + Util.MANAGE_SVC.restoreChange(patchSet.getId(), getMessageText(), + createCallback()); + } + }.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); + Util.MANAGE_SVC.rebaseChange(patchSet.getId(), + new ChangeDetailCache.GerritWidgetCallback(b)); } }); actionsPanel.add(b); @@ -494,12 +567,10 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O private void populateDiffAllActions(final PatchSetDetail detail) { final Button diffAllSideBySide = new Button(Util.C.buttonDiffAllSideBySide()); diffAllSideBySide.addClickHandler(new ClickHandler() { - @Override public void onClick(ClickEvent event) { for (Patch p : detail.getPatches()) { - Window.open(Window.Location.getPath() + "#" - + Dispatcher.toPatchSideBySide(p.getKey()), "_blank", null); + openWindow(Dispatcher.toPatchSideBySide(diffBaseId, p.getKey())); } } }); @@ -507,25 +578,77 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O final Button diffAllUnified = new Button(Util.C.buttonDiffAllUnified()); diffAllUnified.addClickHandler(new ClickHandler() { - @Override public void onClick(ClickEvent event) { for (Patch p : detail.getPatches()) { - Window.open(Window.Location.getPath() + "#" - + Dispatcher.toPatchUnified(p.getKey()), "_blank", null); + openWindow(Dispatcher.toPatchUnified(diffBaseId, p.getKey())); } } }); actionsPanel.add(diffAllUnified); } + private void openWindow(String token) { + String url = Window.Location.getPath() + "#" + token; + Window.open(url, "_blank", null); + } + private void populateReviewAction() { final Button b = new Button(Util.C.buttonReview()); b.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { - Gerrit.display("change,publish," + patchSet.getId().toString(), - new PublishCommentScreen(patchSet.getId())); + 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); + Util.MANAGE_SVC.publish(patchSet.getId(), + new GerritCallback<ChangeDetail>() { + public void onSuccess(ChangeDetail result) { + detailCache.set(result); + } + + @Override + public void onFailure(Throwable caught) { + b.setEnabled(true); + super.onFailure(caught); + } + }); + } + }); + 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); + PatchUtil.DETAIL_SVC.deleteDraftPatchSet(patchSet.getId(), + new GerritCallback<ChangeDetail>() { + public void onSuccess(final ChangeDetail result) { + if (result != null) { + detailCache.set(result); + } else { + Gerrit.display(PageLinks.MINE); + } + } + + @Override + public void onFailure(Throwable caught) { + b.setEnabled(true); + super.onFailure(caught); + } + }); } }); actionsPanel.add(b); @@ -543,18 +666,15 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O new GerritCallback<PatchSetDetail>() { @Override public void onSuccess(PatchSetDetail result) { - if (patchSet.getId().equals(diffBaseId)) { patchTable.setVisible(false); actionsPanel.setVisible(false); } else { - if (patchTable != null) { patchTable.removeFromParent(); } patchTable = new PatchTable(); - patchTable.setPatchSetIdToCompareWith(diffBaseId); - patchTable.display(result); + patchTable.display(diffBaseId, result); body.add(patchTable); for (ClickHandler clickHandler : registeredClickHandler) { @@ -610,7 +730,7 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O new SubmitFailureDialog(result, msg).center(); } } - changeScreen.update(result); + detailCache.set(result); } public PatchSet getPatchSet() { @@ -636,15 +756,24 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O } } - private AsyncCallback<ChangeDetail> createCommentedCallback(final Button b) { - return new AsyncCallback<ChangeDetail>() { - public void onSuccess(ChangeDetail result) { - changeScreen.update(result); - } + private 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); + } + } - public void onFailure(Throwable caught) { - b.setEnabled(true); - } - }; + @Override + public void onFailure(Throwable caught) { + enableOnFailure.setEnabled(true); + } + }); + } } } |