IDEA-57797 Edit changelist: "comment" field should have wrapping
[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.ChangeListManager;
24 import com.intellij.openapi.vcs.changes.LocalChangeList;
25 import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer;
26 import com.intellij.ui.HtmlListCellRenderer;
27 import com.intellij.ui.SimpleTextAttributes;
28 import com.intellij.util.Consumer;
29 import com.intellij.util.ui.UIUtil;
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 NewEditChangelistPanel myNewListPanel;
48   private final Consumer<String> myOkEnabledListener;
49   private Project myProject;
50
51   public ChangeListChooserPanel(final Project project, @NotNull final Consumer<String> okEnabledListener) {
52     super(new BorderLayout());
53     myProject = project;
54     myOkEnabledListener = okEnabledListener;
55     add(myPanel, BorderLayout.CENTER);
56
57     myRbExisting.addItemListener(new ItemListener() {
58       public void itemStateChanged(ItemEvent e) {
59         updateEnabledItems();
60       }
61     });
62   }
63
64   public void init() {
65     myExistingListsCombo.setRenderer(new HtmlListCellRenderer(myExistingListsCombo.getRenderer()) {
66       private final IssueLinkRenderer myLinkRenderer = new IssueLinkRenderer(myProject, this);
67
68       @Override
69       protected void doCustomize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
70         if (value instanceof LocalChangeList) {
71           myLinkRenderer.appendTextWithLinks(((LocalChangeList)value).getName(),
72                                              ((LocalChangeList)value).isDefault() ? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES
73                                                                                   : SimpleTextAttributes.REGULAR_ATTRIBUTES);
74         }
75       }
76     });
77     myNewListPanel.init(null);
78   }
79
80   public void setChangeLists(Collection<? extends ChangeList> changeLists) {
81     final DefaultComboBoxModel model = new DefaultComboBoxModel();
82     for (ChangeList list : changeLists) {
83       model.addElement(list);
84     }
85
86     myExistingListsCombo.setModel(model);
87   }
88
89   public void setDefaultName(String name) {
90     myNewListPanel.setName(name);
91   }
92
93   private void updateEnabledItems() {
94     if (myRbExisting.isSelected()) {
95       myExistingListsCombo.setEnabled(true);
96       UIUtil.setEnabled(myNewListPanel, false, true);
97       myExistingListsCombo.requestFocus();
98     }
99     else {
100       myExistingListsCombo.setEnabled(false);
101       UIUtil.setEnabled(myNewListPanel, true, true);
102       myNewListPanel.requestFocus();
103     }
104     if (myProject != null) {
105       myNewListPanel.nameChangedImpl(myProject, null);
106     }
107   }
108
109   @Nullable
110   public LocalChangeList getSelectedList(Project project) {
111     ChangeListManager manager = ChangeListManager.getInstance(project);
112     if (myRbNew.isSelected()) {
113       String newText = myNewListPanel.getName();
114       if (manager.findChangeList(newText) != null) {
115         Messages.showErrorDialog(project,
116                                  VcsBundle.message("changes.newchangelist.warning.already.exists.text", newText),
117                                  VcsBundle.message("changes.newchangelist.warning.already.exists.title"));
118         return null;
119       }
120     }
121
122     if (myRbExisting.isSelected()) {
123       return (LocalChangeList)myExistingListsCombo.getSelectedItem();
124     }
125     else {
126       LocalChangeList changeList = manager.addChangeList(myNewListPanel.getName(), myNewListPanel.getDescription());
127       myNewListPanel.changelistCreatedOrChanged(changeList);
128       if (myNewListPanel.getMakeActiveCheckBox().isSelected()) {
129         manager.setDefaultChangeList(changeList);
130       }
131       VcsConfiguration.getInstance(project).MAKE_NEW_CHANGELIST_ACTIVE = myNewListPanel.getMakeActiveCheckBox().isSelected();
132
133       return changeList;
134     }
135   }
136
137   public void setDefaultSelection(final ChangeList defaultSelection) {
138     if (defaultSelection == null) {
139       myExistingListsCombo.setSelectedIndex(0);
140     }
141     else {
142       myExistingListsCombo.setSelectedItem(defaultSelection);
143     }
144
145
146     if (defaultSelection != null) {
147       myRbExisting.setSelected(true);
148     }
149     else {
150       myRbNew.setSelected(true);
151     }
152
153     updateEnabledItems();
154   }
155
156   public JComponent getPreferredFocusedComponent() {
157     return myRbExisting.isSelected() ? myExistingListsCombo : myNewListPanel.getPreferredFocusedComponent();
158   }
159
160   private void createUIComponents() {
161     myNewListPanel = new NewEditChangelistPanel(myProject) {
162
163       @Override
164       protected void nameChanged(String errorMessage) {
165         if (myRbExisting.isSelected()) {
166           myOkEnabledListener.consume(null);
167         } else {
168           myOkEnabledListener.consume(errorMessage);
169         }
170       }
171     };
172   }
173 }