From 0340b76b8183c07bc35b2f269a9bfe2ada132749 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 28 Jul 2010 17:12:51 +0400 Subject: [PATCH] Create JavaEE Web Page action --- .../actions/CreateFileFromTemplateAction.java | 74 +++++++++++++++++++ .../ide/actions/CreateFromTemplateAction.java | 51 ++++--------- .../ide/actions/TemplateKindProvider.java | 56 ++++++++++++++ .../ide/actions/CreateHtmlFileAction.java | 33 ++++----- 4 files changed, 157 insertions(+), 57 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java create mode 100644 platform/lang-impl/src/com/intellij/ide/actions/TemplateKindProvider.java diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java new file mode 100644 index 000000000000..7f161b853d26 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ide.actions; + +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.fileEditor.FileEditorManager; +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 javax.swing.*; + +/** + * @author Dmitry Avdeev + */ +public abstract class CreateFileFromTemplateAction extends CreateFromTemplateAction { + + public CreateFileFromTemplateAction(String text, String description, Icon icon) { + super(text, description, icon); + } + + protected PsiFile createFileFromTemplate(String name, FileTemplate template, PsiDirectory dir) { + + 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); + String property = getDefaultTemplateProperty(); + if (property != null) { + PropertiesComponent.getInstance(dir.getProject()).setValue(property, template.getName()); + } + return psiFile; + } + } + catch (IncorrectOperationException e) { + throw e; + } + catch (Exception e) { + LOG.error(e); + } + + return null; + } + + + @Override + protected PsiFile createFile(String name, String templateName, PsiDirectory dir) { + final FileTemplate template = FileTemplateManager.getInstance().getInternalTemplate(templateName); + return createFileFromTemplate(name, template, dir); + } +} 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 edca8c915d14..34928e5d968b 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java @@ -17,19 +17,13 @@ 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.ide.util.PropertiesComponent; 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.util.Ref; -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; @@ -39,37 +33,12 @@ import javax.swing.*; * @author Eugene.Kudelevsky */ public abstract class CreateFromTemplateAction extends AnAction { - private static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.CreateFromTemplateAction"); + protected 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(); @@ -105,22 +74,30 @@ public abstract class CreateFromTemplateAction extends AnA }); if (createdElement != null) { view.selectElement(createdElement); - postProcesss(createdElement, selectedTemplateName.get()); + postProcess(createdElement, selectedTemplateName.get()); } } - protected void postProcesss(T createdElement, String templateName) { + protected void postProcess(T createdElement, String templateName) { } @Nullable protected abstract T createFile(String name, String templateName, PsiDirectory dir); - protected abstract void checkBeforeCreate(String name, String templateName, PsiDirectory dir); + protected void checkBeforeCreate(String name, String templateName, PsiDirectory dir) { + dir.checkCreateFile(name); + } protected abstract void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder); @Nullable protected String getDefaultTemplateName(@NotNull PsiDirectory dir) { + String property = getDefaultTemplateProperty(); + return property == null ? null : PropertiesComponent.getInstance(dir.getProject()).getValue(property); + } + + @Nullable + protected String getDefaultTemplateProperty() { return null; } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/TemplateKindProvider.java b/platform/lang-impl/src/com/intellij/ide/actions/TemplateKindProvider.java new file mode 100644 index 000000000000..5353aa6286db --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/TemplateKindProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ide.actions; + +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.psi.PsiDirectory; + +import javax.swing.*; + +/** + * @author Dmitry Avdeev + */ +public abstract class TemplateKindProvider { + + private final static ExtensionPointName EP_NAME = + ExtensionPointName.create("com.intellij.javaee.templateKindProvider"); + + public static void addAdditionalKinds(AnAction action, PsiDirectory dir, CreateFileFromTemplateDialog.Builder builder) { + String id = ActionManager.getInstance().getId(action); + for (TemplateKindProvider provider : Extensions.getExtensions(EP_NAME)) { + for (Kind kind : provider.getAdditionalKinds(dir)) { + builder.addKind(kind.name, kind.icon, kind.templateName); + } + } + } + public abstract boolean isAvailable(Class actionClass); + public abstract Kind[] getAdditionalKinds(PsiDirectory dir); + + public static class Kind { + public final String name; + public final String templateName; + public final Icon icon; + + public Kind(String name, String templateName, Icon icon) { + this.name = name; + this.templateName = templateName; + this.icon = icon; + } + } +} diff --git a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java index 9727f397e814..cd1d5d130e0f 100644 --- a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java +++ b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java @@ -16,21 +16,16 @@ package com.intellij.ide.actions; import com.intellij.ide.fileTemplates.FileTemplateManager; -import com.intellij.ide.util.PropertiesComponent; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; import com.intellij.xml.XmlBundle; import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; /** * @author Eugene.Kudelevsky */ -public class CreateHtmlFileAction extends CreateFromTemplateAction { - private static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.CreateHtmlFileAction"); +public class CreateHtmlFileAction extends CreateFileFromTemplateAction { @NonNls private static final String DEFAULT_HTML_TEMPLATE_PROPERTY = "DefaultHtmlFileTemplate"; @@ -39,15 +34,8 @@ public class CreateHtmlFileAction extends CreateFromTemplateAction { } @Override - protected PsiFile createFile(String name, String templateName, PsiDirectory dir) { - PropertiesComponent.getInstance(dir.getProject()).setValue(DEFAULT_HTML_TEMPLATE_PROPERTY, templateName); - - return createFileFromTemplate(name, templateName, dir); - } - - @Override - protected void checkBeforeCreate(String name, String templateName, PsiDirectory dir) { - dir.checkCreateFile(name); + protected String getDefaultTemplateProperty() { + return DEFAULT_HTML_TEMPLATE_PROPERTY; } @Override @@ -59,13 +47,18 @@ public class CreateHtmlFileAction extends CreateFromTemplateAction { .addKind("XHTML file", StdFileTypes.XHTML.getIcon(), FileTemplateManager.INTERNAL_XHTML_TEMPLATE_NAME); } - @Override - protected String getDefaultTemplateName(@NotNull PsiDirectory dir) { - return PropertiesComponent.getInstance(dir.getProject()).getValue(DEFAULT_HTML_TEMPLATE_PROPERTY); - } - @Override protected String getActionName(PsiDirectory directory, String newName, String templateName) { return XmlBundle.message("new.html.file.action"); } + + @Override + public int hashCode() { + return 0; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CreateHtmlFileAction; + } }