Java tutorial
/* Copyright 2008 Edward Yakop. * * 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 org.qi4j.ide.plugin.idea.common.actions; import com.intellij.CommonBundle; import com.intellij.ide.actions.CreateElementActionBase; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.JavaTemplateUtil; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.Properties; /** * @author edward.yakop@gmail.com * @since 0.1 */ public abstract class AbstractCreateElementActionBase extends CreateElementActionBase { @NonNls private static final String NAME_TEMPLATE_PROPERTY = "NAME"; protected AbstractCreateElementActionBase(String text, String description) { super(text, description, null); } @NotNull protected final PsiElement[] invokeDialog(Project project, PsiDirectory directory) { Module module = ModuleUtil.findModuleForFile(directory.getVirtualFile(), project); if (module == null) { return PsiElement.EMPTY_ARRAY; } MyInputValidator validator = doInvokeDialog(project, directory); return validator.getCreatedElements(); } protected MyInputValidator doInvokeDialog(Project project, PsiDirectory directory) { MyInputValidator validator = new MyInputValidator(project, directory); Messages.showInputDialog(project, getDialogPrompt(), getDialogTitle(), Messages.getQuestionIcon(), "", validator); return validator; } /** * @return Dialog prompt. */ protected abstract String getDialogPrompt(); /** * @return Dialog title. */ protected abstract String getDialogTitle(); protected String getErrorTitle() { return CommonBundle.getErrorTitle(); } protected final void checkBeforeCreate(String newName, PsiDirectory directory) throws IncorrectOperationException { JavaDirectoryService javaDirectoryService = JavaDirectoryService.getInstance(); javaDirectoryService.checkCreateClass(directory, newName); } protected static PsiClass createClassFromTemplate(@NotNull PsiDirectory directory, @NotNull String className, @NotNull String templateName, @NonNls String... parameters) throws IncorrectOperationException { String classFileName = className + "." + StdFileTypes.JAVA.getDefaultExtension(); PsiFile file = createFromTemplateInternal(directory, className, classFileName, templateName, parameters); return ((PsiJavaFile) file).getClasses()[0]; } protected static PsiFile createFromTemplateInternal(@NotNull PsiDirectory directory, @NotNull String name, @NotNull String fileName, @NotNull String templateName, @NonNls String... parameters) throws IncorrectOperationException { // Load template FileTemplateManager fileTemplateManager = FileTemplateManager.getInstance(); FileTemplate template = fileTemplateManager.getJ2eeTemplate(templateName); // Process template properties Properties properties = new Properties(fileTemplateManager.getDefaultProperties()); JavaTemplateUtil.setPackageNameAttribute(properties, directory); properties.setProperty(NAME_TEMPLATE_PROPERTY, name); // Add parameters for (int i = 0; i < parameters.length; i += 2) { properties.setProperty(parameters[i], parameters[i + 1]); } // Create text from template with specified properties String text; try { text = template.getText(properties); } catch (Exception e) { String message = "Unable to load template for " + fileTemplateManager.internalTemplateToSubject(templateName); throw new RuntimeException(message, e); } // Serialized text to file PsiManager psiManager = PsiManager.getInstance(directory.getProject()); PsiFileFactory fileFactory = PsiFileFactory.getInstance(directory.getProject()); PsiFile file = fileFactory.createFileFromText(fileName, text); // Reformat the file according to project/default style CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(psiManager); codeStyleManager.reformat(file); // Add newly created file to directory return (PsiFile) directory.add(file); } }