/* PackratResolveConflictDialog.java * * Copyright (C) 2014 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.packrat.ui; import java.util.ArrayList; import org.rstudio.core.client.StringUtil; import org.rstudio.core.client.widget.MessageDialog; import org.rstudio.core.client.widget.ModalDialog; import org.rstudio.core.client.widget.OperationWithInput; import org.rstudio.studio.client.RStudioGinjector; import org.rstudio.studio.client.common.StyleUtils; import org.rstudio.studio.client.packrat.model.PackratConflictActions; import org.rstudio.studio.client.packrat.model.PackratConflictResolution; import org.rstudio.studio.client.workbench.views.packages.ui.PackagesDataGridCommon; import com.google.gwt.core.shared.GWT; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.cellview.client.DataGrid; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class PackratResolveConflictDialog extends ModalDialog<PackratConflictResolution> { public PackratResolveConflictDialog( ArrayList<PackratConflictActions> conflictActions, OperationWithInput<PackratConflictResolution> onResolved) { super("Resolve Conflict", onResolved); setOkButtonCaption("Resolve"); // main widget mainWidget_ = new VerticalPanel(); // layout constants final int kTableWidth = 540; final int kPackageColWidth = 120; final int kActionCol1Width = 190; final int kActionCol2Width = 200; // create label Label label = new Label( "Packrat's packages are out of sync with the packages currently " + "installed in your library. To resolve the conflict you need to " + "either update Packrat to match your library or update your library " + "to match Packrat."); label.addStyleName(RESOURCES.styles().conflictLabel()); label.setWidth(kTableWidth + "px"); mainWidget_.add(label); // table table_ = new DataGrid<PackratConflictActions>(conflictActions.size(), (PackagesDataGridCommon)GWT.create(PackagesDataGridCommon.class)); StyleUtils.forceMacScrollbars(table_); table_.addStyleName(RESOURCES.styles().conflictsTable()); table_.setWidth(kTableWidth + "px"); table_.setHeight("225px"); table_.setRowData(conflictActions); table_.addColumn( new TextColumn<PackratConflictActions>() { public String getValue(PackratConflictActions item) { return item.getPackage(); } }, "Package" ); table_.addColumn( new TextColumn<PackratConflictActions>() { public String getValue(PackratConflictActions item) { return StringUtil.notNull(item.getSnapshotAction()); } }, "Packrat" ); table_.addColumn( new TextColumn<PackratConflictActions>() { public String getValue(PackratConflictActions item) { return StringUtil.notNull(item.getLibraryAction()); } }, "Library" ); table_.setColumnWidth(0, kPackageColWidth + "px"); table_.setColumnWidth(1, kActionCol1Width + "px"); table_.setColumnWidth(2, kActionCol2Width + "px"); mainWidget_.add(table_); // create radio buttons Grid choiceGrid = new Grid(1, 3); choiceGrid.setWidth(kTableWidth + "px"); choiceGrid.getColumnFormatter().setWidth(0, (kPackageColWidth-3) + "px"); choiceGrid.getColumnFormatter().setWidth(1, (kActionCol1Width+3) + "px"); choiceGrid.getColumnFormatter().setWidth(2, kActionCol2Width + "px"); choiceGrid.addStyleName(RESOURCES.styles().choicesGrid()); Label resolutionLabel =new Label("Resolution:"); resolutionLabel.addStyleName(RESOURCES.styles().resolutionLabel()); choiceGrid.setWidget(0, 0, resolutionLabel); snapshotChoice_ = new RadioButton("snapshot", "Update Packrat (Snapshot)"); snapshotChoice_.addStyleName(RESOURCES.styles().choiceButton()); choiceGrid.setWidget(0, 1, snapshotChoice_); snapshotChoice_.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { libraryChoice_.setValue(!event.getValue(), false); } }); libraryChoice_ = new RadioButton("library", "Update Library (Restore)"); libraryChoice_.addStyleName(RESOURCES.styles().choiceButton()); choiceGrid.setWidget(0, 2, libraryChoice_); libraryChoice_.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { snapshotChoice_.setValue(!event.getValue(), false); } }); mainWidget_.add(choiceGrid); } @Override protected PackratConflictResolution collectInput() { if (!snapshotChoice_.getValue() && !libraryChoice_.getValue()) { return null; } else if (snapshotChoice_.getValue()) { return PackratConflictResolution.Snapshot; } else if (libraryChoice_.getValue()) { return PackratConflictResolution.Library; } else { return null; } } @Override protected boolean validate(PackratConflictResolution input) { if (input == null) { RStudioGinjector.INSTANCE.getGlobalDisplay().showMessage( MessageDialog.ERROR, "No Selection Made", "You must choose to either update Packrat (snapshot) or " + "update the project's private library (restore)."); return false; } else { return true; } } @Override protected Widget createMainWidget() { return mainWidget_; } static interface Styles extends CssResource { String conflictLabel(); String choicesGrid(); String choiceButton(); String resolutionLabel(); String conflictsTable(); } static interface Resources extends ClientBundle { @Source("PackratResolveConflictDialog.css") Styles styles(); } static Resources RESOURCES = (Resources)GWT.create(Resources.class) ; public static void ensureStylesInjected() { RESOURCES.styles().ensureInjected(); } private VerticalPanel mainWidget_; private DataGrid<PackratConflictActions> table_; private RadioButton snapshotChoice_; private RadioButton libraryChoice_; }