[npw] Use the new JDK combo for generators

#IDEA-343968 Fixed

GitOrigin-RevId: eaf4cd1b94775054277d9b5d3e06519e2f73dfb5
This commit is contained in:
Louis Vignier
2024-08-28 16:36:40 +00:00
committed by intellij-monorepo-bot
parent 5c785be0e7
commit 14772a4268
2 changed files with 71 additions and 15 deletions
@@ -6,7 +6,6 @@ import com.intellij.icons.AllIcons
import com.intellij.ide.JavaUiBundle
import com.intellij.ide.projectWizard.ProjectWizardJdkIntent.*
import com.intellij.ide.util.PropertiesComponent
import com.intellij.ide.wizard.NewProjectWizardBaseData
import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData
import com.intellij.ide.wizard.NewProjectWizardBaseStep
import com.intellij.ide.wizard.NewProjectWizardStep
@@ -81,15 +80,36 @@ sealed class ProjectWizardJdkIntent {
fun NewProjectWizardStep.projectWizardJdkComboBox(
row: Row,
sdkProperty: GraphProperty<Sdk?>,
sdkDownloadTaskProperty: GraphProperty<SdkDownloadTask?>
sdkDownloadTaskProperty: GraphProperty<SdkDownloadTask?>,
): Cell<ProjectWizardJdkComboBox> {
return projectWizardJdkComboBox(
row, sdkProperty, sdkDownloadTaskProperty,
{
requireNotNull(baseData) {
"Expected ${NewProjectWizardBaseStep::class.java.simpleName} in the new project wizard step tree."
}.path
},
{ sdk -> context.projectJdk = sdk },
context.disposable,
context.projectJdk,
)
}
fun projectWizardJdkComboBox(
row: Row,
sdkProperty: GraphProperty<Sdk?>,
sdkDownloadTaskProperty: GraphProperty<SdkDownloadTask?>,
projectLocation: () -> String,
setProjectJdk: (Sdk?) -> Unit,
disposable: Disposable,
projectJdk: Sdk? = null,
sdkFilter: (Sdk) -> Boolean = { true },
): Cell<ProjectWizardJdkComboBox> {
val baseData = requireNotNull(baseData) {
"Expected ${NewProjectWizardBaseStep::class.java.simpleName} in the new project wizard step tree."
}
val sdkPropertyId = StdModuleTypes.JAVA
val selectedJdkProperty = "jdk.selected.${sdkPropertyId.id}"
val combo = ProjectWizardJdkComboBox(context.projectJdk, context.disposable)
val combo = ProjectWizardJdkComboBox(projectJdk, disposable)
combo.filterItems { sdkFilter(it) }
return row.cell(combo)
.columns(COLUMNS_LARGE)
@@ -103,7 +123,7 @@ fun NewProjectWizardStep.projectWizardJdkComboBox(
val intent = it.selectedItem
if (isWindows) {
val wslJDKValidation = validateJdkAndProjectCompatibility(intent, baseData)
val wslJDKValidation = validateJdkAndProjectCompatibility(intent, projectLocation)
if (wslJDKValidation != null) return@validationOnApply wslJDKValidation
}
@@ -123,7 +143,7 @@ fun NewProjectWizardStep.projectWizardJdkComboBox(
registerJdk(selected.home, combo)
}
context.projectJdk = sdkProperty.get()
setProjectJdk.invoke(sdkProperty.get())
when (selected) {
is NoJdk -> JdkComboBoxCollector.noJdkSelected()
@@ -152,7 +172,7 @@ private fun ValidationInfoBuilder.validateInstallDir(intent: DownloadJdk): Valid
}
}
private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any?, baseData: NewProjectWizardBaseData): ValidationInfo? {
private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any?, location: () -> String): ValidationInfo? {
val path = when (intent) {
is DownloadJdk -> intent.task.plannedHomeDir
is ExistingJdk -> intent.jdk.homePath
@@ -160,7 +180,7 @@ private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any
else -> null
}
val isProjectWSL = WslPath.isWslUncPath(baseData.path)
val isProjectWSL = WslPath.isWslUncPath(location.invoke())
if (path != null && WslPath.isWslUncPath(path) != isProjectWSL) {
return when (isProjectWSL) {
@@ -408,6 +428,16 @@ class ProjectWizardJdkComboBox(
super.setSelectedItem(toSelect)
}
fun filterItems(sdkFilter: (Sdk) -> Boolean) {
registered.removeAll { !sdkFilter(it.jdk) }
for (i in itemCount - 1 downTo 0) {
val item = getItemAt(i)
if (item is ExistingJdk && !sdkFilter(item.jdk)) {
removeItemAt(i)
}
}
}
val lastRegisteredJdkIndex
get() = (0 until itemCount).firstOrNull { getItemAt(it) is AddJdkFromJdkListDownloader } ?: 0
@@ -4,25 +4,31 @@ package com.intellij.ide.starters.shared
import com.intellij.icons.AllIcons
import com.intellij.ide.IdeBundle
import com.intellij.ide.JavaUiBundle
import com.intellij.ide.projectWizard.generators.JdkDownloadService
import com.intellij.ide.projectWizard.projectWizardJdkComboBox
import com.intellij.ide.starters.JavaStartersBundle
import com.intellij.ide.starters.local.StarterModuleBuilder
import com.intellij.ide.starters.shared.ValidationFunctions.*
import com.intellij.ide.util.installNameGenerators
import com.intellij.ide.util.projectWizard.ModuleBuilder
import com.intellij.ide.util.projectWizard.ModuleBuilderListener
import com.intellij.ide.util.projectWizard.ModuleWizardStep
import com.intellij.ide.util.projectWizard.WizardContext
import com.intellij.ide.wizard.NewProjectWizardStep.Companion.GIT_PROPERTY_NAME
import com.intellij.ide.wizard.NewProjectWizardStep.Companion.GROUP_ID_PROPERTY_NAME
import com.intellij.openapi.Disposable
import com.intellij.openapi.components.service
import com.intellij.openapi.externalSystem.util.ExternalSystemBundle
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.module.StdModuleTypes
import com.intellij.openapi.module.Module
import com.intellij.openapi.observable.properties.GraphProperty
import com.intellij.openapi.observable.properties.PropertyGraph
import com.intellij.openapi.observable.util.*
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.roots.ui.configuration.JdkComboBox
import com.intellij.openapi.roots.ui.configuration.sdkComboBox
import com.intellij.openapi.roots.ui.configuration.projectRoot.SdkDownloadTask
import com.intellij.openapi.ui.BrowseFolderDescriptor.Companion.withPathToTextConvertor
import com.intellij.openapi.ui.BrowseFolderDescriptor.Companion.withTextToPathConvertor
import com.intellij.openapi.ui.TextFieldWithBrowseButton
@@ -57,6 +63,7 @@ abstract class CommonStarterInitialStep(
protected val artifactIdProperty: GraphProperty<String> = propertyGraph.lazyProperty { entityName }
protected val sdkProperty: GraphProperty<Sdk?> = propertyGraph.lazyProperty { null }
protected val sdkDownloadTaskProperty: GraphProperty<SdkDownloadTask?> = propertyGraph.lazyProperty { null }
protected val languageProperty: GraphProperty<StarterLanguage> = propertyGraph.lazyProperty { starterContext.language }
protected val projectTypeProperty: GraphProperty<StarterProjectType> = propertyGraph.lazyProperty {
@@ -134,9 +141,28 @@ abstract class CommonStarterInitialStep(
protected fun Panel.addSdkUi() {
row(JavaUiBundle.message("label.project.wizard.new.project.jdk")) {
sdkComboBox = sdkComboBox(wizardContext, sdkProperty, StdModuleTypes.JAVA.id, moduleBuilder::isSuitableSdkType)
.columns(COLUMNS_MEDIUM)
.component
projectWizardJdkComboBox(
this, sdkProperty, sdkDownloadTaskProperty,
{ location },
{ sdk -> wizardContext.projectJdk = sdk },
wizardContext.disposable,
wizardContext.projectJdk,
{ sdk -> moduleBuilder.isSuitableSdkType(sdk.sdkType) }
)
moduleBuilder.addListener(object : ModuleBuilderListener {
override fun moduleCreated(module: Module) {
val downloadTask = sdkDownloadTaskProperty.get() ?: return
val downloadService = module.project.service<JdkDownloadService>()
val jdk = downloadService.setupInstallableSdk(downloadTask)
if (wizardContext.isCreatingNewProject) {
ProjectRootManager.getInstance(module.project).projectSdk = jdk
} else {
ModuleRootModificationUtil.setModuleSdk(module, jdk)
}
downloadService.downloadSdk(jdk)
}
})
}.bottomGap(BottomGap.SMALL)
}