From 7203ccf4565779160d8cbb2828b5d5fb733fbf6b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Sat, 17 Jul 2010 16:49:47 +0400 Subject: [PATCH] refactor CreateFromTemplateAction to use a more natural builder API --- .../ide/actions/CreateClassAction.java | 12 ++--- .../actions/CreateFileFromTemplateDialog.java | 16 ++++-- .../ide/actions/CreateFromTemplateAction.java | 52 ++++++++++++++++--- .../groovy/actions/NewGroovyClassAction.java | 21 +++----- .../groovy/actions/NewScriptAction.java | 17 ++---- .../ide/actions/CreateHtmlFileAction.java | 51 +++--------------- 6 files changed, 82 insertions(+), 87 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/actions/CreateClassAction.java b/java/java-impl/src/com/intellij/ide/actions/CreateClassAction.java index 7b5bd8d35b4f..b2a8c3692d6f 100644 --- a/java/java-impl/src/com/intellij/ide/actions/CreateClassAction.java +++ b/java/java-impl/src/com/intellij/ide/actions/CreateClassAction.java @@ -39,18 +39,16 @@ public class CreateClassAction extends CreateTemplateInPackageAction { 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 diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java index e0ebf8406db8..b90e2dfc4f18 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java @@ -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 Builder createDialog(@NotNull final Project project, @NotNull final String title) { - final CreateFileFromTemplateDialog dialog = new CreateFileFromTemplateDialog(project, title); + public static 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(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 show(@NotNull String errorTitle, @Nullable String selectedItem, @NotNull FileCreator creator); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java index 1b2f86462e3e..0ea583945b6e 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java @@ -15,11 +15,20 @@ */ 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 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 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() { + builder.show(getErrorTitle(), getDefaultTemplateName(dir), new CreateFileFromTemplateDialog.FileCreator() { public void checkBeforeCreate(@NotNull String name, @NotNull String templateName) { CreateFromTemplateAction.this.checkBeforeCreate(name, templateName, dir); } @@ -71,11 +110,10 @@ public abstract class CreateFromTemplateAction 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 extends AnA protected abstract String getActionName(PsiDirectory directory, String newName, String templateName); - protected abstract String getErrorTitle(); + protected String getErrorTitle() { + return CommonBundle.getErrorTitle(); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java index 17ad85067580..b9a747629595 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/actions/NewGroovyClassAction.java @@ -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 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 i return GroovyBundle.message("newscript.menu.action.text"); } - protected String getErrorTitle() { - return CommonBundle.getErrorTitle(); - } - @Override protected PsiElement getNavigationElement(@NotNull GroovyFile createdFile) { return createdFile.getLastChild(); diff --git a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java index 58411b069053..8b0d6f269e90 100644 --- a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java +++ b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java @@ -15,20 +15,13 @@ */ 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 { 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 { 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 { protected String getActionName(PsiDirectory directory, String newName, String templateName) { return XmlBundle.message("new.html.file.action"); } - - @Override - protected String getErrorTitle() { - return CommonBundle.getErrorTitle(); - } }