IDEA-155205 Do not show "Use static import if possible" for live templates in all...
authorpeter <peter@jetbrains.com>
Sun, 1 May 2016 15:03:14 +0000 (17:03 +0200)
committerpeter <peter@jetbrains.com>
Mon, 2 May 2016 06:58:54 +0000 (08:58 +0200)
java/java-impl/src/com/intellij/codeInsight/template/impl/CodeBlockReformattingProcessor.java
java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenFQNamesProcessor.java
java/java-impl/src/com/intellij/codeInsight/template/impl/ShortenToStaticImportProcessor.java
platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateSettingsEditor.java
platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateOptionalProcessor.java
plugins/groovy/src/org/jetbrains/plugins/groovy/template/GroovyShortenFQNamesProcessor.java

index eb43ea47049310dfb550c009a3be75f80fb8f486..95947598d2cf6a28fe25aaddccd5673d0b659a68 100644 (file)
@@ -26,6 +26,7 @@ import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.psi.util.PsiUtilBase;
 import com.intellij.util.text.CharArrayUtil;
 import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * @author peter
@@ -74,7 +75,7 @@ public class CodeBlockReformattingProcessor implements TemplateOptionalProcessor
   }
 
   @Override
-  public boolean isVisible(Template template) {
+  public boolean isVisible(@NotNull Template template, @NotNull TemplateContext context) {
     return false;
   }
 }
index 3304e84cfe113e563a5a9a8c08c845ef6c3df018..0f0cc27aad2c0deacd36229da7cf921e379282f0 100644 (file)
@@ -64,8 +64,4 @@ public class ShortenFQNamesProcessor implements TemplateOptionalProcessor {
     template.setToShortenLongNames(value);
   }
 
-  @Override
-  public boolean isVisible(Template template) {
-    return true;
-  }
 }
index fbb6786c49722a570f7ea084b60bb7537d4ca676..3187bb18a2e248fa9266de4a08a357df0a08b057 100644 (file)
@@ -18,7 +18,10 @@ package com.intellij.codeInsight.template.impl;
 import com.intellij.codeInsight.CodeInsightBundle;
 import com.intellij.codeInsight.intention.impl.AddOnDemandStaticImportAction;
 import com.intellij.codeInsight.intention.impl.AddSingleMemberStaticImportAction;
+import com.intellij.codeInsight.template.JavaCodeContextType;
+import com.intellij.codeInsight.template.JavaCommentContextType;
 import com.intellij.codeInsight.template.Template;
+import com.intellij.codeInsight.template.TemplateContextType;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.editor.RangeMarker;
@@ -98,8 +101,14 @@ public class ShortenToStaticImportProcessor implements TemplateOptionalProcessor
   }
 
   @Override
-  public boolean isVisible(Template template) {
-    return true;
+  public boolean isVisible(@NotNull Template template, @NotNull TemplateContext context) {
+    for (TemplateContextType contextType : TemplateContextType.EP_NAME.getExtensions()) {
+      if (!context.isEnabled(contextType)) continue;
+      if (contextType instanceof JavaCodeContextType || contextType instanceof JavaCommentContextType) {
+        return true;
+      }
+    }
+    return false;
   }
   
   private interface StaticImporter {
index 6741ee3d8257e30eb42d3a3250b3769a61d595e1..3f1218c0ac70ce69aba50a28b4700263dddda96c 100644 (file)
@@ -84,6 +84,7 @@ public class LiveTemplateSettingsEditor extends JPanel {
   private final TemplateContext myContext;
   private JBPopup myContextPopup;
   private Dimension myLastSize;
+  private JPanel myTemplateOptionsPanel;
 
   public LiveTemplateSettingsEditor(TemplateImpl template,
                                     final String defaultShortcut,
@@ -165,7 +166,9 @@ public class LiveTemplateSettingsEditor extends JPanel {
     myEditVariablesButton.setMaximumSize(myEditVariablesButton.getPreferredSize());
     panel.add(myEditVariablesButton, gb.next().weighty(0));
 
-    panel.add(createTemplateOptionsPanel(), gb.nextLine().next().next().coverColumn(2).weighty(1));
+    myTemplateOptionsPanel = new JPanel(new BorderLayout());
+    myTemplateOptionsPanel.add(createTemplateOptionsPanel());
+    panel.add(myTemplateOptionsPanel, gb.nextLine().next().next().coverColumn(2).weighty(1));
 
     panel.add(createShortContextPanel(allowNoContexts), gb.nextLine().next().weighty(0).fillCellNone().anchor(GridBagConstraints.WEST));
 
@@ -240,7 +243,7 @@ public class LiveTemplateSettingsEditor extends JPanel {
 
     gbConstraints.gridx = 1;
     gbConstraints.insets = new Insets(0, 4, 0, 0);
-    myExpandByCombo = new ComboBox(new String[]{myDefaultShortcutItem, SPACE, TAB, ENTER});
+    myExpandByCombo = new ComboBox<String>(new String[]{myDefaultShortcutItem, SPACE, TAB, ENTER});
     myExpandByCombo.addItemListener(new ItemListener() {
       @Override
       public void itemStateChanged(@NotNull ItemEvent e) {
@@ -274,17 +277,12 @@ public class LiveTemplateSettingsEditor extends JPanel {
     panel.add(myCbReformat, gbConstraints);
 
     for (final TemplateOptionalProcessor processor: myOptions.keySet()) {
-      if (!processor.isVisible(myTemplate)) continue;
+      if (!processor.isVisible(myTemplate, myContext)) continue;
       gbConstraints.gridy++;
       final JCheckBox cb = new JCheckBox(processor.getOptionName());
       panel.add(cb, gbConstraints);
       cb.setSelected(myOptions.get(processor).booleanValue());
-      cb.addActionListener(new ActionListener() {
-        @Override
-        public void actionPerformed(@NotNull ActionEvent e) {
-          myOptions.put(processor, cb.isSelected());
-        }
-      });
+      cb.addActionListener(e -> myOptions.put(processor, cb.isSelected()));
     }
 
     gbConstraints.weighty = 1;
@@ -347,6 +345,9 @@ public class LiveTemplateSettingsEditor extends JPanel {
         ctxLabel.setText(StringUtil.first(contexts, 100, true));
         ctxLabel.setForeground(noContexts ? allowNoContexts ? JBColor.GRAY : JBColor.RED : UIUtil.getLabelForeground());
         change.setText(noContexts ? "Define" : "Change");
+
+        myTemplateOptionsPanel.removeAll();
+        myTemplateOptionsPanel.add(createTemplateOptionsPanel());
       }
     };
 
index 97259b5260b317c2cbf892bdb2589661a53c25af..202995127ccfde38309d2db576dc5c2366c585a3 100644 (file)
@@ -23,19 +23,54 @@ import com.intellij.openapi.editor.RangeMarker;
 import com.intellij.openapi.extensions.ExtensionPointName;
 import com.intellij.openapi.project.Project;
 import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
 
 /**
+ * An extension controlling aspects of Live Template insertion, like reformatting, adding imports, etc. {@link #getOptionName()} allows
+ * to show a checkbox to enable/disable specific such aspect in Live Template settings, {@link #processText} does the actual
+ * modifications during live template expansion.
  * @author yole
  */
 public interface TemplateOptionalProcessor {
   ExtensionPointName<TemplateOptionalProcessor> EP_NAME = ExtensionPointName.create("com.intellij.liveTemplateOptionalProcessor");
 
+  /**
+   * Invoked inside a write action when a live template is finished.
+   * Note that this happens even if the corresponding option is disabled, so the implementations
+   * should check themselves whether they have to perform any actions.
+   */
   void processText(final Project project, final Template template, final Document document, final RangeMarker templateRange, final Editor editor);
+
+  /**
+   * @return the text of a checkbox in Live Template settings controlling whether this option is enaled.
+   */
   @Nls
   String getOptionName();
 
+  /**
+   * @return whether this processor is enabled for a given template
+   */
   boolean isEnabled(final Template template);
+
+  /**
+   * Change whether this processor is enabled for a given template. It's invoked, for example, when a user changes the value of
+   * the corresponding checkbox in Live template settings.
+   */
   void setEnabled(Template template, boolean value);
 
-  boolean isVisible(final Template template);
+  /**
+   * @return whether a checkbox for this template should be shown in the configuration dialog, with the given template context.
+   */
+  default boolean isVisible(@NotNull Template template, @NotNull TemplateContext context) {
+    //noinspection deprecation
+    return isVisible(template);
+  }
+
+  /**
+   * @deprecated Please override {@link #isVisible(Template, TemplateContext)}
+   */
+  @SuppressWarnings("unused")
+  default boolean isVisible(final Template template) {
+    return true;
+  }
 }
index a132a024c5c365459ff001a139a3e8fd30aabc36..ae5c8d6a3eff6139d90b00888dda878039bb63c1 100644 (file)
@@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.template;
 
 import com.intellij.codeInsight.CodeInsightBundle;
 import com.intellij.codeInsight.template.Template;
+import com.intellij.codeInsight.template.impl.TemplateContext;
 import com.intellij.codeInsight.template.impl.TemplateOptionalProcessor;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Document;
@@ -28,6 +29,7 @@ import com.intellij.psi.PsiFile;
 import com.intellij.psi.codeStyle.JavaCodeStyleManager;
 import com.intellij.psi.util.PsiUtilBase;
 import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
 
 /**
@@ -72,7 +74,7 @@ public class GroovyShortenFQNamesProcessor implements TemplateOptionalProcessor
   }
 
   @Override
-  public boolean isVisible(Template template) {
+  public boolean isVisible(@NotNull Template template, @NotNull TemplateContext context) {
     return false;
   }
 }