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() {
class EditorComponent(
private val project: Project,
configuration: KotlinFacetConfiguration?
private val configuration: KotlinFacetConfiguration?
) : JPanel(BorderLayout()) {
private val isMultiEditor = configuration == null
private val isMultiEditor: Boolean
get() = configuration == null
private var editableCommonArguments: CommonCompilerArguments
private var editableJvmArguments: K2JVMCompilerArguments
private var editableJsArguments: K2JSCompilerArguments
private var editableCompilerSettings: CompilerSettings
private lateinit var editableCommonArguments: CommonCompilerArguments
private lateinit var editableJvmArguments: K2JVMCompilerArguments
private lateinit var editableJsArguments: K2JSCompilerArguments
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) {
editableCommonArguments = object : CommonCompilerArguments() {}
editableJvmArguments = K2JVMCompilerArguments()
editableJsArguments = K2JSCompilerArguments()
editableCompilerSettings = CompilerSettings()
}
else {
} else {
editableCommonArguments = configuration!!.settings.compilerArguments!!
editableJvmArguments = editableCommonArguments as? K2JVMCompilerArguments
?: Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JVMCompilerArguments
?: Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JVMCompilerArguments
editableJsArguments = editableCommonArguments as? K2JSCompilerArguments
?: Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JSCompilerArguments
?: Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings.unfrozen() as K2JSCompilerArguments
editableCompilerSettings = configuration.settings.compilerSettings!!
}
compilerConfigurable = KotlinCompilerConfigurableTab(
project,
editableCommonArguments,
editableJsArguments,
editableJvmArguments,
editableCompilerSettings,
null,
false,
isMultiEditor
project,
editableCommonArguments,
editableJsArguments,
editableJvmArguments,
editableCompilerSettings,
null,
false,
isMultiEditor
)
}
val useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor }
val targetPlatformComboBox =
ComboBox<IdePlatform<*, *>>(IdePlatformKind.All_PLATFORMS.toTypedArray()).apply {
setRenderer(DescriptionListCellRenderer())
}
private val projectSettingsLink = HoverHyperlinkLabel("Edit project settings").apply {
addHyperlinkListener {
ShowSettingsUtilImpl.showSettingsDialog(project, compilerConfigurable.id, "")
if (useProjectSettingsCheckBox.isSelected) {
updateCompilerConfigurable()
useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor }
targetPlatformComboBox = ComboBox<IdePlatform<*, *>>(IdePlatformKind.All_PLATFORMS.toTypedArray()).apply {
setRenderer(DescriptionListCellRenderer())
}
projectSettingsLink = HoverHyperlinkLabel("Edit project settings").apply {
addHyperlinkListener {
ShowSettingsUtilImpl.showSettingsDialog(project, compilerConfigurable.id, "")
if (useProjectSettingsCheckBox.isSelected) {
updateCompilerConfigurable()
}
}
}
}
init {
val contentPanel = FormBuilder
.createFormBuilder()
.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
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() {
with(editor.compilerConfigurable) {
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 {
if (!isInitialized) return false
if (editor.useProjectSettingsCheckBox.isSelected != configuration.settings.useProjectSettings) return true
if (editor.chosenPlatform != configuration.settings.platform) return true
return !editor.useProjectSettingsCheckBox.isSelected && editor.compilerConfigurable.isModified
}
override fun reset() {
if (!isInitialized) return
validateOnce {
editor.useProjectSettingsCheckBox.isSelected = configuration.settings.useProjectSettings
editor.targetPlatformComboBox.selectedItem = configuration.settings.platform
@@ -315,7 +329,9 @@ class KotlinFacetEditorGeneralTab(
}
override fun disposeUIResources() {
editor.compilerConfigurable.disposeUIResources()
if (isInitialized) {
editor.compilerConfigurable.disposeUIResources()
}
}
}
@@ -38,6 +38,8 @@ class MultipleKotlinFacetEditor(
override fun createComponent(): JComponent? {
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(targetPlatformComboBox, editors) { it.tabEditor.targetPlatformComboBox }
with(compilerConfigurable) {