Support buttonGroup with property binding at any level, support binding to getter/setter pair

GitOrigin-RevId: aff801f304a984b335af51d2850b237c87329c47
This commit is contained in:
Dmitry Jemerov
2019-07-03 01:13:10 +03:00
committed by intellij-monorepo-bot
parent 42130bc347
commit 624ff3b0a7
2 changed files with 21 additions and 7 deletions
@@ -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 <T : Any> buttonGroup(prop: KMutableProperty0<T>, init: LayoutBuilderWithButtonGroupProperty<T>.() -> 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<T : Any>
@PublishedApi internal constructor(builder: LayoutBuilderImpl, private val prop: KMutableProperty0<T>) : LayoutBuilder(builder, ButtonGroup()) {
class RowBuilderWithButtonGroupProperty<T : Any>
@PublishedApi internal constructor(private val builder: RowBuilder, private val prop: PropertyBinding<T>) : 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<JBRadioButton> {
val component = JBRadioButton(text, prop.get() == value)
@@ -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 <reified T : Any> RowBuilder.buttonGroup(prop: KMutableProperty0<T>, init: RowBuilderWithButtonGroupProperty<T>.() -> Unit) {
RowBuilderWithButtonGroupProperty(this, prop.toBinding()).init()
}
inline fun <reified T : Any> RowBuilder.buttonGroup(noinline getter: () -> T, noinline setter: (T) -> Unit, init: RowBuilderWithButtonGroupProperty<T>.() -> Unit) {
RowBuilderWithButtonGroupProperty(this, PropertyBinding(getter, setter)).init()
}
abstract class Row : Cell(), RowBuilder {
abstract var enabled: Boolean