Commit 1aa55e23 authored by Nikolay Kuznetsov's avatar Nikolay Kuznetsov
Browse files

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
parent 36737551
Showing with 81 additions and 7 deletions
+81 -7
......@@ -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);
}
}
......
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) {}
}
\ No newline at end of file
......@@ -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>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment