From 28acc14319adb90dfe96df0d43eed6a25b8e844f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 2 Aug 2019 17:51:47 +0200 Subject: [PATCH] Simplify TabsHeightController by rewriting it without using rd (IDEA-218654) GitOrigin-RevId: bfb5fae6551775956b8bd0eca7ae76715d456e0f --- .../intellij/ui/tabs/impl/SingleHeightTabs.kt | 2 +- .../ui/tabs/impl/TabsHeightController.kt | 98 +++++++------------ .../openapi/wm/impl/ToolWindowHeader.java | 2 +- 3 files changed, 39 insertions(+), 63 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/SingleHeightTabs.kt b/platform/platform-api/src/com/intellij/ui/tabs/impl/SingleHeightTabs.kt index 5146658c9be1..0dd0896eea81 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/SingleHeightTabs.kt +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/SingleHeightTabs.kt @@ -21,7 +21,7 @@ open class SingleHeightTabs(project: Project?, var height: Int? = null init { - TabsHeightController.registerAdjective(this, { + TabsHeightController.addListener({ height = it }, this) } diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/TabsHeightController.kt b/platform/platform-api/src/com/intellij/ui/tabs/impl/TabsHeightController.kt index 02d5435cca4e..5218e4f1c29f 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/TabsHeightController.kt +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/TabsHeightController.kt @@ -5,70 +5,46 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.util.Disposer import com.intellij.ui.tabs.TabsUtil import com.intellij.util.ui.JBUI -import com.jetbrains.rd.swing.sizeProperty -import com.jetbrains.rd.util.lifetime.Lifetime -import com.jetbrains.rd.util.lifetime.LifetimeDefinition -import com.jetbrains.rd.util.reactive.Property -import com.jetbrains.rd.util.reactive.ViewableMap -import com.intellij.openapi.rd.createLifetime -import com.intellij.openapi.rd.createNestedDisposable +import java.awt.event.ComponentAdapter +import java.awt.event.ComponentEvent import javax.swing.JComponent -class TabsHeightController { - companion object { - private val heightMap = ViewableMap() - private val adjectives = ViewableMap Unit>() +object TabsHeightController { + private val watchedComponents = mutableListOf() + private val listeners = mutableListOf<(Int) -> Unit>() + private var toolWindowHeight = TabsUtil.getTabsHeight(JBUI.CurrentTheme.ToolWindow.tabVerticalPadding()) - private var ld = LifetimeDefinition() - private val toolWindowHeightProperty = Property(TabsUtil.getTabsHeight(JBUI.CurrentTheme.ToolWindow.tabVerticalPadding())) - - init { - heightMap.advise(ld) { - val value = heightMap.maxBy { it.value }?.value - value?.let { - toolWindowHeightProperty.set(if(it > 0) it else TabsUtil.getTabsHeight(JBUI.CurrentTheme.ToolWindow.tabVerticalPadding())) - } - } - - toolWindowHeightProperty.advise(ld) { - for (entry in adjectives) { - entry.value(it) - } - } - } - - @JvmStatic - fun registerActive(comp: JComponent, parentDisposable: Disposable) { - val lifetime = createNestedLifeTime(parentDisposable) - - lifetime.bracket({ - comp.sizeProperty().advise(lifetime) { - heightMap[comp] = it.height - } - if (comp.height > 0) - heightMap[comp] = comp.height - }, - { heightMap.remove(comp) }) - - } - - @JvmStatic - fun registerAdjective(comp: JComponent, update: (Int) -> Unit, parentDisposable: Disposable) { - val lifetime = createNestedLifeTime(parentDisposable) - - lifetime.bracket({ - adjectives[comp] = update - update(toolWindowHeightProperty.value) - }, - { adjectives.remove(comp) }) - } - - private fun createNestedLifeTime(parentDisposable: Disposable): Lifetime { - val ds = Disposer.newDisposable() - val nestedDisposable = ld.createNestedDisposable() - Disposer.register(nestedDisposable, ds) - Disposer.register(parentDisposable, nestedDisposable) - return ds.createLifetime() + private fun recalcHeight() { + val height = (watchedComponents.map { it.height }.max() ?: 0).coerceAtLeast(TabsUtil.getTabsHeight(JBUI.CurrentTheme.ToolWindow.tabVerticalPadding())) + if (height != toolWindowHeight) { + toolWindowHeight = height + listeners.forEach { it(height) } } } + + @JvmStatic + fun registerActive(comp: JComponent, parentDisposable: Disposable) { + val listener = object : ComponentAdapter() { + override fun componentResized(e: ComponentEvent) { + recalcHeight() + } + } + + watchedComponents.add(comp) + recalcHeight() + comp.addComponentListener(listener) + + Disposer.register(parentDisposable, Disposable { + watchedComponents.remove(comp) + recalcHeight() + comp.removeComponentListener(listener) + }) + } + + @JvmStatic + fun addListener(update: (Int) -> Unit, parentDisposable: Disposable) { + listeners.add(update) + Disposer.register(parentDisposable, Disposable { listeners.remove(update) }) + update(toolWindowHeight) + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java index ba0f7cfc6e73..ac3c997df37f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java @@ -270,7 +270,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable, UIS @Override public void addNotify() { super.addNotify(); - TabsHeightController.registerAdjective(this, height -> { + TabsHeightController.addListener(height -> { updateHeight(height); return Unit.INSTANCE; }, this);