Package org.qi4j.ide.plugin.idea.common.actions

Source Code of org.qi4j.ide.plugin.idea.common.actions.AbstractCreateElementActionBase

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

Related Classes of org.qi4j.ide.plugin.idea.common.actions.AbstractCreateElementActionBase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.