From be3f1a182b8cfb7bda4a5f6b390966ec7ee5572f Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Fri, 24 Apr 2020 22:16:36 +0300 Subject: [PATCH] IDEA-229090: dispose all disposable components, when a configurable is removed GitOrigin-RevId: 23254374c9fe0e6e21c7bc697f473d552ce765fb --- .../options/ex/ConfigurableCardPanel.java | 69 +++++++++++++------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableCardPanel.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableCardPanel.java index 88f08a339162..84311b7eb7d6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableCardPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableCardPanel.java @@ -2,6 +2,7 @@ package com.intellij.openapi.options.ex; import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; @@ -29,6 +30,8 @@ import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import static com.intellij.openapi.actionSystem.PlatformDataKeys.UI_DISPOSABLE; + public class ConfigurableCardPanel extends CardLayoutPanel { private static final Logger LOG = Logger.getInstance(ConfigurableCardPanel.class); @@ -53,13 +56,13 @@ public class ConfigurableCardPanel extends CardLayoutPanel { - JComponent component = createConfigurableComponent(configurable); - if (configurable instanceof ConfigurableWrapper && component != null) { - addEPChangesListener((ConfigurableWrapper)configurable); - } - return component; - }); + JComponent component = createConfigurableComponent(configurable); + if (component == null) return null; + + if (configurable instanceof ConfigurableWrapper) { + ReadAction.run(() -> addEPChangesListener((ConfigurableWrapper)configurable)); + } + return new Wrapper(configurable, component); } @SuppressWarnings("rawtypes") @@ -150,6 +153,7 @@ public class ConfigurableCardPanel extends CardLayoutPanel !Disposer.isDisposed(disposable)) .forEach(disposable -> { - String name = configurable.getDisplayName(); - String id = ConfigurableVisitor.getId(configurable); - LOG.warn("auto-dispose '" + name + "' id=" + id); + LOG.warn(getString("auto-dispose", configurable)); Disposer.dispose(disposable); if (LOG.isDebugEnabled()) { - StringBuilder sb = new StringBuilder("component ").append(disposable.getClass()); - UIUtil.uiParents((Component)disposable, false).forEach(parent -> { - sb.append("\n in ").append(parent.getClass()); - }); - LOG.warn(sb.toString()); + UIUtil.uiParents((Component)disposable, false) + .forEach(parent -> LOG.debug(" in ", parent.getClass())); } }); } @@ -196,15 +195,17 @@ public class ConfigurableCardPanel extends CardLayoutPanel