0ddfb96e029513a4523db502d1f0fbfc9b46c449
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / changes / ui / ChangeListChooserPanel.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.openapi.vcs.changes.ui;
17
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.ui.Messages;
20 import com.intellij.openapi.vcs.VcsBundle;
21 import com.intellij.openapi.vcs.VcsConfiguration;
22 import com.intellij.openapi.vcs.changes.ChangeList;
23 import com.intellij.openapi.vcs.changes.ChangeListEditHandler;
24 import com.intellij.openapi.vcs.changes.ChangeListManager;
25 import com.intellij.openapi.vcs.changes.LocalChangeList;
26 import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer;
27 import com.intellij.ui.HtmlListCellRenderer;
28 import com.intellij.ui.SimpleTextAttributes;
29 import com.intellij.util.Consumer;
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32
33 import javax.swing.*;
34 import java.awt.*;
35 import java.awt.event.ItemEvent;
36 import java.awt.event.ItemListener;
37 import java.util.Collection;
38
39 /**
40  * @author yole
41  */
42 public class ChangeListChooserPanel extends JPanel {
43   private JPanel myPanel;
44   private JRadioButton myRbExisting;
45   private JRadioButton myRbNew;
46   private JComboBox myExistingListsCombo;
47   private EditChangelistPanel myNewListPanel;
48   @Nullable private final ChangeListEditHandler myHandler;
49   private final Consumer<String> myOkEnabledListener;
50   private Project myProject;
51
52   public ChangeListChooserPanel(@Nullable final ChangeListEditHandler handler, @NotNull final Consumer<String> okEnabledListener) {
53     super(new BorderLayout());
54     myHandler = handler;
55     myOkEnabledListener = okEnabledListener;
56     add(myPanel, BorderLayout.CENTER);
57
58     myRbExisting.addItemListener(new ItemListener() {
59       public void itemStateChanged(ItemEvent e) {
60         updateEnabledItems();
61       }
62     });
63   }
64
65   public void init(final Project project) {
66     myProject = project;
67
68     myExistingListsCombo.setRenderer(new HtmlListCellRenderer(myExistingListsCombo.getRenderer()) {
69       private final IssueLinkRenderer myLinkRenderer = new IssueLinkRenderer(project, this);
70
71       @Override
72       protected void doCustomize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
73         if (value instanceof LocalChangeList) {
74           myLinkRenderer.appendTextWithLinks(((LocalChangeList)value).getName(),
75                                              ((LocalChangeList)value).isDefault() ? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES
76                                                                                   : SimpleTextAttributes.REGULAR_ATTRIBUTES);
77         }
78       }
79     });
80     myNewListPanel.init(project, null);
81   }
82
83   public void setChangeLists(Collection<? extends ChangeList> changeLists) {
84     final DefaultComboBoxModel model = new DefaultComboBoxModel();
85     for (ChangeList list : changeLists) {
86       model.addElement(list);
87     }
88
89     myExistingListsCombo.setModel(model);
90   }
91
92   public void setDefaultName(String name) {
93     myNewListPanel.setName(name);
94   }
95
96   private void updateEnabledItems() {
97     if (myRbExisting.isSelected()) {
98       myExistingListsCombo.setEnabled(true);
99       myNewListPanel.setEnabled(false);
100       myExistingListsCombo.requestFocus();
101     }
102     else {
103       myExistingListsCombo.setEnabled(false);
104       myNewListPanel.setEnabled(true);
105       myNewListPanel.requestFocus();
106     }
107     if (myProject != null) {
108       myNewListPanel.nameChangedImpl(myProject, null);
109     }
110   }
111
112   @Nullable
113   public LocalChangeList getSelectedList(Project project) {
114     ChangeListManager manager = ChangeListManager.getInstance(project);
115     if (myRbNew.isSelected()) {
116       String newText = myNewListPanel.getName();
117       if (manager.findChangeList(newText) != null) {
118         Messages.showErrorDialog(project,
119                                  VcsBundle.message("changes.newchangelist.warning.already.exists.text", newText),
120                                  VcsBundle.message("changes.newchangelist.warning.already.exists.title"));
121         return null;
122       }
123     }
124
125     if (myRbExisting.isSelected()) {
126       return (LocalChangeList)myExistingListsCombo.getSelectedItem();
127     }
128     else {
129       LocalChangeList changeList = manager.addChangeList(myNewListPanel.getName(), myNewListPanel.getDescription());
130       myNewListPanel.changelistCreatedOrChanged(changeList);
131       if (myNewListPanel.getMakeActiveCheckBox().isSelected()) {
132         manager.setDefaultChangeList(changeList);
133       }
134       VcsConfiguration.getInstance(project).MAKE_NEW_CHANGELIST_ACTIVE = myNewListPanel.getMakeActiveCheckBox().isSelected();
135
136       return changeList;
137     }
138   }
139
140   public void setDefaultSelection(final ChangeList defaultSelection) {
141     if (defaultSelection == null) {
142       myExistingListsCombo.setSelectedIndex(0);
143     }
144     else {
145       myExistingListsCombo.setSelectedItem(defaultSelection);
146     }
147
148
149     if (defaultSelection != null) {
150       myRbExisting.setSelected(true);
151     }
152     else {
153       myRbNew.setSelected(true);
154     }
155
156     updateEnabledItems();
157   }
158
159   public JComponent getPreferredFocusedComponent() {
160     return myRbExisting.isSelected() ? myExistingListsCombo : myNewListPanel.getPreferredFocusedComponent();
161   }
162
163   private void createUIComponents() {
164     myNewListPanel = new EditChangelistPanel(myHandler) {
165
166       @Override
167       protected void nameChanged(String errorMessage) {
168         if (myRbExisting.isSelected()) {
169           myOkEnabledListener.consume(null);
170         } else {
171           myOkEnabledListener.consume(errorMessage);
172         }
173       }
174     };
175   }
176 }