/* * RVersionSelectWidget.java * * Copyright (C) 2009-14 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.application.ui; import java.util.ArrayList; import org.rstudio.core.client.widget.HelpButton; import org.rstudio.core.client.widget.SelectWidget; import org.rstudio.studio.client.application.model.RVersionSpec; import com.google.gwt.core.client.JsArray; public class RVersionSelectWidget extends SelectWidget { public RVersionSelectWidget(JsArray<RVersionSpec> rVersions) { this("Default version of R:", rVersions, true, true, false); } public RVersionSelectWidget(String caption, JsArray<RVersionSpec> rVersions, boolean includeSystemDefault, boolean includeHelpButton, boolean fillContainer) { super(caption, rVersionChoices(rVersions, includeSystemDefault), rVersionValues(rVersions, includeSystemDefault), false, true, false, fillContainer); if (includeHelpButton) HelpButton.addHelpButton(this, "multiple_r_versions"); } public void setRVersion(RVersionSpec version) { if (!setValue(rVersionSpecToString(version))) setValue(rVersionSpecToString(RVersionSpec.createEmpty())); } public RVersionSpec getRVersion() { return rVersionSpecFromString(getValue()); } private static String[] rVersionChoices(JsArray<RVersionSpec> rVersions, boolean includeSystemDefault) { // do we need to disambiguate identical version numbers boolean disambiguate = RVersionSpec.hasDuplicates(rVersions); // build list of choices ArrayList<String> choices = new ArrayList<String>(); // include "default" label if requested if (includeSystemDefault) choices.add(USE_DEFAULT_VERSION); for (int i=0; i<rVersions.length(); i++) { RVersionSpec version = rVersions.get(i); String choice = "R version " + version.getVersion(); if (disambiguate) choice = choice + " (" + version.getRHome() + ")"; choices.add(choice); } return choices.toArray(new String[0]); } private static String[] rVersionValues(JsArray<RVersionSpec> rVersions, boolean includeSystemDefault) { ArrayList<String> values = new ArrayList<String>(); if (includeSystemDefault) values.add(rVersionSpecToString(RVersionSpec.createEmpty())); for (int i=0; i<rVersions.length(); i++) values.add(rVersionSpecToString(rVersions.get(i))); return values.toArray(new String[0]); } private static RVersionSpec rVersionSpecFromString(String str) { if (str != null) { int loc = str.indexOf(SEP); if (loc != -1) { String version = str.substring(0, loc); String rHomeDir = str.substring(loc + SEP.length()); if (version.length() > 0 && rHomeDir.length() > 0) return RVersionSpec.create(version, rHomeDir); } } // couldn't parse it return RVersionSpec.createEmpty(); } private static String rVersionSpecToString(RVersionSpec version) { if (version.getVersion().length() == 0) return ""; else return version.getVersion() + SEP + version.getRHome(); } private final static String USE_DEFAULT_VERSION = "(Use System Default)"; private final static String SEP = "::::"; }