blob: 68df45d359d143ec5758e07ec432c5316b863203 [file] [log] [blame]
// 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;
}
}