IDEA-80690 Live Template with matched prefix should be at top of popup window
authorpeter <peter@jetbrains.com>
Wed, 1 Feb 2012 15:32:30 +0000 (16:32 +0100)
committerpeter <peter@jetbrains.com>
Wed, 1 Feb 2012 15:50:51 +0000 (16:50 +0100)
platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java
platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateListPanel.java

index aed9467de684ede81b7a4b623d1c46ec0914ffeb..5171bfca10a18fb05f77231d989e37f813bce70f 100644 (file)
@@ -71,6 +71,7 @@ public class ListTemplatesHandler implements CodeInsightActionHandler {
       return;
     }
 
+    Collections.sort(matchingTemplates, TemplateListPanel.TEMPLATE_COMPARATOR);
     showTemplatesLookup(project, editor, prefix, matchingTemplates);
   }
 
@@ -78,6 +79,30 @@ public class ListTemplatesHandler implements CodeInsightActionHandler {
                                          @NotNull String prefix, List<TemplateImpl> matchingTemplates) {
 
     final LookupImpl lookup = (LookupImpl)LookupManager.getInstance(project).createLookup(editor, LookupElement.EMPTY_ARRAY, prefix, LookupArranger.DEFAULT);
+    lookup.setArranger(new LookupArranger() {
+      /*
+      @Override
+      public Comparator<LookupElement> getItemComparator() {
+        return new Comparator<LookupElement>() {
+          @Override
+          public int compare(LookupElement o1, LookupElement o2) {
+            return o1.getLookupString().compareToIgnoreCase(o2.getLookupString());
+          }
+        };
+      }
+      */
+
+      @Override
+      public Classifier<LookupElement> createRelevanceClassifier() {
+        return new ComparingClassifier<LookupElement>(ClassifierFactory.<LookupElement>listClassifier(), "preferPrefix") {
+          @NotNull
+          @Override
+          public Comparable getWeight(LookupElement element) {
+            return !element.getLookupString().startsWith(lookup.itemPattern(element));
+          }
+        };
+      }
+    });
     for (TemplateImpl template : matchingTemplates) {
       lookup.addItem(createTemplateElement(template), new PlainPrefixMatcher(prefix));
     }
index 412d38f4c0c2cdf3d31d5c4f087897852b9b2030..8dba15828b5de82fd38fa32fafc7d2ed83d155f4 100644 (file)
@@ -63,6 +63,11 @@ public class TemplateListPanel extends JPanel implements Disposable {
   private static final String TEMPLATE_SETTINGS = "TemplateSettings";
   private static final TemplateImpl MOCK_TEMPLATE = new TemplateImpl("mockTemplate-xxx", "mockTemplateGroup-yyy");
   public static final String ABBREVIATION = "<abbreviation>";
+  public static final Comparator<TemplateImpl> TEMPLATE_COMPARATOR = new Comparator<TemplateImpl>() {
+    public int compare(final TemplateImpl o1, final TemplateImpl o2) {
+      return o1.getKey().compareToIgnoreCase(o2.getKey());
+    }
+  };
 
   static {
     MOCK_TEMPLATE.setString("");
@@ -485,7 +490,7 @@ public class TemplateListPanel extends JPanel implements Disposable {
 
     TreePath[] paths = myTree.getSelectionPaths();
     if (paths == null) return;
-    
+
     for (TreePath path : paths) {
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
       Object o = node.getUserObject();
@@ -652,7 +657,7 @@ public class TemplateListPanel extends JPanel implements Disposable {
         }
       })
       .install();
-    
+
     if (myTemplateGroups.size() > 0) {
       myTree.setSelectionInterval(0, 0);
     }
@@ -770,10 +775,10 @@ public class TemplateListPanel extends JPanel implements Disposable {
 
         if (enabled) {
           Set<String> oldGroups = getAllGroups(templates);
-          
+
           removeAll();
           SchemesManager<TemplateGroup, TemplateGroup> schemesManager = TemplateSettings.getInstance().getSchemesManager();
-          
+
           for (TemplateGroup group : getTemplateGroups()) {
             final String newGroupName = group.getName();
             if (!oldGroups.contains(newGroupName) && !schemesManager.isShared(group)) {
@@ -976,11 +981,7 @@ public class TemplateListPanel extends JPanel implements Disposable {
 
   private void addTemplateNodes(TemplateGroup group, CheckedTreeNode groupNode) {
     List<TemplateImpl> templates = new ArrayList<TemplateImpl>(group.getElements());
-    Collections.sort(templates, new Comparator<TemplateImpl>() {
-      public int compare(final TemplateImpl o1, final TemplateImpl o2) {
-        return o1.getKey().compareToIgnoreCase(o2.getKey());
-      }
-    });
+    Collections.sort(templates, TEMPLATE_COMPARATOR);
     for (final TemplateImpl template : templates) {
       myTemplateOptions.put(getKey(template), template.createOptions());
       myTemplateContext.put(getKey(template), template.createContext());