Merge branch 'master' of git.labs.intellij.net:idea/community
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / ui / HgPushDialog.java
1 // Copyright 2008-2010 Victor Iacoban
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software distributed under
10 // the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 // either express or implied. See the License for the specific language governing permissions and
12 // limitations under the License.
13 package org.zmlx.hg4idea.ui;
14
15 import com.intellij.openapi.project.Project;
16 import com.intellij.openapi.ui.DialogWrapper;
17 import com.intellij.openapi.vfs.VirtualFile;
18 import org.apache.commons.lang.StringUtils;
19 import org.jetbrains.annotations.Nullable;
20 import org.zmlx.hg4idea.HgVcsMessages;
21 import org.zmlx.hg4idea.command.HgShowConfigCommand;
22 import org.zmlx.hg4idea.command.HgTagBranch;
23 import org.zmlx.hg4idea.command.HgTagBranchCommand;
24
25 import javax.swing.*;
26 import javax.swing.event.ChangeEvent;
27 import javax.swing.event.ChangeListener;
28 import javax.swing.event.DocumentEvent;
29 import javax.swing.event.DocumentListener;
30 import java.awt.event.ActionEvent;
31 import java.awt.event.ActionListener;
32 import java.util.Collection;
33 import java.util.List;
34
35 public class HgPushDialog extends DialogWrapper {
36
37   private final Project myProject;
38
39   private JPanel contentPanel;
40   private JTextField repositoryTxt;
41   private JCheckBox revisionCbx;
42   private JTextField revisionTxt;
43   private HgRepositorySelectorComponent hgRepositorySelectorComponent;
44   private JCheckBox forceCheckBox;
45   private JCheckBox branchCheckBox;
46   private JComboBox branchComboBox;
47
48   public HgPushDialog(Project project) {
49     super(project, false);
50     myProject = project;
51
52     hgRepositorySelectorComponent.setTitle("Select repository to push from");
53     hgRepositorySelectorComponent.addActionListener(new ActionListener() {
54       public void actionPerformed(ActionEvent e) {
55         updateRepository();
56       }
57     });
58
59     final UpdatingListener updatingListener = new UpdatingListener();
60     revisionCbx.addChangeListener(updatingListener);
61     branchCheckBox.addChangeListener(updatingListener);
62     repositoryTxt.getDocument().addDocumentListener(updatingListener);
63     revisionTxt.getDocument().addDocumentListener(updatingListener);
64
65     setTitle(HgVcsMessages.message("hg4idea.push.dialog.title"));
66     init();
67   }
68
69   public void setRoots(Collection<VirtualFile> repos) {
70     hgRepositorySelectorComponent.setRoots(repos);
71     updateRepository();
72   }
73
74   public VirtualFile getRepository() {
75     return hgRepositorySelectorComponent.getRepository();
76   }
77
78   public String getTarget() {
79     return repositoryTxt.getText();
80   }
81
82   @Nullable
83   public String getRevision() {
84     return revisionCbx.isSelected() ? revisionTxt.getText() : null;
85   }
86
87   @Nullable
88   public HgTagBranch getBranch() {
89     return branchCheckBox.isSelected() ? (HgTagBranch) branchComboBox.getSelectedItem() : null;
90   }
91
92   public boolean isForce() {
93     return forceCheckBox.isSelected();
94   }
95
96   protected JComponent createCenterPanel() {
97     return contentPanel;
98   }
99
100   private void updateRepository() {
101     final VirtualFile repo = hgRepositorySelectorComponent.getRepository();
102     final HgShowConfigCommand configCommand = new HgShowConfigCommand(myProject);
103     final String defaultPath = configCommand.getDefaultPath(repo);
104     repositoryTxt.setText(defaultPath);
105     loadBranches(repo);
106     update();
107   }
108
109   private void loadBranches(VirtualFile root) {
110     final List<HgTagBranch> branches = new HgTagBranchCommand(myProject, root).listBranches();
111     branchComboBox.setModel(new DefaultComboBoxModel(branches.toArray()));
112   }
113
114   private void update() {
115     setOKActionEnabled(validateOptions());
116     revisionTxt.setEnabled(revisionCbx.isSelected());
117     branchComboBox.setEnabled(branchCheckBox.isSelected());
118   }
119
120   private boolean validateOptions() {
121     return StringUtils.isNotBlank(repositoryTxt.getText())
122       && !(revisionCbx.isSelected() && StringUtils.isBlank(revisionTxt.getText()))
123       && !(branchCheckBox.isSelected() && (branchComboBox.getSelectedItem() == null));
124   }
125
126   /**
127    * Updates the form on every change.
128    */
129   private class UpdatingListener implements ChangeListener, DocumentListener {
130
131     public void stateChanged(ChangeEvent e) {
132       update();
133     }
134
135     public void insertUpdate(DocumentEvent e) {
136       update();
137     }
138
139     public void removeUpdate(DocumentEvent e) {
140       update();
141     }
142
143     public void changedUpdate(DocumentEvent e) {
144       update();
145     }
146   }
147
148 }