diff --git a/platform/platform-api/src/com/intellij/openapi/options/BoundConfigurable.kt b/platform/platform-api/src/com/intellij/openapi/options/BoundConfigurable.kt index 30799245e761..53064fccba32 100644 --- a/platform/platform-api/src/com/intellij/openapi/options/BoundConfigurable.kt +++ b/platform/platform-api/src/com/intellij/openapi/options/BoundConfigurable.kt @@ -2,29 +2,77 @@ package com.intellij.openapi.options import com.intellij.openapi.ui.DialogPanel +import com.intellij.openapi.util.ClearableLazyValue import javax.swing.JComponent /** * @author yole */ abstract class BoundConfigurable(private val displayName: String, private val helpTopic: String? = null) : Configurable { - private val panel: DialogPanel by lazy { createPanel() } + private val panel = object : ClearableLazyValue() { + override fun compute() = createPanel() + } abstract fun createPanel(): DialogPanel - final override fun createComponent(): JComponent? = panel + final override fun createComponent(): JComponent? = panel.value - override fun isModified() = panel.isModified() + override fun isModified() = panel.value.isModified() override fun getDisplayName(): String = displayName override fun reset() { - panel.reset() + panel.value.reset() } override fun apply() { - panel.apply() + panel.value.apply() + } + + override fun disposeUIResources() { + panel.drop() } override fun getHelpTopic(): String? = helpTopic -} \ No newline at end of file +} + +abstract class BoundCompositeConfigurable( + displayName: String, + helpTopic: String? = null +) : BoundConfigurable(displayName, helpTopic) { + private var configurablesCreated = false + + abstract fun createConfigurables(): List + + private val configurables by lazy { + configurablesCreated = true + createConfigurables() + } + + override fun isModified(): Boolean { + return super.isModified() || configurables.any { it.isModified } + } + + override fun reset() { + super.reset() + for (configurable in configurables) { + configurable.reset() + } + } + + override fun apply() { + super.apply() + for (configurable in configurables) { + configurable.apply() + } + } + + override fun disposeUIResources() { + super.disposeUIResources() + if (configurablesCreated) { + for (configurable in configurables) { + configurable.disposeUIResources() + } + } + } +}