mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
refactor CreateFromTemplateAction to use a more natural builder API
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user