Wizard: introduce Android module type

This commit is contained in:
Ilya Kirillov
2020-03-02 12:08:35 +03:00
parent 034af78b0f
commit 275212b6a9
8 changed files with 45 additions and 36 deletions
@@ -7,7 +7,6 @@ import com.intellij.ui.ToolbarDecorator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.createPanelWithPopupHandler
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import javax.swing.JComponent
@@ -52,40 +51,32 @@ class ModulesEditorToolbarDecorator(
null -> true
else -> false
}
text = when (tree.selectedSettingItem?.safeAs<Module>()?.kind) {
ModuleKind.multiplatform -> KotlinNewProjectWizardBundle.message("editor.add.target")
ModuleKind.singleplatformJvm -> KotlinNewProjectWizardBundle.message("editor.add.generic.module")
ModuleKind.singleplatformJs -> KotlinNewProjectWizardBundle.message("editor.add.javascript.module")
ModuleKind.target -> KotlinNewProjectWizardBundle.message("editor.add")
null -> KotlinNewProjectWizardBundle.message("editor.add")
text = "Add" + when (tree.selectedSettingItem?.safeAs<Module>()?.kind) {
ModuleKind.multiplatform -> " Target"
ModuleKind.singleplatformJvm -> " Module"
ModuleKind.singleplatformJs -> " JS Module"
ModuleKind.singleplatformAndroid -> " Android Module"
ModuleKind.target -> ""
null -> ""
}
}
event.presentation.isEnabled
}
setRemoveAction {
val title = when (selectedModuleKind) {
ModuleKind.target -> KotlinNewProjectWizardBundle.message("editor.remove.target.title")
else -> KotlinNewProjectWizardBundle.message("editor.remove.module.title")
}
val description = when (selectedModuleKind) {
ModuleKind.target -> KotlinNewProjectWizardBundle.message("editor.remove.target.description")
else -> KotlinNewProjectWizardBundle.message("editor.remove.module.description")
}
val moduleKindText = selectedModuleKindText ?: "Module"
if (Messages.showOkCancelDialog(
tree,
buildString {
appendln(description)
appendln("Do you want to remove selected $moduleKindText?")
if (tree.selectedSettingItem.safeAs<Module>()?.kind != ModuleKind.target) {
appendln(KotlinNewProjectWizardBundle.message("editor.remove.all.submodules"))
appendln("This will also remove all submodules.")
}
appendln()
appendln(KotlinNewProjectWizardBundle.message("editor.cant.undone.action"))
appendln("This action cannot be undone.")
},
title,
KotlinNewProjectWizardBundle.message("editor.remove.button.remove"),
KotlinNewProjectWizardBundle.message("editor.remove.button.cancel"),
"Remove selected $moduleKindText?",
"Remove",
"Cancel",
AllIcons.General.QuestionDialog
) == Messages.OK
) {
@@ -95,10 +86,7 @@ class ModulesEditorToolbarDecorator(
setRemoveActionUpdater { event ->
event.presentation.apply {
isEnabled = tree.selectedSettingItem is Module
text = when (selectedModuleKind) {
ModuleKind.target -> KotlinNewProjectWizardBundle.message("editor.remove.target.toolbutton")
else -> KotlinNewProjectWizardBundle.message("editor.remove.module.toolbutton")
}
text = "Remove" + selectedModuleKindText?.let { " $it" }.orEmpty()
}
event.presentation.isEnabled
}
@@ -107,12 +95,21 @@ class ModulesEditorToolbarDecorator(
setMoveUpAction(null)
}
private val selectedModuleKind
get() = tree.selectedSettingItem.safeAs<Module>()?.kind
private val selectedModuleKindText
get() = tree.selectedSettingItem.safeAs<Module>()?.kindText
fun createToolPanel(): JComponent = toolbarDecorator
.createPanelWithPopupHandler(tree)
.apply {
border = null
}
}
}
private val Module.kindText
get() = when (kind) {
ModuleKind.multiplatform -> "Module"
ModuleKind.singleplatformJvm -> "Module"
ModuleKind.singleplatformJs -> "Module"
ModuleKind.singleplatformAndroid -> "Module"
ModuleKind.target -> "Target"
}
@@ -92,6 +92,7 @@ val ModuleType.icon: Icon
ModuleType.js -> KotlinIcons.JS
ModuleType.native -> KotlinIcons.NATIVE
ModuleType.common -> KotlinIcons.SMALL_LOGO
ModuleType.android -> KotlinIcons.SMALL_LOGO
}
@@ -101,6 +102,7 @@ val Module.icon: Icon
ModuleKind.multiplatform -> AllIcons.Nodes.Module
ModuleKind.singleplatformJs -> KotlinIcons.JS
ModuleKind.singleplatformJvm -> AllIcons.Nodes.Module
ModuleKind.singleplatformAndroid -> AllIcons.Nodes.Module
}
val ProjectKind.icon: Icon
@@ -121,6 +123,7 @@ val ModuleKind.icon: Icon
ModuleKind.singleplatformJs -> KotlinIcons.JS
ModuleKind.singleplatformJvm -> AllIcons.Nodes.Module
ModuleKind.target -> AllIcons.Nodes.Module
ModuleKind.singleplatformAndroid -> AllIcons.Nodes.Module
}
val ModuleConfigurator.icon: Icon
@@ -41,7 +41,7 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
GradleModuleConfigurator {
override val moduleType: ModuleType
get() = ModuleType.jvm
get() = ModuleType.android
override val greyText: String
get() = "Requires Android SDK"
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurati
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
@@ -17,6 +18,7 @@ import java.nio.file.Path
object AndroidSinglePlatformModuleConfigurator :
SinglePlatformModuleConfigurator,
AndroidModuleConfigurator {
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformAndroid
override val id = "android"
override val suggestedModuleName = "android"
override val text = "Android"
@@ -66,14 +66,13 @@ object MppModuleConfigurator : ModuleConfigurator {
}
interface SinglePlatformModuleConfigurator : ModuleConfigurator {
override val moduleKind get() = ModuleKind.singleplatformJvm
}
interface SinglePlatformModuleConfigurator : ModuleConfigurator
object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
SinglePlatformModuleConfigurator,
ModuleConfiguratorWithModuleType {
override val moduleType get() = ModuleType.jvm
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformJvm
override val suggestedModuleName = "jvm"
override val id = "JVM Module"
@@ -122,6 +121,7 @@ object IOSSinglePlatformModuleConfigurator :
SinglePlatformModuleConfigurator {
override val id = "IOS Module"
override val suggestedModuleName = "ios"
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformJvm
override val greyText = "Requires Apple Xcode"
}
@@ -132,4 +132,5 @@ val ModuleType.defaultTarget
ModuleType.js -> JsBrowserTargetConfigurator
ModuleType.native -> NativeForCurrentSystemTarget
ModuleType.common -> CommonTargetConfigurator
ModuleType.android -> AndroidTargetConfigurator
}
@@ -2,12 +2,14 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType
//TODO maybe split into interfaces like it made with module configurators
@Suppress("EnumEntryName")
enum class ModuleType(val projectTypeName: String) {
jvm("Kotlin/JVM"),
js("Kotlin/JS"),
native("Kotlin/Native"),
common("Common")
common("Common"),
android("Android")
;
@@ -20,7 +22,8 @@ enum class ModuleType(val projectTypeName: String) {
enum class ModuleSubType(val moduleType: ModuleType) {
jvm(ModuleType.jvm),
js(ModuleType.js),
android(ModuleType.jvm), androidNativeArm32(ModuleType.native), androidNativeArm64(ModuleType.native),
android(ModuleType.android),
androidNativeArm32(ModuleType.native), androidNativeArm64(ModuleType.native),
iosArm32(ModuleType.native), iosArm64(ModuleType.native), iosX64(ModuleType.native),
linuxArm32Hfp(ModuleType.native), linuxMips32(ModuleType.native), linuxMipsel32(ModuleType.native),
linuxX64(ModuleType.native),
@@ -34,5 +37,6 @@ fun ModuleType.correspondingStdlib(): StdlibType? = when (this) {
ModuleType.js -> StdlibType.StdlibJs
ModuleType.native -> null
ModuleType.common -> StdlibType.StdlibCommon
ModuleType.android -> StdlibType.StdlibJdk7
}
@@ -22,6 +22,7 @@ private fun Module.createTag(): TemplateTag? = when (configurator) {
ModuleType.jvm -> TemplateTag.JVM
ModuleType.js -> TemplateTag.JS
ModuleType.native -> TemplateTag.NATIVE
ModuleType.android -> TemplateTag.ANDROID
ModuleType.common -> null
null -> null
}
@@ -16,6 +16,7 @@ enum class ModuleKind : DisplayableSettingItem {
multiplatform,
target,
singleplatformJvm,
singleplatformAndroid,
singleplatformJs, ;
override val text: String