/* * Copyright 2000-2009 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.fileTemplates.actions; import com.intellij.ide.IdeBundle; import com.intellij.ide.IdeView; import com.intellij.ide.actions.EditFileTemplatesAction; import com.intellij.ide.fileTemplates.CreateFromTemplateActionReplacer; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.ide.fileTemplates.ui.SelectTemplateDialog; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.InternalStdFileTypes; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDirectory; import consulo.annotations.RequiredDispatchThread; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; public class CreateFromTemplateGroup extends ActionGroup implements DumbAware { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.fileTemplates.actions.CreateFromTemplateGroup"); @RequiredDispatchThread @Override public void update(@NotNull AnActionEvent event) { super.update(event); Project project = event.getRequiredData(CommonDataKeys.PROJECT); Presentation presentation = event.getPresentation(); FileTemplate[] allTemplates = FileTemplateManager.getInstance(project).getAllTemplates(); for (FileTemplate template : allTemplates) { if (canCreateFromTemplate(event, template)) { presentation.setEnabled(true); return; } } presentation.setEnabled(false); } @Override @NotNull @RequiredDispatchThread public AnAction[] getChildren(@Nullable AnActionEvent e) { if (e == null) return EMPTY_ARRAY; Project project = e.getProject(); if (project == null || project.isDisposed()) return EMPTY_ARRAY; FileTemplateManager manager = FileTemplateManager.getInstance(project); FileTemplate[] templates = manager.getAllTemplates(); boolean showAll = templates.length <= FileTemplateManager.RECENT_TEMPLATES_SIZE; if (!showAll) { Collection<String> recentNames = manager.getRecentNames(); templates = new FileTemplate[recentNames.size()]; int i = 0; for (String name : recentNames) { templates[i] = FileTemplateManager.getInstance(project).getTemplate(name); i++; } } Arrays.sort(templates, (template1, template2) -> { // java first if (template1.isTemplateOfType(InternalStdFileTypes.JAVA) && !template2.isTemplateOfType(InternalStdFileTypes.JAVA)) { return -1; } if (template2.isTemplateOfType(InternalStdFileTypes.JAVA) && !template1.isTemplateOfType(InternalStdFileTypes.JAVA)) { return 1; } // group by type int i = template1.getExtension().compareTo(template2.getExtension()); if (i != 0) { return i; } // group by name if same type return template1.getName().compareTo(template2.getName()); }); List<AnAction> result = new ArrayList<AnAction>(); for (FileTemplate template : templates) { if (canCreateFromTemplate(e, template)) { AnAction action = replaceAction(template); if (action == null) { action = new CreateFromTemplateAction(template); } result.add(action); } } if (!result.isEmpty()) { if (!showAll) { result.add(new CreateFromTemplatesAction(IdeBundle.message("action.from.file.template"))); } result.add(AnSeparator.getInstance()); result.add(new EditFileTemplatesAction(IdeBundle.message("action.edit.file.templates"))); } return result.toArray(new AnAction[result.size()]); } private static AnAction replaceAction(final FileTemplate template) { final CreateFromTemplateActionReplacer[] actionFactories = ApplicationManager.getApplication().getExtensions(CreateFromTemplateActionReplacer.CREATE_FROM_TEMPLATE_REPLACER); for (CreateFromTemplateActionReplacer actionFactory : actionFactories) { AnAction action = actionFactory.replaceCreateFromFileTemplateAction(template); if (action != null) { return action; } } return null; } static boolean canCreateFromTemplate(AnActionEvent e, FileTemplate template) { if (e == null) return false; DataContext dataContext = e.getDataContext(); IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext); if (view == null) return false; PsiDirectory[] dirs = view.getDirectories(); if (dirs.length == 0) return false; return FileTemplateUtil.canCreateFromTemplate(dirs, template); } private static class CreateFromTemplatesAction extends CreateFromTemplateActionBase { public CreateFromTemplatesAction(String title) { super(title, null, null); } @Override protected AnAction getReplacedAction(final FileTemplate template) { return replaceAction(template); } @Override protected FileTemplate getTemplate(final Project project, final PsiDirectory dir) { SelectTemplateDialog dialog = new SelectTemplateDialog(project, dir); dialog.show(); return dialog.getSelectedTemplate(); } } }