diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectWizardJdkComboBox.kt b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectWizardJdkComboBox.kt index 116ab8872448..ceb205046f5e 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectWizardJdkComboBox.kt +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectWizardJdkComboBox.kt @@ -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, - sdkDownloadTaskProperty: GraphProperty + sdkDownloadTaskProperty: GraphProperty, +): Cell { + 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, + sdkDownloadTaskProperty: GraphProperty, + projectLocation: () -> String, + setProjectJdk: (Sdk?) -> Unit, + disposable: Disposable, + projectJdk: Sdk? = null, + sdkFilter: (Sdk) -> Boolean = { true }, ): Cell { - 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 diff --git a/java/idea-ui/src/com/intellij/ide/starters/shared/CommonStarterInitialStep.kt b/java/idea-ui/src/com/intellij/ide/starters/shared/CommonStarterInitialStep.kt index afd45bab4b56..32e2c9f97250 100644 --- a/java/idea-ui/src/com/intellij/ide/starters/shared/CommonStarterInitialStep.kt +++ b/java/idea-ui/src/com/intellij/ide/starters/shared/CommonStarterInitialStep.kt @@ -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 = propertyGraph.lazyProperty { entityName } protected val sdkProperty: GraphProperty = propertyGraph.lazyProperty { null } + protected val sdkDownloadTaskProperty: GraphProperty = propertyGraph.lazyProperty { null } protected val languageProperty: GraphProperty = propertyGraph.lazyProperty { starterContext.language } protected val projectTypeProperty: GraphProperty = 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() + 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) }