diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index 10157b20d000..a8679a8b36d0 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -1658,6 +1658,10 @@ implementationClass="com.intellij.codeInsight.daemon.impl.quickfix.VariableAccessFromInnerClassJava10Fix"/> + + + (java.lang.String,java.lang.String,javax.swing.Icon,java.util.Set):V - p:(java.util.function.Supplier,java.util.function.Supplier,java.util.function.Supplier,java.util.Set):V - p:(java.util.function.Supplier,java.util.function.Supplier,javax.swing.Icon,java.util.Set):V @@ -8279,6 +8281,7 @@ a:com.intellij.ide.actions.CreateTemplateInPackageAction - pa:checkPackageExists(com.intellij.psi.PsiDirectory):Z - p:createFile(java.lang.String,java.lang.String,com.intellij.psi.PsiDirectory):com.intellij.psi.PsiElement - pa:doCreate(com.intellij.psi.PsiDirectory,java.lang.String,java.lang.String):com.intellij.psi.PsiElement +- getCategory():java.lang.String - pa:getNavigationElement(com.intellij.psi.PsiElement):com.intellij.psi.PsiElement - p:isAvailable(com.intellij.openapi.actionSystem.DataContext):Z - s:isAvailable(com.intellij.openapi.actionSystem.DataContext,java.util.Set,java.util.function.Predicate):Z @@ -11383,30 +11386,6 @@ c:com.intellij.ide.scratch.ScratchFileActions$ChangeLanguageAction - p:getChangeLanguageActionName(java.lang.String):java.lang.String - p:getChangeLanguageTitle():java.lang.String - update(com.intellij.openapi.actionSystem.AnActionEvent):V -f:com.intellij.ide.scratch.ScratchFileActions$ExportToScratchAction -- com.intellij.openapi.project.DumbAwareAction -- ():V -- actionPerformed(com.intellij.openapi.actionSystem.AnActionEvent):V -- getActionUpdateThread():com.intellij.openapi.actionSystem.ActionUpdateThread -- update(com.intellij.openapi.actionSystem.AnActionEvent):V -f:com.intellij.ide.scratch.ScratchFileActions$NewBufferAction -- com.intellij.openapi.project.DumbAwareAction -- ():V -- actionPerformed(com.intellij.openapi.actionSystem.AnActionEvent):V -- getActionUpdateThread():com.intellij.openapi.actionSystem.ActionUpdateThread -- update(com.intellij.openapi.actionSystem.AnActionEvent):V -f:com.intellij.ide.scratch.ScratchFileActions$NewFileAction -- com.intellij.openapi.project.DumbAwareAction -- ():V -- actionPerformed(com.intellij.openapi.actionSystem.AnActionEvent):V -- getActionUpdateThread():com.intellij.openapi.actionSystem.ActionUpdateThread -- update(com.intellij.openapi.actionSystem.AnActionEvent):V -f:com.intellij.ide.scratch.ScratchFileActions$ShowFilesPopupAction -- com.intellij.openapi.project.DumbAwareAction -- ():V -- actionPerformed(com.intellij.openapi.actionSystem.AnActionEvent):V -- getActionUpdateThread():com.intellij.openapi.actionSystem.ActionUpdateThread -- update(com.intellij.openapi.actionSystem.AnActionEvent):V a:com.intellij.ide.scratch.ScratchFileCreationHelper - sf:EXTENSION:com.intellij.lang.LanguageExtension - ():V diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java index d340b4c1e4e6..dc3f8a6c15e2 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java @@ -7,6 +7,7 @@ import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase; import com.intellij.ide.util.PropertiesComponent; import com.intellij.internal.statistic.collectors.fus.fileTypes.FileTypeUsageCounterCollector; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NlsActions; @@ -26,9 +27,6 @@ import java.util.Map; import java.util.Properties; import java.util.function.Supplier; -/** - * @author Dmitry Avdeev - */ public abstract class CreateFileFromTemplateAction extends CreateFromTemplateAction { protected CreateFileFromTemplateAction() { @@ -114,7 +112,7 @@ public abstract class CreateFileFromTemplateAction extends CreateFromTemplateAct throw e; } catch (Exception e) { - LOG.error(e); + Logger.getInstance(CreateFileFromTemplateAction.class).error(e); } return null; diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java index c20f281458d6..11f0d119a248 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFromTemplateAction.java @@ -31,6 +31,10 @@ import java.util.function.Supplier; public abstract class CreateFromTemplateAction extends AnAction implements WriteActionAware { + /** + * @deprecated Declare your own LOG where needed. + */ + @Deprecated protected static final Logger LOG = Logger.getInstance(CreateFromTemplateAction.class); protected CreateFromTemplateAction() { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateTemplateInPackageAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateTemplateInPackageAction.java index 62526048cb29..b7511b094d3e 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateTemplateInPackageAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateTemplateInPackageAction.java @@ -7,6 +7,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; @@ -32,7 +33,13 @@ import java.util.Set; import java.util.function.Predicate; import java.util.function.Supplier; -public abstract class CreateTemplateInPackageAction extends CreateFromTemplateAction { +public abstract class CreateTemplateInPackageAction extends CreateFromTemplateAction + implements NewFileActionWithCategory { + + private static final @NotNull Logger LOG = Logger.getInstance(CreateTemplateInPackageAction.class); + + public static final String JAVA_NEW_FILE_CATEGORY = "Java"; + private final @Nullable Set> mySourceRootTypes; protected CreateTemplateInPackageAction(String text, String description, Icon icon, @@ -57,6 +64,11 @@ public abstract class CreateTemplateInPackageAction extend mySourceRootTypes = rootTypes; } + @Override + public @NotNull String getCategory() { + return JAVA_NEW_FILE_CATEGORY; + } + @Override protected @Nullable T createFile(String name, String templateName, PsiDirectory dir) { return checkOrCreate(name, dir, templateName); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/NewFileActionCategoryHandler.java b/platform/lang-impl/src/com/intellij/ide/actions/NewFileActionCategoryHandler.java new file mode 100644 index 000000000000..6fa494aae7b2 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/NewFileActionCategoryHandler.java @@ -0,0 +1,15 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ide.actions; + +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.util.ThreeState; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Hides some of the plugin New File... actions depending on context. For instance, web development templates in Java source sets. + */ +@ApiStatus.Experimental +public interface NewFileActionCategoryHandler { + @NotNull ThreeState isVisible(@NotNull DataContext dataContext, @NotNull String category); +} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/NewFileActionWithCategory.java b/platform/lang-impl/src/com/intellij/ide/actions/NewFileActionWithCategory.java new file mode 100644 index 000000000000..35f2641286ce --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/NewFileActionWithCategory.java @@ -0,0 +1,13 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ide.actions; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Marks actions in New File... popup with a named category. + */ +@ApiStatus.Experimental +public interface NewFileActionWithCategory { + @NotNull String getCategory(); +} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/NewWebDevelopmentGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/NewWebDevelopmentGroup.java new file mode 100644 index 000000000000..a7223ac086be --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/actions/NewWebDevelopmentGroup.java @@ -0,0 +1,12 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ide.actions; + +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import org.jetbrains.annotations.NotNull; + +final class NewWebDevelopmentGroup extends DefaultActionGroup implements NewFileActionWithCategory { + @Override + public @NotNull String getCategory() { + return "Web"; + } +} diff --git a/platform/lang-impl/src/com/intellij/ide/actions/WeighingNewActionGroup.java b/platform/lang-impl/src/com/intellij/ide/actions/WeighingNewActionGroup.java index 3574c29c9c93..1116aaa3e7c9 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/WeighingNewActionGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/WeighingNewActionGroup.java @@ -4,18 +4,23 @@ package com.intellij.ide.actions; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionUtil; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.TextWithMnemonic; import com.intellij.ui.awt.RelativePoint; +import com.intellij.util.ThreeState; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; import java.util.function.Supplier; @ApiStatus.Internal @@ -52,6 +57,15 @@ public class WeighingNewActionGroup extends WeighingActionGroup implements DumbA } } + @Override + public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) { + AnAction[] originalChildren = super.getChildren(e); + + if (e == null) return originalChildren; + + return NewActionCategoryManager.filterVisibleCategories(originalChildren, e.getDataContext()); + } + @Override protected boolean shouldBeChosenAnyway(@NotNull AnAction action) { final Class aClass = action.getClass(); @@ -80,3 +94,41 @@ public class WeighingNewActionGroup extends WeighingActionGroup implements DumbA return Registry.is("ide.project.view.new.file.popup"); } } + +final class NewActionCategoryManager { + private static final ExtensionPointName EP_NAME = + ExtensionPointName.create("com.intellij.newFileActionCategoryHandler"); + + public static AnAction[] filterVisibleCategories(AnAction @NotNull [] actions, @NotNull DataContext context) { + List<@NotNull NewFileActionCategoryHandler> handlers = EP_NAME.getExtensionList(); + if (handlers.isEmpty()) return actions; + + List hiddenCategories = new ArrayList<>(); + + List visible = new ArrayList<>(actions.length); + for (AnAction action : actions) { + if (!(action instanceof NewFileActionWithCategory)) { + visible.add(action); + continue; + } + + String category = ((NewFileActionWithCategory)action).getCategory(); + if (hiddenCategories.contains(category)) continue; + + boolean isVisible = true; + for (NewFileActionCategoryHandler handler : handlers) { + if (handler.isVisible(context, category) == ThreeState.NO) { + hiddenCategories.add(category); + isVisible = false; + break; + } + } + + if (isVisible) { + visible.add(action); + } + } + + return visible.toArray(AnAction.EMPTY_ARRAY); + } +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileActions.java b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileActions.java index f47a8f7f8816..2d08e5755829 100644 --- a/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileActions.java +++ b/platform/lang-impl/src/com/intellij/ide/scratch/ScratchFileActions.java @@ -3,6 +3,7 @@ package com.intellij.ide.scratch; import com.intellij.icons.AllIcons; import com.intellij.ide.actions.NewActionGroup; +import com.intellij.ide.actions.NewFileActionWithCategory; import com.intellij.ide.actions.RecentLocationsAction; import com.intellij.ide.scratch.ScratchImplUtil.LanguageItem; import com.intellij.ide.util.DeleteHandler; @@ -62,8 +63,7 @@ public final class ScratchFileActions { return ourCurrentBuffer; } - - public static final class NewFileAction extends DumbAwareAction { + static final class NewFileAction extends DumbAwareAction implements NewFileActionWithCategory { private static final String ACTION_ID = "NewScratchFile"; private final NotNullLazyValue<@Nls String> myActionText = NotNullLazyValue.lazy(() -> { @@ -169,9 +169,14 @@ public final class ScratchFileActions { presentation.setIcon(null); } } + + @Override + public @NotNull String getCategory() { + return "Scratch"; + } } - public static final class NewBufferAction extends DumbAwareAction { + static final class NewBufferAction extends DumbAwareAction { @Override public @NotNull ActionUpdateThread getActionUpdateThread() { @@ -388,7 +393,7 @@ public final class ScratchFileActions { } } - public static final class ShowFilesPopupAction extends DumbAwareAction { + static final class ShowFilesPopupAction extends DumbAwareAction { @Override public @NotNull ActionUpdateThread getActionUpdateThread() { return ActionUpdateThread.BGT; @@ -447,7 +452,7 @@ public final class ScratchFileActions { } } - public static final class ExportToScratchAction extends DumbAwareAction { + static final class ExportToScratchAction extends DumbAwareAction { { setEnabledInModalContext(true); } diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index 09ab8137fdb6..e7623cc70f3e 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -706,5 +706,8 @@ + + diff --git a/platform/platform-resources/src/META-INF/XmlActions.xml b/platform/platform-resources/src/META-INF/XmlActions.xml index 4efb627ff7fe..3f5a60d4abf7 100644 --- a/platform/platform-resources/src/META-INF/XmlActions.xml +++ b/platform/platform-resources/src/META-INF/XmlActions.xml @@ -16,7 +16,7 @@ - + diff --git a/platform/platform-resources/src/idea/LangActions.xml b/platform/platform-resources/src/idea/LangActions.xml index ccd6e5a41727..bc79e94b82d3 100644 --- a/platform/platform-resources/src/idea/LangActions.xml +++ b/platform/platform-resources/src/idea/LangActions.xml @@ -724,7 +724,7 @@ - + diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/create/CreateEditorConfigAction.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/create/CreateEditorConfigAction.java index dd53fd8dcf93..4ff94a61e36f 100644 --- a/plugins/editorconfig/src/org/editorconfig/configmanagement/create/CreateEditorConfigAction.java +++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/create/CreateEditorConfigAction.java @@ -4,6 +4,7 @@ package org.editorconfig.configmanagement.create; import com.intellij.application.options.CodeStyle; import com.intellij.icons.AllIcons; import com.intellij.ide.IdeView; +import com.intellij.ide.actions.NewFileActionWithCategory; import com.intellij.ide.actions.OpenFileAction; import com.intellij.lang.Language; import com.intellij.notification.Notification; @@ -34,7 +35,7 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.List; -public final class CreateEditorConfigAction extends AnAction implements DumbAware { +public final class CreateEditorConfigAction extends AnAction implements DumbAware, NewFileActionWithCategory { private final static Logger LOG = Logger.getInstance(CreateEditorConfigAction.class); @Override @@ -77,6 +78,11 @@ public final class CreateEditorConfigAction extends AnAction implements DumbAwar } } + @Override + public @NotNull String getCategory() { + return "EditorConfig"; + } + @Nullable private static PsiFile getPsiFile(@NotNull Project project, @NotNull VirtualFile file) { Document document = FileDocumentManager.getInstance().getDocument(file); diff --git a/python/src/com/jetbrains/python/actions/CreatePackageAction.java b/python/src/com/jetbrains/python/actions/CreatePackageAction.java index af41798da97e..4f2e9467193f 100644 --- a/python/src/com/jetbrains/python/actions/CreatePackageAction.java +++ b/python/src/com/jetbrains/python/actions/CreatePackageAction.java @@ -5,6 +5,7 @@ import com.intellij.icons.AllIcons; import com.intellij.ide.IdeView; import com.intellij.ide.actions.CreateDirectoryOrPackageHandler; import com.intellij.ide.actions.CreateFileFromTemplateDialog; +import com.intellij.ide.actions.NewFileActionWithCategory; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; @@ -31,12 +32,12 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; -public final class CreatePackageAction extends DumbAwareAction { +public final class CreatePackageAction extends DumbAwareAction implements NewFileActionWithCategory { private static final Logger LOG = Logger.getInstance(CreatePackageAction.class); + private static final @NonNls String NAMESPACE_PACKAGE_TYPE = "Namespace Package"; private static final @NonNls String ORDINARY_PACKAGE_TYPE = "Package"; - @Override public void actionPerformed(@NotNull AnActionEvent e) { final IdeView view = e.getData(LangDataKeys.IDE_VIEW); @@ -94,6 +95,11 @@ public final class CreatePackageAction extends DumbAwareAction { }, EmptyConsumer.getInstance()); } + @Override + public @NotNull String getCategory() { + return "Python"; + } + private static CreateDirectoryOrPackageHandler getNewOrdinaryPackageHandler(@NotNull Project project, @NotNull PsiDirectory directory, @NotNull SmartPsiElementPointer directoryPointer) { diff --git a/python/src/com/jetbrains/python/actions/CreatePythonFileAction.java b/python/src/com/jetbrains/python/actions/CreatePythonFileAction.java index 9bfc82aa7511..092470599065 100644 --- a/python/src/com/jetbrains/python/actions/CreatePythonFileAction.java +++ b/python/src/com/jetbrains/python/actions/CreatePythonFileAction.java @@ -3,6 +3,7 @@ package com.jetbrains.python.actions; import com.intellij.ide.actions.CreateFileFromTemplateAction; import com.intellij.ide.actions.CreateFileFromTemplateDialog; +import com.intellij.ide.actions.NewFileActionWithCategory; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDirectory; @@ -11,8 +12,7 @@ import com.jetbrains.python.PythonFileType; import com.jetbrains.python.pyi.PyiFileType; import org.jetbrains.annotations.NotNull; - -public class CreatePythonFileAction extends CreateFileFromTemplateAction implements DumbAware { +public class CreatePythonFileAction extends CreateFileFromTemplateAction implements DumbAware, NewFileActionWithCategory { public CreatePythonFileAction() { super(PyBundle.messagePointer("action.create.python.file.title"), PyBundle.messagePointer("action.create.python.file.description"), PythonFileType.INSTANCE.getIcon()); } @@ -30,4 +30,9 @@ public class CreatePythonFileAction extends CreateFileFromTemplateAction impleme protected String getActionName(PsiDirectory directory, @NotNull String newName, String templateName) { return PyBundle.message("create.python.file.script.action", newName); } + + @Override + public @NotNull String getCategory() { + return "Python"; + } } diff --git a/xml/impl/src/com/intellij/xml/actions/CreateXmlDescriptorGroup.java b/xml/impl/src/com/intellij/xml/actions/CreateXmlDescriptorGroup.java new file mode 100644 index 000000000000..42113ea5f6f7 --- /dev/null +++ b/xml/impl/src/com/intellij/xml/actions/CreateXmlDescriptorGroup.java @@ -0,0 +1,13 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.xml.actions; + +import com.intellij.ide.actions.NewFileActionWithCategory; +import com.intellij.ide.actions.NonTrivialActionGroup; +import org.jetbrains.annotations.NotNull; + +final class CreateXmlDescriptorGroup extends NonTrivialActionGroup implements NewFileActionWithCategory { + @Override + public @NotNull String getCategory() { + return "XML"; + } +}