a41d452bd09956ab2e362cf0528db501f78eb448
[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 (annotateRevisions != myNumRevsInAnnotations.getComponentCount()) {
188       return true;
189     }
190     return !configuration.getConfigurationDirectory().equals(myConfigurationDirectoryText.getText().trim());
191   }
192
193   public void apply() throws ConfigurationException {
194     SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
195     configuration.setConfigurationDirectory(myConfigurationDirectoryText.getText());
196     configuration.setUseDefaultConfiguation(myUseDefaultCheckBox.isSelected());
197     configuration.setIsUseDefaultProxy(myUseCommonProxy.isSelected());
198     if ((! configuration.DETECT_NESTED_COPIES) && (configuration.DETECT_NESTED_COPIES != myDetectNestedWorkingCopiesCheckBox.isSelected())) {
199       SvnVcs.getInstance(myProject).invokeRefreshSvnRoots(true);
200     }
201     configuration.DETECT_NESTED_COPIES = myDetectNestedWorkingCopiesCheckBox.isSelected(); 
202     configuration.UPDATE_LOCK_ON_DEMAND = myLockOnDemand.isSelected();
203     configuration.setIgnoreSpacesInAnnotate(myIgnoreWhitespaceDifferenciesInCheckBox.isSelected());
204     configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE = myShowMergeSourceInAnnotate.isSelected();
205     if (! myMaximumNumberOfRevisionsCheckBox.isSelected()) {
206       configuration.setMaxAnnotateRevisions(-1);
207     } else {
208       configuration.setMaxAnnotateRevisions(((SpinnerNumberModel) myNumRevsInAnnotations.getModel()).getNumber().intValue());
209     }
210   }
211
212   public void reset() {
213     SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
214     String path = configuration.getConfigurationDirectory();
215     if (configuration.isUseDefaultConfiguation() || path == null) {
216       path = SVNWCUtil.getDefaultConfigurationDirectory().getAbsolutePath();
217     }
218     myConfigurationDirectoryText.setText(path);
219     myUseDefaultCheckBox.setSelected(configuration.isUseDefaultConfiguation());
220     myUseCommonProxy.setSelected(configuration.isIsUseDefaultProxy());
221     myDetectNestedWorkingCopiesCheckBox.setSelected(configuration.DETECT_NESTED_COPIES);
222
223     boolean enabled = !myUseDefaultCheckBox.isSelected();
224     myConfigurationDirectoryText.setEnabled(enabled);
225     myConfigurationDirectoryLabel.setEnabled(enabled);
226     myLockOnDemand.setSelected(configuration.UPDATE_LOCK_ON_DEMAND);
227     myIgnoreWhitespaceDifferenciesInCheckBox.setSelected(configuration.IGNORE_SPACES_IN_ANNOTATE);
228     myShowMergeSourceInAnnotate.setSelected(configuration.SHOW_MERGE_SOURCES_IN_ANNOTATE);
229
230     final int annotateRevisions = configuration.getMaxAnnotateRevisions();
231     if (annotateRevisions == -1) {
232       myMaximumNumberOfRevisionsCheckBox.setSelected(false);
233       myNumRevsInAnnotations.setValue(SvnConfiguration.ourMaxAnnotateRevisionsDefault);
234     } else {
235       myMaximumNumberOfRevisionsCheckBox.setSelected(true);
236       myNumRevsInAnnotations.setValue(annotateRevisions);
237     }
238     myNumRevsInAnnotations.setEnabled(myMaximumNumberOfRevisionsCheckBox.isSelected());
239   }
240
241   public void disposeUIResources() {
242   }
243
244   private void createUIComponents() {
245     myLockOnDemand = new JCheckBox() {
246       @Override
247       public JToolTip createToolTip() {
248         JToolTip toolTip = new JToolTip(){{
249           setUI(new MultiLineTooltipUI());
250         }};
251         toolTip.setComponent(this);
252         return toolTip;
253       }
254     };
255
256     final SvnConfiguration configuration = SvnConfiguration.getInstance(myProject);
257     int value = configuration.getMaxAnnotateRevisions();
258     value = (value == -1) ? SvnConfiguration.ourMaxAnnotateRevisionsDefault : value; 
259     myNumRevsInAnnotations = new JSpinner(new SpinnerNumberModel(value, 10, 100000, 100));
260   }
261 }
262