diff --git a/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonComponent.kt b/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonComponent.kt index 04a27c9cdb71..11b3eede2bea 100644 --- a/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonComponent.kt +++ b/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonComponent.kt @@ -29,6 +29,7 @@ import java.awt.Graphics2D import java.awt.RenderingHints import java.awt.event.FocusEvent import java.awt.event.FocusListener +import java.util.* import javax.swing.JPanel private const val PLACE = "SegmentedButton" @@ -36,7 +37,14 @@ private const val PLACE = "SegmentedButton" @ApiStatus.Internal internal class SegmentedButtonComponent(items: Collection, private val renderer: (T) -> String) : JPanel(GridLayout()) { - var changeListener: (() -> Unit)? = null + + companion object { + @ApiStatus.Internal + internal fun interface SelectedItemListener: EventListener { + fun onChanged() + } + } + var spacing = SpacingConfiguration.EMPTY set(value) { field = value @@ -50,7 +58,9 @@ internal class SegmentedButtonComponent(items: Collection, private val ren setSelectedState(field, false) setSelectedState(value, true) field = value - changeListener?.invoke() + for (listener in listenerList.getListeners(SelectedItemListener::class.java)) { + listener.onChanged() + } repaint() } @@ -84,6 +94,14 @@ internal class SegmentedButtonComponent(items: Collection, private val ren actionRight.registerCustomShortcutSet(ActionUtil.getShortcutSet("SegmentedButton-right"), this) } + fun addSelectedItemListener(l: SelectedItemListener) { + listenerList.add(SelectedItemListener::class.java, l) + } + + fun removeSelectedItemListener(l: SelectedItemListener) { + listenerList.remove(SelectedItemListener::class.java, l) + } + override fun setEnabled(enabled: Boolean) { super.setEnabled(enabled) diff --git a/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonImpl.kt b/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonImpl.kt index c95526b1d87b..71eabccdf398 100644 --- a/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonImpl.kt +++ b/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/SegmentedButtonImpl.kt @@ -145,7 +145,7 @@ internal class SegmentedButtonImpl(parent: RowImpl, private val renderer: (T) segmentedButtonComponent.selectedItem = it } } - segmentedButtonComponent.changeListener = { + segmentedButtonComponent.addSelectedItemListener { segmentedButtonComponent.selectedItem?.let { mutex.lockOrSkip { property.set(it)