From 624ff3b0a7f8be80c3c446e0237decdecd3b9382 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 2 Jul 2019 19:26:56 +0200 Subject: [PATCH] Support buttonGroup with property binding at any level, support binding to getter/setter pair GitOrigin-RevId: aff801f304a984b335af51d2850b237c87329c47 --- .../com/intellij/ui/layout/LayoutBuilder.kt | 19 ++++++++++++------- .../src/com/intellij/ui/layout/Row.kt | 9 +++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/layout/LayoutBuilder.kt b/platform/platform-impl/src/com/intellij/ui/layout/LayoutBuilder.kt index cd7d8fe41ee1..18fac2a3e321 100644 --- a/platform/platform-impl/src/com/intellij/ui/layout/LayoutBuilder.kt +++ b/platform/platform-impl/src/com/intellij/ui/layout/LayoutBuilder.kt @@ -11,7 +11,6 @@ import java.awt.event.ActionListener import javax.swing.ButtonGroup import javax.swing.JComponent import javax.swing.JLabel -import kotlin.reflect.KMutableProperty0 open class LayoutBuilder @PublishedApi internal constructor(@PublishedApi internal val builder: LayoutBuilderImpl, override val buttonGroup: ButtonGroup? = null) : RowBuilder { override fun createChildRow(label: JLabel?, buttonGroup: ButtonGroup?, isSeparated: Boolean, noGrid: Boolean, title: String?): Row { @@ -22,10 +21,6 @@ open class LayoutBuilder @PublishedApi internal constructor(@PublishedApi intern return builder.rootRow.createNoteOrCommentRow(component) } - fun buttonGroup(prop: KMutableProperty0, init: LayoutBuilderWithButtonGroupProperty.() -> Unit) { - LayoutBuilderWithButtonGroupProperty(builder, prop).init() - } - inline fun buttonGroup(crossinline elementActionListener: () -> Unit, init: LayoutBuilder.() -> Unit): ButtonGroup { val group = ButtonGroup() LayoutBuilder(builder, group).init() @@ -44,8 +39,18 @@ open class LayoutBuilder @PublishedApi internal constructor(@PublishedApi intern get() = builder } -class LayoutBuilderWithButtonGroupProperty - @PublishedApi internal constructor(builder: LayoutBuilderImpl, private val prop: KMutableProperty0) : LayoutBuilder(builder, ButtonGroup()) { +class RowBuilderWithButtonGroupProperty + @PublishedApi internal constructor(private val builder: RowBuilder, private val prop: PropertyBinding) : RowBuilder { + + override val buttonGroup: ButtonGroup? = ButtonGroup() + + override fun createChildRow(label: JLabel?, buttonGroup: ButtonGroup?, isSeparated: Boolean, noGrid: Boolean, title: String?): Row { + return builder.createChildRow(label, buttonGroup, isSeparated, noGrid, title) + } + + override fun createNoteOrCommentRow(component: JComponent): Row { + return builder.createNoteOrCommentRow(component) + } fun Row.radioButton(text: String, value: T): CellBuilder { val component = JBRadioButton(text, prop.get() == value) diff --git a/platform/platform-impl/src/com/intellij/ui/layout/Row.kt b/platform/platform-impl/src/com/intellij/ui/layout/Row.kt index 4acd5d4cbd8f..6fdc7dd2656f 100644 --- a/platform/platform-impl/src/com/intellij/ui/layout/Row.kt +++ b/platform/platform-impl/src/com/intellij/ui/layout/Row.kt @@ -7,6 +7,7 @@ import com.intellij.ui.components.noteComponent import javax.swing.ButtonGroup import javax.swing.JComponent import javax.swing.JLabel +import kotlin.reflect.KMutableProperty0 interface RowBuilder { val buttonGroup: ButtonGroup? @@ -46,6 +47,14 @@ interface RowBuilder { } } +inline fun RowBuilder.buttonGroup(prop: KMutableProperty0, init: RowBuilderWithButtonGroupProperty.() -> Unit) { + RowBuilderWithButtonGroupProperty(this, prop.toBinding()).init() +} + +inline fun RowBuilder.buttonGroup(noinline getter: () -> T, noinline setter: (T) -> Unit, init: RowBuilderWithButtonGroupProperty.() -> Unit) { + RowBuilderWithButtonGroupProperty(this, PropertyBinding(getter, setter)).init() +} + abstract class Row : Cell(), RowBuilder { abstract var enabled: Boolean