[hg] access dialog elements from AWT.
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / ui / HgIntegrateDialog.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.application.ApplicationManager;
16 import com.intellij.openapi.options.Configurable;
17 import com.intellij.openapi.options.ConfigurationException;
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.vcs.FilePath;
20 import com.intellij.openapi.vfs.VirtualFile;
21 import com.intellij.util.Consumer;
22 import com.intellij.util.ui.UIUtil;
23 import org.jetbrains.annotations.Nls;
24 import org.zmlx.hg4idea.HgRevisionNumber;
25 import org.zmlx.hg4idea.HgVcsMessages;
26 import org.zmlx.hg4idea.command.HgHeadsCommand;
27 import org.zmlx.hg4idea.command.HgTagBranch;
28 import org.zmlx.hg4idea.command.HgTagBranchCommand;
29 import org.zmlx.hg4idea.command.HgWorkingCopyRevisionsCommand;
30
31 import javax.swing.*;
32 import javax.swing.event.ChangeEvent;
33 import javax.swing.event.ChangeListener;
34 import java.awt.event.ActionEvent;
35 import java.awt.event.ActionListener;
36 import java.util.Collection;
37 import java.util.LinkedList;
38 import java.util.List;
39
40 public class HgIntegrateDialog implements Configurable {
41
42   private final Project project;
43
44   private JRadioButton revisionOption;
45   private JTextField revisionTxt;
46   private JRadioButton branchOption;
47   private JRadioButton tagOption;
48   private JComboBox branchSelector;
49   private JComboBox tagSelector;
50   private JPanel contentPanel;
51   private HgRepositorySelectorComponent hgRepositorySelectorComponent;
52   private JRadioButton otherHeadRadioButton;
53   private JLabel otherHeadLabel;
54
55   private HgRevisionNumber otherHead;
56
57   public HgIntegrateDialog(Project project, Collection<FilePath> roots) {
58     this.project = project;
59     hgRepositorySelectorComponent.setRoots(pathsToFiles(roots));
60     hgRepositorySelectorComponent.setTitle("Select repository to integrate");
61     hgRepositorySelectorComponent.addActionListener(new ActionListener() {
62       public void actionPerformed(ActionEvent e) {
63         updateRepository();
64       }
65     });
66
67     ChangeListener changeListener = new ChangeListener() {
68       public void stateChanged(ChangeEvent e) {
69         updateOptions();
70       }
71     };
72     branchOption.addChangeListener(changeListener);
73     tagOption.addChangeListener(changeListener);
74     revisionOption.addChangeListener(changeListener);
75     otherHeadRadioButton.addChangeListener(changeListener);
76
77     updateRepository();
78   }
79
80   public VirtualFile getRepository() {
81     return hgRepositorySelectorComponent.getRepository();
82   }
83
84   public HgTagBranch getBranch() {
85     return branchOption.isSelected() ? (HgTagBranch) branchSelector.getSelectedItem() : null;
86   }
87
88   public HgTagBranch getTag() {
89     return tagOption.isSelected() ? (HgTagBranch) tagSelector.getSelectedItem() : null;
90   }
91
92   public String getRevision() {
93     return revisionOption.isSelected() ? revisionTxt.getText() : null;
94   }
95
96   public HgRevisionNumber getOtherHead() {
97     return otherHeadRadioButton.isSelected() ? otherHead : null;
98   }
99
100   @Nls
101   public String getDisplayName() {
102     return null;
103   }
104
105   public Icon getIcon() {
106     return null;
107   }
108
109   public String getHelpTopic() {
110     return null;
111   }
112
113   public JComponent createComponent() {
114     return contentPanel;
115   }
116
117   public boolean isModified() {
118     return true;
119   }
120
121   public void apply() throws ConfigurationException {
122   }
123
124   public void reset() {
125   }
126
127   private void updateRepository() {
128     VirtualFile repo = getRepository();
129     loadBranches(repo);
130     loadTags(repo);
131     loadHeads(repo);
132   }
133
134   private void updateOptions() {
135     revisionTxt.setEnabled(revisionOption.isSelected());
136     branchSelector.setEnabled(branchOption.isSelected());
137     tagSelector.setEnabled(tagOption.isSelected());
138   }
139
140   private void loadBranches(VirtualFile root) {
141     new HgTagBranchCommand(project, root).listBranches(new Consumer<List<HgTagBranch>>() {
142       @Override
143       public void consume(final List<HgTagBranch> branches) {
144         UIUtil.invokeAndWaitIfNeeded(new Runnable() {
145           @Override
146           public void run() {
147             branchSelector.setModel(new DefaultComboBoxModel(branches.toArray()));
148           }
149         });
150       }
151     });
152   }
153
154   private void loadTags(VirtualFile root) {
155     new HgTagBranchCommand(project, root).listTags(new Consumer<List<HgTagBranch>>() {
156       @Override
157       public void consume(final List<HgTagBranch> tags) {
158         UIUtil.invokeAndWaitIfNeeded(new Runnable() {
159           @Override
160           public void run() {
161             tagSelector.setModel(new DefaultComboBoxModel(tags.toArray()));
162           }
163         });
164       }
165     });
166   }
167
168   private void loadHeads(final VirtualFile root) {
169     ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
170       @Override
171       public void run() {
172         final List<HgRevisionNumber> heads = new HgHeadsCommand(project, root).execute();
173         if (heads.size() != 2) {
174           disableOtherHeadsChoice();
175           return;
176         }
177
178         otherHeadRadioButton.setVisible(true);
179         otherHeadLabel.setVisible(true);
180
181         HgRevisionNumber currentParent = new HgWorkingCopyRevisionsCommand(project).identify(root);
182         heads.remove(currentParent);
183
184         if (heads.size() == 1) {
185           otherHead = heads.get(0);
186           otherHeadLabel.setText(HgVcsMessages.message("hg4idea.integrate.other.head", otherHead.asString()));
187         } else {
188           //apparently we are not at one of the heads
189           disableOtherHeadsChoice();
190         }
191       }
192     });
193   }
194
195   private void disableOtherHeadsChoice() {
196     otherHeadLabel.setVisible(false);
197     otherHeadRadioButton.setVisible(false);
198   }
199
200   private List<VirtualFile> pathsToFiles(Collection<FilePath> paths) {
201     List<VirtualFile> files = new LinkedList<VirtualFile>();
202     for (FilePath path : paths) {
203       files.add(path.getVirtualFile());
204     }
205     return files;
206   }
207
208   public void disposeUIResources() {
209   }
210
211 }