SVN: fix configurables test sorry
[idea/community.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / SvnConfigurable.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17
18 package org.jetbrains.idea.svn;
19
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;
35
36 import javax.swing.*;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ActionListener;
39 import java.io.File;
40
41 public class SvnConfigurable implements Configurable {
42
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;
50
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;
59   private JSpinner myNumRevsInAnnotations;
60   private JCheckBox myMaximumNumberOfRevisionsCheckBox;
61
62   @NonNls private static final String HELP_ID = "project.propSubversion";
63
64   public SvnConfigurable(Project project) {
65     myProject = project;
66
67     myUseDefaultCheckBox.addActionListener(new ActionListener(){
68       public void actionPerformed(final ActionEvent e) {
69         boolean enabled = !myUseDefaultCheckBox.isSelected();
70         myConfigurationDirectoryText.setEnabled(enabled);
71         myConfigurationDirectoryLabel.setEnabled(enabled);
72         SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
73         String path = configuration.getConfigurationDirectory();
74         if (!enabled || path == null) {
75           myConfigurationDirectoryText.setText(SVNWCUtil.getDefaultConfigurationDirectory().getAbsolutePath());
76         }
77         else {
78           myConfigurationDirectoryText.setText(path);
79         }
80       }
81     });
82
83     myClearAuthButton.addActionListener(new ActionListener(){
84       public void actionPerformed(final ActionEvent e) {
85         String path = myConfigurationDirectoryText.getText();
86         if (path != null) {
87           int result = Messages.showYesNoDialog(myComponent, SvnBundle.message("confirmation.text.delete.stored.authentication.information"),
88                                                 SvnBundle.message("confirmation.title.clear.authentication.cache"),
89                                                              Messages.getWarningIcon());
90           if (result == 0) {
91             SvnConfiguration.RUNTIME_AUTH_CACHE.clear();
92             SvnConfiguration.getInstance(myProject).clearAuthenticationDirectory();
93           }
94         }
95
96       }
97     });
98
99
100     final FileChooserDescriptor descriptor = createFileDescriptor();
101
102     myConfigurationDirectoryText.addActionListener(new ActionListener() {
103       public void actionPerformed(ActionEvent e) {
104         @NonNls String path = myConfigurationDirectoryText.getText().trim();
105         path = "file://" + path.replace(File.separatorChar, '/');
106         VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(path);
107
108         String oldValue = PropertiesComponent.getInstance().getValue("FileChooser.showHiddens");
109         PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", Boolean.TRUE.toString());
110         VirtualFile[] files = FileChooser.chooseFiles(myComponent, descriptor, root);
111         PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", oldValue);
112         if (files.length != 1 || files[0] == null) {
113           return;
114         }
115         myConfigurationDirectoryText.setText(files[0].getPath().replace('/', File.separatorChar));
116       }
117     });
118     myConfigurationDirectoryText.setEditable(false);
119
120     myConfigurationDirectoryLabel.setLabelFor(myConfigurationDirectoryText);
121
122     myUseCommonProxy.setText(SvnBundle.message("use.idea.proxy.as.default", ApplicationNamesInfo.getInstance().getProductName()));
123     myEditProxiesButton.addActionListener(new ConfigureProxiesListener(myProject));
124
125     myMaximumNumberOfRevisionsCheckBox.addActionListener(new ActionListener() {
126       public void actionPerformed(ActionEvent e) {
127         myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());
128       }
129     });
130     myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());
131   }
132
133   private FileChooserDescriptor createFileDescriptor() {
134     final FileChooserDescriptor descriptor =  new FileChooserDescriptor(false, true, false, false, false, false);
135     descriptor.setShowFileSystemRoots(true);
136     descriptor.setTitle(SvnBundle.message("dialog.title.select.configuration.directory"));
137     descriptor.setDescription(SvnBundle.message("dialog.description.select.configuration.directory"));
138     descriptor.setHideIgnored(false);
139     return descriptor;
140   }
141
142   public JComponent createComponent() {
143
144     return myComponent;
145   }
146
147   public String getDisplayName() {
148     return null;
149   }
150
151   public Icon getIcon() {
152     return null;
153   }
154
155   public String getHelpTopic() {
156     return HELP_ID;
157   }
158
159   public boolean isModified() {
160     if (myComponent == null) {
161       return false;
162     }
163     SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
164     if (configuration.isUseDefaultConfiguation() != myUseDefaultCheckBox.isSelected()) {
165       return true;
166     }
167     if (configuration.isIsUseDefaultProxy() != myUseCommonProxy.isSelected()) {
168       return true;
169     }
170     if (configuration.UPDATE_LOCK_ON_DEMAND != myLockOnDemand.isSelected()) {
171       return true;
172     }
173     if (configuration.DETECT_NESTED_COPIES != myDetectNestedWorkingCopiesCheckBox.isSelected()) {
174       return true;
175     }
176     if (configuration.IGNORE_SPACES_IN_ANNOTATE != myIgnoreWhitespaceDifferenciesInCheckBox.isSelected()) {
177       return true;
178     }
179     if (configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE != myShowMergeSourceInAnnotate.isSelected()) {
180       return true;
181     }
182     final int annotateRevisions = configuration.getMaxAnnotateRevisions();
183     final boolean useMaxInAnnot = annotateRevisions != -1;
184     if (useMaxInAnnot != myMaximumNumberOfRevisionsCheckBox.isSelected()) {
185       return true;
186     }
187     if (myMaximumNumberOfRevisionsCheckBox.isSelected()) {
188       if (annotateRevisions != ((SpinnerNumberModel) myNumRevsInAnnotations.getModel()).getNumber().intValue()) {
189         return true;
190       }
191     }
192     return !configuration.getConfigurationDirectory().equals(myConfigurationDirectoryText.getText().trim());
193   }
194
195   public void apply() throws ConfigurationException {
196     SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
197     configuration.setConfigurationDirectory(myConfigurationDirectoryText.getText());
198     configuration.setUseDefaultConfiguation(myUseDefaultCheckBox.isSelected());
199     configuration.setIsUseDefaultProxy(myUseCommonProxy.isSelected());
200     if ((! configuration.DETECT_NESTED_COPIES) && (configuration.DETECT_NESTED_COPIES != myDetectNestedWorkingCopiesCheckBox.isSelected())) {
201       SvnVcs.getInstance(myProject).invokeRefreshSvnRoots(true);
202     }
203     configuration.DETECT_NESTED_COPIES = myDetectNestedWorkingCopiesCheckBox.isSelected(); 
204     configuration.UPDATE_LOCK_ON_DEMAND = myLockOnDemand.isSelected();
205     configuration.setIgnoreSpacesInAnnotate(myIgnoreWhitespaceDifferenciesInCheckBox.isSelected());
206     configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE = myShowMergeSourceInAnnotate.isSelected();
207     if (! myMaximumNumberOfRevisionsCheckBox.isSelected()) {
208       configuration.setMaxAnnotateRevisions(-1);
209     } else {
210       configuration.setMaxAnnotateRevisions(((SpinnerNumberModel) myNumRevsInAnnotations.getModel()).getNumber().intValue());
211     }
212   }
213
214   public void reset() {
215     SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
216     String path = configuration.getConfigurationDirectory();
217     if (configuration.isUseDefaultConfiguation() || path == null) {
218       path = SVNWCUtil.getDefaultConfigurationDirectory().getAbsolutePath();
219     }
220     myConfigurationDirectoryText.setText(path);
221     myUseDefaultCheckBox.setSelected(configuration.isUseDefaultConfiguation());
222     myUseCommonProxy.setSelected(configuration.isIsUseDefaultProxy());
223     myDetectNestedWorkingCopiesCheckBox.setSelected(configuration.DETECT_NESTED_COPIES);
224
225     boolean enabled = !myUseDefaultCheckBox.isSelected();
226     myConfigurationDirectoryText.setEnabled(enabled);
227     myConfigurationDirectoryLabel.setEnabled(enabled);
228     myLockOnDemand.setSelected(configuration.UPDATE_LOCK_ON_DEMAND);
229     myIgnoreWhitespaceDifferenciesInCheckBox.setSelected(configuration.IGNORE_SPACES_IN_ANNOTATE);
230     myShowMergeSourceInAnnotate.setSelected(configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE);
231
232     final int annotateRevisions = configuration.getMaxAnnotateRevisions();
233     if (annotateRevisions == -1) {
234       myMaximumNumberOfRevisionsCheckBox.setSelected(false);
235       myNumRevsInAnnotations.setValue(SvnConfiguration.ourMaxAnnotateRevisionsDefault);
236     } else {
237       myMaximumNumberOfRevisionsCheckBox.setSelected(true);
238       myNumRevsInAnnotations.setValue(annotateRevisions);
239     }
240     myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());
241   }
242
243   public void disposeUIResources() {
244   }
245
246   private void createUIComponents() {
247     myLockOnDemand = new JCheckBox() {
248       @Override
249       public JToolTip createToolTip() {
250         JToolTip toolTip = new JToolTip(){{
251           setUI(new MultiLineTooltipUI());
252         }};
253         toolTip.setComponent(this);
254         return toolTip;
255       }
256     };
257
258     final SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
259     int value = configuration.getMaxAnnotateRevisions();
260     value = (value == -1) ? SvnConfiguration.ourMaxAnnotateRevisionsDefault : value; 
261     myNumRevsInAnnotations = new JSpinner(new SpinnerNumberModel(value, 10, 100000, 100));
262   }
263 }
264