ComponentWithBrowseButton - optional remove listener on hide
[fedora-idea.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / dialogs / SelectLocationDialog.java
blob73c6c95e848f1b3a4b4a91edebefbe9d3c1fb77e
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.
16 package org.jetbrains.idea.svn.dialogs;
18 import com.intellij.openapi.help.HelpManager;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.ui.DialogWrapper;
21 import com.intellij.openapi.ui.Messages;
22 import com.intellij.openapi.util.Disposer;
23 import org.jetbrains.annotations.NonNls;
24 import org.jetbrains.annotations.Nullable;
25 import org.jetbrains.idea.svn.SvnBundle;
26 import org.jetbrains.idea.svn.SvnVcs;
27 import org.jetbrains.idea.svn.dialogs.browser.UrlOpeningExpander;
28 import org.tmatesoft.svn.core.SVNException;
29 import org.tmatesoft.svn.core.SVNURL;
30 import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil;
31 import org.tmatesoft.svn.core.io.SVNRepository;
33 import javax.swing.*;
34 import javax.swing.event.DocumentEvent;
35 import javax.swing.event.DocumentListener;
36 import javax.swing.event.TreeSelectionEvent;
37 import javax.swing.event.TreeSelectionListener;
38 import java.awt.*;
40 /**
41 * @author alex
43 public class SelectLocationDialog extends DialogWrapper {
44 private Project myProject;
45 private RepositoryBrowserComponent myRepositoryBrowser;
46 private SVNURL myURL;
47 private String myDstName;
48 private String myDstLabel;
49 private JTextField myDstText;
50 private boolean myIsShowFiles;
52 @NonNls private static final String HELP_ID = "vcs.subversion.common";
54 @Nullable
55 public static String selectLocation(Project project, String url) {
56 try {
57 SVNURL.parseURIEncoded(url);
58 SelectLocationDialog dialog = new SelectLocationDialog(project, url);
59 dialog.show();
60 if (!dialog.isOK()) return null;
61 return dialog.getSelectedURL();
62 } catch (SVNException e) {
63 Messages.showErrorDialog(project, SvnBundle.message("select.location.invalid.url.message", url),
64 SvnBundle.message("dialog.title.select.repository.location"));
65 return null;
69 public SelectLocationDialog(Project project, String url) throws SVNException {
70 this(project, url, null, null, true);
73 public SelectLocationDialog(Project project, String url,
74 String dstLabel, String dstName, boolean showFiles) throws SVNException {
75 super(project, true);
76 myProject = project;
77 myDstLabel = dstLabel;
78 myDstName = dstName;
79 myURL = SVNURL.parseURIEncoded(url);
80 myIsShowFiles = showFiles;
81 setTitle(SvnBundle.message("dialog.title.select.repository.location"));
82 getHelpAction().setEnabled(true);
83 init();
86 protected void doHelpAction() {
87 HelpManager.getInstance().invokeHelp(HELP_ID);
90 protected Action[] createActions() {
91 return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
94 protected String getDimensionServiceKey() {
95 return "svn.repositoryBrowser";
98 protected void init() {
99 super.init();
100 String urlString = myURL.toString();
101 try {
102 SVNRepository repos = SvnVcs.getInstance(myProject).createRepository(urlString);
103 myURL = repos.getRepositoryRoot(true);
104 repos.closeSession();
105 } catch (SVNException e) {
106 // show error dialog.
108 myRepositoryBrowser.setRepositoryURL(myURL, myIsShowFiles, new UrlOpeningExpander.Factory(urlString, urlString));
109 myRepositoryBrowser.addChangeListener(new TreeSelectionListener() {
110 public void valueChanged(TreeSelectionEvent e) {
111 getOKAction().setEnabled(isOKActionEnabled());
116 @Override
117 protected void dispose() {
118 super.dispose();
119 Disposer.dispose(myRepositoryBrowser);
122 protected JComponent createCenterPanel() {
123 JPanel panel = new JPanel();
124 panel.setLayout(new GridBagLayout());
126 GridBagConstraints gc = new GridBagConstraints();
127 gc.insets = new Insets(2, 2, 2, 2);
128 gc.gridwidth = 2;
129 gc.gridheight = 1;
130 gc.gridx = 0;
131 gc.gridy = 0;
132 gc.anchor = GridBagConstraints.WEST;
133 gc.fill = GridBagConstraints.BOTH;
134 gc.weightx = 1;
135 gc.weighty = 1;
138 myRepositoryBrowser = new RepositoryBrowserComponent(SvnVcs.getInstance(myProject));
139 panel.add(myRepositoryBrowser, gc);
140 if (myDstName != null) {
141 gc.gridy += 1;
142 gc.gridwidth = 1;
143 gc.gridx = 0;
144 gc.fill = GridBagConstraints.NONE;
145 gc.weightx = 0;
146 gc.weighty = 0;
148 JLabel dstLabel = new JLabel(myDstLabel);
149 panel.add(dstLabel, gc);
151 gc.gridx += 1;
152 gc.weightx = 1;
153 gc.fill = GridBagConstraints.HORIZONTAL;
155 myDstText = new JTextField();
156 myDstText.setText(myDstName);
157 myDstText.selectAll();
158 panel.add(myDstText, gc);
160 myDstText.getDocument().addDocumentListener(new DocumentListener() {
161 public void insertUpdate(DocumentEvent e) {
162 getOKAction().setEnabled(isOKActionEnabled());
165 public void removeUpdate(DocumentEvent e) {
166 getOKAction().setEnabled(isOKActionEnabled());
169 public void changedUpdate(DocumentEvent e) {
170 getOKAction().setEnabled(isOKActionEnabled());
174 dstLabel.setLabelFor(myDstText);
175 gc.gridx = 0;
176 gc.gridy += 1;
177 gc.gridwidth = 2;
179 panel.add(new JSeparator(), gc);
182 return panel;
185 public JComponent getPreferredFocusedComponent() {
186 return (JComponent)myRepositoryBrowser.getPreferredFocusedComponent();
189 public boolean shouldCloseOnCross() {
190 return true;
193 public boolean isOKActionEnabled() {
194 boolean ok = myRepositoryBrowser.getSelectedURL() != null;
195 if (ok && myDstText != null) {
196 return myDstText.getText().trim().length() > 0;
198 return ok;
201 public String getDestinationName() {
202 return SVNEncodingUtil.uriEncode(myDstText.getText().trim());
205 public String getSelectedURL() {
206 return myRepositoryBrowser.getSelectedURL();
209 public SVNURL getSelectedSVNURL() {
210 return myRepositoryBrowser.getSelectedSVNURL();