Configuraion: Defer initialization of facets UI

#KT-25410 Fixed
This commit is contained in:
Alexey Sedunov
2018-09-19 18:27:35 +03:00
parent 5e33860652
commit 6d4f927f7e
2 changed files with 85 additions and 67 deletions
@@ -45,64 +45,64 @@ class KotlinFacetEditorGeneralTab(
) : FacetEditorTab() { ) : FacetEditorTab() {
class EditorComponent( class EditorComponent(
private val project: Project, private val project: Project,
configuration: KotlinFacetConfiguration? private val configuration: KotlinFacetConfiguration?
) : JPanel(BorderLayout()) { ) : JPanel(BorderLayout()) {
private val isMultiEditor = configuration == null private val isMultiEditor: Boolean
get() = configuration == null
private var editableCommonArguments: CommonCompilerArguments private lateinit var editableCommonArguments: CommonCompilerArguments
private var editableJvmArguments: K2JVMCompilerArguments private lateinit var editableJvmArguments: K2JVMCompilerArguments
private var editableJsArguments: K2JSCompilerArguments private lateinit var editableJsArguments: K2JSCompilerArguments
private var editableCompilerSettings: CompilerSettings private lateinit var editableCompilerSettings: CompilerSettings
val compilerConfigurable: KotlinCompilerConfigurableTab lateinit var compilerConfigurable: KotlinCompilerConfigurableTab
private set
init { lateinit var useProjectSettingsCheckBox: ThreeStateCheckBox
lateinit var targetPlatformComboBox: ComboBox<IdePlatform<*, *>>
private lateinit var projectSettingsLink: HoverHyperlinkLabel
fun initialize() {
if (isMultiEditor) { if (isMultiEditor) {
editableCommonArguments = object : CommonCompilerArguments() {} editableCommonArguments = object : CommonCompilerArguments() {}
editableJvmArguments = K2JVMCompilerArguments() editableJvmArguments = K2JVMCompilerArguments()
editableJsArguments = K2JSCompilerArguments() editableJsArguments = K2JSCompilerArguments()
editableCompilerSettings = CompilerSettings() editableCompilerSettings = CompilerSettings()
} else {
}
else {
editableCommonArguments = configuration!!.settings.compilerArguments!! editableCommonArguments = configuration!!.settings.compilerArguments!!
editableJvmArguments = editableCommonArguments as? K2JVMCompilerArguments editableJvmArguments = editableCommonArguments as? K2JVMCompilerArguments
?: Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JVMCompilerArguments ?: Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JVMCompilerArguments
editableJsArguments = editableCommonArguments as? K2JSCompilerArguments editableJsArguments = editableCommonArguments as? K2JSCompilerArguments
?: Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JSCompilerArguments ?: Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JSCompilerArguments
editableCompilerSettings = configuration.settings.compilerSettings!! editableCompilerSettings = configuration.settings.compilerSettings!!
} }
compilerConfigurable = KotlinCompilerConfigurableTab( compilerConfigurable = KotlinCompilerConfigurableTab(
project, project,
editableCommonArguments, editableCommonArguments,
editableJsArguments, editableJsArguments,
editableJvmArguments, editableJvmArguments,
editableCompilerSettings, editableCompilerSettings,
null, null,
false, false,
isMultiEditor isMultiEditor
) )
}
val useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor } useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor }
targetPlatformComboBox = ComboBox<IdePlatform<*, *>>(IdePlatformKind.All_PLATFORMS.toTypedArray()).apply {
val targetPlatformComboBox = setRenderer(DescriptionListCellRenderer())
ComboBox<IdePlatform<*, *>>(IdePlatformKind.All_PLATFORMS.toTypedArray()).apply { }
setRenderer(DescriptionListCellRenderer()) projectSettingsLink = HoverHyperlinkLabel("Edit project settings").apply {
} addHyperlinkListener {
ShowSettingsUtilImpl.showSettingsDialog(project, compilerConfigurable.id, "")
private val projectSettingsLink = HoverHyperlinkLabel("Edit project settings").apply { if (useProjectSettingsCheckBox.isSelected) {
addHyperlinkListener { updateCompilerConfigurable()
ShowSettingsUtilImpl.showSettingsDialog(project, compilerConfigurable.id, "") }
if (useProjectSettingsCheckBox.isSelected) {
updateCompilerConfigurable()
} }
} }
}
init {
val contentPanel = FormBuilder val contentPanel = FormBuilder
.createFormBuilder() .createFormBuilder()
.addComponent(JPanel(BorderLayout()).apply { .addComponent(JPanel(BorderLayout()).apply {
@@ -205,38 +205,11 @@ class KotlinFacetEditorGeneralTab(
} }
} }
val editor = EditorComponent(editorContext.project, configuration) private var isInitialized = false
val editor by lazy { EditorComponent(editorContext.project, configuration) }
private var enableValidation = false private var enableValidation = false
init {
for (creator in KotlinFacetValidatorCreator.EP_NAME.getExtensions()) {
validatorsManager.registerValidator(creator.create(editor, validatorsManager, editorContext))
}
validatorsManager.registerValidator(ArgumentConsistencyValidator())
with(editor.compilerConfigurable) {
reportWarningsCheckBox.validateOnChange()
additionalArgsOptionsField.textField.validateOnChange()
generateSourceMapsCheckBox.validateOnChange()
outputPrefixFile.textField.validateOnChange()
outputPostfixFile.textField.validateOnChange()
outputDirectory.textField.validateOnChange()
copyRuntimeFilesCheckBox.validateOnChange()
moduleKindComboBox.validateOnChange()
languageVersionComboBox.addActionListener {
onLanguageLevelChanged()
doValidate()
}
apiVersionComboBox.validateOnChange()
coroutineSupportComboBox.validateOnChange()
}
editor.targetPlatformComboBox.validateOnChange()
editor.updateCompilerConfigurable()
}
private fun onLanguageLevelChanged() { private fun onLanguageLevelChanged() {
with(editor.compilerConfigurable) { with(editor.compilerConfigurable) {
onLanguageLevelChanged(selectedLanguageVersionView) onLanguageLevelChanged(selectedLanguageVersionView)
@@ -268,13 +241,54 @@ class KotlinFacetEditorGeneralTab(
} }
} }
fun initialize() {
if (isInitialized) return
editor.initialize()
for (creator in KotlinFacetValidatorCreator.EP_NAME.getExtensions()) {
validatorsManager.registerValidator(creator.create(editor, validatorsManager, editorContext))
}
validatorsManager.registerValidator(ArgumentConsistencyValidator())
with(editor.compilerConfigurable) {
reportWarningsCheckBox.validateOnChange()
additionalArgsOptionsField.textField.validateOnChange()
generateSourceMapsCheckBox.validateOnChange()
outputPrefixFile.textField.validateOnChange()
outputPostfixFile.textField.validateOnChange()
outputDirectory.textField.validateOnChange()
copyRuntimeFilesCheckBox.validateOnChange()
moduleKindComboBox.validateOnChange()
languageVersionComboBox.addActionListener {
onLanguageLevelChanged()
doValidate()
}
apiVersionComboBox.validateOnChange()
coroutineSupportComboBox.validateOnChange()
}
editor.targetPlatformComboBox.validateOnChange()
editor.updateCompilerConfigurable()
isInitialized = true
reset()
}
override fun onTabEntering() {
initialize()
}
override fun isModified(): Boolean { override fun isModified(): Boolean {
if (!isInitialized) return false
if (editor.useProjectSettingsCheckBox.isSelected != configuration.settings.useProjectSettings) return true if (editor.useProjectSettingsCheckBox.isSelected != configuration.settings.useProjectSettings) return true
if (editor.chosenPlatform != configuration.settings.platform) return true if (editor.chosenPlatform != configuration.settings.platform) return true
return !editor.useProjectSettingsCheckBox.isSelected && editor.compilerConfigurable.isModified return !editor.useProjectSettingsCheckBox.isSelected && editor.compilerConfigurable.isModified
} }
override fun reset() { override fun reset() {
if (!isInitialized) return
validateOnce { validateOnce {
editor.useProjectSettingsCheckBox.isSelected = configuration.settings.useProjectSettings editor.useProjectSettingsCheckBox.isSelected = configuration.settings.useProjectSettings
editor.targetPlatformComboBox.selectedItem = configuration.settings.platform editor.targetPlatformComboBox.selectedItem = configuration.settings.platform
@@ -315,7 +329,9 @@ class KotlinFacetEditorGeneralTab(
} }
override fun disposeUIResources() { override fun disposeUIResources() {
editor.compilerConfigurable.disposeUIResources() if (isInitialized) {
editor.compilerConfigurable.disposeUIResources()
}
} }
} }
@@ -38,6 +38,8 @@ class MultipleKotlinFacetEditor(
override fun createComponent(): JComponent? { override fun createComponent(): JComponent? {
return KotlinFacetEditorGeneralTab.EditorComponent(project, null).apply { return KotlinFacetEditorGeneralTab.EditorComponent(project, null).apply {
initialize()
editors.flatMap { it.editorTabs.filterIsInstance<KotlinFacetEditorGeneralTab>() }.forEach { it.initialize() }
helper.bind(useProjectSettingsCheckBox, editors) { it.tabEditor.useProjectSettingsCheckBox } helper.bind(useProjectSettingsCheckBox, editors) { it.tabEditor.useProjectSettingsCheckBox }
helper.bind(targetPlatformComboBox, editors) { it.tabEditor.targetPlatformComboBox } helper.bind(targetPlatformComboBox, editors) { it.tabEditor.targetPlatformComboBox }
with(compilerConfigurable) { with(compilerConfigurable) {