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 extends JpsModuleSourceRootType>> 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 extends AnAction> 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";
+ }
+}