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
;
34 import javax
.swing
.event
.DocumentEvent
;
35 import javax
.swing
.event
.DocumentListener
;
36 import javax
.swing
.event
.TreeSelectionEvent
;
37 import javax
.swing
.event
.TreeSelectionListener
;
43 public class SelectLocationDialog
extends DialogWrapper
{
44 private Project myProject
;
45 private RepositoryBrowserComponent myRepositoryBrowser
;
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";
55 public static String
selectLocation(Project project
, String url
) {
57 SVNURL
.parseURIEncoded(url
);
58 SelectLocationDialog dialog
= new SelectLocationDialog(project
, url
);
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"));
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
{
77 myDstLabel
= dstLabel
;
79 myURL
= SVNURL
.parseURIEncoded(url
);
80 myIsShowFiles
= showFiles
;
81 setTitle(SvnBundle
.message("dialog.title.select.repository.location"));
82 getHelpAction().setEnabled(true);
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() {
100 String urlString
= myURL
.toString();
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());
117 protected void 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);
132 gc
.anchor
= GridBagConstraints
.WEST
;
133 gc
.fill
= GridBagConstraints
.BOTH
;
138 myRepositoryBrowser
= new RepositoryBrowserComponent(SvnVcs
.getInstance(myProject
));
139 panel
.add(myRepositoryBrowser
, gc
);
140 if (myDstName
!= null) {
144 gc
.fill
= GridBagConstraints
.NONE
;
148 JLabel dstLabel
= new JLabel(myDstLabel
);
149 panel
.add(dstLabel
, gc
);
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
);
179 panel
.add(new JSeparator(), gc
);
185 public JComponent
getPreferredFocusedComponent() {
186 return (JComponent
)myRepositoryBrowser
.getPreferredFocusedComponent();
189 public boolean shouldCloseOnCross() {
193 public boolean isOKActionEnabled() {
194 boolean ok
= myRepositoryBrowser
.getSelectedURL() != null;
195 if (ok
&& myDstText
!= null) {
196 return myDstText
.getText().trim().length() > 0;
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();