summaryrefslogtreecommitdiffstats
path: root/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java')
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java414
1 files changed, 414 insertions, 0 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java
new file mode 100644
index 0000000000..28099bf08f
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java
@@ -0,0 +1,414 @@
+// 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.Gerrit;
+import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
+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.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.event.logical.shared.SelectionEvent;
+import com.google.gwt.event.logical.shared.SelectionHandler;
+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.FlowPanel;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.SuggestBox;
+import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
+import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
+import com.google.gwtexpui.globalkey.client.NpTextBox;
+import com.google.gwtjsonrpc.client.VoidResult;
+
+import java.util.HashSet;
+import java.util.List;
+
+public class MyWatchedProjectsScreen extends SettingsScreen {
+ private WatchTable watches;
+
+ private Button addNew;
+ private NpTextBox nameBox;
+ private SuggestBox nameTxt;
+ private NpTextBox filterTxt;
+ private Button delSel;
+ private boolean submitOnSelection;
+
+ @Override
+ protected void onInitUI() {
+ super.onInitUI();
+
+ {
+ nameBox = new NpTextBox();
+ nameTxt = new SuggestBox(new ProjectNameSuggestOracle(), nameBox);
+ nameBox.setVisibleLength(50);
+ nameBox.setText(Util.C.defaultProjectName());
+ nameBox.addStyleName(Gerrit.RESOURCES.css().inputFieldTypeHint());
+ nameBox.addFocusHandler(new FocusHandler() {
+ @Override
+ public void onFocus(FocusEvent event) {
+ if (Util.C.defaultProjectName().equals(nameBox.getText())) {
+ nameBox.setText("");
+ nameBox.removeStyleName(Gerrit.RESOURCES.css().inputFieldTypeHint());
+ }
+ }
+ });
+ nameBox.addBlurHandler(new BlurHandler() {
+ @Override
+ public void onBlur(BlurEvent event) {
+ if ("".equals(nameBox.getText())) {
+ nameBox.setText(Util.C.defaultProjectName());
+ nameBox.addStyleName(Gerrit.RESOURCES.css().inputFieldTypeHint());
+ }
+ }
+ });
+ nameBox.addKeyPressHandler(new KeyPressHandler() {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ submitOnSelection = false;
+
+ if (event.getCharCode() == KeyCodes.KEY_ENTER) {
+ if (nameTxt.isSuggestionListShowing()) {
+ submitOnSelection = true;
+ } else {
+ doAddNew();
+ }
+ }
+ }
+ });
+ nameTxt.addSelectionHandler(new SelectionHandler<Suggestion>() {
+ @Override
+ public void onSelection(SelectionEvent<Suggestion> event) {
+ if (submitOnSelection) {
+ submitOnSelection = false;
+ doAddNew();
+ }
+ }
+ });
+
+ filterTxt = new NpTextBox();
+ filterTxt.setVisibleLength(50);
+ filterTxt.setText(Util.C.defaultFilter());
+ filterTxt.addStyleName(Gerrit.RESOURCES.css().inputFieldTypeHint());
+ filterTxt.addFocusHandler(new FocusHandler() {
+ @Override
+ public void onFocus(FocusEvent event) {
+ if (Util.C.defaultFilter().equals(filterTxt.getText())) {
+ filterTxt.setText("");
+ filterTxt.removeStyleName(Gerrit.RESOURCES.css().inputFieldTypeHint());
+ }
+ }
+ });
+ filterTxt.addBlurHandler(new BlurHandler() {
+ @Override
+ public void onBlur(BlurEvent event) {
+ if ("".equals(filterTxt.getText())) {
+ filterTxt.setText(Util.C.defaultFilter());
+ filterTxt.addStyleName(Gerrit.RESOURCES.css().inputFieldTypeHint());
+ }
+ }
+ });
+ filterTxt.addKeyPressHandler(new KeyPressHandler() {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getCharCode() == KeyCodes.KEY_ENTER) {
+ doAddNew();
+ }
+ }
+ });
+
+ addNew = new Button(Util.C.buttonWatchProject());
+ addNew.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ doAddNew();
+ }
+ });
+
+ final Grid grid = new Grid(2, 2);
+ grid.setStyleName(Gerrit.RESOURCES.css().infoBlock());
+ grid.setText(0, 0, Util.C.watchedProjectName());
+ grid.setWidget(0, 1, nameTxt);
+
+ grid.setText(1, 0, Util.C.watchedProjectFilter());
+ grid.setWidget(1, 1, filterTxt);
+
+ final CellFormatter fmt = grid.getCellFormatter();
+ fmt.addStyleName(0, 0, Gerrit.RESOURCES.css().topmost());
+ fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().topmost());
+ fmt.addStyleName(0, 0, Gerrit.RESOURCES.css().header());
+ fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().header());
+ fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().bottomheader());
+
+ final FlowPanel fp = new FlowPanel();
+ fp.setStyleName(Gerrit.RESOURCES.css().addWatchPanel());
+ fp.add(grid);
+ fp.add(addNew);
+ add(fp);
+ }
+
+ watches = new WatchTable();
+ add(watches);
+
+ delSel = new Button(Util.C.buttonDeleteSshKey());
+ delSel.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(final ClickEvent event) {
+ watches.deleteChecked();
+ }
+ });
+ add(delSel);
+ }
+
+ void doAddNew() {
+ final String projectName = nameTxt.getText();
+ if (projectName == null || projectName.length() == 0
+ || Util.C.defaultProjectName().equals(projectName)) {
+ return;
+ }
+
+ String filter = filterTxt.getText();
+ if (filter == null || filter.isEmpty()
+ || filter.equals(Util.C.defaultFilter())) {
+ filter = null;
+ }
+
+ addNew.setEnabled(false);
+ nameBox.setEnabled(false);
+ filterTxt.setEnabled(false);
+
+ Util.ACCOUNT_SVC.addProjectWatch(projectName, filter,
+ new GerritCallback<AccountProjectWatchInfo>() {
+ public void onSuccess(final AccountProjectWatchInfo result) {
+ addNew.setEnabled(true);
+ nameBox.setEnabled(true);
+ filterTxt.setEnabled(true);
+
+ nameTxt.setText("");
+ watches.insertWatch(result);
+ }
+
+ @Override
+ public void onFailure(final Throwable caught) {
+ addNew.setEnabled(true);
+ nameBox.setEnabled(true);
+ filterTxt.setEnabled(true);
+
+ super.onFailure(caught);
+ }
+ });
+ }
+
+ @Override
+ protected void onLoad() {
+ super.onLoad();
+ Util.ACCOUNT_SVC
+ .myProjectWatch(new ScreenLoadCallback<List<AccountProjectWatchInfo>>(
+ this) {
+ public void preDisplay(final List<AccountProjectWatchInfo> result) {
+ watches.display(result);
+ }
+ });
+ }
+
+ private class WatchTable extends FancyFlexTable<AccountProjectWatchInfo> {
+ WatchTable() {
+ table.setWidth("");
+ table.insertRow(1);
+ table.setText(0, 2, Util.C.watchedProjectName());
+ table.setText(0, 3, Util.C.watchedProjectColumnEmailNotifications());
+
+ final FlexCellFormatter fmt = table.getFlexCellFormatter();
+ fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().iconHeader());
+ fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader());
+ fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader());
+ 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, Gerrit.RESOURCES.css().dataHeader());
+ fmt.addStyleName(1, 1, Gerrit.RESOURCES.css().dataHeader());
+ fmt.addStyleName(1, 2, Gerrit.RESOURCES.css().dataHeader());
+ }
+
+ 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) {
+ final FlowPanel fp = new FlowPanel();
+ fp.add(new ProjectLink(k.getProject().getNameKey(), Status.NEW));
+ if (k.getWatch().getFilter() != null) {
+ Label filter = new Label(k.getWatch().getFilter());
+ filter.setStyleName(Gerrit.RESOURCES.css().watchedProjectFilter());
+ fp.add(filter);
+ }
+
+ table.setWidget(row, 1, new CheckBox());
+ table.setWidget(row, 2, fp);
+ {
+ 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, Gerrit.RESOURCES.css().iconCell());
+ fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell());
+ fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell());
+ fmt.addStyleName(row, 4, Gerrit.RESOURCES.css().dataCell());
+ fmt.addStyleName(row, 5, Gerrit.RESOURCES.css().dataCell());
+
+ setRowItem(row, k);
+ }
+ }
+}