From 3a80de8c85675c3e077a2115f1b32f5bc56e3884 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Tue, 2 Sep 2014 22:13:22 +0400 Subject: [PATCH] Ignore invisible SearchableConfigurable.Parent (0xDBE) --- .../options/ex/ConfigurableWrapper.java | 38 ++++++++++++++++++- .../options/ex/MixedConfigurableGroup.java | 6 +++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java index 825fc0eaee9e..b5a62f8ae395 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java @@ -196,7 +196,7 @@ public class ConfigurableWrapper implements SearchableConfigurable { return configurable instanceof SearchableConfigurable ? ((SearchableConfigurable)configurable).enableSearch(option) : null; } - private static class CompositeWrapper extends ConfigurableWrapper implements Configurable.Composite { + private static class CompositeWrapper extends ConfigurableWrapper implements SearchableConfigurable.Parent { private Configurable[] myKids; @@ -241,6 +241,42 @@ public class ConfigurableWrapper implements SearchableConfigurable { myKids = ArrayUtil.append(myKids, configurable); return this; } + + @Override + public boolean hasOwnContent() { + UnnamedConfigurable configurable = getConfigurable(); + if (configurable instanceof SearchableConfigurable.Parent) { + SearchableConfigurable.Parent parent = (SearchableConfigurable.Parent)configurable; + return parent.hasOwnContent(); + } + return false; + } + + @Override + public boolean isVisible() { + if (super.myConfigurable == null) { + String name = super.myEp.instanceClass; + if (name == null) { + name = super.myEp.implementationClass; + } + if (name != null) { + try { + if (!SearchableConfigurable.Parent.class.isAssignableFrom(super.myEp.findClass(name))) { + return true; // do not instantiate wrapped configurable if not needed + } + } + catch (ClassNotFoundException exception) { + return true; // ignore unexpected exception from findClass + } + } + } + UnnamedConfigurable configurable = getConfigurable(); + if (configurable instanceof SearchableConfigurable.Parent) { + SearchableConfigurable.Parent parent = (SearchableConfigurable.Parent)configurable; + return parent.isVisible(); + } + return true; + } } private static final class GroupWrapper extends CompositeWrapper implements ConfigurableGroup { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java index bf81c7b17cbe..ee12807ed9e1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/MixedConfigurableGroup.java @@ -97,6 +97,12 @@ public final class MixedConfigurableGroup implements SearchableConfigurable, Con ArrayList groups = new ArrayList(); HashMap> map = new HashMap>(); for (Configurable configurable : configurables) { + if (configurable instanceof SearchableConfigurable.Parent) { + SearchableConfigurable.Parent parent = (SearchableConfigurable.Parent)configurable; + if (!parent.isVisible()) { + continue; + } + } if (configurable instanceof ConfigurableGroup) { groups.add((ConfigurableGroup)configurable); }