SVN: refresh nested copies upon "detect nested copies" is selected; default=true
[fedora-idea.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / SvnConfigurable.java
blob81d62d7b46250f1f8753a2ad21ef6ca09918d3ce
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 package org.jetbrains.idea.svn;
20 import com.intellij.ide.util.PropertiesComponent;
21 import com.intellij.openapi.application.ApplicationNamesInfo;
22 import com.intellij.openapi.fileChooser.FileChooser;
23 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
24 import com.intellij.openapi.options.Configurable;
25 import com.intellij.openapi.options.ConfigurationException;
26 import com.intellij.openapi.project.Project;
27 import com.intellij.openapi.ui.Messages;
28 import com.intellij.openapi.ui.TextFieldWithBrowseButton;
29 import com.intellij.openapi.vfs.VirtualFile;
30 import com.intellij.openapi.vfs.VirtualFileManager;
31 import com.intellij.ui.MultiLineTooltipUI;
32 import org.jetbrains.annotations.NonNls;
33 import org.jetbrains.idea.svn.config.ConfigureProxiesListener;
34 import org.tmatesoft.svn.core.wc.SVNWCUtil;
36 import javax.swing.*;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ActionListener;
39 import java.io.File;
41 public class SvnConfigurable implements Configurable {
43 private final Project myProject;
44 private JCheckBox myUseDefaultCheckBox;
45 private TextFieldWithBrowseButton myConfigurationDirectoryText;
46 private JButton myClearAuthButton;
47 private JCheckBox myUseCommonProxy;
48 private JButton myEditProxiesButton;
49 private JPanel myComponent;
51 private JLabel myConfigurationDirectoryLabel;
52 private JLabel myClearCacheLabel;
53 private JLabel myUseCommonProxyLabel;
54 private JLabel myEditProxyLabel;
55 private JCheckBox myLockOnDemand;
56 private JCheckBox myDetectNestedWorkingCopiesCheckBox;
57 private JCheckBox myIgnoreWhitespaceDifferenciesInCheckBox;
58 private JCheckBox myShowMergeSourceInAnnotate;
60 @NonNls private static final String HELP_ID = "project.propSubversion";
62 public SvnConfigurable(Project project) {
63 myProject = project;
65 myUseDefaultCheckBox.addActionListener(new ActionListener(){
66 public void actionPerformed(final ActionEvent e) {
67 boolean enabled = !myUseDefaultCheckBox.isSelected();
68 myConfigurationDirectoryText.setEnabled(enabled);
69 myConfigurationDirectoryLabel.setEnabled(enabled);
70 SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
71 String path = configuration.getConfigurationDirectory();
72 if (!enabled || path == null) {
73 myConfigurationDirectoryText.setText(SVNWCUtil.getDefaultConfigurationDirectory().getAbsolutePath());
75 else {
76 myConfigurationDirectoryText.setText(path);
79 });
81 myClearAuthButton.addActionListener(new ActionListener(){
82 public void actionPerformed(final ActionEvent e) {
83 String path = myConfigurationDirectoryText.getText();
84 if (path != null) {
85 int result = Messages.showYesNoDialog(myComponent, SvnBundle.message("confirmation.text.delete.stored.authentication.information"),
86 SvnBundle.message("confirmation.title.clear.authentication.cache"),
87 Messages.getWarningIcon());
88 if (result == 0) {
89 SvnConfiguration.RUNTIME_AUTH_CACHE.clear();
90 SvnConfiguration.getInstance(myProject).clearAuthenticationDirectory();
95 });
98 final FileChooserDescriptor descriptor = createFileDescriptor();
100 myConfigurationDirectoryText.addActionListener(new ActionListener() {
101 public void actionPerformed(ActionEvent e) {
102 @NonNls String path = myConfigurationDirectoryText.getText().trim();
103 path = "file://" + path.replace(File.separatorChar, '/');
104 VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(path);
106 String oldValue = PropertiesComponent.getInstance().getValue("FileChooser.showHiddens");
107 PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", Boolean.TRUE.toString());
108 VirtualFile[] files = FileChooser.chooseFiles(myComponent, descriptor, root);
109 PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", oldValue);
110 if (files.length != 1 || files[0] == null) {
111 return;
113 myConfigurationDirectoryText.setText(files[0].getPath().replace('/', File.separatorChar));
116 myConfigurationDirectoryText.setEditable(false);
118 myConfigurationDirectoryLabel.setLabelFor(myConfigurationDirectoryText);
120 myUseCommonProxy.setText(SvnBundle.message("use.idea.proxy.as.default", ApplicationNamesInfo.getInstance().getProductName()));
121 myEditProxiesButton.addActionListener(new ConfigureProxiesListener(myProject));
124 private FileChooserDescriptor createFileDescriptor() {
125 final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false);
126 descriptor.setShowFileSystemRoots(true);
127 descriptor.setTitle(SvnBundle.message("dialog.title.select.configuration.directory"));
128 descriptor.setDescription(SvnBundle.message("dialog.description.select.configuration.directory"));
129 descriptor.setHideIgnored(false);
130 return descriptor;
133 public JComponent createComponent() {
135 return myComponent;
138 public String getDisplayName() {
139 return null;
142 public Icon getIcon() {
143 return null;
146 public String getHelpTopic() {
147 return HELP_ID;
150 public boolean isModified() {
151 if (myComponent == null) {
152 return false;
154 SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
155 if (configuration.isUseDefaultConfiguation() != myUseDefaultCheckBox.isSelected()) {
156 return true;
158 if (configuration.isIsUseDefaultProxy() != myUseCommonProxy.isSelected()) {
159 return true;
161 if (configuration.UPDATE_LOCK_ON_DEMAND != myLockOnDemand.isSelected()) {
162 return true;
164 if (configuration.DETECT_NESTED_COPIES != myDetectNestedWorkingCopiesCheckBox.isSelected()) {
165 return true;
167 if (configuration.IGNORE_SPACES_IN_ANNOTATE != myIgnoreWhitespaceDifferenciesInCheckBox.isSelected()) {
168 return true;
170 if (configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE != myShowMergeSourceInAnnotate.isSelected()) {
171 return true;
173 return !configuration.getConfigurationDirectory().equals(myConfigurationDirectoryText.getText().trim());
176 public void apply() throws ConfigurationException {
177 SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
178 configuration.setConfigurationDirectory(myConfigurationDirectoryText.getText());
179 configuration.setUseDefaultConfiguation(myUseDefaultCheckBox.isSelected());
180 configuration.setIsUseDefaultProxy(myUseCommonProxy.isSelected());
181 if ((! configuration.DETECT_NESTED_COPIES) && (configuration.DETECT_NESTED_COPIES != myDetectNestedWorkingCopiesCheckBox.isSelected())) {
182 SvnVcs.getInstance(myProject).invokeRefreshSvnRoots(true);
184 configuration.DETECT_NESTED_COPIES = myDetectNestedWorkingCopiesCheckBox.isSelected();
185 configuration.UPDATE_LOCK_ON_DEMAND = myLockOnDemand.isSelected();
186 configuration.setIgnoreSpacesInAnnotate(myIgnoreWhitespaceDifferenciesInCheckBox.isSelected());
187 configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE = myShowMergeSourceInAnnotate.isSelected();
190 public void reset() {
191 SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
192 String path = configuration.getConfigurationDirectory();
193 if (configuration.isUseDefaultConfiguation() || path == null) {
194 path = SVNWCUtil.getDefaultConfigurationDirectory().getAbsolutePath();
196 myConfigurationDirectoryText.setText(path);
197 myUseDefaultCheckBox.setSelected(configuration.isUseDefaultConfiguation());
198 myUseCommonProxy.setSelected(configuration.isIsUseDefaultProxy());
199 myDetectNestedWorkingCopiesCheckBox.setSelected(configuration.DETECT_NESTED_COPIES);
201 boolean enabled = !myUseDefaultCheckBox.isSelected();
202 myConfigurationDirectoryText.setEnabled(enabled);
203 myConfigurationDirectoryLabel.setEnabled(enabled);
204 myLockOnDemand.setSelected(configuration.UPDATE_LOCK_ON_DEMAND);
205 myIgnoreWhitespaceDifferenciesInCheckBox.setSelected(configuration.IGNORE_SPACES_IN_ANNOTATE);
206 myShowMergeSourceInAnnotate.setSelected(configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE);
209 public void disposeUIResources() {
212 private void createUIComponents() {
213 myLockOnDemand = new JCheckBox() {
214 @Override
215 public JToolTip createToolTip() {
216 JToolTip toolTip = new JToolTip(){{
217 setUI(new MultiLineTooltipUI());
219 toolTip.setComponent(this);
220 return toolTip;