/*
* GeneralPreferencesPane.java
*
* Copyright (C) 2009-17 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.prefs.views;
import org.rstudio.core.client.StringUtil;
import org.rstudio.core.client.files.FileSystemContext;
import org.rstudio.core.client.prefs.PreferencesDialogBaseResources;
import org.rstudio.core.client.resources.ImageResource2x;
import org.rstudio.core.client.widget.DirectoryChooserTextBox;
import org.rstudio.core.client.widget.MessageDialog;
import org.rstudio.core.client.widget.SelectWidget;
import org.rstudio.core.client.widget.TextBoxWithButton;
import org.rstudio.studio.client.application.Desktop;
import org.rstudio.studio.client.application.model.RVersionSpec;
import org.rstudio.studio.client.application.model.RVersionsInfo;
import org.rstudio.studio.client.application.model.SaveAction;
import org.rstudio.studio.client.application.ui.RVersionSelectWidget;
import org.rstudio.studio.client.common.FileDialogs;
import org.rstudio.studio.client.common.GlobalDisplay;
import org.rstudio.studio.client.workbench.WorkbenchContext;
import org.rstudio.studio.client.workbench.model.RemoteFileSystemContext;
import org.rstudio.studio.client.workbench.model.Session;
import org.rstudio.studio.client.workbench.prefs.model.GeneralPrefs;
import org.rstudio.studio.client.workbench.prefs.model.HistoryPrefs;
import org.rstudio.studio.client.workbench.prefs.model.ProjectsPrefs;
import org.rstudio.studio.client.workbench.prefs.model.RPrefs;
import org.rstudio.studio.client.workbench.prefs.model.UIPrefs;
import com.google.gwt.dom.client.Style;
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.ImageResource;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Label;
import com.google.inject.Inject;
public class GeneralPreferencesPane extends PreferencesPane
{
@Inject
public GeneralPreferencesPane(RemoteFileSystemContext fsContext,
FileDialogs fileDialogs,
UIPrefs prefs,
Session session,
final GlobalDisplay globalDisplay,
WorkbenchContext context)
{
fsContext_ = fsContext;
fileDialogs_ = fileDialogs;
prefs_ = prefs;
session_ = session;
RVersionsInfo versionsInfo = context.getRVersionsInfo();
if (Desktop.isDesktop())
{
if (Desktop.getFrame().canChooseRVersion())
{
rVersion_ = new TextBoxWithButton(
"R version:",
"Change...",
new ClickHandler()
{
public void onClick(ClickEvent event)
{
String ver = Desktop.getFrame().chooseRVersion();
if (!StringUtil.isNullOrEmpty(ver))
{
rVersion_.setText(ver);
globalDisplay.showMessage(MessageDialog.INFO,
"Change R Version",
"You need to quit and re-open RStudio " +
"in order for this change to take effect.");
}
}
});
rVersion_.setWidth("100%");
rVersion_.setText(Desktop.getFrame().getRVersion());
spaced(rVersion_);
add(rVersion_);
}
}
else if (versionsInfo.isMultiVersion())
{
rServerRVersion_ = new RVersionSelectWidget(
versionsInfo.getAvailableRVersions());
add(tight(rServerRVersion_));
rememberRVersionForProjects_ =
new CheckBox("Restore last used R version for projects");
rememberRVersionForProjects_.setValue(true);
Style style = rememberRVersionForProjects_.getElement().getStyle();
style.setMarginTop(5, Unit.PX);
style.setMarginBottom(12, Unit.PX);
add(rememberRVersionForProjects_);
}
Label defaultLabel = new Label("Default working directory (when not in a project):");
nudgeRight(defaultLabel);
add(tight(defaultLabel));
add(dirChooser_ = new DirectoryChooserTextBox(null,
null,
fileDialogs_,
fsContext_));
spaced(dirChooser_);
nudgeRight(dirChooser_);
textBoxWithChooser(dirChooser_);
showServerHomePage_ = new SelectWidget(
"Show server home page:",
new String[] {
"Multiple active sessions",
"Always",
"Never"
},
new String[] {
"sessions",
"always",
"never"
},
false,
true,
false);
reuseSessionsForProjectLinks_ = new CheckBox("Re-use idle sessions for project links");
if (session_.getSessionInfo().getShowUserHomePage())
{
spaced(showServerHomePage_);
add(showServerHomePage_);
lessSpaced(reuseSessionsForProjectLinks_);
}
if (session_.getSessionInfo().getMultiSession())
add(reuseSessionsForProjectLinks_);
restoreLastProject_ = new CheckBox("Restore most recently opened project at startup");
lessSpaced(restoreLastProject_);
add(restoreLastProject_);
add(checkboxPref("Restore previously open source documents at startup", prefs_.restoreSourceDocuments()));
add(loadRData_ = new CheckBox("Restore .RData into workspace at startup"));
lessSpaced(loadRData_);
saveWorkspace_ = new SelectWidget(
"Save workspace to .RData on exit:",
new String[] {
"Always",
"Never",
"Ask"
});
spaced(saveWorkspace_);
add(saveWorkspace_);
alwaysSaveHistory_ = new CheckBox(
"Always save history (even when not saving .RData)");
lessSpaced(alwaysSaveHistory_);
add(alwaysSaveHistory_);
removeHistoryDuplicates_ = new CheckBox(
"Remove duplicate entries in history");
spaced(removeHistoryDuplicates_);
add(removeHistoryDuplicates_);
showLastDotValue_ = new CheckBox("Show .Last.value in environment listing");
lessSpaced(showLastDotValue_);
add(showLastDotValue_);
rProfileOnResume_ = new CheckBox("Run Rprofile when resuming suspended session");
spaced(rProfileOnResume_);
if (!Desktop.isDesktop())
add(rProfileOnResume_);
// The error handler features require source references; if this R
// version doesn't support them, don't show these options.
if (session_.getSessionInfo().getHaveSrcrefAttribute())
{
add(checkboxPref(
"Use debug error handler only when my code contains errors",
prefs_.handleErrorsInUserCodeOnly()));
add(spaced(checkboxPref(
"Automatically expand tracebacks in error inspector",
prefs_.autoExpandErrorTracebacks(),
false /*defaultSpaced*/)));
}
add(spaced(checkboxPref(
"Wrap around when navigating to previous/next tab",
prefs_.wrapTabNavigation(),
false /*defaultSpaced*/)));
// provide check for updates option in desktop mode when not
// already globally disabled
if (Desktop.isDesktop() &&
!session.getSessionInfo().getDisableCheckForUpdates())
{
add(spaced(checkboxPref("Automatically notify me of updates to RStudio",
prefs_.checkForUpdates(),
false /*defaultSpaced*/)));
}
showServerHomePage_.setEnabled(false);
reuseSessionsForProjectLinks_.setEnabled(false);
saveWorkspace_.setEnabled(false);
loadRData_.setEnabled(false);
dirChooser_.setEnabled(false);
alwaysSaveHistory_.setEnabled(false);
removeHistoryDuplicates_.setEnabled(false);
rProfileOnResume_.setEnabled(false);
showLastDotValue_.setEnabled(false);
restoreLastProject_.setEnabled(false);
}
@Override
protected void initialize(RPrefs rPrefs)
{
// general prefs
final GeneralPrefs generalPrefs = rPrefs.getGeneralPrefs();
showServerHomePage_.setEnabled(true);
reuseSessionsForProjectLinks_.setEnabled(true);
saveWorkspace_.setEnabled(true);
loadRData_.setEnabled(true);
dirChooser_.setEnabled(true);
showServerHomePage_.setValue(generalPrefs.getShowUserHomePage());
reuseSessionsForProjectLinks_.setValue(generalPrefs.getReuseSessionsForProjectLinks());
int saveWorkspaceIndex;
switch (generalPrefs.getSaveAction())
{
case SaveAction.NOSAVE:
saveWorkspaceIndex = 1;
break;
case SaveAction.SAVE:
saveWorkspaceIndex = 0;
break;
case SaveAction.SAVEASK:
default:
saveWorkspaceIndex = 2;
break;
}
saveWorkspace_.getListBox().setSelectedIndex(saveWorkspaceIndex);
loadRData_.setValue(generalPrefs.getLoadRData());
dirChooser_.setText(generalPrefs.getInitialWorkingDirectory());
// history prefs
HistoryPrefs historyPrefs = rPrefs.getHistoryPrefs();
alwaysSaveHistory_.setEnabled(true);
removeHistoryDuplicates_.setEnabled(true);
alwaysSaveHistory_.setValue(historyPrefs.getAlwaysSave());
removeHistoryDuplicates_.setValue(historyPrefs.getRemoveDuplicates());
rProfileOnResume_.setValue(generalPrefs.getRprofileOnResume());
rProfileOnResume_.setEnabled(true);
showLastDotValue_.setValue(generalPrefs.getShowLastDotValue());
showLastDotValue_.setEnabled(true);
if (rServerRVersion_ != null)
rServerRVersion_.setRVersion(generalPrefs.getDefaultRVersion());
if (rememberRVersionForProjects_ != null)
{
rememberRVersionForProjects_.setValue(
generalPrefs.getRestoreProjectRVersion());
}
// projects prefs
ProjectsPrefs projectsPrefs = rPrefs.getProjectsPrefs();
restoreLastProject_.setEnabled(true);
restoreLastProject_.setValue(projectsPrefs.getRestoreLastProject());
}
@Override
public ImageResource getIcon()
{
return new ImageResource2x(PreferencesDialogBaseResources.INSTANCE.iconR2x());
}
@Override
public boolean onApply(RPrefs rPrefs)
{
boolean restartRequired = super.onApply(rPrefs);
if (saveWorkspace_.isEnabled())
{
int saveAction;
switch (saveWorkspace_.getListBox().getSelectedIndex())
{
case 0:
saveAction = SaveAction.SAVE;
break;
case 1:
saveAction = SaveAction.NOSAVE;
break;
case 2:
default:
saveAction = SaveAction.SAVEASK;
break;
}
// set general prefs
GeneralPrefs generalPrefs = GeneralPrefs.create(showServerHomePage_.getValue(),
reuseSessionsForProjectLinks_.getValue(),
saveAction,
loadRData_.getValue(),
rProfileOnResume_.getValue(),
dirChooser_.getText(),
getDefaultRVersion(),
getRestoreProjectRVersion(),
showLastDotValue_.getValue());
rPrefs.setGeneralPrefs(generalPrefs);
// set history prefs
HistoryPrefs historyPrefs = HistoryPrefs.create(
alwaysSaveHistory_.getValue(),
removeHistoryDuplicates_.getValue());
rPrefs.setHistoryPrefs(historyPrefs);
// set projects prefs
ProjectsPrefs projectsPrefs = ProjectsPrefs.create(
restoreLastProject_.getValue());
rPrefs.setProjectsPrefs(projectsPrefs);
}
return restartRequired;
}
@Override
public String getName()
{
return "General";
}
private RVersionSpec getDefaultRVersion()
{
if (rServerRVersion_ != null)
return rServerRVersion_.getRVersion();
else
return RVersionSpec.createEmpty();
}
private boolean getRestoreProjectRVersion()
{
if (rememberRVersionForProjects_ != null)
return rememberRVersionForProjects_.getValue();
else
return false;
}
private final FileSystemContext fsContext_;
private final FileDialogs fileDialogs_;
private RVersionSelectWidget rServerRVersion_ = null;
private CheckBox rememberRVersionForProjects_ = null;
private CheckBox reuseSessionsForProjectLinks_ = null;
private SelectWidget showServerHomePage_;
private SelectWidget saveWorkspace_;
private TextBoxWithButton rVersion_;
private TextBoxWithButton dirChooser_;
private CheckBox loadRData_;
private final CheckBox alwaysSaveHistory_;
private final CheckBox removeHistoryDuplicates_;
private CheckBox restoreLastProject_;
private CheckBox rProfileOnResume_;
private CheckBox showLastDotValue_;
private final UIPrefs prefs_;
private final Session session_;
}