void (@NotNull List<? extends Configurable> configurables, @NotNull Map<SearchableConfigurable, @NotNull Set<OptionDescription>> options, boolean i18n) { for (final Configurable configurable : configurables) { if (!(configurable instanceof SearchableConfigurable searchableConfigurable)) { continue; } Set<OptionDescription> configurableOptions = new TreeSet<>(); options.put(searchableConfigurable, configurableOptions); for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensionList()) { extension.beforeConfigurable(searchableConfigurable, configurableOptions); } if (configurable instanceof MasterDetails md) { md.initUi(); processComponent(searchableConfigurable, configurableOptions, md.getMaster(), i18n); processComponent(searchableConfigurable, configurableOptions, md.getDetails().getComponent(), i18n); } else { processComponent(searchableConfigurable, configurableOptions, configurable.createComponent(), i18n); final Configurable unwrapped = unwrapConfigurable(configurable); if (unwrapped instanceof CompositeConfigurable) { unwrapped.disposeUIResources(); final List<? extends UnnamedConfigurable> children = ((CompositeConfigurable<?>)unwrapped).getConfigurables(); for (final UnnamedConfigurable child : children) { final Set<OptionDescription> childConfigurableOptions = new TreeSet<>(); options.put(new SearchableConfigurableAdapter(searchableConfigurable, child), childConfigurableOptions); if (child instanceof SearchableConfigurable) { processUILabel(((SearchableConfigurable)child).getDisplayName(), childConfigurableOptions, null, i18n); } final JComponent component = child.createComponent(); if (component != null) { processComponent(component, childConfigurableOptions, null, i18n); } configurableOptions.removeAll(childConfigurableOptions); } } } for (TraverseUIHelper extension : TraverseUIHelper.helperExtensionPoint.getExtensionList()) { extension.afterConfigurable(searchableConfigurable, configurableOptions); } } }