From ece39e39983c83e8d604d5ea367b631ba9e9a331 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Wed, 26 Oct 2016 11:44:19 +0200 Subject: [PATCH] Kotlin UI DSL: easy way to disable sub rows --- .../src/PasswordSafeConfigurable.kt | 6 ++--- .../com/intellij/ui/layout/LayoutBuilder.kt | 6 +++-- .../intellij/ui/layout/MigLayoutBuilder.kt | 25 ++++++++++++++++--- .../src/com/intellij/ui/layout/Row.kt | 14 ++++++++++- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/platform/credential-store/src/PasswordSafeConfigurable.kt b/platform/credential-store/src/PasswordSafeConfigurable.kt index 5c0cffec64e2..a145102f1e69 100644 --- a/platform/credential-store/src/PasswordSafeConfigurable.kt +++ b/platform/credential-store/src/PasswordSafeConfigurable.kt @@ -145,7 +145,7 @@ internal class PasswordSafeConfigurableUi : ConfigurableUi fun getCurrentDbFile() = keePassDbFile.text.trim().nullize()?.let { Paths.get(it) } fun updateEnabledState() { - modeToRow[ProviderType.KEEPASS]?.enabled = getProviderType() == ProviderType.KEEPASS + modeToRow[ProviderType.KEEPASS]?.subRowsEnabled = getProviderType() == ProviderType.KEEPASS } override fun getComponent(): JPanel { @@ -163,7 +163,7 @@ internal class PasswordSafeConfigurableUi : ConfigurableUi } } - row { + modeToRow[ProviderType.KEEPASS] = row { inKeePass() row("Database:") { keePassDbFile = textFieldWithBrowseButton("KeePass Database File", @@ -193,7 +193,7 @@ internal class PasswordSafeConfigurableUi : ConfigurableUi } ) } - modeToRow[ProviderType.KEEPASS] = row("Master Password:") { + row("Master Password:") { keePassMasterPassword(growPolicy = GrowPolicy.SHORT_TEXT) } } 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 db152ecb0ec9..898bdcc8b145 100644 --- a/platform/platform-impl/src/com/intellij/ui/layout/LayoutBuilder.kt +++ b/platform/platform-impl/src/com/intellij/ui/layout/LayoutBuilder.kt @@ -25,8 +25,10 @@ class LayoutBuilder(val `$`: LayoutBuilderImpl, val buttonGroup: ButtonGroup? = row(label = Label(label), init = init) } - inline fun row(label: JLabel? = null, separated: Boolean = false, init: Row.() -> Unit) { - `$`.newRow(label, buttonGroup, separated).init() + inline fun row(label: JLabel? = null, separated: Boolean = false, init: Row.() -> Unit): Row { + val row = `$`.newRow(label, buttonGroup, separated) + row.init() + return row } /** diff --git a/platform/platform-impl/src/com/intellij/ui/layout/MigLayoutBuilder.kt b/platform/platform-impl/src/com/intellij/ui/layout/MigLayoutBuilder.kt index f871cff65590..bfd8e619748c 100644 --- a/platform/platform-impl/src/com/intellij/ui/layout/MigLayoutBuilder.kt +++ b/platform/platform-impl/src/com/intellij/ui/layout/MigLayoutBuilder.kt @@ -182,7 +182,7 @@ private fun addGrowIfNeed(cc: CC, component: Component) { } private class MigLayoutRow(private val componentConstraints: MutableMap, - private val builder: MigLayoutBuilder, + override val builder: LayoutBuilderImpl, val labeled: Boolean = false, val noGrid: Boolean = false, private val buttonGroup: ButtonGroup? = null, @@ -191,6 +191,11 @@ private class MigLayoutRow(private val componentConstraints: MutableMap() var rightIndex = Int.MAX_VALUE + private var _subRows: MutableList? = null + + override val subRows: List + get() = _subRows ?: emptyList() + override var enabled: Boolean = true get() = field set(value) { @@ -204,6 +209,17 @@ private class MigLayoutRow(private val componentConstraints: MutableMap Unit): Row { + override fun createRow(label: String): Row { val row = builder.newRow(Label(label), indented = true) - row.init() + if (_subRows == null) { + _subRows = SmartList() + } + _subRows!!.add(row) return row } } 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 066be6670d34..5f01310137ae 100644 --- a/platform/platform-impl/src/com/intellij/ui/layout/Row.kt +++ b/platform/platform-impl/src/com/intellij/ui/layout/Row.kt @@ -45,6 +45,12 @@ import javax.swing.JLabel abstract class Row() { abstract var enabled: Boolean + abstract var subRowsEnabled: Boolean + + abstract val subRows: List + + protected abstract val builder: LayoutBuilderImpl + fun label(text: String, gapLeft: Int = 0, style: ComponentStyle? = null, fontColor: FontColor? = null, bold: Boolean = false) { Label(text, style, fontColor, bold)(gapLeft = gapLeft) } @@ -113,7 +119,13 @@ abstract class Row() { protected abstract fun alignRight() - abstract fun row(label: String, init: Row.() -> Unit): Row + inline fun row(label: String, init: Row.() -> Unit): Row { + val row = createRow(label) + row.init() + return row + } + + protected abstract fun createRow(label: String): Row @Deprecated(message = "Nested row is prohibited", level = DeprecationLevel.ERROR) fun row(label: JLabel? = null, init: Row.() -> Unit) {