Skip to content

Commit

Permalink
Call mediator.onChangeComponentSize() and mediator.onChangeComponentP…
Browse files Browse the repository at this point in the history
…osition() on _windowContainer size and position changes.
  • Loading branch information
m-sasha committed Apr 30, 2024
1 parent 0cf5cf1 commit 2414ff1
Showing 1 changed file with 38 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ import androidx.lifecycle.ViewModelStore
import androidx.lifecycle.ViewModelStoreOwner
import java.awt.Component
import java.awt.Window
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import java.awt.event.ComponentListener
import java.awt.event.WindowEvent
import java.awt.event.WindowFocusListener
import java.awt.event.WindowListener
Expand Down Expand Up @@ -88,7 +88,7 @@ internal class ComposeContainer(

private val useSwingGraphics: Boolean = ComposeFeatureFlags.useSwingGraphics,
private val layerType: LayerType = ComposeFeatureFlags.layerType,
) : ComponentListener, WindowFocusListener, WindowListener, LifecycleOwner, ViewModelStoreOwner {
) : WindowFocusListener, WindowListener, LifecycleOwner, ViewModelStoreOwner {
val windowContext = PlatformWindowContext()
var window: Window? = null
private set
Expand All @@ -111,6 +111,9 @@ internal class ComposeContainer(
error("Customizing windowContainer cannot be used with LayerType.OnSameCanvas")
}

_windowContainer?.removeComponentListener(windowContainerComponentListener)
value.addComponentListener(windowContainerComponentListener)

_windowContainer = value

windowContext.setWindowContainer(value)
Expand All @@ -136,6 +139,36 @@ internal class ComposeContainer(
composeSceneFactory = ::createComposeScene,
)

/**
* The listener to [window] size and position changes.
*/
private val windowComponentListener = object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) = onChangeWindowSize()
override fun componentMoved(e: ComponentEvent?) = onChangeWindowPosition()
}

/**
* The listener to [_windowContainer] size and position changes.
*/
private val windowContainerComponentListener = object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) {
if (!container.isDisplayable) return

mediator.onChangeComponentSize()

// Sometimes Swing displays interop views in incorrect order after resizing,
// so we need to force re-validate it.
container.validate()
container.repaint()
}

override fun componentMoved(e: ComponentEvent?) {
if (!container.isDisplayable) return

mediator.onChangeComponentPosition()
}
}

val contentComponent by mediator::contentComponent
val focusManager by mediator::focusManager
val accessible by mediator::accessible
Expand Down Expand Up @@ -171,23 +204,11 @@ internal class ComposeContainer(
updateLifecycleState()
viewModelStore.clear()

_windowContainer?.removeComponentListener(this)
_windowContainer?.removeComponentListener(windowContainerComponentListener)
mediator.dispose()
layers.fastForEach(DesktopComposeSceneLayer::close)
}

override fun componentResized(e: ComponentEvent?) {
onChangeWindowSize()

// Sometimes Swing displays interop views in incorrect order after resizing,
// so we need to force re-validate it.
container.validate()
container.repaint()
}
override fun componentMoved(e: ComponentEvent?) = onChangeWindowPosition()
override fun componentShown(e: ComponentEvent?) = Unit
override fun componentHidden(e: ComponentEvent?) = Unit

override fun windowGainedFocus(event: WindowEvent) = onChangeWindowFocus()
override fun windowLostFocus(event: WindowEvent) = onChangeWindowFocus()

Expand Down Expand Up @@ -216,15 +237,13 @@ internal class ComposeContainer(
private fun onChangeWindowPosition() {
if (!container.isDisplayable) return

mediator.onChangeComponentPosition()
layers.fastForEach(DesktopComposeSceneLayer::onChangeWindowPosition)
}

private fun onChangeWindowSize() {
if (!container.isDisplayable) return

windowContext.setContainerSize(windowContainer.sizeInPx)
mediator.onChangeComponentSize()
layers.fastForEach(DesktopComposeSceneLayer::onChangeWindowSize)
}

Expand Down Expand Up @@ -288,12 +307,12 @@ internal class ComposeContainer(
this.window?.let {
it.removeWindowFocusListener(this)
it.removeWindowListener(this)
it.removeComponentListener(this)
it.removeComponentListener(windowComponentListener)
}
window?.let {
it.addWindowFocusListener(this)
it.addWindowListener(this)
it.addComponentListener(this)
it.addComponentListener(windowComponentListener)
}
this.window = window

Expand Down

0 comments on commit 2414ff1

Please # to comment.