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
This commit is contained in:
Gregory.Shrago
2024-01-27 10:41:58 +00:00
committed by intellij-monorepo-bot
parent 5daf13be28
commit 2f4d825f20
2 changed files with 8 additions and 24 deletions
@@ -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<ActionToolbarAppListener> TOPIC = new Topic<>(ActionToolbarAppListener.class, Topic.BroadcastDirection.NONE);
public interface ActionToolbarAppListener {
default void toolbarAdded(@NotNull ActionToolbar toolbar) {
}
}
private static final Set<ActionToolbarImpl> 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() {
@@ -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 {