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 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 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()); + } } }