diff --git a/plugins/kotlin/project-configuration/kotlin.project-configuration.iml b/plugins/kotlin/project-configuration/kotlin.project-configuration.iml
index e57133c22073..edeba6c84e02 100644
--- a/plugins/kotlin/project-configuration/kotlin.project-configuration.iml
+++ b/plugins/kotlin/project-configuration/kotlin.project-configuration.iml
@@ -38,5 +38,6 @@
+
\ No newline at end of file
diff --git a/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.kt b/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.kt
index 4c9bee895e70..c2302d177efb 100644
--- a/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.kt
+++ b/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.kt
@@ -4,12 +4,12 @@ package org.jetbrains.kotlin.idea.framework.ui
import com.google.common.io.Closeables
import com.google.gson.JsonParser
import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.module.Module
import com.intellij.openapi.observable.properties.AtomicProperty
import com.intellij.openapi.observable.util.transform
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
-import com.intellij.openapi.util.Disposer
import com.intellij.ui.dsl.builder.AlignX
import com.intellij.ui.dsl.builder.bindText
import com.intellij.ui.dsl.builder.panel
@@ -34,7 +34,8 @@ class ConfigureDialogWithModulesAndVersion(
minimumVersion: String
) : DialogWrapper(project) {
private val chooseModulePanel = ChooseModulePanel(project, configurator, excludedModules)
- private val kotlinVersionChooser = KotlinVersionChooser(project, minimumVersion)
+ private val kotlinVersionChooser =
+ KotlinVersionChooser(project, minimumVersion, disposable, ModalityState.stateForComponent(window))
private val listOfKotlinVersionsAndModulesText = AtomicProperty("")
private val jvmModulesTargetingUnsupportedJvm: Map>
@@ -77,8 +78,6 @@ class ConfigureDialogWithModulesAndVersion(
showWarningIfThereAreDifferentKotlinVersions()
}
- Disposer.register(disposable, kotlinVersionChooser)
-
init()
}
diff --git a/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/KotlinVersionChooser.kt b/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/KotlinVersionChooser.kt
index a174b8d21667..c41653863928 100644
--- a/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/KotlinVersionChooser.kt
+++ b/plugins/kotlin/project-configuration/src/org/jetbrains/kotlin/idea/framework/ui/KotlinVersionChooser.kt
@@ -2,13 +2,19 @@
package org.jetbrains.kotlin.idea.framework.ui
import com.intellij.openapi.Disposable
+import com.intellij.openapi.application.EDT
+import com.intellij.openapi.application.ModalityState
+import com.intellij.openapi.application.asContextElement
+import com.intellij.openapi.components.Service
+import com.intellij.openapi.components.service
import com.intellij.openapi.observable.properties.AtomicBooleanProperty
import com.intellij.openapi.observable.properties.AtomicProperty
import com.intellij.openapi.observable.util.not
import com.intellij.openapi.observable.util.or
-import com.intellij.platform.ide.progress.withBackgroundProgress
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogPanel
+import com.intellij.openapi.util.Disposer
+import com.intellij.platform.util.coroutines.namedChildScope
import com.intellij.ui.dsl.builder.*
import com.intellij.ui.dsl.gridLayout.UnscaledGaps
import com.intellij.uiDesigner.core.Spacer
@@ -18,39 +24,54 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import org.jetbrains.kotlin.idea.projectConfiguration.KotlinProjectConfigurationBundle
import java.awt.Dimension
import javax.swing.DefaultComboBoxModel
-internal class KotlinVersionChooser(project: Project, minimumVersion: String): Disposable {
+@Service(Service.Level.PROJECT)
+internal class KotlinVersionChooserService(
+ private val coroutineScope: CoroutineScope
+) {
+ fun childScope(name: String): CoroutineScope = coroutineScope.namedChildScope(name)
+}
+
+internal class KotlinVersionChooser(
+ private val project: Project,
+ private val minimumVersion: String,
+ private val parentDisposable: Disposable,
+ private val modalityState: ModalityState
+) {
private val loading = AtomicBooleanProperty(true)
private val error = AtomicBooleanProperty(false)
private val comboBoxModel = DefaultComboBoxModel()
private val selectedVersion = AtomicProperty("")
- private val coroutineScope = CoroutineScope(Dispatchers.Default)
+ private val coroutineScope = project.service().childScope("KotlinVersionChooser")
val kotlinVersion: String?
get() = selectedVersion.get().takeIf { it.isNotBlank() }
init {
- coroutineScope.launch {
- withBackgroundProgress(project, KotlinProjectConfigurationBundle.message("configure.kotlin.find.maven.versions")) {
- comboBoxModel.removeAllElements()
- loading.set(true)
- error.set(false)
- val kotlinVersions = try {
+ Disposer.register(parentDisposable) {
+ coroutineScope.cancel()
+ }
+
+ coroutineScope.launch(Dispatchers.EDT + modalityState.asContextElement()) {
+ // Use IO dispatcher because loadVersions is blocking
+ val loadedVersions = withContext(Dispatchers.IO) {
+ runCatching {
ConfigureDialogWithModulesAndVersion.loadVersions(minimumVersion)
- } catch (e: Exception) {
- error.set(true)
- listOf(ConfigureDialogWithModulesAndVersion.DEFAULT_KOTLIN_VERSION)
- }
- comboBoxModel.addAll(kotlinVersions)
- @Suppress("HardCodedStringLiteral")
- comboBoxModel.selectedItem = kotlinVersions.firstOrNull()
- loading.set(false)
+ }.getOrNull()
}
+ error.set(loadedVersions == null)
+
+ val kotlinVersions = loadedVersions ?: listOf(ConfigureDialogWithModulesAndVersion.DEFAULT_KOTLIN_VERSION)
+ comboBoxModel.addAll(kotlinVersions)
+ @Suppress("HardCodedStringLiteral")
+ comboBoxModel.selectedItem = kotlinVersions.firstOrNull()
+ loading.set(false)
}
}
@@ -101,8 +122,4 @@ internal class KotlinVersionChooser(project: Project, minimumVersion: String): D
}.layout(RowLayout.PARENT_GRID)
}
}
-
- override fun dispose() {
- coroutineScope.cancel()
- }
}
\ No newline at end of file