| /* 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 ); |
| } |
| } |