/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.actions; import com.intellij.ide.IdeView; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.util.IncorrectOperationException; import gw.lang.reflect.module.IModule; import gw.plugin.ij.util.GosuModuleUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; /** * Class description... * * @author pfong */ public abstract class AbstractCreateFromTemplateInPackageAction <T extends PsiFile> extends AbstractCreateInPackageAction { public AbstractCreateFromTemplateInPackageAction(String text, String description, Icon icon) { super(text, description, icon, true); } public final void actionPerformed(@NotNull final AnActionEvent e) { final DataContext dataContext = e.getDataContext(); final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext); if (view == null) { return; } final Project project = PlatformDataKeys.PROJECT.getData(dataContext); final PsiDirectory dir = view.getOrChooseDirectory(); if (dir == null || project == null) return; final CreateSimpleDialog.Builder builder = CreateSimpleDialog.createDialog(project); buildDialog(project, dir, builder); final T createdElement = builder.show(getErrorTitle(), builder.getTemplateName(), new CreateSimpleDialog.FileCreator<T>() { public void checkBeforeCreate(@NotNull String name, @NotNull String templateName) { AbstractCreateFromTemplateInPackageAction.this.checkBeforeCreate(name, templateName, dir); } public T createFile(@NotNull String name, @NotNull String templateName) { return AbstractCreateFromTemplateInPackageAction.this.createFile(name, templateName, dir); } @NotNull public String getActionName(@NotNull String name, @NotNull String templateName) { return AbstractCreateFromTemplateInPackageAction.this.getActionName(dir, name, templateName); } }); if (createdElement != null) { view.selectElement(createdElement); } } @Nullable protected T createFile(String name, @NotNull String templateName, PsiDirectory dir) { return checkOrCreate(name, dir, templateName, false); } protected IModule getModule(@NotNull PsiDirectory dir) { return GosuModuleUtil.findModuleForFile(dir.getVirtualFile(), dir.getProject()); } protected void checkBeforeCreate(String name, @NotNull String templateName, PsiDirectory dir) { checkOrCreate(name, dir, templateName, true); } @Nullable private T checkOrCreate(String newName, PsiDirectory directory, @NotNull String templateName, boolean check) throws IncorrectOperationException { PsiDirectory dir = directory; String className = newName; final String extension = StringUtil.getShortName(templateName); if (StringUtil.isNotEmpty(extension)) { className = StringUtil.trimEnd(className, "." + extension); } if (className.contains(".")) { String[] names = className.split("\\."); for (int i = 0; i < names.length - 1; i++) { String name = names[i]; PsiDirectory subDir = dir.findSubdirectory(name); if (subDir == null) { if (check) { dir.checkCreateSubdirectory(name); return null; } subDir = dir.createSubdirectory(name); } dir = subDir; } className = names[names.length - 1]; } if (check) { doCheckCreate(dir, className); return null; } return doCreate(dir, className, templateName); } protected abstract String getErrorTitle(); protected abstract void buildDialog(Project project, PsiDirectory directory, CreateSimpleDialog.Builder builder); protected abstract String getActionName(PsiDirectory directory, String newName, String templateName); protected abstract void doCheckCreate(PsiDirectory dir, String className) throws IncorrectOperationException; protected abstract T doCreate(PsiDirectory dir, String className, String templateName); }