blob: 874fee9a117cf9a31056af725bbdc444ded1d83a [file] [log] [blame]
/* 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 );
}
}