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
This commit is contained in:
Nikolay Kuznetsov
2019-02-04 16:25:17 +01:00
parent 36737551ee
commit 1aa55e2390
4 changed files with 81 additions and 7 deletions
@@ -97,8 +97,14 @@ public class TraverseUIStarter extends ApplicationStarterEx {
public static void startup(@NotNull final String outputPath, final boolean splitByResourcePath) throws IOException {
Map<SearchableConfigurable, Set<OptionDescription>> 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<String, Element> 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 {
@@ -47,7 +47,7 @@ public class SearchUtil {
}
private static void processConfigurables(Configurable[] configurables, Map<SearchableConfigurable, Set<OptionDescription>> 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<OptionDescription> 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<? extends UnnamedConfigurable> children = ((CompositeConfigurable)unwrapped).getConfigurables();
for (final UnnamedConfigurable child : children) {
final Set<OptionDescription> 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<? super OptionDescription> configurableOptions, JComponent component) {
private static void processComponent(SearchableConfigurable configurable, Set<? super OptionDescription> 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);
}
}
@@ -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<TraverseUIHelper> helperExtensionPoint = ExtensionPointName.create(EP_NAME);
/**
* Invoked before indexing SearchableConfigurables
*/
default void beforeStart() {}
/**
* Invoked after all configurables were traversed
*/
default void afterTraversal(@NotNull Map<SearchableConfigurable, Set<OptionDescription>> 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<OptionDescription> options) {}
/**
* Invoked after indexing a SearchableConfigurable
*/
default void afterConfigurable(@NotNull SearchableConfigurable configurable, @NotNull Set<OptionDescription> options) {}
/**
* Invoked before indexing the root component of a SearchableConfigurable
*/
default void beforeComponent(@NotNull SearchableConfigurable configurable, @NotNull JComponent component, @NotNull Set<? super OptionDescription> options) {}
/**
* Invoked after indexing the root component of a SearchableConfigurable
*/
default void afterComponent(@NotNull SearchableConfigurable configurable, @NotNull JComponent component, @NotNull Set<? super OptionDescription> options) {}
}
@@ -336,5 +336,7 @@
<extensionPoint qualifiedName="com.intellij.registryKey" beanClass="com.intellij.openapi.util.registry.RegistryKeyBean"/>
<extensionPoint name="fileBreadcrumbsCollector" interface="com.intellij.codeInsight.breadcrumbs.FileBreadcrumbsCollector" area="IDEA_PROJECT"/>
<extensionPoint qualifiedName="com.intellij.search.traverseUiHelper" interface="com.intellij.ide.ui.search.TraverseUIHelper"/>
</extensionPoints>
</idea-plugin>