/* * PackageActionConfirmationDialog.java * * Copyright (C) 2009-12 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.studio.client.workbench.views.packages.ui; import java.util.ArrayList; import java.util.List; import org.rstudio.core.client.widget.ModalDialog; import org.rstudio.core.client.widget.Operation; import org.rstudio.core.client.widget.OperationWithInput; import org.rstudio.core.client.widget.ThemedButton; import org.rstudio.studio.client.common.SimpleRequestCallback; import org.rstudio.studio.client.server.ServerDataSource; import org.rstudio.studio.client.server.ServerError; import com.google.gwt.cell.client.CheckboxCell; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.NoSelectionModel; public abstract class PackageActionConfirmationDialog<T extends JavaScriptObject> extends ModalDialog<ArrayList<T>> { public PackageActionConfirmationDialog( String caption, String okCaption, ServerDataSource<JsArray<T>> actionsDS, OperationWithInput<ArrayList<T>> checkOperation, Operation cancelOperation) { super(caption, checkOperation, cancelOperation); actionsDS_ = actionsDS; setOkButtonCaption(okCaption); addLeftButton(selectAllButton_ = new ThemedButton("Select All", new ClickHandler() { @Override public void onClick(ClickEvent event) { setGlobalPerformAction(true); } })); addLeftButton(selectNoneButton_ = new ThemedButton("Select None", new ClickHandler() { @Override public void onClick(ClickEvent event) { setGlobalPerformAction(false); } })); enableOkButton(false); enableCancelButton(false); selectAllButton_.setEnabled(false); selectNoneButton_.setEnabled(false); } @Override protected ArrayList<T> collectInput() { ArrayList<T> actions = new ArrayList<T>(); for (PendingAction action : actionsDataProvider_.getList()) { if (action.getPerformAction()) actions.add(action.getActionInfo()); } return actions; } @Override protected boolean validate(ArrayList<T> input) { return input.size() > 0; } @Override protected Widget createMainWidget() { FlowPanel flowPanel = new FlowPanel(); String explanatoryText = getExplanatoryText(); if (explanatoryText.length() > 0) { Label text = new Label(explanatoryText); text.setStylePrimaryName(RESOURCES.styles().explanatoryText()); flowPanel.add(text); } actionsTable_ = new CellTable<PendingAction>( 15, GWT.<PackagesCellTableResources> create(PackagesCellTableResources.class)); actionsTable_.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.DISABLED); actionsTable_.setSelectionModel(new NoSelectionModel<PendingAction>()); actionsTable_.setWidth("100%", true); ActionColumn actionColumn = new ActionColumn(); actionsTable_.addColumn(actionColumn); actionsTable_.setColumnWidth(actionColumn, 30, Unit.PX); addTableColumns(actionsTable_); ScrollPanel scrollPanel = new ScrollPanel(); scrollPanel.setWidget(actionsTable_); scrollPanel.setStylePrimaryName(RESOURCES.styles().mainWidget()); flowPanel.add(scrollPanel); // query for updates actionsDS_.requestData(new SimpleRequestCallback<JsArray<T>>() { @Override public void onResponseReceived(JsArray<T> actions) { if (actions != null && actions.length() > 0) { ArrayList<PendingAction> pendingActions = new ArrayList<PendingAction>(); for (int i=0; i<actions.length(); i++) pendingActions.add(new PendingAction(actions.get(i), false)); actionsTable_.setPageSize(pendingActions.size()); actionsDataProvider_ = new ListDataProvider<PendingAction>(); actionsDataProvider_.setList(pendingActions); actionsDataProvider_.addDataDisplay(actionsTable_); enableCancelButton(true); selectAllButton_.setEnabled(true); selectNoneButton_.setEnabled(true); } else { closeDialog(); showNoActionsRequired(); } } @Override public void onError(ServerError error) { closeDialog(); super.onError(error); } }); return flowPanel; } protected String getExplanatoryText() { return ""; } protected abstract void showNoActionsRequired(); protected abstract void addTableColumns(CellTable<PendingAction> table); class ActionColumn extends Column<PendingAction, Boolean> { public ActionColumn() { super(new CheckboxCell(false, false)); setFieldUpdater(new FieldUpdater<PendingAction,Boolean>() { public void update(int index, PendingAction action, Boolean value) { List<PendingAction> actions = actionsDataProvider_.getList(); actions.set(actions.indexOf(action), new PendingAction(action.getActionInfo(), value)); manageUIState(); } }); } @Override public Boolean getValue(PendingAction update) { return update.getPerformAction(); } } protected class PendingAction { public PendingAction(T actionInfo, boolean performAction) { actionInfo_ = actionInfo; performAction_ = performAction; } public T getActionInfo() { return actionInfo_; } public boolean getPerformAction() { return performAction_; } private final T actionInfo_; private final boolean performAction_; } private void setGlobalPerformAction(Boolean performAction) { List<PendingAction> actions = actionsDataProvider_.getList(); ArrayList<PendingAction> newActions = new ArrayList<PendingAction>(); for(PendingAction action : actions) newActions.add(new PendingAction(action.getActionInfo(), performAction)); actionsDataProvider_.setList(newActions); manageUIState(); } private void manageUIState() { enableOkButton(collectInput().size() > 0); } static interface Styles extends CssResource { String mainWidget(); String explanatoryText(); } static interface Resources extends ClientBundle { @Source("PackageActionConfirmationDialog.css") Styles styles(); } static Resources RESOURCES = (Resources) GWT.create(Resources.class); public static void ensureStylesInjected() { RESOURCES.styles().ensureInjected(); } private CellTable<PendingAction> actionsTable_; private ServerDataSource<JsArray<T>> actionsDS_; private ListDataProvider<PendingAction> actionsDataProvider_; private ThemedButton selectAllButton_; private ThemedButton selectNoneButton_; }