package com.siberika.idea.pascal.ide.actions; import com.google.common.collect.ImmutableSet; import com.intellij.ide.actions.CreateClassAction; import com.intellij.ide.actions.CreateFileFromTemplateDialog; import com.intellij.ide.actions.CreateTemplateInPackageAction; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.impl.DirectoryIndex; import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.siberika.idea.pascal.PascalBundle; import com.siberika.idea.pascal.PascalFileType; import com.siberika.idea.pascal.PascalIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.java.JavaSourceRootType; import javax.swing.*; import java.util.List; import java.util.Properties; /** * Author: George Bakhtadze * Date: 23/03/2015 */ public class CreateModuleAction extends CreateTemplateInPackageAction<PsiFile> { private static final String PASCAL_TEMPLATE_PREFIX = "Pascal"; public CreateModuleAction() { super(PascalBundle.message("action.create.new.module"), PascalBundle.message("action.create.new.module"), PascalIcons.GENERAL, ImmutableSet.of(JavaSourceRootType.SOURCE, JavaSourceRootType.TEST_SOURCE)); } @Nullable @Override protected PsiElement getNavigationElement(@NotNull PsiFile createdElement) { return createdElement.getNavigationElement(); } @Override protected boolean checkPackageExists(PsiDirectory directory) { return DirectoryIndex.getInstance(directory.getProject()).getPackageName(directory.getVirtualFile()) != null; } @Override protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) { builder.setTitle(PascalBundle.message("action.create.new.module")); for (FileTemplate fileTemplate : getApplicableTemplates()) { final String templateName = fileTemplate.getName(); final String shortName = getTemplateShortName(templateName); final Icon icon = getTemplateIcon(templateName); builder.addKind(shortName, icon, templateName); } } @Override protected String getActionName(PsiDirectory directory, String newName, String templateName) { return PascalBundle.message("progress.creating.module", newName); } @Nullable @Override protected PsiFile doCreate(@NotNull PsiDirectory dir, String className, String templateName) throws IncorrectOperationException { String packageName = DirectoryIndex.getInstance(dir.getProject()).getPackageName(dir.getVirtualFile()); try { return createClass(className, packageName, dir, templateName).getContainingFile(); } catch (Throwable e) { throw new IncorrectOperationException(e.getMessage()); } } private static PsiElement createClass(String className, String packageName, @NotNull PsiDirectory directory, final String templateName) throws Exception { return createClass(className, packageName, directory, templateName, CreateClassAction.class.getClassLoader()); } private static PsiElement createClass(String className, String packageName, PsiDirectory directory, String templateName, @Nullable java.lang.ClassLoader classLoader) throws Exception { final Properties props = new Properties(FileTemplateManager.getInstance().getDefaultProperties(directory.getProject())); props.setProperty(FileTemplate.ATTRIBUTE_NAME, className); props.setProperty(FileTemplate.ATTRIBUTE_PACKAGE_NAME, packageName); final FileTemplate template = FileTemplateManager.getInstance().getInternalTemplate(templateName); return FileTemplateUtil.createFromTemplate(template, className, props, directory, classLoader); } public static List<FileTemplate> getApplicableTemplates() { return getApplicableTemplates(new Condition<FileTemplate>() { @Override public boolean value(FileTemplate fileTemplate) { return PascalFileType.INSTANCE.getDefaultExtension().equals(fileTemplate.getExtension()); } }); } public static List<FileTemplate> getApplicableTemplates(Condition<FileTemplate> filter) { List<FileTemplate> applicableTemplates = new SmartList<FileTemplate>(); applicableTemplates.addAll(ContainerUtil.findAll(FileTemplateManager.getInstance().getInternalTemplates(), filter)); applicableTemplates.addAll(ContainerUtil.findAll(FileTemplateManager.getInstance().getAllTemplates(), filter)); return applicableTemplates; } public static String getTemplateShortName(String templateName) { if (templateName.startsWith(PASCAL_TEMPLATE_PREFIX)) { return templateName.substring(PASCAL_TEMPLATE_PREFIX.length()); } return templateName; } @NotNull public static Icon getTemplateIcon(String name) { return PascalIcons.GENERAL; } }