Wizard: do not allow to choose Frontend Application template & JS Library at the same time
#KT-40371 fixed
This commit is contained in:
+30
-2
@@ -1,5 +1,6 @@
|
||||
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.ui.ComboBox
|
||||
import com.intellij.ui.ColoredListCellRenderer
|
||||
import com.intellij.ui.SimpleTextAttributes
|
||||
@@ -13,13 +14,14 @@ import java.awt.event.ItemEvent
|
||||
import javax.swing.DefaultComboBoxModel
|
||||
import javax.swing.Icon
|
||||
import javax.swing.JList
|
||||
import javax.swing.SwingUtilities
|
||||
|
||||
class DropDownComponent<T : DisplayableSettingItem>(
|
||||
context: Context,
|
||||
initialValues: List<T> = emptyList(),
|
||||
private val initialValues: List<T> = emptyList(),
|
||||
initiallySelectedValue: T? = null,
|
||||
labelText: String? = null,
|
||||
filter: (T) -> Boolean = { true },
|
||||
private val filter: (T) -> Boolean = { true },
|
||||
private val validator: SettingValidator<T> = settingValidator { ValidationResult.OK },
|
||||
private val iconProvider: (T) -> Icon? = { null },
|
||||
onValueUpdate: (T) -> Unit = {}
|
||||
@@ -68,6 +70,32 @@ class DropDownComponent<T : DisplayableSettingItem>(
|
||||
}
|
||||
}
|
||||
|
||||
fun filterValues() {
|
||||
val selectedItem = model.selectedItem
|
||||
|
||||
safeUpdateUi {
|
||||
model.removeAllElements()
|
||||
initialValues.filter(filter).forEach(model::addElement)
|
||||
when {
|
||||
model.getIndexOf(selectedItem) != -1 -> {
|
||||
model.selectedItem = selectedItem
|
||||
}
|
||||
model.size != 0 -> {
|
||||
uiComponent.selectedIndex = 0
|
||||
uiComponent.selectedItem?.let {
|
||||
ApplicationManager.getApplication().invokeLater {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
forceValueUpdate(it as T)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
uiComponent.repaint()
|
||||
}
|
||||
|
||||
private val model get() = uiComponent.model as DefaultComboBoxModel
|
||||
|
||||
val valuesCount
|
||||
get() = uiComponent.model.size
|
||||
|
||||
|
||||
+4
@@ -51,6 +51,10 @@ abstract class UIComponent<V : Any>(
|
||||
validate(value)
|
||||
}
|
||||
|
||||
protected fun forceValueUpdate(newValue: V) {
|
||||
onValueUpdate(newValue)
|
||||
}
|
||||
|
||||
override fun onInit() {
|
||||
super.onInit()
|
||||
getUiValue()?.let(::validate)
|
||||
|
||||
+27
-20
@@ -1,12 +1,11 @@
|
||||
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
|
||||
|
||||
import com.intellij.ui.components.JBLabel
|
||||
import com.intellij.util.ui.JBUI
|
||||
import com.intellij.util.ui.UIUtil
|
||||
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
|
||||
import org.jetbrains.kotlin.tools.projectWizard.core.Context
|
||||
import org.jetbrains.kotlin.tools.projectWizard.core.Reader
|
||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
|
||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
|
||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.CommonTargetConfigurator
|
||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.getConfiguratorSettings
|
||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType
|
||||
@@ -59,13 +58,18 @@ class ModuleSettingsComponent(
|
||||
settingsList.setComponents(moduleSettingComponents)
|
||||
}
|
||||
|
||||
private fun createTemplatesListComponentForModule(module: Module) =
|
||||
read { availableTemplatesFor(module) }.takeIf { it.isNotEmpty() }?.let { templates ->
|
||||
ModuleTemplateComponent(context, module, templates, uiEditorUsagesStats) {
|
||||
updateModule(module)
|
||||
component.updateUI()
|
||||
}
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private fun createTemplatesListComponentForModule(module: Module): ModuleTemplateComponent? {
|
||||
val templates = read { availableTemplatesFor(module) }.takeIf { it.isNotEmpty() } ?: return null
|
||||
val templatesWithNoneTemplate = buildList {
|
||||
add(NoneTemplate)
|
||||
addAll(templates)
|
||||
}
|
||||
return ModuleTemplateComponent(context, module, templatesWithNoneTemplate, uiEditorUsagesStats) {
|
||||
updateModule(module)
|
||||
component.updateUI()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ModuleNameComponent(context: Context, private val module: Module) : TitledComponent(context) {
|
||||
@@ -117,11 +121,9 @@ private class ModuleTemplateComponent(
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private val dropDown = DropDownComponent(
|
||||
context,
|
||||
initialValues = buildList {
|
||||
add(NoneTemplate)
|
||||
addAll(templates)
|
||||
},
|
||||
initialValues = templates,
|
||||
initiallySelectedValue = module.template ?: NoneTemplate,
|
||||
filter = { template: Template -> read { template.isApplicableTo(this, module) } },
|
||||
labelText = null,
|
||||
) { value ->
|
||||
module.template = value.takeIf { it != NoneTemplate }
|
||||
@@ -150,19 +152,24 @@ private class ModuleTemplateComponent(
|
||||
addToBottom(templateDescriptionLabel)
|
||||
}
|
||||
|
||||
override val title: String = KotlinNewProjectWizardUIBundle.message("module.settings.template")
|
||||
|
||||
private object NoneTemplate : Template() {
|
||||
override val title = KotlinNewProjectWizardUIBundle.message("module.settings.template.none")
|
||||
override val description: String = ""
|
||||
override val moduleTypes: Set<ModuleType> = ModuleType.ALL
|
||||
override val id: String = "none"
|
||||
override fun onValueUpdated(reference: SettingReference<*, *>?) {
|
||||
super.onValueUpdated(reference)
|
||||
dropDown.filterValues()
|
||||
}
|
||||
|
||||
override val title: String = KotlinNewProjectWizardUIBundle.message("module.settings.template")
|
||||
}
|
||||
|
||||
private object NoneTemplate : Template() {
|
||||
override val title = KotlinNewProjectWizardUIBundle.message("module.settings.template.none")
|
||||
override val description: String = ""
|
||||
override val moduleTypes: Set<ModuleType> = ModuleType.ALL
|
||||
override val id: String = "none"
|
||||
}
|
||||
|
||||
fun Reader.availableTemplatesFor(module: Module) =
|
||||
TemplatesPlugin::templates.propertyValue.values.filter { template ->
|
||||
module.configurator.moduleType in template.moduleTypes && template.isApplicableTo(module)
|
||||
module.configurator.moduleType in template.moduleTypes
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user