[new project wizard][IDEA-378105] bind jdkIntent to combobox

GitOrigin-RevId: f1d1c86cb37f393ea40bf476c48621f00c75ea43
This commit is contained in:
Alexander.Glukhov
2025-09-08 17:56:11 +00:00
committed by intellij-monorepo-bot
parent 533548db9f
commit 5d3d8f7c40
2 changed files with 31 additions and 39 deletions
@@ -19,6 +19,9 @@ import com.intellij.openapi.application.asContextElement
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.observable.properties.GraphProperty
import com.intellij.openapi.observable.properties.ObservableProperty
import com.intellij.openapi.observable.util.bind
import com.intellij.openapi.observable.util.transform
import com.intellij.openapi.observable.util.whenDisposed
import com.intellij.openapi.progress.runBlockingMaybeCancellable
import com.intellij.openapi.project.DefaultProjectFactory
@@ -39,6 +42,7 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.EelDescriptor
import com.intellij.platform.eel.EelOsFamily
import com.intellij.platform.eel.provider.LocalEelDescriptor
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.platform.eel.provider.localEel
@@ -110,30 +114,22 @@ fun projectWizardJdkComboBox(
sdkFilter: (Sdk) -> Boolean = { true },
jdkPredicate: ProjectWizardJdkPredicate? = ProjectWizardJdkPredicate.IsJdkSupported(),
): Cell<ProjectWizardJdkComboBox> {
val combo = ProjectWizardJdkComboBox(projectJdk, disposable, sdkFilter)
locationProperty.afterPropagation {
val path = locationProperty.get()
if (path.isEmpty()) {
return@afterPropagation
}
val newDescriptor = guardEelDescriptor { Path.of(locationProperty.get()).getEelDescriptor() } ?: LocalEelDescriptor
combo.eelChanged(newDescriptor)
}
combo.filterItems { sdkFilter(it) }
return row.cell(combo)
val eelDescriptorProperty = locationProperty.transform { Path.of(it).getEelDescriptor() }
return row.cell(ProjectWizardJdkComboBox(projectJdk, disposable, sdkFilter))
.columns(COLUMNS_LARGE)
.apply {
val commentCell = comment(component.comment, 50)
component.addItemListener {
commentCell.comment?.let { it.text = component.comment }
}
updateIntentProperty(combo, intentProperty)
}
.applyToComponent {
filterItems { sdkFilter(it) }
bind(intentProperty)
bindEelDescriptor(eelDescriptorProperty)
}
.validationInfo {
val intent = combo.selectedItem as? ProjectWizardJdkIntent ?: return@validationInfo null
val intent = intentProperty.get()
val version = intent.versionString ?: return@validationInfo null
val name = intent.name
val error = jdkPredicate?.getError(version, name ?: version) ?: return@validationInfo null
@@ -144,7 +140,7 @@ fun projectWizardJdkComboBox(
if (isWindows) {
// todo: remove this when JDK over Eel is enabled by default
val wslJDKValidation = validateJdkAndProjectCompatibility(intent, locationProperty::get)
val wslJDKValidation = validateJdkAndProjectCompatibility(intent, eelDescriptorProperty.get())
if (wslJDKValidation != null) return@validationOnApply wslJDKValidation
}
@@ -154,11 +150,8 @@ fun projectWizardJdkComboBox(
null
}
.onChanged {
updateIntentProperty(combo, intentProperty)
}
.onApply {
val intent = combo.selectedItem as? ProjectWizardJdkIntent ?: return@onApply
val intent = intentProperty.get()
when (intent) {
is NoJdk -> JdkComboBoxCollector.noJdkSelected()
is DownloadJdk -> JdkComboBoxCollector.jdkDownloaded((intent.task as JdkDownloadTask).jdkItem)
@@ -175,7 +168,7 @@ private fun ValidationInfoBuilder.validateInstallDir(intent: DownloadJdk): Valid
}
}
private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any?, location: () -> String): ValidationInfo? {
private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any?, eelDescriptor: EelDescriptor): ValidationInfo? {
val path = when (intent) {
is DownloadJdk -> intent.task.plannedHomeDir
is ExistingJdk -> intent.jdk.homePath
@@ -183,7 +176,8 @@ private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any
else -> null
}
val isProjectWSL = WslPath.isWslUncPath(location.invoke())
//todo this code is temporary and should be removed together with the java.home.finder.use.eel flag
val isProjectWSL = eelDescriptor.osFamily != EelOsFamily.Windows && isWindows
if (path != null && WslPath.isWslUncPath(path) != isProjectWSL) {
return when (isProjectWSL) {
@@ -194,13 +188,6 @@ private fun ValidationInfoBuilder.validateJdkAndProjectCompatibility(intent: Any
return null
}
private fun updateIntentProperty(
combo: ProjectWizardJdkComboBox,
intentProperty: GraphProperty<ProjectWizardJdkIntent>,
) {
intentProperty.set((combo.selectedItem as? ProjectWizardJdkIntent)!!)
}
@Service(Service.Level.APP)
internal class ProjectWizardJdkComboBoxService(
private val coroutineScope: CoroutineScope
@@ -333,11 +320,9 @@ class ProjectWizardJdkComboBox(
}
@RequiresEdt
fun eelChanged(descriptor: EelDescriptor) {
if (descriptor != currentEelDescriptor) {
currentEelDescriptor = descriptor
reloadJdks(descriptor)
}
fun refreshJdks(descriptor: EelDescriptor) {
currentEelDescriptor = descriptor
reloadJdks(descriptor)
}
@RequiresEdt
@@ -639,4 +624,12 @@ private fun addDownloadItem(extension: SdkDownload, combo: ComboBox<ProjectWizar
} ?: 0
combo.insertItemAt(DownloadJdk(task), index)
combo.selectedIndex = index
}
}
internal fun ProjectWizardJdkComboBox.bindEelDescriptor(eelDescriptorProperty: ObservableProperty<EelDescriptor>) {
// initial setup
refreshJdks(eelDescriptorProperty.get())
eelDescriptorProperty.afterChange { eelDescriptor ->
refreshJdks(eelDescriptor)
}
}
@@ -10,7 +10,6 @@ import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.projectRoots.SimpleJavaSdkType
import com.intellij.openapi.util.Disposer
import com.intellij.platform.eel.EelPlatform
import com.intellij.platform.eel.path.EelPath
import com.intellij.platform.eel.provider.LocalEelDescriptor
import com.intellij.platform.eel.provider.utils.EelPathUtils
import com.intellij.platform.testFramework.junit5.eel.fixture.eelFixture
@@ -34,11 +33,11 @@ class ProjectWizardJdkComboBoxTest {
val comboBox = ProjectWizardJdkComboBox(null, disposable)
comboBox.eelChanged(LocalEelDescriptor)
comboBox.refreshJdks(LocalEelDescriptor)
Assertions.assertTrue(comboBox.contains(localSdk))
Assertions.assertFalse(comboBox.contains(eelSdk))
comboBox.eelChanged(eelFixture.get().eelDescriptor)
comboBox.refreshJdks(eelFixture.get().eelDescriptor)
Assertions.assertFalse(comboBox.contains(localSdk))
Assertions.assertTrue(comboBox.contains(eelSdk))
}