MPP: Show error popups for module names in the New Kotlin/Multiplatform wizard
#KT-23261 Fixed
This commit is contained in:
+94
-40
@@ -20,6 +20,7 @@ import com.intellij.ide.util.projectWizard.ModuleWizardStep
|
|||||||
import com.intellij.ide.util.projectWizard.ProjectWizardUtil
|
import com.intellij.ide.util.projectWizard.ProjectWizardUtil
|
||||||
import com.intellij.ide.util.projectWizard.WizardContext
|
import com.intellij.ide.util.projectWizard.WizardContext
|
||||||
import com.intellij.openapi.externalSystem.model.project.ProjectId
|
import com.intellij.openapi.externalSystem.model.project.ProjectId
|
||||||
|
import com.intellij.openapi.externalSystem.util.ExternalSystemUiUtil
|
||||||
import com.intellij.openapi.options.ConfigurationException
|
import com.intellij.openapi.options.ConfigurationException
|
||||||
import com.intellij.openapi.project.ProjectManager
|
import com.intellij.openapi.project.ProjectManager
|
||||||
import com.intellij.openapi.projectRoots.JavaSdk
|
import com.intellij.openapi.projectRoots.JavaSdk
|
||||||
@@ -27,12 +28,12 @@ import com.intellij.openapi.projectRoots.Sdk
|
|||||||
import com.intellij.openapi.roots.ui.configuration.JdkComboBox
|
import com.intellij.openapi.roots.ui.configuration.JdkComboBox
|
||||||
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel
|
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel
|
||||||
import com.intellij.openapi.ui.ComboBox
|
import com.intellij.openapi.ui.ComboBox
|
||||||
import com.intellij.ui.DocumentAdapter
|
import com.intellij.openapi.ui.MessageType
|
||||||
import com.intellij.ui.layout.CCFlags
|
import com.intellij.ui.layout.CCFlags
|
||||||
import com.intellij.ui.layout.LCFlags
|
import com.intellij.ui.layout.LCFlags
|
||||||
import com.intellij.ui.layout.panel
|
import com.intellij.ui.layout.panel
|
||||||
|
import org.jetbrains.kotlin.idea.util.onTextChange
|
||||||
import javax.swing.*
|
import javax.swing.*
|
||||||
import javax.swing.event.DocumentEvent
|
|
||||||
|
|
||||||
class KotlinGradleMultiplatformWizardStep(
|
class KotlinGradleMultiplatformWizardStep(
|
||||||
private val builder: KotlinGradleMultiplatformModuleBuilder,
|
private val builder: KotlinGradleMultiplatformModuleBuilder,
|
||||||
@@ -59,6 +60,7 @@ class KotlinGradleMultiplatformWizardStep(
|
|||||||
private val panel: JPanel
|
private val panel: JPanel
|
||||||
private var syncEditing: Boolean = true
|
private var syncEditing: Boolean = true
|
||||||
private var inSyncUpdate: Boolean = false
|
private var inSyncUpdate: Boolean = false
|
||||||
|
private var showErrorBalloons: Boolean = true
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val baseDir = wizardContext.projectFileDirectory
|
val baseDir = wizardContext.projectFileDirectory
|
||||||
@@ -69,24 +71,36 @@ class KotlinGradleMultiplatformWizardStep(
|
|||||||
|
|
||||||
updateDerivedModuleNames()
|
updateDerivedModuleNames()
|
||||||
|
|
||||||
rootModuleNameComponent.document.addDocumentListener(object : DocumentAdapter() {
|
rootModuleNameComponent.onTextChange {
|
||||||
override fun textChanged(e: DocumentEvent?) {
|
val rootModuleError = getRootModuleError()
|
||||||
if (syncEditing) {
|
showErrorBalloonIfNeeded(rootModuleNameComponent, rootModuleError)
|
||||||
|
if (syncEditing) {
|
||||||
|
showErrorBalloons = false
|
||||||
|
try {
|
||||||
updateDerivedModuleNames()
|
updateDerivedModuleNames()
|
||||||
}
|
} finally {
|
||||||
}
|
showErrorBalloons = true
|
||||||
})
|
if (rootModuleError == null) {
|
||||||
|
showCommonModuleErrorIfNeeded()
|
||||||
val stopSyncEditingListener = object : DocumentAdapter() {
|
showJvmModuleErrorIfNeeded()
|
||||||
override fun textChanged(e: DocumentEvent?) {
|
showJsModuleErrorIfNeeded()
|
||||||
if (!inSyncUpdate) {
|
}
|
||||||
syncEditing = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
commonModuleNameComponent.document.addDocumentListener(stopSyncEditingListener)
|
|
||||||
jvmModuleNameComponent.document.addDocumentListener(stopSyncEditingListener)
|
commonModuleNameComponent.onTextChange {
|
||||||
jsModuleNameComponent.document.addDocumentListener(stopSyncEditingListener)
|
stopSyncEditing()
|
||||||
|
showCommonModuleErrorIfNeeded()
|
||||||
|
}
|
||||||
|
jvmModuleNameComponent.onTextChange {
|
||||||
|
stopSyncEditing()
|
||||||
|
showJvmModuleErrorIfNeeded()
|
||||||
|
}
|
||||||
|
jsModuleNameComponent.onTextChange {
|
||||||
|
stopSyncEditing()
|
||||||
|
showJsModuleErrorIfNeeded()
|
||||||
|
}
|
||||||
|
|
||||||
jdkComboBox.selectedJdk = jdkModel.projectSdk
|
jdkComboBox.selectedJdk = jdkModel.projectSdk
|
||||||
|
|
||||||
@@ -115,6 +129,68 @@ class KotlinGradleMultiplatformWizardStep(
|
|||||||
panel.border = BorderFactory.createEmptyBorder(10, 10, 10, 10)
|
panel.border = BorderFactory.createEmptyBorder(10, 10, 10, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun showJsModuleErrorIfNeeded() {
|
||||||
|
showErrorBalloonIfNeeded(jsModuleNameComponent, getJsModuleError())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showJvmModuleErrorIfNeeded() {
|
||||||
|
showErrorBalloonIfNeeded(jvmModuleNameComponent, getJvmModuleError())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showCommonModuleErrorIfNeeded() {
|
||||||
|
showErrorBalloonIfNeeded(commonModuleNameComponent, getCommonModuleError())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showErrorBalloonIfNeeded(component: JComponent, errorMessage: String?) {
|
||||||
|
if (showErrorBalloons && errorMessage != null) {
|
||||||
|
ExternalSystemUiUtil.showBalloon(component, MessageType.ERROR, errorMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun stopSyncEditing() {
|
||||||
|
if (!inSyncUpdate) {
|
||||||
|
syncEditing = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getRootModuleError() = if (rootModuleName.isEmpty()) "Please specify the root module name" else null
|
||||||
|
|
||||||
|
private fun getCommonModuleError() = when {
|
||||||
|
!commonModuleIsRoot && commonModuleName.isEmpty() ->
|
||||||
|
"Please specify the common module name"
|
||||||
|
|
||||||
|
commonModuleName.isNotEmpty() &&
|
||||||
|
(commonModuleName == rootModuleName || commonModuleName == jvmModuleName || commonModuleName == jsModuleName) ->
|
||||||
|
"The common module name should be distinct"
|
||||||
|
|
||||||
|
else ->
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getJvmModuleError() = when {
|
||||||
|
jvmCheckBox.isSelected && jvmModuleName.isEmpty() ->
|
||||||
|
"Please specify the JVM module name"
|
||||||
|
|
||||||
|
jvmModuleName.isNotEmpty() &&
|
||||||
|
(jvmModuleName == rootModuleName || jvmModuleName == commonModuleName || jvmModuleName == jsModuleName) ->
|
||||||
|
"The JVM module name should be distinct"
|
||||||
|
|
||||||
|
else ->
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getJsModuleError() = when {
|
||||||
|
jsCheckBox.isSelected && jsModuleName.isEmpty() ->
|
||||||
|
"Please specify the JS module name"
|
||||||
|
|
||||||
|
jsModuleName.isNotEmpty() &&
|
||||||
|
(jsModuleName == rootModuleName || jsModuleName == commonModuleName || jsModuleName == jvmModuleName) ->
|
||||||
|
"The JS module name should be distinct"
|
||||||
|
|
||||||
|
else ->
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateDerivedModuleNames() {
|
private fun updateDerivedModuleNames() {
|
||||||
inSyncUpdate = true
|
inSyncUpdate = true
|
||||||
try {
|
try {
|
||||||
@@ -154,29 +230,7 @@ class KotlinGradleMultiplatformWizardStep(
|
|||||||
get() = if (jsCheckBox.isSelected) jsModuleNameComponent.text else ""
|
get() = if (jsCheckBox.isSelected) jsModuleNameComponent.text else ""
|
||||||
|
|
||||||
override fun validate(): Boolean {
|
override fun validate(): Boolean {
|
||||||
if (rootModuleName.isEmpty()) {
|
val errorMessage = getRootModuleError() ?: getCommonModuleError() ?: getJvmModuleError() ?: getJsModuleError() ?: return true
|
||||||
throw ConfigurationException("Please specify the root module name")
|
throw ConfigurationException(errorMessage)
|
||||||
}
|
|
||||||
if (!commonModuleIsRoot && commonModuleName.isEmpty()) {
|
|
||||||
throw ConfigurationException("Please specify the common module name")
|
|
||||||
}
|
|
||||||
if (jvmCheckBox.isSelected && jvmModuleName.isEmpty()) {
|
|
||||||
throw ConfigurationException("Please specify the JVM module name")
|
|
||||||
}
|
|
||||||
if (jsCheckBox.isSelected && jsModuleName.isEmpty()) {
|
|
||||||
throw ConfigurationException("Please specify the JS module name")
|
|
||||||
}
|
|
||||||
if (commonModuleName.isNotEmpty()
|
|
||||||
&& (commonModuleName == rootModuleName || commonModuleName == jvmModuleName || commonModuleName == jsModuleName)
|
|
||||||
) {
|
|
||||||
throw ConfigurationException("The common module name should be distinct")
|
|
||||||
}
|
|
||||||
if (jvmModuleName.isNotEmpty() && (jvmModuleName == rootModuleName || jvmModuleName == jsModuleName)) {
|
|
||||||
throw ConfigurationException("The JVM module name should be distinct")
|
|
||||||
}
|
|
||||||
if (jsModuleName.isNotEmpty() && jsModuleName == rootModuleName) {
|
|
||||||
throw ConfigurationException("The IS module name should be distinct")
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user