diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.form b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.form
deleted file mode 100644
index 7228db028df1..000000000000
--- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.form
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.java
index 363d5f1e319f..11b9be18052e 100644
--- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.java
+++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangeListChooserPanel.java
@@ -15,161 +15,144 @@
*/
package com.intellij.openapi.vcs.changes.ui;
+import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.VcsConfiguration;
import com.intellij.openapi.vcs.changes.ChangeList;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.LocalChangeList;
import com.intellij.openapi.vcs.changes.committed.CommittedChangeListRenderer;
-import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer;
-import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.*;
import com.intellij.util.NullableConsumer;
-import com.intellij.util.ui.UIUtil;
+import com.intellij.util.ObjectUtils;
+import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
-/**
- * @author yole
- */
public class ChangeListChooserPanel extends JPanel {
- private static final Comparator CHANGE_LIST_COMPARATOR = new Comparator() {
- @Override
- public int compare(ChangeList o1, ChangeList o2) {
- return o1.getName().compareToIgnoreCase(o2.getName());
- }
- };
- private JPanel myPanel;
- private JRadioButton myRbExisting;
- private JRadioButton myRbNew;
- private JComboBox myExistingListsCombo;
- private NewEditChangelistPanel myNewListPanel;
+ private final MyEditorComboBox myExistingListsCombo;
+ private final NewEditChangelistPanel myListPanel;
private final NullableConsumer myOkEnabledListener;
- private Project myProject;
+ private final Project myProject;
public ChangeListChooserPanel(final Project project, @NotNull final NullableConsumer okEnabledListener) {
super(new BorderLayout());
myProject = project;
- myOkEnabledListener = okEnabledListener;
- add(myPanel, BorderLayout.CENTER);
-
- myRbExisting.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- updateEnabledItems();
- }
- });
- }
-
- public void init() {
- myExistingListsCombo.setRenderer(new ColoredListCellRendererWrapper() {
- private final IssueLinkRenderer myLinkRenderer = new IssueLinkRenderer(myProject, this);
-
+ myExistingListsCombo = new MyEditorComboBox(project);
+ myExistingListsCombo.setEditable(true);
+ myExistingListsCombo.setRenderer(new ColoredListCellRenderer() {
@Override
- protected void doCustomize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
- if (value instanceof LocalChangeList) {
- String name = ((LocalChangeList) value).getName();
-
- if (myExistingListsCombo.getWidth() == 0) {
+ protected void customizeCellRenderer(@NotNull JList extends String> list,
+ String value,
+ int index,
+ boolean selected,
+ boolean hasFocus) {
+ if (value != null) {
+ String name = value;
+ LocalChangeList changeList = ChangeListManager.getInstance(myProject).findChangeList(name);
+ int visibleWidth = myExistingListsCombo.getEditorTextField().getVisibleRect().width;
+ if (visibleWidth == 0) {
name = name.length() > 10 ? name.substring(0, 7) + " .." : name;
}
else {
final FontMetrics fm = list.getFontMetrics(list.getFont());
final int width = fm.stringWidth(name);
- final int listWidth = myExistingListsCombo.getWidth();
- if ((listWidth > 0) && (width > listWidth)) {
- final String truncated = CommittedChangeListRenderer.truncateDescription(name, fm, listWidth - fm.stringWidth(" ..") - 7);
+ if ((visibleWidth > 0) && (width > visibleWidth)) {
+ final String truncated = CommittedChangeListRenderer
+ .truncateDescription(name, fm, visibleWidth - fm.stringWidth(" ..") - 7);
if (truncated.length() > 5) {
name = truncated + " ..";
}
}
}
- myLinkRenderer.appendTextWithLinks(name, ((LocalChangeList)value).isDefault()
- ? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES : SimpleTextAttributes.REGULAR_ATTRIBUTES);
+ append(name, changeList != null && changeList.isDefault()
+ ? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES
+ : SimpleTextAttributes.REGULAR_ATTRIBUTES);
}
}
});
- myNewListPanel.init(null);
- myRbNew.addFocusListener(new FocusAdapter() {
+ myListPanel = new NewEditChangelistPanel(myProject) {
+
@Override
- public void focusGained(FocusEvent e) {
- if (myRbNew.isSelected()) {
- IdeFocusManager.getInstance(myProject).requestFocus(myNewListPanel.getPreferredFocusedComponent(), true);
- }
+ protected NewEditChangelistPanel.ComponentWithTextFieldWrapper createComponentWithTextField(Project project) {
+ return new ComponentWithTextFieldWrapper(myExistingListsCombo) {
+ @NotNull
+ @Override
+ public EditorTextField getEditorTextField() {
+ return myExistingListsCombo.getEditorTextField();
+ }
+ };
}
- });
- final ComboboxSpeedSearch search = new ComboboxSpeedSearch(myExistingListsCombo);
- search.setComparator(new SpeedSearchComparator(true, false));
+
+ @Override
+ protected void nameChanged(String errorMessage) {
+ LocalChangeList list = getExistingChangelist();
+ setDescription(list != null ? list.getComment() : "");
+ myOkEnabledListener.consume(errorMessage);
+ }
+
+ @Override
+ protected void nameChangedImpl(Project project, LocalChangeList initial) {
+ nameChanged(StringUtil.isEmptyOrSpaces(getChangeListName()) ? "Cannot create new changelist with empty name." : null);
+ }
+ };
+ myOkEnabledListener = okEnabledListener;
+ add(myListPanel, BorderLayout.CENTER);
+ }
+
+ public void init() {
+ myListPanel.init(null);
}
public void setChangeLists(Collection extends ChangeList> changeLists) {
- List list = new ArrayList(changeLists);
- Collections.sort(list, CHANGE_LIST_COMPARATOR);
- myExistingListsCombo.setModel(new CollectionComboBoxModel(list, null));
+ List changelistNames = ContainerUtil.map(changeLists, ChangeList::getName);
+ Collections.sort(changelistNames);
+ myExistingListsCombo.setModel(new CollectionComboBoxModel(changelistNames));
}
public void setDefaultName(String name) {
- if (! StringUtil.isEmptyOrSpaces(name)) {
- myNewListPanel.setChangeListName(name);
+ if (!StringUtil.isEmptyOrSpaces(name)) {
+ myListPanel.setChangeListName(name);
}
}
private void updateEnabledItems() {
- if (myRbExisting.isSelected()) {
- myExistingListsCombo.setEnabled(true);
- UIUtil.setEnabled(myNewListPanel, false, true);
- myExistingListsCombo.requestFocus();
- }
- else {
- myExistingListsCombo.setEnabled(false);
- UIUtil.setEnabled(myNewListPanel, true, true);
- myNewListPanel.requestFocus();
- }
if (myProject != null) {
- myNewListPanel.nameChangedImpl(myProject, null);
+ myListPanel.nameChangedImpl(myProject, null);
}
}
+ /**
+ * Method used as getResult, usually invoked inside doOkAction
+ */
@Nullable
public LocalChangeList getSelectedList(Project project) {
ChangeListManager manager = ChangeListManager.getInstance(project);
- if (myRbNew.isSelected()) {
- String newText = myNewListPanel.getChangeListName();
- if (manager.findChangeList(newText) != null) {
- Messages.showErrorDialog(project,
- VcsBundle.message("changes.newchangelist.warning.already.exists.text", newText),
- VcsBundle.message("changes.newchangelist.warning.already.exists.title"));
- return null;
- }
- }
- final boolean existingSelected = myRbExisting.isSelected();
- VcsConfiguration.getInstance(myProject).PRESELECT_EXISTING_CHANGELIST = existingSelected;
+ String changeListName = myListPanel.getChangeListName();
+ LocalChangeList localChangeList = manager.findChangeList(changeListName);
- if (existingSelected) {
- return (LocalChangeList)myExistingListsCombo.getSelectedItem();
+ if (localChangeList == null) {
+ localChangeList = manager.addChangeList(changeListName, myListPanel.getDescription());
+ myListPanel.changelistCreatedOrChanged(localChangeList);
}
else {
- LocalChangeList changeList = manager.addChangeList(myNewListPanel.getChangeListName(), myNewListPanel.getDescription());
- myNewListPanel.changelistCreatedOrChanged(changeList);
- if (myNewListPanel.getMakeActiveCheckBox().isSelected()) {
- manager.setDefaultChangeList(changeList);
- }
- VcsConfiguration.getInstance(project).MAKE_NEW_CHANGELIST_ACTIVE = myNewListPanel.getMakeActiveCheckBox().isSelected();
-
- return changeList;
+ //update description if changed
+ localChangeList.setComment(myListPanel.getDescription());
}
+ if (myListPanel.getMakeActiveCheckBox().isSelected()) {
+ manager.setDefaultChangeList(localChangeList);
+ }
+ VcsConfiguration.getInstance(project).MAKE_NEW_CHANGELIST_ACTIVE = myListPanel.getMakeActiveCheckBox().isSelected();
+ return localChangeList;
}
public void setDefaultSelection(final ChangeList defaultSelection) {
@@ -177,34 +160,37 @@ public class ChangeListChooserPanel extends JPanel {
myExistingListsCombo.setSelectedIndex(0);
}
else {
- myExistingListsCombo.setSelectedItem(defaultSelection);
+ myExistingListsCombo.setSelectedItem(defaultSelection.getName());
}
- //if defaultSelection was predefined as null then it means we could not use existing is this context
- if (defaultSelection != null && VcsConfiguration.getInstance(myProject).PRESELECT_EXISTING_CHANGELIST) {
- myRbExisting.setSelected(true);
- }
- else {
- myRbNew.setSelected(true);
- }
-
+ updateDescription();
updateEnabledItems();
}
- public JComponent getPreferredFocusedComponent() {
- return myRbExisting.isSelected() ? myExistingListsCombo : myNewListPanel.getPreferredFocusedComponent();
+ private void updateDescription() {
+ LocalChangeList list = getExistingChangelist();
+ myListPanel.setDescription(list != null ? list.getComment() : "");
}
- private void createUIComponents() {
- myNewListPanel = new NewEditChangelistPanel(myProject) {
+ private LocalChangeList getExistingChangelist() {
+ ChangeListManager manager = ChangeListManager.getInstance(myProject);
+ String changeListName = myListPanel.getChangeListName();
+ return manager.findChangeList(changeListName);
+ }
- @Override
- protected void nameChanged(String errorMessage) {
- if (myRbExisting.isSelected()) {
- myOkEnabledListener.consume(null);
- } else {
- myOkEnabledListener.consume(errorMessage);
- }
- }
- };
+ public JComponent getPreferredFocusedComponent() {
+ return myExistingListsCombo;
+ }
+
+ private static class MyEditorComboBox extends ComboBox {
+
+ public MyEditorComboBox(Project project) {
+ super();
+ setEditor(new StringComboboxEditor(project, FileTypes.PLAIN_TEXT, this));
+ }
+
+ @NotNull
+ private EditorTextField getEditorTextField() {
+ return ObjectUtils.assertNotNull((EditorTextField)getEditor().getEditorComponent());
+ }
}
}