org.rstudio.studio.client.workbench.prefs.views.SourceControlPreferencesPane.java Source code

Java tutorial

Introduction

Here is the source code for org.rstudio.studio.client.workbench.prefs.views.SourceControlPreferencesPane.java

Source

/*
 * SourceControlPreferencesPane.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.prefs.views;

import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.inject.Inject;

import org.rstudio.core.client.BrowseCap;
import org.rstudio.core.client.prefs.PreferencesDialogBaseResources;
import org.rstudio.core.client.widget.FileChooserTextBox;
import org.rstudio.core.client.widget.HyperlinkLabel;
import org.rstudio.core.client.widget.MessageDialog;
import org.rstudio.core.client.widget.TextBoxWithButton;
import org.rstudio.studio.client.application.Desktop;
import org.rstudio.studio.client.common.FileDialogs;
import org.rstudio.studio.client.common.GlobalDisplay;
import org.rstudio.studio.client.common.HelpLink;
import org.rstudio.studio.client.common.vcs.GitServerOperations;
import org.rstudio.studio.client.common.vcs.SshKeyWidget;
import org.rstudio.studio.client.common.vcs.VcsHelpLink;
import org.rstudio.studio.client.workbench.commands.Commands;
import org.rstudio.studio.client.workbench.model.RemoteFileSystemContext;
import org.rstudio.studio.client.workbench.model.Session;
import org.rstudio.studio.client.workbench.model.SessionInfo;
import org.rstudio.studio.client.workbench.prefs.model.RPrefs;
import org.rstudio.studio.client.workbench.prefs.model.SourceControlPrefs;

public class SourceControlPreferencesPane extends PreferencesPane {
    @Inject
    public SourceControlPreferencesPane(PreferencesDialogResources res, Session session, GitServerOperations server,
            final GlobalDisplay globalDisplay, final Commands commands, RemoteFileSystemContext fsContext,
            FileDialogs fileDialogs) {
        res_ = res;

        chkVcsEnabled_ = new CheckBox("Enable version control interface for RStudio projects");
        extraSpaced(chkVcsEnabled_);
        add(chkVcsEnabled_);
        chkVcsEnabled_.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> event) {
                manageControlVisibility();

                globalDisplay.showMessage(MessageDialog.INFO,
                        (event.getValue() ? "Enable" : "Disable") + " Version Control",
                        "You must restart RStudio for this change to take effect.");
            }
        });

        // git exe path chooser  
        gitExePathChooser_ = new FileChooserTextBox("", "(Not Found)", null, null);
        gitExePathLabel_ = new Label("Git executable:");
        SessionInfo sessionInfo = session.getSessionInfo();
        if (sessionInfo.getAllowVcsExeEdit())
            addTextBoxChooser(gitExePathLabel_, null, null, gitExePathChooser_);

        // use git bash
        chkUseGitBash_ = new CheckBox("Use Git Bash as shell for Git projects");
        if (haveGitBashPref()) {
            extraSpaced(chkUseGitBash_);
            add(chkUseGitBash_);
        }

        // svn exe path chooser
        svnExePathLabel_ = new Label("SVN executable:");
        svnExePathChooser_ = new FileChooserTextBox("", "(Not Found)", null, null);
        if (sessionInfo.getAllowVcsExeEdit())
            addTextBoxChooser(svnExePathLabel_, null, null, svnExePathChooser_);

        // terminal path
        terminalPathLabel_ = new Label("Terminal executable:");
        terminalPathChooser_ = new FileChooserTextBox("", "(Not Found)", null, null);
        if (haveTerminalPathPref())
            addTextBoxChooser(terminalPathLabel_, null, null, terminalPathChooser_);

        // ssh key widget
        sshKeyWidget_ = new SshKeyWidget(server, "330px");
        sshKeyWidget_.addStyleName(res_.styles().sshKeyWidget());
        nudgeRight(sshKeyWidget_);
        add(sshKeyWidget_);

        HelpLink vcsHelpLink = new VcsHelpLink();
        nudgeRight(vcsHelpLink);
        vcsHelpLink.addStyleName(res_.styles().newSection());
        add(vcsHelpLink);

        chkVcsEnabled_.setEnabled(false);
        gitExePathChooser_.setEnabled(false);
        svnExePathChooser_.setEnabled(false);
        terminalPathChooser_.setEnabled(false);
        chkUseGitBash_.setEnabled(false);
    }

    @Override
    protected void initialize(RPrefs rPrefs) {
        // source control prefs
        SourceControlPrefs prefs = rPrefs.getSourceControlPrefs();

        chkVcsEnabled_.setEnabled(true);
        gitExePathChooser_.setEnabled(true);
        svnExePathChooser_.setEnabled(true);
        terminalPathChooser_.setEnabled(true);
        chkUseGitBash_.setEnabled(true);

        chkVcsEnabled_.setValue(prefs.getVcsEnabled());
        gitExePathChooser_.setText(prefs.getGitExePath());
        svnExePathChooser_.setText(prefs.getSvnExePath());
        terminalPathChooser_.setText(prefs.getTerminalPath());
        chkUseGitBash_.setValue(prefs.getUseGitBash());

        sshKeyWidget_.setRsaSshKeyPath(prefs.getRsaKeyPath(), prefs.getHaveRsaKey());
        sshKeyWidget_.setProgressIndicator(getProgressIndicator());

        manageControlVisibility();
    }

    @Override
    public ImageResource getIcon() {
        return PreferencesDialogBaseResources.INSTANCE.iconSourceControl();
    }

    @Override
    public boolean validate() {
        return true;
    }

    @Override
    public String getName() {
        return "Git/SVN";
    }

    @Override
    public boolean onApply(RPrefs rPrefs) {
        boolean restartRequired = super.onApply(rPrefs);

        SourceControlPrefs prefs = SourceControlPrefs.create(chkVcsEnabled_.getValue(),
                gitExePathChooser_.getText(), svnExePathChooser_.getText(), terminalPathChooser_.getText(),
                chkUseGitBash_.getValue());

        rPrefs.setSourceControlPrefs(prefs);

        return restartRequired;
    }

    private boolean haveTerminalPathPref() {
        return Desktop.isDesktop() && BrowseCap.isLinux();
    }

    private boolean haveGitBashPref() {
        return Desktop.isDesktop() && BrowseCap.isWindows();
    }

    private void addTextBoxChooser(Label captionLabel, HyperlinkLabel link, String captionPanelStyle,
            TextBoxWithButton chooser) {
        String textWidth = "250px";

        HorizontalPanel captionPanel = new HorizontalPanel();
        captionPanel.setWidth(textWidth);
        nudgeRight(captionPanel);
        if (captionPanelStyle != null)
            captionPanel.addStyleName(captionPanelStyle);

        captionPanel.add(captionLabel);
        captionPanel.setCellHorizontalAlignment(captionLabel, HasHorizontalAlignment.ALIGN_LEFT);

        if (link != null) {
            HorizontalPanel linkPanel = new HorizontalPanel();
            linkPanel.add(link);
            captionPanel.add(linkPanel);
            captionPanel.setCellHorizontalAlignment(linkPanel, HasHorizontalAlignment.ALIGN_RIGHT);

        }

        add(tight(captionPanel));

        chooser.setTextWidth(textWidth);
        nudgeRight(chooser);
        textBoxWithChooser(chooser);
        add(chooser);
    }

    private void manageControlVisibility() {
        boolean vcsEnabled = chkVcsEnabled_.getValue();
        gitExePathLabel_.setVisible(vcsEnabled);
        gitExePathChooser_.setVisible(vcsEnabled);
        svnExePathLabel_.setVisible(vcsEnabled);
        svnExePathChooser_.setVisible(vcsEnabled);
        terminalPathLabel_.setVisible(vcsEnabled);
        terminalPathChooser_.setVisible(vcsEnabled && haveTerminalPathPref());
        chkUseGitBash_.setVisible(vcsEnabled && haveGitBashPref());
        sshKeyWidget_.setVisible(vcsEnabled);
    }

    private final PreferencesDialogResources res_;

    private final CheckBox chkVcsEnabled_;

    private Label svnExePathLabel_;
    private Label gitExePathLabel_;
    private TextBoxWithButton gitExePathChooser_;
    private TextBoxWithButton svnExePathChooser_;
    private Label terminalPathLabel_;
    private TextBoxWithButton terminalPathChooser_;
    private CheckBox chkUseGitBash_;
    private SshKeyWidget sshKeyWidget_;
}