| // 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.patches; |
| |
| import com.google.gerrit.client.Gerrit; |
| import com.google.gerrit.client.VoidResult; |
| import com.google.gerrit.client.changes.PatchTable; |
| import com.google.gerrit.client.changes.PatchTable.PatchValidator; |
| import com.google.gerrit.client.changes.Util; |
| import com.google.gerrit.client.rpc.RestApi; |
| import com.google.gerrit.client.ui.ChangeLink; |
| import com.google.gerrit.client.ui.InlineHyperlink; |
| import com.google.gerrit.reviewdb.client.Patch; |
| 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.logical.shared.ValueChangeEvent; |
| import com.google.gwt.event.logical.shared.ValueChangeHandler; |
| import com.google.gwt.user.client.rpc.AsyncCallback; |
| import com.google.gwt.user.client.ui.Anchor; |
| import com.google.gwt.user.client.ui.CheckBox; |
| import com.google.gwt.user.client.ui.FlowPanel; |
| import com.google.gwtexpui.safehtml.client.SafeHtml; |
| import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; |
| |
| public class ReviewedPanels { |
| |
| public final FlowPanel top; |
| public final FlowPanel bottom; |
| |
| private Patch.Key patchKey; |
| private PatchTable fileList; |
| private InlineHyperlink reviewedLink; |
| private CheckBox checkBoxTop; |
| private CheckBox checkBoxBottom; |
| |
| public ReviewedPanels() { |
| this.top = new FlowPanel(); |
| this.bottom = new FlowPanel(); |
| this.bottom.setStyleName(Gerrit.RESOURCES.css().reviewedPanelBottom()); |
| } |
| |
| public void populate(Patch.Key pk, PatchTable pt, int patchIndex, |
| PatchScreen.Type patchScreenType) { |
| patchKey = pk; |
| fileList = pt; |
| reviewedLink = createReviewedLink(patchIndex, patchScreenType); |
| |
| top.clear(); |
| checkBoxTop = createReviewedCheckbox(); |
| top.add(checkBoxTop); |
| top.add(createReviewedAnchor()); |
| |
| bottom.clear(); |
| checkBoxBottom = createReviewedCheckbox(); |
| bottom.add(checkBoxBottom); |
| bottom.add(createReviewedAnchor()); |
| } |
| |
| private CheckBox createReviewedCheckbox() { |
| final CheckBox checkBox = new CheckBox(PatchUtil.C.reviewedAnd() + " "); |
| checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() { |
| @Override |
| public void onValueChange(ValueChangeEvent<Boolean> event) { |
| final boolean value = event.getValue(); |
| setReviewedByCurrentUser(value); |
| if (checkBoxTop.getValue() != value) { |
| checkBoxTop.setValue(value); |
| } |
| if (checkBoxBottom.getValue() != value) { |
| checkBoxBottom.setValue(value); |
| } |
| } |
| }); |
| return checkBox; |
| } |
| |
| public boolean getValue() { |
| return checkBoxTop.getValue(); |
| } |
| |
| public void setValue(final boolean value) { |
| checkBoxTop.setValue(value); |
| checkBoxBottom.setValue(value); |
| } |
| |
| public void setReviewedByCurrentUser(boolean reviewed) { |
| if (fileList != null) { |
| fileList.updateReviewedStatus(patchKey, reviewed); |
| } |
| |
| PatchSet.Id ps = patchKey.getParentKey(); |
| RestApi api = new RestApi("/changes/").id(ps.getParentKey().get()) |
| .view("revisions").id(ps.get()) |
| .view("files").id(patchKey.getFileName()) |
| .view("reviewed"); |
| |
| AsyncCallback<VoidResult> cb = new AsyncCallback<VoidResult>() { |
| @Override |
| public void onFailure(Throwable arg0) { |
| // nop |
| } |
| |
| @Override |
| public void onSuccess(VoidResult result) { |
| // nop |
| } |
| }; |
| if (reviewed) { |
| api.put(cb); |
| } else { |
| api.delete(cb); |
| } |
| } |
| |
| public void go() { |
| if (reviewedLink != null) { |
| setReviewedByCurrentUser(true); |
| reviewedLink.go(); |
| } |
| } |
| |
| private InlineHyperlink createReviewedLink(final int patchIndex, |
| final PatchScreen.Type patchScreenType) { |
| final PatchValidator unreviewedValidator = new PatchValidator() { |
| public boolean isValid(Patch patch) { |
| return !patch.isReviewedByCurrentUser(); |
| } |
| }; |
| |
| InlineHyperlink reviewedLink = new ChangeLink("", patchKey.getParentKey()); |
| if (fileList != null) { |
| int nextUnreviewedPatchIndex = |
| fileList.getNextPatch(patchIndex, true, unreviewedValidator, |
| fileList.PREFERENCE_VALIDATOR); |
| |
| if (nextUnreviewedPatchIndex > -1) { |
| // Create invisible patch link to change page |
| reviewedLink = |
| fileList.createLink(nextUnreviewedPatchIndex, patchScreenType, |
| null, null); |
| reviewedLink.setText(""); |
| } |
| } |
| return reviewedLink; |
| } |
| |
| private Anchor createReviewedAnchor() { |
| SafeHtmlBuilder text = new SafeHtmlBuilder(); |
| text.append(PatchUtil.C.next()); |
| text.append(SafeHtml.asis(Util.C.nextPatchLinkIcon())); |
| |
| Anchor reviewedAnchor = new Anchor(""); |
| SafeHtml.set(reviewedAnchor, text); |
| |
| reviewedAnchor.addClickHandler(new ClickHandler() { |
| @Override |
| public void onClick(ClickEvent event) { |
| setReviewedByCurrentUser(true); |
| reviewedLink.go(); |
| } |
| }); |
| |
| return reviewedAnchor; |
| } |
| } |