refactor CreateFromTemplateAction to use a more natural builder API pycharm/96.674
authorDmitry Jemerov <yole@jetbrains.com>
Sat, 17 Jul 2010 12:49:47 +0000 (16:49 +0400)
committerDmitry Jemerov <yole@jetbrains.com>
Sat, 17 Jul 2010 15:45:48 +0000 (19:45 +0400)
java/java-impl/src/com/intellij/ide/actions/CreateClassAction.java
platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java
platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java
plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java
plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewScriptAction.java
xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java

index 7b5bd8d35b4f524745da5de9bbfac8a336af1117..b2a8c3692d6f2efb8e3bbec189474f3e89c9017a 100644 (file)
@@ -39,18 +39,16 @@ public class CreateClassAction extends CreateTemplateInPackageAction<PsiClass> {
     super(IdeBundle.message("action.create.new.class"), IdeBundle.message("action.create.new.class"), Icons.CLASS_ICON, true);
   }
 
-  @NotNull
   @Override
-  protected CreateFileFromTemplateDialog.Builder buildDialog(Project project, final PsiDirectory directory) {
-    final CreateFileFromTemplateDialog.Builder builder = CreateFileFromTemplateDialog.
-      createDialog(project, IdeBundle.message("action.create.new.class"));
-    builder.addKind("Class", Icons.CLASS_ICON, JavaTemplateUtil.INTERNAL_CLASS_TEMPLATE_NAME);
-    builder.addKind("Interface", Icons.INTERFACE_ICON, JavaTemplateUtil.INTERNAL_INTERFACE_TEMPLATE_NAME);
+  protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) {
+    builder
+      .setTitle(IdeBundle.message("action.create.new.class"))
+      .addKind("Class", Icons.CLASS_ICON, JavaTemplateUtil.INTERNAL_CLASS_TEMPLATE_NAME)
+      .addKind("Interface", Icons.INTERFACE_ICON, JavaTemplateUtil.INTERNAL_INTERFACE_TEMPLATE_NAME);
     if (LanguageLevelProjectExtension.getInstance(project).getLanguageLevel().compareTo(LanguageLevel.JDK_1_5) >= 0) {
       builder.addKind("Enum", Icons.ENUM_ICON, JavaTemplateUtil.INTERNAL_ENUM_TEMPLATE_NAME);
       builder.addKind("Annotation", Icons.ANNOTATION_TYPE_ICON, JavaTemplateUtil.INTERNAL_ANNOTATION_TYPE_TEMPLATE_NAME);
     }
-    return builder;
   }
 
   @Override
index e0ebf8406db852c1863f4581f6316813996f98e6..b90e2dfc4f182482d13938253573441065e85b5a 100644 (file)
@@ -49,7 +49,7 @@ public class CreateFileFromTemplateDialog extends DialogWrapper {
 
   private ElementCreator myCreator;
 
-  private CreateFileFromTemplateDialog(@NotNull Project project, @NotNull final String title) {
+  private CreateFileFromTemplateDialog(@NotNull Project project) {
     super(project, true);
 
     myKindCombo.setRenderer(new DefaultListCellRenderer() {
@@ -63,8 +63,7 @@ public class CreateFileFromTemplateDialog extends DialogWrapper {
       }
     });
 
-    setTitle(title);
-    //myNameLabel.setText(prompt);
+      //myNameLabel.setText(prompt);
 
     new ComboboxSpeedSearch(myKindCombo) {
       @Override
@@ -132,11 +131,17 @@ public class CreateFileFromTemplateDialog extends DialogWrapper {
     return myNameField;
   }
 
-  public static <T extends PsiElement> Builder createDialog(@NotNull final Project project, @NotNull final String title) {
-    final CreateFileFromTemplateDialog dialog = new CreateFileFromTemplateDialog(project, title);
+  public static <T extends PsiElement> Builder createDialog(@NotNull final Project project) {
+    final CreateFileFromTemplateDialog dialog = new CreateFileFromTemplateDialog(project);
 
     return new Builder() {
 
+      @Override
+      public Builder setTitle(String title) {
+        dialog.setTitle(title);
+        return this;
+      }
+
       public Builder addKind(@NotNull String name, @Nullable Icon icon, @NotNull String templateName) {
         dialog.myKindCombo.addItem(new Trinity<String, Icon, String>(name, icon, templateName));
         return this;
@@ -190,6 +195,7 @@ public class CreateFileFromTemplateDialog extends DialogWrapper {
   }
 
   public interface Builder {
+    Builder setTitle(String title);
     Builder addKind(@NotNull String kind, @Nullable Icon icon, @NotNull String templateName);
     @Nullable
     <T extends PsiElement> T show(@NotNull String errorTitle, @Nullable String selectedItem, @NotNull FileCreator<T> creator);
index 1b2f86462e3ea6a50a4f3d7a24962b4e21992cd3..0ea583945b6e5c69c40dec2991aa008035976d6b 100644 (file)
  */
 package com.intellij.ide.actions;
 
+import com.intellij.CommonBundle;
 import com.intellij.ide.IdeView;
+import com.intellij.ide.fileTemplates.FileTemplate;
+import com.intellij.ide.fileTemplates.FileTemplateManager;
+import com.intellij.ide.fileTemplates.FileTemplateUtil;
 import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.fileEditor.FileEditorManager;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiDirectory;
 import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.util.IncorrectOperationException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -29,10 +38,37 @@ import javax.swing.*;
  * @author Eugene.Kudelevsky
  */
 public abstract class CreateFromTemplateAction<T extends PsiElement> extends AnAction {
+  private static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.CreateFromTemplateAction");
+
   public CreateFromTemplateAction(String text, String description, Icon icon) {
     super(text, description, icon);
   }
 
+  protected static PsiFile createFileFromTemplate(String name, String templateName, PsiDirectory dir) {
+    final FileTemplate template = FileTemplateManager.getInstance().getInternalTemplate(templateName);
+
+    PsiElement element;
+    try {
+      element = FileTemplateUtil
+        .createFromTemplate(template, name, FileTemplateManager.getInstance().getDefaultProperties(), dir);
+      final PsiFile psiFile = element.getContainingFile();
+
+      final VirtualFile virtualFile = psiFile.getVirtualFile();
+      if (virtualFile != null) {
+        FileEditorManager.getInstance(dir.getProject()).openFile(virtualFile, true);
+        return psiFile;
+      }
+    }
+    catch (IncorrectOperationException e) {
+      throw e;
+    }
+    catch (Exception e) {
+      LOG.error(e);
+    }
+
+    return null;
+  }
+
   public final void actionPerformed(final AnActionEvent e) {
     final DataContext dataContext = e.getDataContext();
 
@@ -44,10 +80,13 @@ public abstract class CreateFromTemplateAction<T extends PsiElement> extends AnA
     final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
 
     final PsiDirectory dir = view.getOrChooseDirectory();
-    if (dir == null) return;
+    if (dir == null || project == null) return;
+
+    final CreateFileFromTemplateDialog.Builder builder = CreateFileFromTemplateDialog.createDialog(project);
+    buildDialog(project, dir, builder);
 
     final T createdElement =
-      buildDialog(project, dir).show(getErrorTitle(), getDefaultTempalteName(dir), new CreateFileFromTemplateDialog.FileCreator<T>() {
+      builder.show(getErrorTitle(), getDefaultTemplateName(dir), new CreateFileFromTemplateDialog.FileCreator<T>() {
         public void checkBeforeCreate(@NotNull String name, @NotNull String templateName) {
           CreateFromTemplateAction.this.checkBeforeCreate(name, templateName, dir);
         }
@@ -71,11 +110,10 @@ public abstract class CreateFromTemplateAction<T extends PsiElement> extends AnA
 
   protected abstract void checkBeforeCreate(String name, String templateName, PsiDirectory dir);
 
-  @NotNull
-  protected abstract CreateFileFromTemplateDialog.Builder buildDialog(Project project, PsiDirectory directory);
+  protected abstract void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder);
 
   @Nullable
-  protected String getDefaultTempalteName(@NotNull PsiDirectory dir) {
+  protected String getDefaultTemplateName(@NotNull PsiDirectory dir) {
     return null;
   }
 
@@ -97,5 +135,7 @@ public abstract class CreateFromTemplateAction<T extends PsiElement> extends AnA
 
   protected abstract String getActionName(PsiDirectory directory, String newName, String templateName);
 
-  protected abstract String getErrorTitle();
+  protected String getErrorTitle() {
+    return CommonBundle.getErrorTitle();
+  }
 }
index 17ad85067580b7331099b5eabc6c6cb115c9c187..b9a7476295955e0ae8edc19b6ea1f4d0cec8424e 100644 (file)
@@ -16,7 +16,6 @@
 
 package org.jetbrains.plugins.groovy.actions;
 
-import com.intellij.CommonBundle;
 import com.intellij.ide.actions.CreateFileFromTemplateDialog;
 import com.intellij.ide.actions.CreateTemplateInPackageAction;
 import com.intellij.openapi.actionSystem.DataContext;
@@ -38,16 +37,14 @@ public class NewGroovyClassAction extends CreateTemplateInPackageAction<GrTypeDe
     super(GroovyBundle.message("newclass.menu.action.text"), GroovyBundle.message("newclass.menu.action.description"), GroovyIcons.CLASS, true);
   }
 
-  @NotNull
   @Override
-  protected CreateFileFromTemplateDialog.Builder buildDialog(Project project, final PsiDirectory directory) {
-    final CreateFileFromTemplateDialog.Builder builder = CreateFileFromTemplateDialog.
-      createDialog(project, GroovyBundle.message("newclass.dlg.title"));
-    builder.addKind("Class", GroovyIcons.CLASS, "GroovyClass.groovy");
-    builder.addKind("Interface", GroovyIcons.INTERFACE, "GroovyInterface.groovy");
-    builder.addKind("Enum", GroovyIcons.ENUM, "GroovyEnum.groovy");
-    builder.addKind("Annotation", GroovyIcons.ANNOTATION_TYPE, "GroovyAnnotation.groovy");
-    return builder;
+  protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) {
+    builder
+      .setTitle(GroovyBundle.message("newclass.dlg.title"))
+      .addKind("Class", GroovyIcons.CLASS, "GroovyClass.groovy")
+      .addKind("Interface", GroovyIcons.INTERFACE, "GroovyInterface.groovy")
+      .addKind("Enum", GroovyIcons.ENUM, "GroovyEnum.groovy")
+      .addKind("Annotation", GroovyIcons.ANNOTATION_TYPE, "GroovyAnnotation.groovy");
   }
 
   @Override
@@ -60,10 +57,6 @@ public class NewGroovyClassAction extends CreateTemplateInPackageAction<GrTypeDe
     return GroovyBundle.message("newclass.menu.action.text");
   }
 
-  protected String getErrorTitle() {
-    return CommonBundle.getErrorTitle();
-  }
-
   @Override
   protected PsiElement getNavigationElement(@NotNull GrTypeDefinition createdElement) {
     return createdElement.getLBraceGroovy();
index a8b11bc9f98ab3518daa2e34cf7d9c737129f84e..3d5a251ba14cd2854d492e83b8b4689781aa8c6b 100644 (file)
@@ -16,7 +16,6 @@
 
 package org.jetbrains.plugins.groovy.actions;
 
-import com.intellij.CommonBundle;
 import com.intellij.ide.actions.CreateFileFromTemplateDialog;
 import com.intellij.ide.actions.CreateTemplateInPackageAction;
 import com.intellij.openapi.actionSystem.DataContext;
@@ -41,14 +40,12 @@ public class NewScriptAction extends CreateTemplateInPackageAction<GroovyFile> i
     super(GroovyBundle.message("newscript.menu.action.text"), GroovyBundle.message("newscript.menu.action.description"), GroovyIcons.GROOVY_ICON_16x16, false);
   }
 
-  @NotNull
   @Override
-  protected CreateFileFromTemplateDialog.Builder buildDialog(Project project, final PsiDirectory directory) {
-    final CreateFileFromTemplateDialog.Builder builder = CreateFileFromTemplateDialog.
-      createDialog(project, GroovyBundle.message("newscript.dlg.prompt"));
-    builder.addKind("Groovy script", GroovyIcons.GROOVY_ICON_16x16, "GroovyScript.groovy");
-    builder.addKind("GroovyDSL script", GroovyIcons.GROOVY_ICON_16x16, GROOVY_DSL_SCRIPT_TMPL);
-    return builder;
+  protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) {
+    builder
+      .setTitle(GroovyBundle.message("newscript.dlg.prompt"))
+      .addKind("Groovy script", GroovyIcons.GROOVY_ICON_16x16, "GroovyScript.groovy")
+      .addKind("GroovyDSL script", GroovyIcons.GROOVY_ICON_16x16, GROOVY_DSL_SCRIPT_TMPL);
   }
 
   @Override
@@ -61,10 +58,6 @@ public class NewScriptAction extends CreateTemplateInPackageAction<GroovyFile> i
     return GroovyBundle.message("newscript.menu.action.text");
   }
 
-  protected String getErrorTitle() {
-    return CommonBundle.getErrorTitle();
-  }
-
   @Override
   protected PsiElement getNavigationElement(@NotNull GroovyFile createdFile) {
     return createdFile.getLastChild();
index 58411b069053777edb9dfed03d2ee5f38261c91d..8b0d6f269e905f89b6beb28ba92bc042c64b358b 100644 (file)
  */
 package com.intellij.ide.actions;
 
-import com.intellij.CommonBundle;
-import com.intellij.ide.fileTemplates.FileTemplate;
 import com.intellij.ide.fileTemplates.FileTemplateManager;
-import com.intellij.ide.fileTemplates.FileTemplateUtil;
 import com.intellij.ide.util.PropertiesComponent;
 import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.fileEditor.FileEditorManager;
 import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiDirectory;
-import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
-import com.intellij.util.IncorrectOperationException;
 import com.intellij.xml.XmlBundle;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
@@ -49,28 +42,7 @@ public class CreateHtmlFileAction extends CreateFromTemplateAction<PsiFile> {
   protected PsiFile createFile(String name, String templateName, PsiDirectory dir) {
     PropertiesComponent.getInstance(dir.getProject()).setValue(DEFAULT_HTML_TEMPLATE_PROPERTY, templateName);
 
-    final FileTemplate template = FileTemplateManager.getInstance().getInternalTemplate(templateName);
-
-    PsiElement element;
-    try {
-      element = FileTemplateUtil
-        .createFromTemplate(template, name, FileTemplateManager.getInstance().getDefaultProperties(), dir);
-      final PsiFile psiFile = element.getContainingFile();
-
-      final VirtualFile virtualFile = psiFile.getVirtualFile();
-      if (virtualFile != null) {
-        FileEditorManager.getInstance(dir.getProject()).openFile(virtualFile, true);
-        return psiFile;
-      }
-    }
-    catch (IncorrectOperationException e) {
-      throw e;
-    }
-    catch (Exception e) {
-      LOG.error(e);
-    }
-
-    return null;
+    return createFileFromTemplate(name, templateName, dir);
   }
 
   @Override
@@ -78,19 +50,17 @@ public class CreateHtmlFileAction extends CreateFromTemplateAction<PsiFile> {
     dir.checkCreateFile(name);
   }
 
-  @NotNull
   @Override
-  protected CreateFileFromTemplateDialog.Builder buildDialog(Project project, PsiDirectory directory) {
-    final CreateFileFromTemplateDialog.Builder builder =
-      CreateFileFromTemplateDialog.createDialog(project, XmlBundle.message("new.html.file.action"));
-    builder.addKind("HTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML_TEMPLATE_NAME);
-    builder.addKind("HTML5 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML5_TEMPLATE_NAME);
-    builder.addKind("XHTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_XHTML_TEMPLATE_NAME);
-    return builder;
+  protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) {
+    builder
+      .setTitle(XmlBundle.message("new.html.file.action"))
+      .addKind("HTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML_TEMPLATE_NAME)
+      .addKind("HTML5 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML5_TEMPLATE_NAME)
+      .addKind("XHTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_XHTML_TEMPLATE_NAME);
   }
 
   @Override
-  protected String getDefaultTempalteName(@NotNull PsiDirectory dir) {
+  protected String getDefaultTemplateName(@NotNull PsiDirectory dir) {
     return PropertiesComponent.getInstance(dir.getProject()).getValue(DEFAULT_HTML_TEMPLATE_PROPERTY);
   }
 
@@ -98,9 +68,4 @@ public class CreateHtmlFileAction extends CreateFromTemplateAction<PsiFile> {
   protected String getActionName(PsiDirectory directory, String newName, String templateName) {
     return XmlBundle.message("new.html.file.action");
   }
-
-  @Override
-  protected String getErrorTitle() {
-    return CommonBundle.getErrorTitle();
-  }
 }