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
;
37 import java
.awt
.event
.ActionEvent
;
38 import java
.awt
.event
.ActionListener
;
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
) {
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());
76 myConfigurationDirectoryText
.setText(path
);
81 myClearAuthButton
.addActionListener(new ActionListener(){
82 public void actionPerformed(final ActionEvent e
) {
83 String path
= myConfigurationDirectoryText
.getText();
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());
89 SvnConfiguration
.RUNTIME_AUTH_CACHE
.clear();
90 SvnConfiguration
.getInstance(myProject
).clearAuthenticationDirectory();
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) {
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);
133 public JComponent
createComponent() {
138 public String
getDisplayName() {
142 public Icon
getIcon() {
146 public String
getHelpTopic() {
150 public boolean isModified() {
151 if (myComponent
== null) {
154 SvnConfiguration configuration
= SvnConfiguration
.getInstance(myProject
);
155 if (configuration
.isUseDefaultConfiguation() != myUseDefaultCheckBox
.isSelected()) {
158 if (configuration
.isIsUseDefaultProxy() != myUseCommonProxy
.isSelected()) {
161 if (configuration
.UPDATE_LOCK_ON_DEMAND
!= myLockOnDemand
.isSelected()) {
164 if (configuration
.DETECT_NESTED_COPIES
!= myDetectNestedWorkingCopiesCheckBox
.isSelected()) {
167 if (configuration
.IGNORE_SPACES_IN_ANNOTATE
!= myIgnoreWhitespaceDifferenciesInCheckBox
.isSelected()) {
170 if (configuration
.SHOW_MERGE_SOURCES_IN_ANNOTATE
!= myShowMergeSourceInAnnotate
.isSelected()) {
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 configuration
.DETECT_NESTED_COPIES
= myDetectNestedWorkingCopiesCheckBox
.isSelected();
182 configuration
.UPDATE_LOCK_ON_DEMAND
= myLockOnDemand
.isSelected();
183 configuration
.setIgnoreSpacesInAnnotate(myIgnoreWhitespaceDifferenciesInCheckBox
.isSelected());
184 configuration
.SHOW_MERGE_SOURCES_IN_ANNOTATE
= myShowMergeSourceInAnnotate
.isSelected();
187 public void reset() {
188 SvnConfiguration configuration
= SvnConfiguration
.getInstance(myProject
);
189 String path
= configuration
.getConfigurationDirectory();
190 if (configuration
.isUseDefaultConfiguation() || path
== null) {
191 path
= SVNWCUtil
.getDefaultConfigurationDirectory().getAbsolutePath();
193 myConfigurationDirectoryText
.setText(path
);
194 myUseDefaultCheckBox
.setSelected(configuration
.isUseDefaultConfiguation());
195 myUseCommonProxy
.setSelected(configuration
.isIsUseDefaultProxy());
196 myDetectNestedWorkingCopiesCheckBox
.setSelected(configuration
.DETECT_NESTED_COPIES
);
198 boolean enabled
= !myUseDefaultCheckBox
.isSelected();
199 myConfigurationDirectoryText
.setEnabled(enabled
);
200 myConfigurationDirectoryLabel
.setEnabled(enabled
);
201 myLockOnDemand
.setSelected(configuration
.UPDATE_LOCK_ON_DEMAND
);
202 myIgnoreWhitespaceDifferenciesInCheckBox
.setSelected(configuration
.IGNORE_SPACES_IN_ANNOTATE
);
203 myShowMergeSourceInAnnotate
.setSelected(configuration
.SHOW_MERGE_SOURCES_IN_ANNOTATE
);
206 public void disposeUIResources() {
209 private void createUIComponents() {
210 myLockOnDemand
= new JCheckBox() {
212 public JToolTip
createToolTip() {
213 JToolTip toolTip
= new JToolTip(){{
214 setUI(new MultiLineTooltipUI());
216 toolTip
.setComponent(this);