blob: 26ecb5616972249f9270187a335840ab26ff6bf6 [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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 com.intellij.ide.actions;
import com.intellij.CommonBundle;
import com.intellij.ide.IdeView;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNameIdentifierOwner;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Map;
/**
* @author Eugene.Kudelevsky
*/
public abstract class CreateFromTemplateAction<T extends PsiElement> extends AnAction {
protected static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.CreateFromTemplateAction");
public CreateFromTemplateAction(String text, String description, Icon icon) {
super(text, description, icon);
}
@Override
public final void actionPerformed(final AnActionEvent e) {
final DataContext dataContext = e.getDataContext();
final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
if (view == null) {
return;
}
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
final PsiDirectory dir = view.getOrChooseDirectory();
if (dir == null || project == null) return;
final CreateFileFromTemplateDialog.Builder builder = CreateFileFromTemplateDialog.createDialog(project);
buildDialog(project, dir, builder);
final Ref<String> selectedTemplateName = Ref.create(null);
final T createdElement =
builder.show(getErrorTitle(), getDefaultTemplateName(dir), new CreateFileFromTemplateDialog.FileCreator<T>() {
@Override
public T createFile(@NotNull String name, @NotNull String templateName) {
selectedTemplateName.set(templateName);
return CreateFromTemplateAction.this.createFile(name, templateName, dir);
}
@Override
@NotNull
public String getActionName(@NotNull String name, @NotNull String templateName) {
return CreateFromTemplateAction.this.getActionName(dir, name, templateName);
}
});
if (createdElement != null) {
view.selectElement(createdElement);
postProcess(createdElement, selectedTemplateName.get(), builder.getCustomProperties());
}
}
protected void postProcess(T createdElement, String templateName, Map<String,String> customProperties) {
}
@Nullable
protected abstract T createFile(String name, String templateName, PsiDirectory dir);
protected abstract void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder);
@Nullable
protected String getDefaultTemplateName(@NotNull PsiDirectory dir) {
String property = getDefaultTemplateProperty();
return property == null ? null : PropertiesComponent.getInstance(dir.getProject()).getValue(property);
}
@Nullable
protected String getDefaultTemplateProperty() {
return null;
}
@Override
public void update(final AnActionEvent e) {
final DataContext dataContext = e.getDataContext();
final Presentation presentation = e.getPresentation();
final boolean enabled = isAvailable(dataContext);
presentation.setVisible(enabled);
presentation.setEnabled(enabled);
}
protected boolean isAvailable(DataContext dataContext) {
final Project project = CommonDataKeys.PROJECT.getData(dataContext);
final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
return project != null && view != null && view.getDirectories().length != 0;
}
protected abstract String getActionName(PsiDirectory directory, String newName, String templateName);
protected String getErrorTitle() {
return CommonBundle.getErrorTitle();
}
//todo append $END variable to templates?
protected static void moveCaretAfterNameIdentifier(PsiNameIdentifierOwner createdElement) {
final Project project = createdElement.getProject();
final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor();
if (editor != null) {
final VirtualFile virtualFile = createdElement.getContainingFile().getVirtualFile();
if (virtualFile != null) {
if (FileDocumentManager.getInstance().getDocument(virtualFile) == editor.getDocument()) {
final PsiElement nameIdentifier = createdElement.getNameIdentifier();
if (nameIdentifier != null) {
editor.getCaretModel().moveToOffset(nameIdentifier.getTextRange().getEndOffset());
}
}
}
}
}
}