Simplify TabsHeightController by rewriting it without using rd (IDEA-218654)

GitOrigin-RevId: bfb5fae6551775956b8bd0eca7ae76715d456e0f
This commit is contained in:
Dmitry Jemerov
2019-08-02 19:04:31 +03:00
committed by intellij-monorepo-bot
parent 609a835464
commit 28acc14319
3 changed files with 39 additions and 63 deletions
@@ -21,7 +21,7 @@ open class SingleHeightTabs(project: Project?,
var height: Int? = null
init {
TabsHeightController.registerAdjective(this, {
TabsHeightController.addListener({
height = it
}, this)
}
@@ -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<JComponent, Int>()
private val adjectives = ViewableMap<JComponent, (Int) -> Unit>()
object TabsHeightController {
private val watchedComponents = mutableListOf<JComponent>()
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)
}
}
@@ -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);