From 58bb0b0706ff4b9f54e7e1dc74c87cf0aa13a363 Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Mon, 23 Nov 2009 20:04:59 +0300 Subject: [PATCH] filtered popup instead of speedsearch --- .../inject/InjectLanguageAction.java | 90 ++++++------------- 1 file changed, 28 insertions(+), 62 deletions(-) diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java index fd2d1e6f9ece..eb42a8a5cb17 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java @@ -27,6 +27,7 @@ import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; +import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.Pair; @@ -36,6 +37,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.FileContentUtil; +import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.ui.EmptyIcon; @@ -45,7 +47,9 @@ import org.jetbrains.annotations.Nullable; import org.intellij.plugins.intelliLang.Configuration; import javax.swing.*; +import java.awt.*; import java.util.*; +import java.util.List; public class InjectLanguageAction implements IntentionAction { @NonNls protected static final String INJECT_LANGUAGE_FAMILY = "Inject Language"; @@ -108,23 +112,31 @@ public class InjectLanguageAction implements IntentionAction { final String[] langIds = InjectedLanguage.getAvailableLanguageIDs(); Arrays.sort(langIds); - final Map> map = new LinkedHashMap>(); - buildLanguageTree(langIds, map); - - final BaseListPopupStep step = new MyPopupStep(map, new ArrayList(map.keySet()), onChosen); - - final ListPopup listPopup = JBPopupFactory.getInstance().createListPopup(step); - listPopup.showInBestPositionFor(DataManager.getInstance().getDataContext()); - return true; - } - - - private static void buildLanguageTree(String[] langIds, Map> map) { - for (final String id : langIds) { - if (!map.containsKey(id)) { - map.put(id, new ArrayList()); + final JList list = new JList(langIds); + list.setCellRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + final String aValue = (String)value; + final Language language = InjectedLanguage.findLanguageById(aValue); + assert language != null; + final FileType ft = language.getAssociatedFileType(); + setIcon(ft != null ? ft.getIcon() : new EmptyIcon(16)); + setText(value + (ft != null ? " (" + ft.getDescription() + ")" : "")); + return this; } - } + }); + new PopupChooserBuilder(list).setItemChoosenCallback(new Runnable() { + public void run() { + final String string = (String)list.getSelectedValue(); + onChosen.process(string); + } + }).setFilteringEnabled(new Function() { + public String fun(Object o) { + return (String)o; + } + }).createPopup().showInBestPositionFor(DataManager.getInstance().getDataContext()); + return true; } public boolean startInWriteAction() { @@ -134,50 +146,4 @@ public class InjectLanguageAction implements IntentionAction { public static boolean doEditConfigurable(final Project project, final Configurable configurable) { return true; //ShowSettingsUtil.getInstance().editConfigurable(project, configurable); } - - private static class MyPopupStep extends BaseListPopupStep { - private final Map> myMap; - private final Processor myFinalStepProcessor; - - public MyPopupStep(final Map> map, final List values, final Processor finalStepProcessor) { - super("Choose Language", values); - myMap = map; - myFinalStepProcessor = finalStepProcessor; - } - - @Override - public PopupStep onChosen(final String selectedValue, boolean finalChoice) { - if (finalChoice) { - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - myFinalStepProcessor.process(selectedValue); - } - }); - return FINAL_CHOICE; - } - return new MyPopupStep(myMap, myMap.get(selectedValue), myFinalStepProcessor); - } - - @Override - public boolean hasSubstep(String selectedValue) { - return myMap.containsKey(selectedValue) && !myMap.get(selectedValue).isEmpty(); - } - - @Override - public Icon getIconFor(String aValue) { - final Language language = InjectedLanguage.findLanguageById(aValue); - assert language != null; - final FileType ft = language.getAssociatedFileType(); - return ft != null ? ft.getIcon() : new EmptyIcon(16); - } - - @NotNull - @Override - public String getTextFor(String value) { - final Language language = InjectedLanguage.findLanguageById(value); - assert language != null; - final FileType ft = language.getAssociatedFileType(); - return value + (ft != null ? " ("+ft.getDescription()+")" : ""); - } - } }