diff --git a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt index cac1f4263d9f7..0d5e8eefba380 100644 --- a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt +++ b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt @@ -13,7 +13,6 @@ import java.awt.Toolkit import java.awt.event.AWTEventListener import java.awt.event.MouseEvent import javax.swing.JComponent -import javax.swing.SwingUtilities import org.jetbrains.annotations.ApiStatus import org.jetbrains.jewel.bridge.actionSystem.ComponentDataProviderBridge import org.jetbrains.jewel.bridge.component.JBPopupRenderer @@ -206,7 +205,7 @@ public class JewelComposePanelWrapper(private val focusOnClickInside: Boolean) : internal var targetProvider: UiDataProvider? = null private val listener = AWTEventListener { event -> if (event !is MouseEvent || event.button == MouseEvent.NOBUTTON) return@AWTEventListener - if (!isFocusOwner && SwingUtilities.isDescendingFrom(event.component, this)) { + if (!composePanel.isFocusOwner && event.component.parent == composePanel) { composePanel.requestFocus() } } diff --git a/plugins/devkit/intellij.devkit.compose/src/demo/ComponentShowcaseTab.kt b/plugins/devkit/intellij.devkit.compose/src/demo/ComponentShowcaseTab.kt index 39a9d36ff8e25..f7ebb62f4f888 100644 --- a/plugins/devkit/intellij.devkit.compose/src/demo/ComponentShowcaseTab.kt +++ b/plugins/devkit/intellij.devkit.compose/src/demo/ComponentShowcaseTab.kt @@ -16,11 +16,13 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.onFirstVisible +import androidx.compose.ui.awt.SwingPanel import androidx.compose.ui.unit.dp import com.intellij.ide.BrowserUtil import com.intellij.openapi.project.Project import com.intellij.ui.JBColor import com.intellij.util.ui.JBUI +import javax.swing.JButton import org.jetbrains.jewel.bridge.toComposeColor import org.jetbrains.jewel.foundation.LocalComponent import org.jetbrains.jewel.foundation.actionSystem.provideData @@ -178,6 +180,32 @@ private fun RowScope.ColumnOne() { var sliderValue by remember { mutableFloatStateOf(.15f) } Slider(sliderValue, { sliderValue = it }, steps = 5) + var swingButtonClicks by remember { mutableIntStateOf(0) } + var swingButtonFocused by remember { mutableStateOf(false) } + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Text("Swing interop:") + SwingPanel( + factory = { + JButton("Click me (Swing)").apply { + addActionListener { + swingButtonClicks++ + requestFocusInWindow() + } + addFocusListener(object : java.awt.event.FocusListener { + override fun focusGained(e: java.awt.event.FocusEvent?) { + swingButtonFocused = true + } + override fun focusLost(e: java.awt.event.FocusEvent?) { + swingButtonFocused = false + } + }) + } + }, + modifier = Modifier.height(32.dp) + ) + Text("Clicks: $swingButtonClicks, Focused: $swingButtonFocused") + } + var bannerStyle by remember { mutableIntStateOf(0) } var clickLabel by remember { mutableStateOf("") }