From 1aa55e239098bc1529a2983e781a3ff0da034814 Mon Sep 17 00:00:00 2001 From: Nikolay Kuznetsov Date: Fri, 1 Feb 2019 16:55:10 +0100 Subject: [PATCH] Add extensibility to TraverseUI and related classes This allows IDEs with backends such as Rider to inject necessary waits and other code to handle non-standard settings indexing --- .../ide/ui/search/TraverseUIStarter.java | 9 ++++ .../intellij/ide/ui/search/SearchUtil.java | 28 ++++++++--- .../ide/ui/search/TraverseUIHelper.java | 49 +++++++++++++++++++ .../src/META-INF/PlatformExtensionPoints.xml | 2 + 4 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/ide/ui/search/TraverseUIHelper.java diff --git a/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java b/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java index eac9443d3c4d..f15718c99bb7 100644 --- a/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java +++ b/platform/lang-impl/src/com/intellij/ide/ui/search/TraverseUIStarter.java @@ -97,8 +97,14 @@ public class TraverseUIStarter extends ApplicationStarterEx { public static void startup(@NotNull final String outputPath, final boolean splitByResourcePath) throws IOException { Map> options = new LinkedHashMap<>(); try { + for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension.beforeStart(); + SearchUtil.processProjectConfigurables(ProjectManager.getInstance().getDefaultProject(), options); + for (TraverseUIHelper extension1 : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension1.afterTraversal(options); + final Map roots = newHashMap(); for (SearchableConfigurable option : options.keySet()) { SearchableConfigurable configurable = option; @@ -149,6 +155,9 @@ public class TraverseUIStarter extends ApplicationStarterEx { JDOMUtil.writeDocument(new Document(entry.getValue()), output, "\n"); } + for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension.afterResultsAreSaved(); + System.out.println("Searchable options index builder completed"); } finally { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java b/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java index e36b582e8eae..417abb862ff2 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/search/SearchUtil.java @@ -47,7 +47,7 @@ public class SearchUtil { } private static void processConfigurables(Configurable[] configurables, Map> options) { - for (Configurable configurable : configurables) { + for (final Configurable configurable : configurables) { if (configurable instanceof SearchableConfigurable) { //ignore invisible root nodes //noinspection deprecation @@ -55,24 +55,29 @@ public class SearchUtil { continue; } + final SearchableConfigurable searchableConfigurable = (SearchableConfigurable) configurable; + Set configurableOptions = new TreeSet<>(); - options.put((SearchableConfigurable)configurable, configurableOptions); + options.put(searchableConfigurable, configurableOptions); + + for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension.beforeConfigurable(searchableConfigurable, configurableOptions); if (configurable instanceof MasterDetails) { final MasterDetails md = (MasterDetails)configurable; md.initUi(); - processComponent(configurable, configurableOptions, md.getMaster()); - processComponent(configurable, configurableOptions, md.getDetails().getComponent()); + processComponent(searchableConfigurable, configurableOptions, md.getMaster()); + processComponent(searchableConfigurable, configurableOptions, md.getDetails().getComponent()); } else { - processComponent(configurable, configurableOptions, configurable.createComponent()); + processComponent(searchableConfigurable, configurableOptions, configurable.createComponent()); final Configurable unwrapped = unwrapConfigurable(configurable); if (unwrapped instanceof CompositeConfigurable) { //noinspection unchecked final List children = ((CompositeConfigurable)unwrapped).getConfigurables(); for (final UnnamedConfigurable child : children) { final Set childConfigurableOptions = new TreeSet<>(); - options.put(new SearchableConfigurableAdapter((SearchableConfigurable)configurable, child), childConfigurableOptions); + options.put(new SearchableConfigurableAdapter(searchableConfigurable, child), childConfigurableOptions); if (child instanceof SearchableConfigurable) { processUILabel(((SearchableConfigurable)child).getDisplayName(), childConfigurableOptions, null); @@ -86,6 +91,9 @@ public class SearchUtil { } } } + + for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension.afterConfigurable(searchableConfigurable, configurableOptions); } } } @@ -108,10 +116,16 @@ public class SearchUtil { return configurable; } - private static void processComponent(Configurable configurable, Set configurableOptions, JComponent component) { + private static void processComponent(SearchableConfigurable configurable, Set configurableOptions, JComponent component) { if (component != null) { + for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension.beforeComponent(configurable, component, configurableOptions); + processUILabel(configurable.getDisplayName(), configurableOptions, null); processComponent(component, configurableOptions, null); + + for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensions()) + extension.afterComponent(configurable, component, configurableOptions); } } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/search/TraverseUIHelper.java b/platform/platform-impl/src/com/intellij/ide/ui/search/TraverseUIHelper.java new file mode 100644 index 000000000000..07a110f5d682 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/ui/search/TraverseUIHelper.java @@ -0,0 +1,49 @@ +package com.intellij.ide.ui.search; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.options.SearchableConfigurable; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.util.Map; +import java.util.Set; + +public interface TraverseUIHelper { + String EP_NAME = "com.intellij.search.traverseUiHelper"; + ExtensionPointName helperExtensionPoint = ExtensionPointName.create(EP_NAME); + + /** + * Invoked before indexing SearchableConfigurables + */ + default void beforeStart() {} + + /** + * Invoked after all configurables were traversed + */ + default void afterTraversal(@NotNull Map> options) {} + + /** + * Invoked after indexing all SearchableConfigurables and results are saved + */ + default void afterResultsAreSaved() {} + + /** + * Invoked before indexing a SearchableConfigurable + */ + default void beforeConfigurable(@NotNull SearchableConfigurable configurable, @NotNull Set options) {} + + /** + * Invoked after indexing a SearchableConfigurable + */ + default void afterConfigurable(@NotNull SearchableConfigurable configurable, @NotNull Set options) {} + + /** + * Invoked before indexing the root component of a SearchableConfigurable + */ + default void beforeComponent(@NotNull SearchableConfigurable configurable, @NotNull JComponent component, @NotNull Set options) {} + + /** + * Invoked after indexing the root component of a SearchableConfigurable + */ + default void afterComponent(@NotNull SearchableConfigurable configurable, @NotNull JComponent component, @NotNull Set options) {} +} \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index b1738a0eeaa7..ee1b4c01565b 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -336,5 +336,7 @@ + +