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