From 2f4d825f20d19481bf765e512894ddaa537fdf69 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Sat, 27 Jan 2024 05:07:04 +0400 Subject: [PATCH] replace ActionToolbarAppListener with ComponentTreeWatcher A better fix for IDEA-323550 that does not involve a single-client topic and a dedicated listener interface. GitOrigin-RevId: c2652417110618e43f6f80863bf16bf555860217 --- .../actionSystem/impl/ActionToolbarImpl.java | 10 --------- .../openapi/wm/impl/ToolWindowImpl.kt | 22 +++++++------------ 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java index 5c3e0d95951d..5f8cfe22b46e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java @@ -40,7 +40,6 @@ import com.intellij.util.concurrency.EdtScheduledExecutorService; import com.intellij.util.concurrency.ThreadingAssertions; import com.intellij.util.concurrency.annotations.RequiresEdt; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.messages.Topic; import com.intellij.util.ui.*; import com.intellij.util.ui.update.UiNotifyConnector; import org.intellij.lang.annotations.MagicConstant; @@ -72,14 +71,6 @@ import java.util.function.Supplier; public class ActionToolbarImpl extends JPanel implements ActionToolbar, QuickActionProvider, AlphaAnimated { private static final Logger LOG = Logger.getInstance(ActionToolbarImpl.class); - @Topic.AppLevel - public static final Topic TOPIC = new Topic<>(ActionToolbarAppListener.class, Topic.BroadcastDirection.NONE); - - public interface ActionToolbarAppListener { - default void toolbarAdded(@NotNull ActionToolbar toolbar) { - } - } - private static final Set ourToolbars = new LinkedHashSet<>(); private static final String RIGHT_ALIGN_KEY = "RIGHT_ALIGN"; @@ -351,7 +342,6 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar, QuickAct ourToolbars.add(this); updateActionsOnAdd(); - ApplicationManager.getApplication().getMessageBus().syncPublisher(TOPIC).toolbarAdded(this); } protected void updateActionsOnAdd() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt index 196f13f65315..51a9dd2ed486 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt @@ -17,10 +17,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.* import com.intellij.openapi.actionSystem.ex.ActionUtil import com.intellij.openapi.actionSystem.impl.ActionButton -import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl -import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl.ActionToolbarAppListener import com.intellij.openapi.actionSystem.impl.FusAwareAction -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState import com.intellij.openapi.diagnostic.debug import com.intellij.openapi.diagnostic.logger @@ -38,7 +35,7 @@ import com.intellij.toolWindow.InternalDecoratorImpl import com.intellij.toolWindow.ToolWindowEventSource import com.intellij.toolWindow.ToolWindowProperty import com.intellij.ui.ClientProperty -import com.intellij.ui.ComponentUtil +import com.intellij.ui.ComponentTreeWatcher import com.intellij.ui.LayeredIcon import com.intellij.ui.UIBundle import com.intellij.ui.content.Content @@ -49,6 +46,7 @@ import com.intellij.ui.content.impl.ContentImpl import com.intellij.ui.content.impl.ContentManagerImpl import com.intellij.ui.content.tabs.TabbedContentAction import com.intellij.ui.scale.JBUIScale +import com.intellij.util.ArrayUtil import com.intellij.util.Consumer import com.intellij.util.ModalityUiUtil import com.intellij.util.SingleAlarm @@ -204,18 +202,14 @@ internal class ToolWindowImpl(val toolWindowManager: ToolWindowManagerImpl, onMovedOrResized() } }) - - ApplicationManager.getApplication().messageBus.connect(disposable).subscribe( - ActionToolbarImpl.TOPIC, - object : ActionToolbarAppListener { - override fun toolbarAdded(toolbar: ActionToolbar) { - // Check if it's our toolbar to avoid traversing the whole hierarchy every time a toolbar is added somewhere. - if (ComponentUtil.getParentOfType(InternalDecoratorImpl::class.java, toolbar.component) == decorator) { - updateToolbarsVisibility() - } + object : ComponentTreeWatcher(ArrayUtil.EMPTY_CLASS_ARRAY) { + override fun processComponent(component: Component) { + if (component is ActionToolbar) { + updateToolbarsVisibility() } } - ) + override fun unprocessComponent(component: Component) = Unit + }.register(decorator) toolWindowFocusWatcher = ToolWindowFocusWatcher(toolWindow = this, component = decorator) contentManager.addContentManagerListener(object : ContentManagerListener {