diff --git a/platform/platform-resources/src/META-INF/VcsExtensions.xml b/platform/platform-resources/src/META-INF/VcsExtensions.xml index 3dd44bd1cfb3..ed9a6d525c11 100644 --- a/platform/platform-resources/src/META-INF/VcsExtensions.xml +++ b/platform/platform-resources/src/META-INF/VcsExtensions.xml @@ -57,6 +57,8 @@ + diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListCompletionContributor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListCompletionContributor.java new file mode 100644 index 000000000000..214f9e5d2cb8 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListCompletionContributor.java @@ -0,0 +1,53 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.vcs.changes; + +import com.intellij.codeInsight.completion.CompletionContributor; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.completion.PlainPrefixMatcher; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.util.Key; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; + +public class ChangeListCompletionContributor extends CompletionContributor implements DumbAware { + public static final Key> COMBO_BOX_KEY = Key.create("CHANGELIST_COMBO_BOX"); + + @Override + public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull final CompletionResultSet result) { + final PsiFile file = parameters.getOriginalFile(); + final Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file); + if (document == null) return; + ComboBox comboBox = document.getUserData(COMBO_BOX_KEY); + if (comboBox == null) return; + final CompletionResultSet resultSet = result.withPrefixMatcher(new PlainPrefixMatcher(document.getText())); + for (int i = 0; i < comboBox.getItemCount(); i++) { + resultSet.addElement(LookupElementBuilder.create(comboBox.getItemAt(i))); + } + } + + @Override + public boolean invokeAutoPopup(@NotNull PsiElement position, char typeChar) { + return true; + } +} + 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 b9cf423190d5..3dde551991e6 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 @@ -17,24 +17,21 @@ package com.intellij.openapi.vcs.changes.ui; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; -import com.intellij.openapi.editor.ex.EditorEx; -import com.intellij.openapi.fileTypes.FileTypes; +import com.intellij.openapi.editor.event.DocumentAdapter; +import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.fileTypes.PlainTextLanguage; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vcs.changes.ChangeListCompletionContributor; 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.ui.ColoredListCellRenderer; -import com.intellij.ui.EditorTextField; -import com.intellij.ui.SimpleTextAttributes; -import com.intellij.ui.StringComboboxEditor; -import com.intellij.util.ArrayUtil; +import com.intellij.ui.*; import com.intellij.util.NullableConsumer; import com.intellij.util.ObjectUtils; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,10 +41,6 @@ import java.awt.*; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import static com.intellij.codeInsight.completion.ComboEditorCompletionContributor.CONTINUE_RUN_COMPLETION; public class ChangeListChooserPanel extends JPanel { @@ -61,18 +54,18 @@ public class ChangeListChooserPanel extends JPanel { public ChangeListChooserPanel(final Project project, @NotNull final NullableConsumer okEnabledListener) { super(new BorderLayout()); myProject = project; - myExistingListsCombo = new MyEditorComboBox(project); + myExistingListsCombo = new MyEditorComboBox(); myExistingListsCombo.setEditable(true); - myExistingListsCombo.setRenderer(new ColoredListCellRenderer() { + myExistingListsCombo.setRenderer(new ColoredListCellRenderer() { + @Override - protected void customizeCellRenderer(@NotNull JList list, - String value, + protected void customizeCellRenderer(@NotNull JList list, + ChangeList value, int index, boolean selected, boolean hasFocus) { if (value != null) { - String name = value; - LocalChangeList changeList = ChangeListManager.getInstance(myProject).findChangeList(name); + String name = value.getName(); int visibleWidth = getSize().width; if (visibleWidth == 0) { visibleWidth = MyEditorComboBox.PREF_WIDTH; @@ -86,7 +79,7 @@ public class ChangeListChooserPanel extends JPanel { name = truncated + " .."; } } - append(name, changeList != null && changeList.isDefault() + append(name, value instanceof LocalChangeList && ((LocalChangeList)value).isDefault() ? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES : SimpleTextAttributes.REGULAR_ATTRIBUTES); } @@ -141,20 +134,19 @@ public class ChangeListChooserPanel extends JPanel { } public void setChangeLists(Collection changeLists) { - List changelistNames = ContainerUtil.map(changeLists, ChangeList::getName); - Collections.sort(changelistNames); - myExistingListsCombo.setModel(new DefaultComboBoxModel<>(ArrayUtil.toStringArray(changelistNames))); + myExistingListsCombo.setModel(new DefaultComboBoxModel<>(changeLists.toArray(new ChangeList[changeLists.size()]))); } public void setSuggestedName(@NotNull String name) { if (StringUtil.isEmptyOrSpaces(name)) return; - if (getExistingChangelistByName(name) != null) { - myExistingListsCombo.setSelectedItem(name); + LocalChangeList changelistByName = getExistingChangelistByName(name); + if (changelistByName != null) { + myExistingListsCombo.setSelectedItem(changelistByName); } else { myNewNameSuggested = true; if (VcsConfiguration.getInstance(myProject).PRESELECT_EXISTING_CHANGELIST) { - myExistingListsCombo.insertItemAt(name, 0); + myExistingListsCombo.insertItemAt(LocalChangeList.createEmptyChangeList(myProject, name), 0); selectActiveChangeListIfExist(); } else { @@ -165,7 +157,7 @@ public class ChangeListChooserPanel extends JPanel { } private void selectActiveChangeListIfExist() { - myExistingListsCombo.setSelectedItem(ChangeListManager.getInstance(myProject).getDefaultChangeList().getName()); + myExistingListsCombo.setSelectedItem(ChangeListManager.getInstance(myProject).getDefaultChangeList()); } public void updateEnabled() { @@ -210,7 +202,7 @@ public class ChangeListChooserPanel extends JPanel { selectActiveChangeListIfExist(); } else { - myExistingListsCombo.setSelectedItem(defaultSelection.getName()); + myExistingListsCombo.setSelectedItem(defaultSelection); } updateDescription(); updateEnabled(); @@ -230,27 +222,33 @@ public class ChangeListChooserPanel extends JPanel { } public JComponent getPreferredFocusedComponent() { - return myExistingListsCombo; + return myExistingListsCombo.getEditorTextField(); } - private static class MyEditorComboBox extends ComboBox { + private class MyEditorComboBox extends ComboBox { private static final int PREF_WIDTH = 200; + private final LanguageTextField myEditorTextField; - public MyEditorComboBox(Project project) { + public MyEditorComboBox() { super(PREF_WIDTH); - setEditor(new StringComboboxEditor(project, FileTypes.PLAIN_TEXT, this) { + myEditorTextField = new LanguageTextField(PlainTextLanguage.INSTANCE, myProject, ""); + JLabel label = new JLabel(" "); + myEditorTextField.addDocumentListener(new DocumentAdapter() { @Override - protected void onEditorCreate(EditorEx editor) { - super.onEditorCreate(editor); - getDocument().putUserData(CONTINUE_RUN_COMPLETION, true); + public void documentChanged(DocumentEvent e) { + String changeListName = e.getDocument().getText(); + label.setText(StringUtil.isEmptyOrSpaces(changeListName) + ? " " : getExistingChangelistByName(changeListName) != null ? " Existing " : " New "); } }); + ObjectUtils.assertNotNull(myEditorTextField.getDocument()).putUserData(ChangeListCompletionContributor.COMBO_BOX_KEY, this); + setEditor(new ComboBoxCompositeEditor<>(myEditorTextField, label)); } @NotNull private EditorTextField getEditorTextField() { - return ObjectUtils.assertNotNull((EditorTextField)getEditor().getEditorComponent()); + return myEditorTextField; } } }