org.jetbrains.idea.svn.SvnConfigurable.java Source code

Java tutorial

Introduction

Here is the source code for org.jetbrains.idea.svn.SvnConfigurable.java

Source

/*
 * Copyright 2000-2013 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jetbrains.idea.svn;

import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.ui.MultiLineTooltipUI;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBRadioButton;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.config.SvnConfigureProxiesDialog;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

public class SvnConfigurable implements Configurable {

    private final Project myProject;
    private JCheckBox myUseDefaultCheckBox;
    private TextFieldWithBrowseButton myConfigurationDirectoryText;
    private JButton myClearAuthButton;
    private JCheckBox myUseCommonProxy;
    private JButton myEditProxiesButton;
    private JPanel myComponent;

    private JLabel myConfigurationDirectoryLabel;
    private JCheckBox myLockOnDemand;
    private JCheckBox myCheckNestedInQuickMerge;
    private JCheckBox myDetectNestedWorkingCopiesCheckBox;
    private JCheckBox myIgnoreWhitespaceDifferenciesInCheckBox;
    private JCheckBox myShowMergeSourceInAnnotate;
    private JBCheckBox myWithCommandLineClient;
    private JSpinner myNumRevsInAnnotations;
    private JCheckBox myMaximumNumberOfRevisionsCheckBox;
    private JSpinner mySSHConnectionTimeout;
    private JSpinner mySSHReadTimeout;
    private TextFieldWithBrowseButton myCommandLineClient;
    private JSpinner myHttpTimeout;
    private JBRadioButton mySSLv3RadioButton;
    private JBRadioButton myTLSv1RadioButton;
    private JBRadioButton myAllRadioButton;
    private JLabel mySSLExplicitly;

    @NonNls
    private static final String HELP_ID = "project.propSubversion";

    public SvnConfigurable(Project project) {
        myProject = project;

        myUseDefaultCheckBox.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                boolean enabled = !myUseDefaultCheckBox.isSelected();
                myConfigurationDirectoryText.setEnabled(enabled);
                myConfigurationDirectoryText.setEditable(enabled);
                myConfigurationDirectoryLabel.setEnabled(enabled);
                SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
                String path = configuration.getConfigurationDirectory();
                if (!enabled || path == null) {
                    myConfigurationDirectoryText.setText(IdeaSubversionConfigurationDirectory.getPath());
                } else {
                    myConfigurationDirectoryText.setText(path);
                }
            }
        });
        myCommandLineClient.addBrowseFolderListener("Subversion", "Select path to Subversion executable (1.7+)",
                project, FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor());

        myClearAuthButton.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                SvnAuthenticationNotifier.clearAuthenticationCache(myProject, myComponent,
                        myConfigurationDirectoryText.getText());
            }
        });

        myConfigurationDirectoryText.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                @NonNls
                String path = myConfigurationDirectoryText.getText().trim();
                selectConfigirationDirectory(path, new Consumer<String>() {
                    @Override
                    public void consume(String s) {
                        myConfigurationDirectoryText.setText(s);
                    }
                }, myProject, myComponent);
            }
        });

        myConfigurationDirectoryLabel.setLabelFor(myConfigurationDirectoryText);

        myUseCommonProxy.setText(SvnBundle.message("use.idea.proxy.as.default",
                ApplicationNamesInfo.getInstance().getProductName()));
        myEditProxiesButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                final SvnConfigureProxiesDialog dialog = new SvnConfigureProxiesDialog(myProject);
                dialog.show();
                myHttpTimeout
                        .setValue(Long.valueOf(SvnConfiguration.getInstance(myProject).getHttpTimeout() / 1000));
            }
        });

        myMaximumNumberOfRevisionsCheckBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());
            }
        });
        myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());

        final ButtonGroup bg = new ButtonGroup();
        bg.add(mySSLv3RadioButton);
        bg.add(myTLSv1RadioButton);
        bg.add(myAllRadioButton);
        if (SvnVcs.isSSLProtocolExplicitlySet()) {
            mySSLv3RadioButton.setEnabled(false);
            myTLSv1RadioButton.setEnabled(false);
            myAllRadioButton.setEnabled(false);
            mySSLExplicitly.setVisible(true);
            mySSLExplicitly.setText("Set explicitly to: " + System.getProperty(SvnVcs.SVNKIT_HTTP_SSL_PROTOCOLS));
        } else {
            mySSLv3RadioButton.setEnabled(true);
            myTLSv1RadioButton.setEnabled(true);
            myAllRadioButton.setEnabled(true);
            mySSLExplicitly.setVisible(false);
            final String version = SystemInfo.JAVA_RUNTIME_VERSION;
            final boolean jdkBugFixed = version.startsWith("1.7") || version.startsWith("1.8");
            if (!jdkBugFixed) {
                mySSLExplicitly.setVisible(true);
                mySSLExplicitly
                        .setText("Setting 'All' value in this JDK version (" + version + ") is not recommended.");
            }
        }
    }

    public static void selectConfigirationDirectory(@NotNull String path,
            @NotNull final Consumer<String> dirConsumer, final Project project,
            @Nullable final Component component) {
        final FileChooserDescriptor descriptor = createFileDescriptor();
        path = "file://" + path.replace(File.separatorChar, '/');
        VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(path);

        String oldValue = PropertiesComponent.getInstance().getValue("FileChooser.showHiddens");
        PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", Boolean.TRUE.toString());
        VirtualFile file = FileChooser.chooseFile(descriptor, component, project, root);
        PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", oldValue);
        if (file == null) {
            return;
        }
        final String resultPath = file.getPath().replace('/', File.separatorChar);
        dirConsumer.consume(resultPath);
    }

    private static FileChooserDescriptor createFileDescriptor() {
        final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
        descriptor.setShowFileSystemRoots(true);
        descriptor.setTitle(SvnBundle.message("dialog.title.select.configuration.directory"));
        descriptor.setDescription(SvnBundle.message("dialog.description.select.configuration.directory"));
        descriptor.setHideIgnored(false);
        return descriptor;
    }

    public JComponent createComponent() {

        return myComponent;
    }

    public String getDisplayName() {
        return SvnVcs.VCS_DISPLAY_NAME;
    }

    public String getHelpTopic() {
        return HELP_ID;
    }

    private SvnConfiguration.SSLProtocols getSelectedSSL() {
        if (myAllRadioButton.isSelected())
            return SvnConfiguration.SSLProtocols.all;
        if (mySSLv3RadioButton.isSelected())
            return SvnConfiguration.SSLProtocols.sslv3;
        if (myTLSv1RadioButton.isSelected())
            return SvnConfiguration.SSLProtocols.tlsv1;
        throw new IllegalStateException();
    }

    public boolean isModified() {
        if (myComponent == null) {
            return false;
        }
        SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
        if (configuration.isUseDefaultConfiguation() != myUseDefaultCheckBox.isSelected()) {
            return true;
        }
        if (configuration.isIsUseDefaultProxy() != myUseCommonProxy.isSelected()) {
            return true;
        }
        if (configuration.isUpdateLockOnDemand() != myLockOnDemand.isSelected()) {
            return true;
        }
        if (configuration.isCheckNestedForQuickMerge() != myCheckNestedInQuickMerge.isSelected()) {
            return true;
        }
        if (configuration.isIgnoreSpacesInAnnotate() != myIgnoreWhitespaceDifferenciesInCheckBox.isSelected()) {
            return true;
        }
        if (configuration.isShowMergeSourcesInAnnotate() != myShowMergeSourceInAnnotate.isSelected()) {
            return true;
        }
        if (!configuration.getUseAcceleration().equals(acceleration()))
            return true;
        final int annotateRevisions = configuration.getMaxAnnotateRevisions();
        final boolean useMaxInAnnot = annotateRevisions != -1;
        if (useMaxInAnnot != myMaximumNumberOfRevisionsCheckBox.isSelected()) {
            return true;
        }
        if (myMaximumNumberOfRevisionsCheckBox.isSelected()) {
            if (annotateRevisions != ((SpinnerNumberModel) myNumRevsInAnnotations.getModel()).getNumber()
                    .intValue()) {
                return true;
            }
        }
        if (configuration.getSshConnectionTimeout()
                / 1000 != ((SpinnerNumberModel) mySSHConnectionTimeout.getModel()).getNumber().longValue()) {
            return true;
        }
        if (configuration.getSshReadTimeout() / 1000 != ((SpinnerNumberModel) mySSHReadTimeout.getModel())
                .getNumber().longValue()) {
            return true;
        }
        if (configuration.getHttpTimeout() / 1000 != ((SpinnerNumberModel) myHttpTimeout.getModel()).getNumber()
                .longValue()) {
            return true;
        }
        if (!getSelectedSSL().equals(configuration.getSslProtocols()))
            return true;
        final SvnApplicationSettings applicationSettings17 = SvnApplicationSettings.getInstance();
        if (!Comparing.equal(applicationSettings17.getCommandLinePath(), myCommandLineClient.getText().trim()))
            return true;
        return !configuration.getConfigurationDirectory().equals(myConfigurationDirectoryText.getText().trim());
    }

    private SvnConfiguration.UseAcceleration acceleration() {
        if (myWithCommandLineClient.isSelected())
            return SvnConfiguration.UseAcceleration.commandLine;
        return SvnConfiguration.UseAcceleration.nothing;
    }

    public void apply() throws ConfigurationException {
        SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
        configuration.setConfigurationDirParameters(myUseDefaultCheckBox.isSelected(),
                myConfigurationDirectoryText.getText());

        configuration.setIsUseDefaultProxy(myUseCommonProxy.isSelected());
        final SvnVcs vcs17 = SvnVcs.getInstance(myProject);
        configuration.setCheckNestedForQuickMerge(myCheckNestedInQuickMerge.isSelected());
        configuration.setUpdateLockOnDemand(myLockOnDemand.isSelected());
        configuration.setIgnoreSpacesInAnnotate(myIgnoreWhitespaceDifferenciesInCheckBox.isSelected());
        configuration.setShowMergeSourcesInAnnotate(myShowMergeSourceInAnnotate.isSelected());
        if (!myMaximumNumberOfRevisionsCheckBox.isSelected()) {
            configuration.setMaxAnnotateRevisions(-1);
        } else {
            configuration.setMaxAnnotateRevisions(
                    ((SpinnerNumberModel) myNumRevsInAnnotations.getModel()).getNumber().intValue());
        }
        configuration.setSshConnectionTimeout(
                ((SpinnerNumberModel) mySSHConnectionTimeout.getModel()).getNumber().longValue() * 1000);
        configuration.setSshReadTimeout(
                ((SpinnerNumberModel) mySSHReadTimeout.getModel()).getNumber().longValue() * 1000);

        final SvnApplicationSettings applicationSettings17 = SvnApplicationSettings.getInstance();
        boolean reloadWorkingCopies = !acceleration().equals(configuration.getUseAcceleration()) || !StringUtil
                .equals(applicationSettings17.getCommandLinePath(), myCommandLineClient.getText().trim());
        configuration.setUseAcceleration(acceleration());
        configuration.setSslProtocols(getSelectedSSL());
        SvnVcs.getInstance(myProject).refreshSSLProperty();

        applicationSettings17.setCommandLinePath(myCommandLineClient.getText().trim());
        boolean isClientValid = vcs17.checkCommandLineVersion();
        if (isClientValid && reloadWorkingCopies) {
            vcs17.invokeRefreshSvnRoots();
            VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty();
        }
        configuration
                .setHttpTimeout(((SpinnerNumberModel) myHttpTimeout.getModel()).getNumber().longValue() * 1000);
    }

    public void reset() {
        SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
        String path = configuration.getConfigurationDirectory();
        if (configuration.isUseDefaultConfiguation() || path == null) {
            path = IdeaSubversionConfigurationDirectory.getPath();
        }
        myConfigurationDirectoryText.setText(path);
        myUseDefaultCheckBox.setSelected(configuration.isUseDefaultConfiguation());
        myUseCommonProxy.setSelected(configuration.isIsUseDefaultProxy());
        myCheckNestedInQuickMerge.setSelected(configuration.isCheckNestedForQuickMerge());

        boolean enabled = !myUseDefaultCheckBox.isSelected();
        myConfigurationDirectoryText.setEnabled(enabled);
        myConfigurationDirectoryText.setEditable(enabled);
        myConfigurationDirectoryLabel.setEnabled(enabled);
        myLockOnDemand.setSelected(configuration.isUpdateLockOnDemand());
        myIgnoreWhitespaceDifferenciesInCheckBox.setSelected(configuration.isIgnoreSpacesInAnnotate());
        myShowMergeSourceInAnnotate.setSelected(configuration.isShowMergeSourcesInAnnotate());

        final int annotateRevisions = configuration.getMaxAnnotateRevisions();
        if (annotateRevisions == -1) {
            myMaximumNumberOfRevisionsCheckBox.setSelected(false);
            myNumRevsInAnnotations.setValue(SvnConfiguration.ourMaxAnnotateRevisionsDefault);
        } else {
            myMaximumNumberOfRevisionsCheckBox.setSelected(true);
            myNumRevsInAnnotations.setValue(annotateRevisions);
        }
        myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());
        mySSHConnectionTimeout.setValue(Long.valueOf(configuration.getSshConnectionTimeout() / 1000));
        mySSHReadTimeout.setValue(Long.valueOf(configuration.getSshReadTimeout() / 1000));
        myHttpTimeout.setValue(Long.valueOf(configuration.getHttpTimeout() / 1000));
        myWithCommandLineClient.setSelected(configuration.isCommandLine());
        final SvnApplicationSettings applicationSettings17 = SvnApplicationSettings.getInstance();
        myCommandLineClient.setText(applicationSettings17.getCommandLinePath());

        if (SvnConfiguration.SSLProtocols.sslv3.equals(configuration.getSslProtocols())) {
            mySSLv3RadioButton.setSelected(true);
        } else if (SvnConfiguration.SSLProtocols.tlsv1.equals(configuration.getSslProtocols())) {
            myTLSv1RadioButton.setSelected(true);
        } else {
            myAllRadioButton.setSelected(true);
        }
    }

    public void disposeUIResources() {
    }

    private void createUIComponents() {
        myLockOnDemand = new JCheckBox() {
            @Override
            public JToolTip createToolTip() {
                JToolTip toolTip = new JToolTip() {
                    {
                        setUI(new MultiLineTooltipUI());
                    }
                };
                toolTip.setComponent(this);
                return toolTip;
            }
        };

        final SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
        int value = configuration.getMaxAnnotateRevisions();
        value = (value == -1) ? SvnConfiguration.ourMaxAnnotateRevisionsDefault : value;
        myNumRevsInAnnotations = new JSpinner(new SpinnerNumberModel(value, 10, 100000, 100));

        final Long maximum = 30 * 60 * 1000L;
        final long connection = configuration.getSshConnectionTimeout() <= maximum
                ? configuration.getSshConnectionTimeout()
                : maximum;
        final long read = configuration.getSshReadTimeout() <= maximum ? configuration.getSshReadTimeout()
                : maximum;
        mySSHConnectionTimeout = new JSpinner(new SpinnerNumberModel(Long.valueOf(connection / 1000),
                Long.valueOf(0L), maximum, Long.valueOf(10L)));
        mySSHReadTimeout = new JSpinner(
                new SpinnerNumberModel(Long.valueOf(read / 1000), Long.valueOf(0L), maximum, Long.valueOf(10L)));
        myHttpTimeout = new JSpinner(
                new SpinnerNumberModel(Long.valueOf(read / 1000), Long.valueOf(0L), maximum, Long.valueOf(10L)));
    }
}