refactor CreateFromTemplateAction to use a more natural builder API

This commit is contained in:
Dmitry Jemerov
2010-07-17 19:45:48 +04:00
parent 2e0eec6aaa
commit 7203ccf456
6 changed files with 82 additions and 87 deletions
@@ -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
@@ -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);
@@ -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<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();
}
}
@@ -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();
@@ -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();
@@ -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<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();
}
}