summaryrefslogtreecommitdiffstats
path: root/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java')
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java313
1 files changed, 313 insertions, 0 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java
new file mode 100644
index 0000000000..8b674cea7a
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java
@@ -0,0 +1,313 @@
+// 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.account;
+
+import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.ui.FancyFlexTable;
+import com.google.gerrit.client.ui.ProjectLink;
+import com.google.gerrit.client.ui.ProjectNameSuggestOracle;
+import com.google.gerrit.common.data.AccountProjectWatchInfo;
+import com.google.gerrit.reviewdb.AccountProjectWatch;
+import com.google.gerrit.reviewdb.Change.Status;
+import com.google.gwt.event.dom.client.BlurEvent;
+import com.google.gwt.event.dom.client.BlurHandler;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.FocusEvent;
+import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.CheckBox;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.SuggestBox;
+import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import com.google.gwtexpui.globalkey.client.NpTextBox;
+import com.google.gwtjsonrpc.client.VoidResult;
+
+import java.util.HashSet;
+import java.util.List;
+
+class ProjectWatchPanel extends Composite {
+ private WatchTable watches;
+
+ private Button addNew;
+ private SuggestBox nameTxt;
+ private Button delSel;
+
+ ProjectWatchPanel() {
+ final FlowPanel body = new FlowPanel();
+
+ {
+ final FlowPanel fp = new FlowPanel();
+ fp.setStyleName("gerrit-ProjectWatchPanel-AddPanel");
+
+ final NpTextBox box = new NpTextBox();
+ nameTxt = new SuggestBox(new ProjectNameSuggestOracle(), box);
+ box.setVisibleLength(50);
+ box.setText(Util.C.defaultProjectName());
+ box.addStyleName("gerrit-InputFieldTypeHint");
+ box.addFocusHandler(new FocusHandler() {
+ @Override
+ public void onFocus(FocusEvent event) {
+ if (Util.C.defaultProjectName().equals(box.getText())) {
+ box.setText("");
+ box.removeStyleName("gerrit-InputFieldTypeHint");
+ }
+ }
+ });
+ box.addBlurHandler(new BlurHandler() {
+ @Override
+ public void onBlur(BlurEvent event) {
+ if ("".equals(box.getText())) {
+ box.setText(Util.C.defaultProjectName());
+ box.addStyleName("gerrit-InputFieldTypeHint");
+ }
+ }
+ });
+ fp.add(nameTxt);
+
+ addNew = new Button(Util.C.buttonWatchProject());
+ addNew.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ doAddNew();
+ }
+ });
+ fp.add(addNew);
+ body.add(fp);
+ }
+
+ watches = new WatchTable();
+ body.add(watches);
+ {
+ final FlowPanel fp = new FlowPanel();
+ delSel = new Button(Util.C.buttonDeleteSshKey());
+ delSel.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ watches.deleteChecked();
+ }
+ });
+ fp.add(delSel);
+ body.add(fp);
+ }
+
+ initWidget(body);
+ }
+
+ void doAddNew() {
+ final String projectName = nameTxt.getText();
+ if (projectName == null || projectName.length() == 0
+ || Util.C.defaultProjectName().equals(projectName)) {
+ return;
+ }
+
+ addNew.setEnabled(false);
+ Util.ACCOUNT_SVC.addProjectWatch(projectName,
+ new GerritCallback<AccountProjectWatchInfo>() {
+ public void onSuccess(final AccountProjectWatchInfo result) {
+ addNew.setEnabled(true);
+ nameTxt.setText("");
+ watches.insertWatch(result);
+ }
+
+ @Override
+ public void onFailure(final Throwable caught) {
+ addNew.setEnabled(true);
+ super.onFailure(caught);
+ }
+ });
+ }
+
+ @Override
+ protected void onLoad() {
+ super.onLoad();
+ Util.ACCOUNT_SVC
+ .myProjectWatch(new GerritCallback<List<AccountProjectWatchInfo>>() {
+ public void onSuccess(final List<AccountProjectWatchInfo> result) {
+ watches.display(result);
+ }
+ });
+ }
+
+ private class WatchTable extends FancyFlexTable<AccountProjectWatchInfo> {
+ WatchTable() {
+ table.setWidth("");
+ table.insertRow(1);
+ table.setText(0, 2, com.google.gerrit.client.changes.Util.C
+ .changeTableColumnProject());
+ table.setText(0, 3, Util.C.watchedProjectColumnEmailNotifications());
+
+ final FlexCellFormatter fmt = table.getFlexCellFormatter();
+ fmt.addStyleName(0, 1, S_ICON_HEADER);
+ fmt.addStyleName(0, 2, S_DATA_HEADER);
+ fmt.addStyleName(0, 3, S_DATA_HEADER);
+ fmt.setRowSpan(0, 0, 2);
+ fmt.setRowSpan(0, 1, 2);
+ fmt.setRowSpan(0, 2, 2);
+ DOM.setElementProperty(fmt.getElement(0, 3), "align", "center");
+
+ fmt.setColSpan(0, 3, 3);
+ table.setText(1, 0, Util.C.watchedProjectColumnNewChanges());
+ table.setText(1, 1, Util.C.watchedProjectColumnAllComments());
+ table.setText(1, 2, Util.C.watchedProjectColumnSubmittedChanges());
+ fmt.addStyleName(1, 0, S_DATA_HEADER);
+ fmt.addStyleName(1, 1, S_DATA_HEADER);
+ fmt.addStyleName(1, 2, S_DATA_HEADER);
+ }
+
+ void deleteChecked() {
+ final HashSet<AccountProjectWatch.Key> ids =
+ new HashSet<AccountProjectWatch.Key>();
+ for (int row = 1; row < table.getRowCount(); row++) {
+ final AccountProjectWatchInfo k = getRowItem(row);
+ if (k != null && ((CheckBox) table.getWidget(row, 1)).getValue()) {
+ ids.add(k.getWatch().getKey());
+ }
+ }
+ if (!ids.isEmpty()) {
+ Util.ACCOUNT_SVC.deleteProjectWatches(ids,
+ new GerritCallback<VoidResult>() {
+ public void onSuccess(final VoidResult result) {
+ for (int row = 1; row < table.getRowCount();) {
+ final AccountProjectWatchInfo k = getRowItem(row);
+ if (k != null && ids.contains(k.getWatch().getKey())) {
+ table.removeRow(row);
+ } else {
+ row++;
+ }
+ }
+ }
+ });
+ }
+ }
+
+ void insertWatch(final AccountProjectWatchInfo k) {
+ final String newName = k.getProject().getName();
+ int row = 1;
+ for (; row < table.getRowCount(); row++) {
+ final AccountProjectWatchInfo i = getRowItem(row);
+ if (i != null && i.getProject().getName().compareTo(newName) >= 0) {
+ break;
+ }
+ }
+
+ table.insertRow(row);
+ applyDataRowStyle(row);
+ populate(row, k);
+ }
+
+ void display(final List<AccountProjectWatchInfo> result) {
+ while (2 < table.getRowCount())
+ table.removeRow(table.getRowCount() - 1);
+
+ for (final AccountProjectWatchInfo k : result) {
+ final int row = table.getRowCount();
+ table.insertRow(row);
+ applyDataRowStyle(row);
+ populate(row, k);
+ }
+ }
+
+ void populate(final int row, final AccountProjectWatchInfo k) {
+ table.setWidget(row, 1, new CheckBox());
+ table.setWidget(row, 2, new ProjectLink(k.getProject().getNameKey(), Status.NEW));
+ {
+ final CheckBox notifyNewChanges = new CheckBox();
+ notifyNewChanges.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ final boolean oldVal = k.getWatch().isNotifyNewChanges();
+ k.getWatch().setNotifyNewChanges(notifyNewChanges.getValue());
+ Util.ACCOUNT_SVC.updateProjectWatch(k.getWatch(),
+ new GerritCallback<VoidResult>() {
+ public void onSuccess(final VoidResult result) {
+ }
+
+ @Override
+ public void onFailure(final Throwable caught) {
+ k.getWatch().setNotifyNewChanges(oldVal);
+ notifyNewChanges.setValue(oldVal);
+ super.onFailure(caught);
+ }
+ });
+ }
+ });
+ notifyNewChanges.setValue(k.getWatch().isNotifyNewChanges());
+ table.setWidget(row, 3, notifyNewChanges);
+ }
+ {
+ final CheckBox notifyAllComments = new CheckBox();
+ notifyAllComments.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ final boolean oldVal = k.getWatch().isNotifyAllComments();
+ k.getWatch().setNotifyAllComments(notifyAllComments.getValue());
+ Util.ACCOUNT_SVC.updateProjectWatch(k.getWatch(),
+ new GerritCallback<VoidResult>() {
+ public void onSuccess(final VoidResult result) {
+ }
+
+ @Override
+ public void onFailure(final Throwable caught) {
+ k.getWatch().setNotifyAllComments(oldVal);
+ notifyAllComments.setValue(oldVal);
+ super.onFailure(caught);
+ }
+ });
+ }
+ });
+ notifyAllComments.setValue(k.getWatch().isNotifyAllComments());
+ table.setWidget(row, 4, notifyAllComments);
+ }
+ {
+ final CheckBox notifySubmittedChanges = new CheckBox();
+ notifySubmittedChanges.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ final boolean oldVal = k.getWatch().isNotifySubmittedChanges();
+ k.getWatch().setNotifySubmittedChanges(
+ notifySubmittedChanges.getValue());
+ Util.ACCOUNT_SVC.updateProjectWatch(k.getWatch(),
+ new GerritCallback<VoidResult>() {
+ public void onSuccess(final VoidResult result) {
+ }
+
+ @Override
+ public void onFailure(final Throwable caught) {
+ k.getWatch().setNotifySubmittedChanges(oldVal);
+ notifySubmittedChanges.setValue(oldVal);
+ super.onFailure(caught);
+ }
+ });
+ }
+ });
+ notifySubmittedChanges
+ .setValue(k.getWatch().isNotifySubmittedChanges());
+ table.setWidget(row, 5, notifySubmittedChanges);
+ }
+
+ final FlexCellFormatter fmt = table.getFlexCellFormatter();
+ fmt.addStyleName(row, 1, S_ICON_CELL);
+ fmt.addStyleName(row, 2, S_DATA_CELL);
+ fmt.addStyleName(row, 3, S_DATA_CELL);
+ fmt.addStyleName(row, 4, S_DATA_CELL);
+ fmt.addStyleName(row, 5, S_DATA_CELL);
+
+ setRowItem(row, k);
+ }
+ }
+}