Wizard: refactoring do not use context directly in UI

This commit is contained in:
Ilya Kirillov
2020-02-21 20:05:06 +03:00
parent ad39d0520a
commit 870b7d234f
59 changed files with 311 additions and 189 deletions
@@ -0,0 +1,22 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.wizard
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
class IdeContext(context: Context, servicesManager: ServicesManager, isUnitTestMode: Boolean) :
SettingsWritingContext(
context,
servicesManager,
isUnitTestMode
) {
val eventManager
get() = context.eventManager
}
@@ -27,6 +27,7 @@ class IdeWizard(
isUnitTestMode isUnitTestMode
) { ) {
private val allSettings = plugins.flatMap { it.declaredSettings } private val allSettings = plugins.flatMap { it.declaredSettings }
val ideContext = IdeContext(context, servicesManager, isUnitTestMode)
init { init {
with(valuesReadingContext) { with(valuesReadingContext) {
@@ -190,7 +190,7 @@ private class PomWizardStep(
originalSettingStep: SettingsStep, originalSettingStep: SettingsStep,
wizard: IdeWizard wizard: IdeWizard
) : WizardStep(wizard, GenerationPhase.PROJECT_GENERATION) { ) : WizardStep(wizard, GenerationPhase.PROJECT_GENERATION) {
private val pomWizardStepComponent = PomWizardStepComponent(wizard.valuesReadingContext) private val pomWizardStepComponent = PomWizardStepComponent(wizard.ideContext)
init { init {
originalSettingStep.addSettingsComponent(component) originalSettingStep.addSettingsComponent(component)
@@ -10,7 +10,7 @@ import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunCo
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService
import org.jetbrains.kotlin.tools.projectWizard.core.service.isBuildSystemAvailable import org.jetbrains.kotlin.tools.projectWizard.core.service.isBuildSystemAvailable
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
@@ -1,7 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
abstract class Component : Displayable { abstract class Component : Displayable {
private val subComponents = mutableListOf<Component>() private val subComponents = mutableListOf<Component>()
@@ -15,12 +18,7 @@ abstract class Component : Displayable {
} }
} }
abstract class DynamicComponent(private val readingContext: ReadingContext) : Component() { abstract class DynamicComponent(private val ideContext: IdeContext) : Component() {
//TODO do not use it in future
protected val context = readingContext.context
protected val eventManager
get() = readingContext.context.eventManager
private var isInitialized: Boolean = false private var isInitialized: Boolean = false
override fun onInit() { override fun onInit() {
@@ -29,22 +27,29 @@ abstract class DynamicComponent(private val readingContext: ReadingContext) : Co
} }
var <V : Any, T : SettingType<V>> SettingReference<V, T>.value: V? var <V : Any, T : SettingType<V>> SettingReference<V, T>.value: V?
get() = with(readingContext) { notRequiredSettingValue() } get() = read { notRequiredSettingValue() }
set(value) { set(value) = modify {
with(context) { settingContext[this@value] = value!! } value?.let { setValue(it) }
} }
inline val <V : Any, reified T : SettingType<V>> PluginSettingPropertyReference<V, T>.value: V? inline val <V : Any, reified T : SettingType<V>> PluginSettingPropertyReference<V, T>.value: V?
get() = reference.value get() = reference.value
init { init {
readingContext.context.eventManager.addSettingUpdaterEventListener { reference -> ideContext.eventManager.addSettingUpdaterEventListener { reference ->
if (isInitialized) onValueUpdated(reference) if (isInitialized) onValueUpdated(reference)
} }
} }
protected fun <T> read(reader: ReadingContext.() -> T): T = protected fun <T> read(reader: ReadingContext.() -> T): T =
reader(readingContext) reader(ideContext)
protected fun <T> write(writer: WritingContext.() -> T): T =
writer(ideContext)
protected fun <T> modify(modifier: SettingsWritingContext.() -> T): T =
modifier(ideContext)
open fun onValueUpdated(reference: SettingReference<*, *>?) {} open fun onValueUpdated(reference: SettingReference<*, *>?) {}
} }
@@ -1,30 +1,31 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import com.intellij.ui.components.panels.VerticalLayout import com.intellij.ui.components.panels.VerticalLayout
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.StringSettingComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.StringSettingComponent
import javax.swing.Box import javax.swing.Box
import javax.swing.JSeparator import javax.swing.JSeparator
import javax.swing.SwingConstants import javax.swing.SwingConstants
class PomWizardStepComponent(readingContext: ReadingContext) : WizardStepComponent(readingContext) { class PomWizardStepComponent(ideContext: IdeContext) : WizardStepComponent(ideContext) {
private val groupIdComponent = StringSettingComponent( private val groupIdComponent = StringSettingComponent(
StructurePlugin::groupId.reference, StructurePlugin::groupId.reference,
readingContext, ideContext,
showLabel = true showLabel = true
).asSubComponent() ).asSubComponent()
private val artifactIdComponent = StringSettingComponent( private val artifactIdComponent = StringSettingComponent(
StructurePlugin::artifactId.reference, StructurePlugin::artifactId.reference,
readingContext, ideContext,
showLabel = true showLabel = true
).asSubComponent() ).asSubComponent()
private val versionComponent = StringSettingComponent( private val versionComponent = StringSettingComponent(
StructurePlugin::version.reference, StructurePlugin::version.reference,
readingContext, ideContext,
showLabel = true showLabel = true
).asSubComponent() ).asSubComponent()
@@ -1,12 +1,13 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import java.awt.BorderLayout import java.awt.BorderLayout
import javax.swing.JComponent import javax.swing.JComponent
abstract class SubStep( abstract class SubStep(
readingContext: ReadingContext ideContext: IdeContext
) : DynamicComponent(readingContext) { ) : DynamicComponent(ideContext) {
protected abstract fun buildContent(): JComponent protected abstract fun buildContent(): JComponent
final override val component: JComponent by lazy(LazyThreadSafetyMode.NONE) { final override val component: JComponent by lazy(LazyThreadSafetyMode.NONE) {
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
abstract class WizardStepComponent( abstract class WizardStepComponent(
readingContext: ReadingContext ideContext: IdeContext
) : DynamicComponent(readingContext) ) : DynamicComponent(ideContext)
@@ -1,17 +1,18 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.ui.components.JBCheckBox import com.intellij.ui.components.JBCheckBox
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
class CheckboxComponent( class CheckboxComponent(
readingContext: ReadingContext, ideContext: IdeContext,
labelText: String? = null, labelText: String? = null,
initialValue: Boolean? = null, initialValue: Boolean? = null,
validator: SettingValidator<Boolean>? = null, validator: SettingValidator<Boolean>? = null,
onValueUpdate: (Boolean) -> Unit = {} onValueUpdate: (Boolean) -> Unit = {}
) : UIComponent<Boolean>( ) : UIComponent<Boolean>(
readingContext, ideContext,
labelText, labelText,
validator, validator,
onValueUpdate onValueUpdate
@@ -3,11 +3,12 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.ui.ComboBox import com.intellij.openapi.ui.ComboBox
import com.intellij.ui.ColoredListCellRenderer import com.intellij.ui.ColoredListCellRenderer
import com.intellij.ui.SimpleTextAttributes import com.intellij.ui.SimpleTextAttributes
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.awt.event.ItemEvent import java.awt.event.ItemEvent
import javax.swing.DefaultComboBoxModel import javax.swing.DefaultComboBoxModel
@@ -15,7 +16,7 @@ import javax.swing.Icon
import javax.swing.JList import javax.swing.JList
class DropDownComponent<T : DisplayableSettingItem>( class DropDownComponent<T : DisplayableSettingItem>(
private val readingContext: ReadingContext, ideContext: IdeContext,
initialValues: List<T> = emptyList(), initialValues: List<T> = emptyList(),
labelText: String? = null, labelText: String? = null,
private val filter: (T) -> Boolean = { true }, private val filter: (T) -> Boolean = { true },
@@ -23,7 +24,7 @@ class DropDownComponent<T : DisplayableSettingItem>(
private val iconProvider: (T) -> Icon? = { null }, private val iconProvider: (T) -> Icon? = { null },
onValueUpdate: (T) -> Unit = {} onValueUpdate: (T) -> Unit = {}
) : UIComponent<T>( ) : UIComponent<T>(
readingContext, ideContext,
labelText, labelText,
validator, validator,
onValueUpdate onValueUpdate
@@ -46,8 +47,8 @@ class DropDownComponent<T : DisplayableSettingItem>(
value.greyText?.let { value.greyText?.let {
append(" $it", SimpleTextAttributes.GRAYED_ATTRIBUTES) append(" $it", SimpleTextAttributes.GRAYED_ATTRIBUTES)
} }
if (this@apply.selectedItem != value) { if (this@apply.selectedItem != value) read {
validator.validate(readingContext, value) validator.validate(this, value)
.safeAs<ValidationResult.ValidationError>() .safeAs<ValidationResult.ValidationError>()
?.messages ?.messages
?.firstOrNull() ?.firstOrNull()
@@ -3,21 +3,22 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.ui.TextBrowseFolderListener import com.intellij.openapi.ui.TextBrowseFolderListener
import com.intellij.openapi.ui.TextFieldWithBrowseButton import com.intellij.openapi.ui.TextFieldWithBrowseButton
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.textField import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.textField
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
import javax.swing.JComponent import javax.swing.JComponent
class PathFieldComponent( class PathFieldComponent(
readingContext: ReadingContext, ideContext: IdeContext,
labelText: String? = null, labelText: String? = null,
initialValue: Path? = null, initialValue: Path? = null,
validator: SettingValidator<Path>? = null, validator: SettingValidator<Path>? = null,
onValueUpdate: (Path) -> Unit = {} onValueUpdate: (Path) -> Unit = {}
) : UIComponent<Path>( ) : UIComponent<Path>(
readingContext, ideContext,
labelText, labelText,
validator, validator,
onValueUpdate onValueUpdate
@@ -1,18 +1,19 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.ui.components.JBTextField import com.intellij.ui.components.JBTextField
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.textField import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.textField
class TextFieldComponent( class TextFieldComponent(
readingContext: ReadingContext, ideContext: IdeContext,
labelText: String? = null, labelText: String? = null,
initialValue: String? = null, initialValue: String? = null,
validator: SettingValidator<String>? = null, validator: SettingValidator<String>? = null,
onValueUpdate: (String) -> Unit = {} onValueUpdate: (String) -> Unit = {}
) : UIComponent<String>( ) : UIComponent<String>(
readingContext, ideContext,
labelText, labelText,
validator, validator,
onValueUpdate onValueUpdate
@@ -6,8 +6,9 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.Disposable import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label
@@ -18,11 +19,11 @@ import java.awt.BorderLayout
import javax.swing.JComponent import javax.swing.JComponent
abstract class UIComponent<V : Any>( abstract class UIComponent<V : Any>(
private val readingContext: ReadingContext, ideContext: IdeContext,
labelText: String? = null, labelText: String? = null,
private val validator: SettingValidator<V>? = null, private val validator: SettingValidator<V>? = null,
private val onValueUpdate: (V) -> Unit = {} private val onValueUpdate: (V) -> Unit = {}
) : DynamicComponent(readingContext), ErrorAwareComponent, FocusableComponent, Disposable { ) : DynamicComponent(ideContext), ErrorAwareComponent, FocusableComponent, Disposable {
private val validationIndicator by lazy(LazyThreadSafetyMode.NONE) { private val validationIndicator by lazy(LazyThreadSafetyMode.NONE) {
if (validator != null) if (validator != null)
IdeaBasedComponentValidator(this, getValidatorTarget()) IdeaBasedComponentValidator(this, getValidatorTarget())
@@ -69,7 +70,9 @@ abstract class UIComponent<V : Any>(
fun validate(value: V) { fun validate(value: V) {
if (validator == null) return if (validator == null) return
if (validationIndicator == null) return if (validationIndicator == null) return
validationIndicator?.updateValidationState(validator.validate(readingContext, value)) read {
validationIndicator?.updateValidationState(validator.validate(this, value))
}
} }
override fun focusOn() { override fun focusOn() {
@@ -77,7 +80,9 @@ abstract class UIComponent<V : Any>(
} }
override fun findComponentWithError(error: ValidationResult.ValidationError): FocusableComponent? = takeIf { override fun findComponentWithError(error: ValidationResult.ValidationError): FocusableComponent? = takeIf {
getUiValue()?.let { validator?.validate?.invoke(readingContext, it)?.isSpecificError(error) } == true read {
getUiValue()?.let { validator?.validate?.invoke(this, it)?.isSpecificError(error) } == true
}
} }
} }
@@ -6,26 +6,27 @@ import icons.OpenapiIcons
import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.UIComponentDelegatingSettingComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.UIComponentDelegatingSettingComponent
class BuildSystemTypeSettingComponent( class BuildSystemTypeSettingComponent(
readingContext: ReadingContext ideContext: IdeContext
) : UIComponentDelegatingSettingComponent<BuildSystemType, DropDownSettingType<BuildSystemType>>( ) : UIComponentDelegatingSettingComponent<BuildSystemType, DropDownSettingType<BuildSystemType>>(
BuildSystemPlugin::type.reference, BuildSystemPlugin::type.reference,
readingContext ideContext
) { ) {
override val uiComponent: DropDownComponent<BuildSystemType> = DropDownComponent( override val uiComponent: DropDownComponent<BuildSystemType> = DropDownComponent(
readingContext, ideContext,
setting.type.values, setting.type.values,
labelText = "Build System", labelText = "Build System",
filter = { value -> setting.type.filter(readingContext, reference, value) }, filter = { value -> read { setting.type.filter(this, reference, value) } },
validator = setting.validator, validator = setting.validator,
iconProvider = BuildSystemType::icon, iconProvider = BuildSystemType::icon,
onValueUpdate = { value = it } onValueUpdate = { value = it }
@@ -1,20 +1,20 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import java.awt.BorderLayout import java.awt.BorderLayout
import javax.swing.JComponent import javax.swing.JComponent
class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.valuesReadingContext) { class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.ideContext) {
private val buildSystemSubStep = BuildSystemSubStep(wizard.valuesReadingContext).asSubComponent() private val buildSystemSubStep = BuildSystemSubStep(wizard.ideContext).asSubComponent()
private val templatesSubStep = TemplatesSubStep(wizard.valuesReadingContext).asSubComponent() private val templatesSubStep = TemplatesSubStep(wizard.ideContext).asSubComponent()
override val component: JComponent = panel { override val component: JComponent = panel {
add(templatesSubStep.component, BorderLayout.CENTER) add(templatesSubStep.component, BorderLayout.CENTER)
@@ -22,19 +22,17 @@ class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.v
} }
} }
class BuildSystemSubStep(readingContext: ReadingContext) : class BuildSystemSubStep(ideContext: IdeContext) : SubStep(ideContext) {
SubStep(readingContext) { private val buildSystemSetting = BuildSystemTypeSettingComponent(ideContext).asSubComponent()
private val buildSystemSetting = BuildSystemTypeSettingComponent(readingContext).asSubComponent()
override fun buildContent(): JComponent = panel { override fun buildContent(): JComponent = panel {
add(buildSystemSetting.component, BorderLayout.CENTER) add(buildSystemSetting.component, BorderLayout.CENTER)
} }
} }
class TemplatesSubStep(readingContext: ReadingContext) : class TemplatesSubStep(ideContext: IdeContext) : SubStep(ideContext) {
SubStep(readingContext) {
private val projectTemplateSettingComponent = private val projectTemplateSettingComponent =
ProjectTemplateSettingComponent(readingContext) { projectTemplate -> ProjectTemplateSettingComponent(ideContext) { projectTemplate ->
templateDescriptionComponent.setTemplate(projectTemplate) templateDescriptionComponent.setTemplate(projectTemplate)
}.asSubComponent() }.asSubComponent()
@@ -51,11 +49,10 @@ class TemplatesSubStep(readingContext: ReadingContext) :
} }
private fun applySelectedTemplate() { private fun applySelectedTemplate() {
projectTemplateSettingComponent.value?.setsValues?.forEach { (setting, value) -> modify {
// TODO do not use settingContext directly projectTemplateSettingComponent.value?.setsValues?.forEach { (setting, value) ->
context.settingContext[setting] = value setting.setValue(value)
} }
read {
allModules().forEach { module -> allModules().forEach { module ->
module.apply { initDefaultValuesForSettings() } module.apply { initDefaultValuesForSettings() }
} }
@@ -1,10 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.DropDownSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ValidationIndicator import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ValidationIndicator
@@ -13,11 +13,11 @@ import javax.swing.BorderFactory
import javax.swing.JComponent import javax.swing.JComponent
class ProjectTemplateSettingComponent( class ProjectTemplateSettingComponent(
readingContext: ReadingContext, ideContext: IdeContext,
private val onSelected: (ProjectTemplate) -> Unit private val onSelected: (ProjectTemplate) -> Unit
) : SettingComponent<ProjectTemplate, DropDownSettingType<ProjectTemplate>>( ) : SettingComponent<ProjectTemplate, DropDownSettingType<ProjectTemplate>>(
ProjectTemplatesPlugin::template.reference, ProjectTemplatesPlugin::template.reference,
readingContext ideContext
) { ) {
override val validationIndicator: ValidationIndicator? get() = null override val validationIndicator: ValidationIndicator? get() = null
@@ -2,7 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import com.intellij.ui.components.JBTabbedPane import com.intellij.ui.components.JBTabbedPane
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.getConfiguratorSettings import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.getConfiguratorSettings
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module.Companion.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module.Companion.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.TextFieldComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.TextFieldComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
@@ -19,15 +20,15 @@ import java.awt.BorderLayout
import javax.swing.JComponent import javax.swing.JComponent
class ModuleSettingsComponent( class ModuleSettingsComponent(
readingContext: ReadingContext, ideContext: IdeContext,
uiEditorUsagesStats: UiEditorUsageStats uiEditorUsagesStats: UiEditorUsageStats
) : DynamicComponent(readingContext) { ) : DynamicComponent(ideContext) {
private val validateModuleName = private val validateModuleName =
StringValidators.shouldNotBeBlank("Module name") and StringValidators.shouldNotBeBlank("Module name") and
StringValidators.shouldBeValidIdentifier("Module Name", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES) StringValidators.shouldBeValidIdentifier("Module Name", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)
private val moduleConfiguratorSettingsList = SettingsList(emptyList(), readingContext).asSubComponent() private val moduleConfiguratorSettingsList = SettingsList(emptyList(), ideContext).asSubComponent()
private val templateComponent = TemplatesComponent(readingContext, uiEditorUsagesStats).asSubComponent() private val templateComponent = TemplatesComponent(ideContext, uiEditorUsagesStats).asSubComponent()
private val tabPanel = JBTabbedPane().apply { private val tabPanel = JBTabbedPane().apply {
add("Template", templateComponent.component) add("Template", templateComponent.component)
@@ -42,11 +43,11 @@ class ModuleSettingsComponent(
} }
private val nameField = TextFieldComponent( private val nameField = TextFieldComponent(
readingContext, ideContext,
labelText = "Name", labelText = "Name",
onValueUpdate = { value -> onValueUpdate = { value ->
module?.name = value module?.name = value
eventManager.fireListeners(null) ideContext.eventManager.fireListeners(null)
}, },
validator = validateModuleName validator = validateModuleName
).asSubComponent() ).asSubComponent()
@@ -1,12 +1,12 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import org.jetbrains.kotlin.idea.debugger.readAction
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor.ModulesEditorComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor.ModulesEditorComponent
@@ -17,9 +17,9 @@ import javax.swing.JComponent
class SecondStepWizardComponent( class SecondStepWizardComponent(
wizard: IdeWizard, wizard: IdeWizard,
uiEditorUsagesStats: UiEditorUsageStats uiEditorUsagesStats: UiEditorUsageStats
) : WizardStepComponent(wizard.valuesReadingContext) { ) : WizardStepComponent(wizard.ideContext) {
private val moduleEditorSubStep = private val moduleEditorSubStep =
ModulesEditorSubStep(wizard.valuesReadingContext, uiEditorUsagesStats, ::onNodeSelected) { ModulesEditorSubStep(wizard.ideContext, uiEditorUsagesStats, ::onNodeSelected) {
templatesSubStep.selectSettingWithError(it) templatesSubStep.selectSettingWithError(it)
}.asSubComponent() }.asSubComponent()
private val templatesSubStep = ModuleSettingsSubStep(wizard, uiEditorUsagesStats).asSubComponent() private val templatesSubStep = ModuleSettingsSubStep(wizard, uiEditorUsagesStats).asSubComponent()
@@ -36,13 +36,13 @@ class SecondStepWizardComponent(
class ModulesEditorSubStep( class ModulesEditorSubStep(
readingContext: ReadingContext, ideContext: IdeContext,
uiEditorUsagesStats: UiEditorUsageStats, uiEditorUsagesStats: UiEditorUsageStats,
onNodeSelected: (data: DisplayableSettingItem?) -> Unit, onNodeSelected: (data: DisplayableSettingItem?) -> Unit,
selectSettingWithError: (ValidationResult.ValidationError) -> Unit selectSettingWithError: (ValidationResult.ValidationError) -> Unit
) : SubStep(readingContext) { ) : SubStep(ideContext) {
private val moduleSettingComponent = ModulesEditorComponent( private val moduleSettingComponent = ModulesEditorComponent(
readingContext, ideContext,
uiEditorUsagesStats, uiEditorUsagesStats,
onNodeSelected, onNodeSelected,
selectSettingWithError selectSettingWithError
@@ -62,9 +62,9 @@ class ModulesEditorSubStep(
class ModuleSettingsSubStep( class ModuleSettingsSubStep(
wizard: IdeWizard, wizard: IdeWizard,
uiEditorUsagesStats: UiEditorUsageStats uiEditorUsagesStats: UiEditorUsageStats
) : SubStep(wizard.valuesReadingContext) { ) : SubStep(wizard.ideContext) {
private val sourcesetSettingsComponent = SourcesetSettingsComponent(wizard.valuesReadingContext).asSubComponent() private val sourcesetSettingsComponent = SourcesetSettingsComponent(wizard.ideContext).asSubComponent()
private val moduleSettingsComponent = ModuleSettingsComponent(wizard.valuesReadingContext, uiEditorUsagesStats).asSubComponent() private val moduleSettingsComponent = ModuleSettingsComponent(wizard.ideContext, uiEditorUsagesStats).asSubComponent()
private val nothingSelectedComponent = NothingSelectedComponent().asSubComponent() private val nothingSelectedComponent = NothingSelectedComponent().asSubComponent()
private val panel = panel { private val panel = panel {
@@ -5,12 +5,13 @@ import com.intellij.openapi.ui.DialogWrapper
import com.intellij.ui.ColoredListCellRenderer import com.intellij.ui.ColoredListCellRenderer
import com.intellij.ui.SimpleTextAttributes import com.intellij.ui.SimpleTextAttributes
import com.intellij.ui.ToolbarDecorator import com.intellij.ui.ToolbarDecorator
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.IOSSinglePlatformModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.IOSSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.awt.BorderLayout import java.awt.BorderLayout
@@ -18,8 +19,8 @@ import java.awt.Dimension
import javax.swing.JComponent import javax.swing.JComponent
class SourcesetDependenciesSettingsComponent( class SourcesetDependenciesSettingsComponent(
readingContext: ReadingContext ideContext: IdeContext
) : DynamicComponent(readingContext) { ) : DynamicComponent(ideContext) {
private val sourcesetDependenciesList = SourcesetDependenciesList() private val sourcesetDependenciesList = SourcesetDependenciesList()
private val toolbarDecorator: ToolbarDecorator = ToolbarDecorator.createDecorator(sourcesetDependenciesList).apply { private val toolbarDecorator: ToolbarDecorator = ToolbarDecorator.createDecorator(sourcesetDependenciesList).apply {
@@ -1,12 +1,13 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import com.intellij.ui.components.JBTabbedPane import com.intellij.ui.components.JBTabbedPane
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
class SourcesetSettingsComponent(readingContext: ReadingContext) : DynamicComponent(readingContext) { class SourcesetSettingsComponent(ideContext: IdeContext) : DynamicComponent(ideContext) {
private val dependenciesComponent = SourcesetDependenciesSettingsComponent(readingContext).asSubComponent() private val dependenciesComponent = SourcesetDependenciesSettingsComponent(ideContext).asSubComponent()
override val component = JBTabbedPane().apply { override val component = JBTabbedPane().apply {
add("Dependencies", dependenciesComponent.component) add("Dependencies", dependenciesComponent.component)
@@ -9,13 +9,14 @@ import com.intellij.util.ui.StatusText
import com.intellij.util.ui.UIUtil import com.intellij.util.ui.UIUtil
import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.templates.Template import org.jetbrains.kotlin.tools.projectWizard.templates.Template
import org.jetbrains.kotlin.tools.projectWizard.templates.settings import org.jetbrains.kotlin.tools.projectWizard.templates.settings
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.Component import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.Component
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ErrorAwareComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ErrorAwareComponent
@@ -26,17 +27,17 @@ import javax.swing.JComponent
import javax.swing.JPanel import javax.swing.JPanel
class TemplatesComponent( class TemplatesComponent(
readingContext: ReadingContext, ideContext: IdeContext,
uiEditorUsagesStats: UiEditorUsageStats uiEditorUsagesStats: UiEditorUsageStats
) : DynamicComponent(readingContext), ErrorAwareComponent { ) : DynamicComponent(ideContext), ErrorAwareComponent {
private val chooseTemplateComponent: ChooseTemplateComponent = private val chooseTemplateComponent: ChooseTemplateComponent =
ChooseTemplateComponent(readingContext) { template -> ChooseTemplateComponent(ideContext) { template ->
uiEditorUsagesStats.moduleTemplatesSet++ uiEditorUsagesStats.moduleTemplatesSet++
module?.template = template module?.template = template
switchState(template) switchState(template)
} }.asSubComponent()
private val templateSettingsComponent = TemplateSettingsComponent(readingContext) { private val templateSettingsComponent = TemplateSettingsComponent(ideContext) {
if (MessagesEx.showOkCancelDialog( if (MessagesEx.showOkCancelDialog(
component, component,
"Do you want to remove selected template from module", "Do you want to remove selected template from module",
@@ -50,7 +51,7 @@ class TemplatesComponent(
module?.template = null module?.template = null
switchState(null) switchState(null)
} }
} }.asSubComponent()
override fun findComponentWithError(error: ValidationResult.ValidationError): SettingComponent<*, *>? = override fun findComponentWithError(error: ValidationResult.ValidationError): SettingComponent<*, *>? =
templateSettingsComponent.findComponentWithError(error) templateSettingsComponent.findComponentWithError(error)
@@ -84,9 +85,9 @@ class TemplatesComponent(
} }
class ChooseTemplateComponent( class ChooseTemplateComponent(
readingContext: ReadingContext, ideContext: IdeContext,
private val onTemplateChosen: (Template) -> Unit private val onTemplateChosen: (Template) -> Unit
) : DynamicComponent(readingContext) { ) : DynamicComponent(ideContext) {
private enum class State(val text: String) { private enum class State(val text: String) {
MODULE_SELECTED_AND_TEMPLATES_AVAILABLE("You can configure a template for selected module"), MODULE_SELECTED_AND_TEMPLATES_AVAILABLE("You can configure a template for selected module"),
MODULE_SELECTED_AND_NO_TEMPLATES_AVAILABLE("No templates available for selected module"), MODULE_SELECTED_AND_NO_TEMPLATES_AVAILABLE("No templates available for selected module"),
@@ -247,9 +248,9 @@ class TemplateDescriptionComponent(
} }
private class TemplateSettingsComponent( private class TemplateSettingsComponent(
readingContext: ReadingContext, ideContext: IdeContext,
removeTemplate: () -> Unit removeTemplate: () -> Unit
) : DynamicComponent(readingContext), ErrorAwareComponent { ) : DynamicComponent(ideContext), ErrorAwareComponent {
private val templateDescriptionComponent = TemplateDescriptionComponent( private val templateDescriptionComponent = TemplateDescriptionComponent(
needRemoveButton = true, needRemoveButton = true,
nonDefaultBackgroundColor = UIUtil.getEditorPaneBackground(), nonDefaultBackgroundColor = UIUtil.getEditorPaneBackground(),
@@ -258,7 +259,7 @@ private class TemplateSettingsComponent(
component.bordered(needTopEmptyBorder = false, needBottomEmptyBorder = false) component.bordered(needTopEmptyBorder = false, needBottomEmptyBorder = false)
} }
private val settings = SettingsList(emptyList(), readingContext).apply { private val settings = SettingsList(emptyList(), ideContext).apply {
component.bordered() component.bordered()
} }
@@ -3,13 +3,14 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEdi
import com.intellij.ui.JBColor import com.intellij.ui.JBColor
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ListSettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.ListSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.AlwaysShownValidationIndicator import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.AlwaysShownValidationIndicator
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent
@@ -19,11 +20,11 @@ import javax.swing.JComponent
class ModulesEditorComponent( class ModulesEditorComponent(
readingContext: ReadingContext, ideContext: IdeContext,
uiEditorUsagesStats: UiEditorUsageStats, uiEditorUsagesStats: UiEditorUsageStats,
oneEntrySelected: (data: DisplayableSettingItem?) -> Unit, oneEntrySelected: (data: DisplayableSettingItem?) -> Unit,
selectSettingWithError: (ValidationResult.ValidationError) -> Unit selectSettingWithError: (ValidationResult.ValidationError) -> Unit
) : SettingComponent<List<Module>, ListSettingType<Module>>(KotlinPlugin::modules.reference, readingContext) { ) : SettingComponent<List<Module>, ListSettingType<Module>>(KotlinPlugin::modules.reference, ideContext) {
private val tree: ModulesEditorTree = private val tree: ModulesEditorTree =
ModulesEditorTree( ModulesEditorTree(
onSelected = { oneEntrySelected(it) }, onSelected = { oneEntrySelected(it) },
@@ -41,7 +42,7 @@ class ModulesEditorComponent(
} }
) )
private val model = TargetsModel(tree, ::value, readingContext, uiEditorUsagesStats) private val model = TargetsModel(tree, ::value, ideContext, uiEditorUsagesStats)
override fun onInit() { override fun onInit() {
super.onInit() super.onInit()
@@ -1,9 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.TreePath import javax.swing.tree.TreePath
@@ -12,7 +13,7 @@ import kotlin.reflect.KMutableProperty0
class TargetsModel( class TargetsModel(
private val tree: ModulesEditorTree, private val tree: ModulesEditorTree,
private val value: KMutableProperty0<List<Module>?>, private val value: KMutableProperty0<List<Module>?>,
private val readingContext: ReadingContext, private val ideContext: IdeContext,
private val uiEditorUsagesStats: UiEditorUsageStats private val uiEditorUsagesStats: UiEditorUsageStats
) { ) {
private val root get() = tree.model.root as DefaultMutableTreeNode private val root get() = tree.model.root as DefaultMutableTreeNode
@@ -65,7 +66,7 @@ class TargetsModel(
fun add(module: Module) { fun add(module: Module) {
uiEditorUsagesStats.modulesCreated++ uiEditorUsagesStats.modulesCreated++
addToTheTree(module, modifyValue = true, parent = tree.selectedNode ?: root) addToTheTree(module, modifyValue = true, parent = tree.selectedNode ?: root)
with(readingContext) { with(ideContext) {
module.apply { initDefaultValuesForSettings() } module.apply { initDefaultValuesForSettings() }
} }
} }
@@ -1,10 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import com.intellij.openapi.ui.ComboBox import com.intellij.openapi.ui.ComboBox
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
@@ -19,32 +20,32 @@ object DefaultSettingComponent {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <V : Any, T : SettingType<V>> create( fun <V : Any, T : SettingType<V>> create(
setting: SettingReference<V, T>, setting: SettingReference<V, T>,
readingContext: ReadingContext ideContext: IdeContext
): SettingComponent<V, T> = when (setting.type) { ): SettingComponent<V, T> = when (setting.type) {
VersionSettingType::class -> VersionSettingType::class ->
VersionSettingComponent( VersionSettingComponent(
setting as SettingReference<Version, VersionSettingType>, setting as SettingReference<Version, VersionSettingType>,
readingContext ideContext
) as SettingComponent<V, T> ) as SettingComponent<V, T>
BooleanSettingType::class -> BooleanSettingType::class ->
BooleanSettingComponent( BooleanSettingComponent(
setting as SettingReference<Boolean, BooleanSettingType>, setting as SettingReference<Boolean, BooleanSettingType>,
readingContext ideContext
) as SettingComponent<V, T> ) as SettingComponent<V, T>
DropDownSettingType::class -> DropDownSettingType::class ->
DropdownSettingComponent( DropdownSettingComponent(
setting as SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>, setting as SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>,
readingContext ideContext
) as SettingComponent<V, T> ) as SettingComponent<V, T>
StringSettingType::class -> StringSettingType::class ->
StringSettingComponent( StringSettingComponent(
setting as SettingReference<String, StringSettingType>, setting as SettingReference<String, StringSettingType>,
readingContext ideContext
) as SettingComponent<V, T> ) as SettingComponent<V, T>
PathSettingType::class -> PathSettingType::class ->
PathSettingComponent( PathSettingComponent(
setting as SettingReference<Path, PathSettingType>, setting as SettingReference<Path, PathSettingType>,
readingContext ideContext
) as SettingComponent<V, T> ) as SettingComponent<V, T>
else -> TODO(setting.type.qualifiedName!!) else -> TODO(setting.type.qualifiedName!!)
} }
@@ -52,8 +53,8 @@ object DefaultSettingComponent {
class VersionSettingComponent( class VersionSettingComponent(
reference: SettingReference<Version, VersionSettingType>, reference: SettingReference<Version, VersionSettingType>,
readingContext: ReadingContext ideContext: IdeContext
) : SettingComponent<Version, VersionSettingType>(reference, readingContext) { ) : SettingComponent<Version, VersionSettingType>(reference, ideContext) {
private val settingLabel = label(setting.title) private val settingLabel = label(setting.title)
private val comboBox = ComboBox<Version>().apply { private val comboBox = ComboBox<Version>().apply {
addItemListener { e -> addItemListener { e ->
@@ -90,17 +91,17 @@ class VersionSettingComponent(
class DropdownSettingComponent( class DropdownSettingComponent(
reference: SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>, reference: SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>,
readingContext: ReadingContext ideContext: IdeContext
) : UIComponentDelegatingSettingComponent<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>( ) : UIComponentDelegatingSettingComponent<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>(
reference, reference,
readingContext ideContext
) { ) {
override val uiComponent = DropDownComponent( override val uiComponent = DropDownComponent(
readingContext = readingContext, ideContext = ideContext,
initialValues = setting.type.values, initialValues = setting.type.values,
validator = setting.validator, validator = setting.validator,
filter = { value -> filter = { value ->
setting.type.filter(readingContext, reference, value) setting.type.filter(ideContext, reference, value)
}, },
labelText = setting.title, labelText = setting.title,
onValueUpdate = { newValue -> value = newValue } onValueUpdate = { newValue -> value = newValue }
@@ -109,13 +110,13 @@ class DropdownSettingComponent(
class BooleanSettingComponent( class BooleanSettingComponent(
reference: SettingReference<Boolean, BooleanSettingType>, reference: SettingReference<Boolean, BooleanSettingType>,
readingContext: ReadingContext ideContext: IdeContext
) : UIComponentDelegatingSettingComponent<Boolean, BooleanSettingType>( ) : UIComponentDelegatingSettingComponent<Boolean, BooleanSettingType>(
reference, reference,
readingContext ideContext
) { ) {
override val uiComponent = CheckboxComponent( override val uiComponent = CheckboxComponent(
readingContext = readingContext, ideContext = ideContext,
labelText = setting.title, labelText = setting.title,
initialValue = null, initialValue = null,
validator = setting.validator, validator = setting.validator,
@@ -125,14 +126,14 @@ class BooleanSettingComponent(
class StringSettingComponent( class StringSettingComponent(
reference: SettingReference<String, StringSettingType>, reference: SettingReference<String, StringSettingType>,
readingContext: ReadingContext, ideContext: IdeContext,
showLabel: Boolean = true showLabel: Boolean = true
) : UIComponentDelegatingSettingComponent<String, StringSettingType>( ) : UIComponentDelegatingSettingComponent<String, StringSettingType>(
reference, reference,
readingContext ideContext
) { ) {
override val uiComponent = TextFieldComponent( override val uiComponent = TextFieldComponent(
readingContext = readingContext, ideContext = ideContext,
initialValue = null, initialValue = null,
labelText = if (showLabel) setting.title else null, labelText = if (showLabel) setting.title else null,
validator = setting.validator, validator = setting.validator,
@@ -142,13 +143,13 @@ class StringSettingComponent(
class PathSettingComponent( class PathSettingComponent(
reference: SettingReference<Path, PathSettingType>, reference: SettingReference<Path, PathSettingType>,
readingContext: ReadingContext ideContext: IdeContext
) : UIComponentDelegatingSettingComponent<Path, PathSettingType>( ) : UIComponentDelegatingSettingComponent<Path, PathSettingType>(
reference, reference,
readingContext ideContext
) { ) {
override val uiComponent = PathFieldComponent( override val uiComponent = PathFieldComponent(
readingContext = readingContext, ideContext = ideContext,
labelText = setting.title, labelText = setting.title,
validator = settingValidator { path -> setting.validator.validate(this, path) }, validator = settingValidator { path -> setting.validator.validate(this, path) },
onValueUpdate = { newValue -> value = newValue } onValueUpdate = { newValue -> value = newValue }
@@ -1,15 +1,17 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.entity.Setting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.Displayable import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.Displayable
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent
abstract class SettingComponent<V : Any, T: SettingType<V>>( abstract class SettingComponent<V : Any, T : SettingType<V>>(
val reference: SettingReference<V, T>, val reference: SettingReference<V, T>,
private val readingContext: ReadingContext ideContext: IdeContext
) : DynamicComponent(readingContext), Displayable, FocusableComponent { ) : DynamicComponent(ideContext), Displayable, FocusableComponent {
var value: V? var value: V?
get() = reference.value get() = reference.value
set(value) { set(value) {
@@ -17,9 +19,7 @@ abstract class SettingComponent<V : Any, T: SettingType<V>>(
} }
val setting: Setting<V, T> val setting: Setting<V, T>
get() = with(readingContext.context) { get() = read { reference.setting }
with(reference) { getSetting() }
}
abstract val validationIndicator: ValidationIndicator? abstract val validationIndicator: ValidationIndicator?
@@ -29,14 +29,14 @@ abstract class SettingComponent<V : Any, T: SettingType<V>>(
} }
override fun onValueUpdated(reference: SettingReference<*, *>?) { override fun onValueUpdated(reference: SettingReference<*, *>?) {
component.isVisible = setting.isActive(readingContext) component.isVisible = read { setting.isActive(this) }
updateValidationState() updateValidationState()
} }
private fun updateValidationState() { private fun updateValidationState() {
val value = value val value = value
if (validationIndicator != null && value != null) { if (validationIndicator != null && value != null) read {
validationIndicator!!.updateValidationState(setting.validator.validate(readingContext, value)) validationIndicator!!.updateValidationState(setting.validator.validate(this, value))
} }
} }
} }
@@ -1,10 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import com.intellij.ui.components.panels.VerticalLayout import com.intellij.ui.components.panels.VerticalLayout
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.isSpecificError import org.jetbrains.kotlin.tools.projectWizard.core.entity.isSpecificError
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.PanelWithStatusText import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.PanelWithStatusText
@@ -16,8 +17,8 @@ interface ErrorAwareComponent {
class SettingsList( class SettingsList(
settings: List<SettingReference<*, *>>, settings: List<SettingReference<*, *>>,
private val readingContext: ReadingContext private val ideContext: IdeContext
) : DynamicComponent(readingContext), ErrorAwareComponent { ) : DynamicComponent(ideContext), ErrorAwareComponent {
private val panel = PanelWithStatusText(VerticalLayout(5), "This module has no settings to configure") private val panel = PanelWithStatusText(VerticalLayout(5), "This module has no settings to configure")
var settingComponents: List<SettingComponent<*, *>> = emptyList() var settingComponents: List<SettingComponent<*, *>> = emptyList()
@@ -38,15 +39,16 @@ class SettingsList(
panel.isStatusTextVisible = settings.isEmpty() panel.isStatusTextVisible = settings.isEmpty()
panel.removeAll() panel.removeAll()
settingComponents = settings.map { setting -> settingComponents = settings.map { setting ->
DefaultSettingComponent.create(setting, readingContext) DefaultSettingComponent.create(setting, ideContext)
} }
settingComponents.forEach { setting -> setting.onInit(); panel.add(setting.component) } settingComponents.forEach { setting -> setting.onInit(); panel.add(setting.component) }
} }
override fun findComponentWithError(error: ValidationResult.ValidationError) = override fun findComponentWithError(error: ValidationResult.ValidationError) = read {
settingComponents.firstOrNull { component -> settingComponents.firstOrNull { component ->
val value = component.value ?: return@firstOrNull false val value = component.value ?: return@firstOrNull false
val result = component.setting.validator.validate(readingContext, value) val result = component.setting.validator.validate(this, value)
result isSpecificError error result isSpecificError error
} }
}
} }
@@ -5,17 +5,17 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.UIComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.UIComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.valueForSetting import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.valueForSetting
import javax.swing.JComponent import javax.swing.JComponent
abstract class UIComponentDelegatingSettingComponent<V : Any, T : SettingType<V>>( abstract class UIComponentDelegatingSettingComponent<V : Any, T : SettingType<V>>(
reference: SettingReference<V, T>, reference: SettingReference<V, T>,
readingContext: ReadingContext ideContext: IdeContext
) : SettingComponent<V, T>(reference, readingContext) { ) : SettingComponent<V, T>(reference, ideContext) {
abstract val uiComponent: UIComponent<V> abstract val uiComponent: UIComponent<V>
// As there is one in UIComponent // As there is one in UIComponent
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
typealias Checker = ReadingContext.() -> Boolean typealias Checker = ReadingContext.() -> Boolean
val ALWAYS_AVAILABLE_CHECKER = checker { true } val ALWAYS_AVAILABLE_CHECKER = checker { true }
@@ -1,6 +1,14 @@
package org.jetbrains.kotlin.tools.projectWizard.core /*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.context
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService
@@ -8,7 +16,7 @@ import kotlin.reflect.KClass
import kotlin.reflect.KProperty1 import kotlin.reflect.KProperty1
open class ReadingContext( open class ReadingContext(
val context: Context, protected val context: Context,
private val servicesManager: ServicesManager, private val servicesManager: ServicesManager,
val isUnitTestMode: Boolean val isUnitTestMode: Boolean
) { ) {
@@ -19,10 +27,10 @@ open class ReadingContext(
servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found") servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found")
inline val <reified T : Any> PropertyReference<T>.propertyValue: T inline val <reified T : Any> PropertyReference<T>.propertyValue: T
get() = context.propertyContext[this] as T get() = `access$context`.propertyContext[this] as T
inline val <reified V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue: V inline val <reified V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue: V
get() = context.settingContext[this] ?: error("No value is present for setting `$this`") get() = `access$context`.settingContext[this] ?: error("No value is present for setting `$this`")
inline val <reified V : Any> KProperty1<out Plugin, PluginSetting<V, SettingType<V>>>.settingValue: V inline val <reified V : Any> KProperty1<out Plugin, PluginSetting<V, SettingType<V>>>.settingValue: V
get() = reference.settingValue get() = reference.settingValue
@@ -31,7 +39,7 @@ open class ReadingContext(
this.reference.settingValue this.reference.settingValue
inline fun <reified V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue(): V = inline fun <reified V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue(): V =
context.settingContext[this] ?: error("No value is present for setting `$this`") `access$context`.settingContext[this] ?: error("No value is present for setting `$this`")
val <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue: V? val <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue: V?
get() = context.settingContext[this] get() = context.settingContext[this]
@@ -52,4 +60,11 @@ open class ReadingContext(
val <V : Any> Setting<V, SettingType<V>>.savedOrDefaultValue: V? val <V : Any> Setting<V, SettingType<V>>.savedOrDefaultValue: V?
get() = getSavedValueForSetting() ?: defaultValue get() = getSavedValueForSetting() ?: defaultValue
val <V : Any, T : SettingType<V>> SettingReference<V, T>.setting: Setting<V, T>
get() = with(this) { getSetting() }
@PublishedApi
internal val `access$context`: Context
get() = context
} }
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.context
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
open class SettingsWritingContext(context: Context, servicesManager: ServicesManager, isUnitTestMode: Boolean) :
WritingContext(
context,
servicesManager,
isUnitTestMode
) {
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setValue(newValue: V) {
context.settingContext[this] = newValue
}
}
@@ -1,11 +1,17 @@
package org.jetbrains.kotlin.tools.projectWizard.core /*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.context
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PropertyReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.PropertyReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1 import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1Reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1Reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
class WritingContext( open class WritingContext(
context: Context, context: Context,
servicesManager: ServicesManager, servicesManager: ServicesManager,
isUnitTestMode: Boolean isUnitTestMode: Boolean
@@ -20,8 +26,7 @@ class WritingContext(
crossinline updater: suspend ComputeContext<*>.(T) -> TaskResult<T> crossinline updater: suspend ComputeContext<*>.(T) -> TaskResult<T>
): TaskResult<Unit> = compute { ): TaskResult<Unit> = compute {
val (newValue) = updater(propertyValue) val (newValue) = updater(propertyValue)
context.propertyContext[this@update] = newValue `access$context`.propertyContext[this@update] = newValue
Unit
} }
fun <T : Any> PropertyReference<List<T>>.addValues( fun <T : Any> PropertyReference<List<T>>.addValues(
@@ -1,6 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
@@ -18,7 +19,7 @@ sealed class SettingReference<out V : Any, out T : SettingType<V>> {
abstract val path: String abstract val path: String
abstract val type: KClass<out T> abstract val type: KClass<out T>
abstract fun Context.getSetting(): Setting<V, T> abstract fun ReadingContext.getSetting(): Setting<V, T>
final override fun toString() = path final override fun toString() = path
final override fun equals(other: Any?) = other.safeAs<SettingReference<*, *>>()?.path == path final override fun equals(other: Any?) = other.safeAs<SettingReference<*, *>>()?.path == path
@@ -37,8 +38,7 @@ data class PluginSettingReference<out V : Any, out T : SettingType<V>>(
constructor(setting: PluginSetting<V, T>) : constructor(setting: PluginSetting<V, T>) :
this(setting.path, setting.type::class as KClass<T>) this(setting.path, setting.type::class as KClass<T>)
override fun Context.getSetting(): Setting<V, T> = override fun ReadingContext.getSetting(): Setting<V, T> = pluginSetting
settingContext.getPluginSetting(this@PluginSettingReference)
} }
inline val <V : Any, reified T : SettingType<V>> PluginSetting<V, T>.reference: PluginSettingReference<V, T> inline val <V : Any, reified T : SettingType<V>> PluginSetting<V, T>.reference: PluginSettingReference<V, T>
@@ -55,7 +55,7 @@ sealed class ModuleConfiguratorSettingReference<V : Any, T : SettingType<V>> : S
override val type: KClass<out T> override val type: KClass<out T>
get() = setting.type::class get() = setting.type::class
override fun Context.getSetting(): Setting<V, T> = setting override fun ReadingContext.getSetting(): Setting<V, T> = setting
abstract val module: Module? abstract val module: Module?
} }
@@ -87,7 +87,7 @@ sealed class TemplateSettingReference<V : Any, T : SettingType<V>> : SettingRefe
override val type: KClass<out T> override val type: KClass<out T>
get() = setting.type::class get() = setting.type::class
override fun Context.getSetting(): Setting<V, T> = setting override fun ReadingContext.getSetting(): Setting<V, T> = setting
abstract val module: Module? abstract val module: Module?
} }
@@ -3,7 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.Failure import org.jetbrains.kotlin.tools.projectWizard.core.Failure
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
import org.jetbrains.kotlin.tools.projectWizard.core.ValidationError import org.jetbrains.kotlin.tools.projectWizard.core.ValidationError
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
inline class SettingValidator<V>(val validate: ReadingContext.(V) -> ValidationResult) { inline class SettingValidator<V>(val validate: ReadingContext.(V) -> ValidationResult) {
infix fun and(other: SettingValidator<V>) = SettingValidator<V> { value -> infix fun and(other: SettingValidator<V>) = SettingValidator<V> { value ->
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import kotlin.reflect.KProperty1 import kotlin.reflect.KProperty1
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
interface BuildSystemAvailabilityWizardService : WizardService { interface BuildSystemAvailabilityWizardService : WizardService {
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
interface RunConfigurationsService : WizardService { interface RunConfigurationsService : WizardService {
fun ReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>) fun ReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>)
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PluginSettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.PluginSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
@@ -2,8 +2,11 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.cached import org.jetbrains.kotlin.tools.projectWizard.core.cached
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -163,11 +166,11 @@ interface ModuleConfiguratorWithSettings : ModuleConfigurator {
fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList() fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList()
fun initDefaultValuesFor(module: Module, context: Context) { fun SettingsWritingContext.initDefaultValuesFor(module: Module) {
withSettingsOf(module) { withSettingsOf(module) {
getConfiguratorSettings().forEach { setting -> getConfiguratorSettings().forEach { setting ->
val defaultValue = setting.defaultValue ?: return@forEach val defaultValue = setting.defaultValue ?: return@forEach
context.settingContext[setting.reference] = defaultValue setting.reference.setValue(defaultValue)
} }
} }
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.CreateGradleValueIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.CreateGradleValueIR
@@ -1,12 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.KOTLIN_DIR import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.KOTLIN_DIR
import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.RESOURCES_DIR import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.RESOURCES_DIR
@@ -3,7 +3,9 @@ package org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem
import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
@@ -86,9 +88,9 @@ class Module(
else -> "Module" else -> "Module"
} }
fun ReadingContext.initDefaultValuesForSettings() { fun SettingsWritingContext.initDefaultValuesForSettings() {
configurator.safeAs<ModuleConfiguratorWithSettings>()?.initDefaultValuesFor(this@Module, context) configurator.safeAs<ModuleConfiguratorWithSettings>()?.apply { initDefaultValuesFor(this@Module) }
template?.apply { initDefaultValuesFor(this@Module, context) } template?.apply { initDefaultValuesFor(this@Module) }
} }
companion object { companion object {
@@ -4,7 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
@@ -3,7 +3,10 @@ package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -72,11 +75,11 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
open val settings: List<TemplateSetting<*, *>> = emptyList() open val settings: List<TemplateSetting<*, *>> = emptyList()
open val interceptionPoints: List<InterceptionPoint<Any>> = emptyList() open val interceptionPoints: List<InterceptionPoint<Any>> = emptyList()
fun ReadingContext.initDefaultValuesFor(module: Module, context: Context) { fun SettingsWritingContext.initDefaultValuesFor(module: Module) {
withSettingsOf(module) { withSettingsOf(module) {
settings.forEach { setting -> settings.forEach { setting ->
val defaultValue = setting.savedOrDefaultValue ?: return@forEach val defaultValue = setting.savedOrDefaultValue ?: return@forEach
context.settingContext[setting.reference] = defaultValue setting.reference.setValue(defaultValue)
} }
} }
} }
@@ -6,7 +6,7 @@ import org.apache.velocity.runtime.RuntimeConstants
import org.apache.velocity.runtime.RuntimeServices import org.apache.velocity.runtime.RuntimeServices
import org.apache.velocity.runtime.log.LogChute import org.apache.velocity.runtime.log.LogChute
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.div import org.jetbrains.kotlin.tools.projectWizard.core.div
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard package org.jetbrains.kotlin.tools.projectWizard.wizard
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
@@ -9,7 +11,8 @@ import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: ServicesManager, private val isUnitTestMode: Boolean) { abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: ServicesManager, private val isUnitTestMode: Boolean) {
val context = Context(createPlugins, EventManager()) val context = Context(createPlugins, EventManager())
val valuesReadingContext = ReadingContext(context, servicesManager, isUnitTestMode) val valuesReadingContext =
ReadingContext(context, servicesManager, isUnitTestMode)
protected val plugins = context.plugins protected val plugins = context.plugins
protected val pluginSettings = plugins.flatMap { it.declaredSettings }.distinctBy { it.path } protected val pluginSettings = plugins.flatMap { it.declaredSettings }.distinctBy { it.path }
@@ -48,7 +51,11 @@ abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: Servic
onTaskExecuting: (PipelineTask) -> Unit = {} onTaskExecuting: (PipelineTask) -> Unit = {}
): TaskResult<Unit> = computeM { ): TaskResult<Unit> = computeM {
context.checkAllRequiredSettingPresent(phases).ensure() context.checkAllRequiredSettingPresent(phases).ensure()
val taskRunningContext = WritingContext(context, servicesManager.withServices(services), isUnitTestMode) val taskRunningContext = WritingContext(
context,
servicesManager.withServices(services),
isUnitTestMode
)
taskRunningContext.validate(phases).ensure() taskRunningContext.validate(phases).ensure()
taskRunningContext.saveSettingValues(phases) taskRunningContext.saveSettingValues(phases)
val (tasksSorted) = context.sortTasks().map { tasks -> val (tasksSorted) = context.sortTasks().map { tasks ->