Wizard: add tags for project templates
This commit is contained in:
+24
@@ -1,5 +1,9 @@
|
|||||||
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
|
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
|
||||||
|
|
||||||
|
import TemplateTag
|
||||||
|
import com.intellij.ide.plugins.newui.VerticalLayout
|
||||||
|
import com.intellij.ui.JBColor
|
||||||
|
import com.intellij.util.ui.JBUI
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
|
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
|
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
|
||||||
@@ -10,7 +14,10 @@ import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
|
|||||||
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
|
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
|
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
|
||||||
import java.awt.BorderLayout
|
import java.awt.BorderLayout
|
||||||
|
import javax.swing.Box
|
||||||
|
import javax.swing.BoxLayout
|
||||||
import javax.swing.JComponent
|
import javax.swing.JComponent
|
||||||
|
import java.awt.Component as AwtComponent
|
||||||
|
|
||||||
class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.ideContext) {
|
class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.ideContext) {
|
||||||
private val buildSystemSubStep = BuildSystemSubStep(wizard.ideContext).asSubComponent()
|
private val buildSystemSubStep = BuildSystemSubStep(wizard.ideContext).asSubComponent()
|
||||||
@@ -83,14 +90,31 @@ class TemplatesSubStep(ideContext: IdeContext) : SubStep(ideContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class TemplateDescriptionComponent : Component() {
|
class TemplateDescriptionComponent : Component() {
|
||||||
|
private val tagsPanel = panel {
|
||||||
|
layout = BoxLayout(this, BoxLayout.X_AXIS)
|
||||||
|
alignmentX = AwtComponent.LEFT_ALIGNMENT
|
||||||
|
alignmentY = AwtComponent.TOP_ALIGNMENT
|
||||||
|
border = JBUI.Borders.emptyBottom(6)
|
||||||
|
}
|
||||||
private val descriptionPanel = DescriptionPanel()
|
private val descriptionPanel = DescriptionPanel()
|
||||||
|
|
||||||
fun setTemplate(template: ProjectTemplate) {
|
fun setTemplate(template: ProjectTemplate) {
|
||||||
|
addTagsToPanel(template.tags)
|
||||||
descriptionPanel.updateText(template.htmlDescription)
|
descriptionPanel.updateText(template.htmlDescription)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun addTagsToPanel(tags: List<TemplateTag>) {
|
||||||
|
tagsPanel.removeAll()
|
||||||
|
for (tag in tags) {
|
||||||
|
tagsPanel.add(TemplateTagUIComponent(tag))
|
||||||
|
tagsPanel.add(Box.createHorizontalStrut(6))
|
||||||
|
}
|
||||||
|
tagsPanel.updateUI()
|
||||||
|
}
|
||||||
|
|
||||||
override val component: JComponent = panel {
|
override val component: JComponent = panel {
|
||||||
bordered()
|
bordered()
|
||||||
|
add(tagsPanel, BorderLayout.NORTH)
|
||||||
add(descriptionPanel, BorderLayout.CENTER)
|
add(descriptionPanel, BorderLayout.CENTER)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+15
-8
@@ -1,15 +1,15 @@
|
|||||||
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
|
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
|
||||||
|
|
||||||
|
import TemplateTag
|
||||||
import com.intellij.icons.AllIcons
|
import com.intellij.icons.AllIcons
|
||||||
|
import com.intellij.ide.plugins.newui.TagComponent
|
||||||
import com.intellij.openapi.actionSystem.ActionManager
|
import com.intellij.openapi.actionSystem.ActionManager
|
||||||
import com.intellij.openapi.actionSystem.ActionPlaces
|
import com.intellij.openapi.actionSystem.ActionPlaces
|
||||||
import com.intellij.openapi.actionSystem.DefaultActionGroup
|
import com.intellij.openapi.actionSystem.DefaultActionGroup
|
||||||
import com.intellij.ui.JBColor
|
import com.intellij.ui.*
|
||||||
import com.intellij.ui.JBSplitter
|
|
||||||
import com.intellij.ui.PopupHandler
|
|
||||||
import com.intellij.ui.ToolbarDecorator
|
|
||||||
import com.intellij.ui.components.JBLabel
|
import com.intellij.ui.components.JBLabel
|
||||||
import com.intellij.ui.components.JBTextField
|
import com.intellij.ui.components.JBTextField
|
||||||
|
import com.intellij.util.ui.JBUI
|
||||||
import com.intellij.util.ui.UIUtil
|
import com.intellij.util.ui.UIUtil
|
||||||
import org.jetbrains.kotlin.idea.KotlinIcons
|
import org.jetbrains.kotlin.idea.KotlinIcons
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.Failure
|
import org.jetbrains.kotlin.tools.projectWizard.core.Failure
|
||||||
@@ -23,10 +23,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
|
|||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
|
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.buildsystem.ModuleKind
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.UiConstants.GAP_BORDER_SIZE
|
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.UiConstants.GAP_BORDER_SIZE
|
||||||
import java.awt.BorderLayout
|
import java.awt.*
|
||||||
import java.awt.Cursor
|
|
||||||
import java.awt.Font
|
|
||||||
import java.awt.LayoutManager
|
|
||||||
import java.awt.event.MouseAdapter
|
import java.awt.event.MouseAdapter
|
||||||
import java.awt.event.MouseEvent
|
import java.awt.event.MouseEvent
|
||||||
import javax.swing.BorderFactory
|
import javax.swing.BorderFactory
|
||||||
@@ -169,6 +166,16 @@ fun <C : JComponent> C.bordered(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TemplateTagUIComponent(tag: TemplateTag) : TagComponent(tag.text) {
|
||||||
|
override fun isInClickableArea(pt: Point?) = false
|
||||||
|
|
||||||
|
init {
|
||||||
|
RelativeFont.TINY.install(this)
|
||||||
|
tag.tooltip?.let { toolTipText = it }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
object UiConstants {
|
object UiConstants {
|
||||||
const val GAP_BORDER_SIZE = 5
|
const val GAP_BORDER_SIZE = 5
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class TemplateTag private constructor(
|
||||||
|
val text: String,
|
||||||
|
val tooltip: String?,
|
||||||
|
val priority: Int
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
private val allTags = mutableListOf<TemplateTag>()
|
||||||
|
private fun tag(text: String, tooltip: String? = null): TemplateTag =
|
||||||
|
TemplateTag(text, tooltip, priority = allTags.size).also {
|
||||||
|
allTags += it
|
||||||
|
}
|
||||||
|
|
||||||
|
val ALL: List<TemplateTag>
|
||||||
|
get() = allTags
|
||||||
|
|
||||||
|
val MPP = tag("Multiplatform")
|
||||||
|
val JVM = tag("JVM")
|
||||||
|
val JS = tag("JS")
|
||||||
|
val NATIVE = tag("Native")
|
||||||
|
val ANDROID = tag("Android")
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -123,7 +123,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum class ProjectKind(override val text: String) : DisplayableSettingItem {
|
enum class ProjectKind(override val text: String) : DisplayableSettingItem {
|
||||||
Singleplatform("Singleplatform JVM project"),
|
Singleplatform("Singleplatform project"),
|
||||||
Multiplatform("Multiplatform project"),
|
Multiplatform("Multiplatform project"),
|
||||||
Android("Android project"),
|
Android("Android project"),
|
||||||
Js("Kotlin/JS project")
|
Js("Kotlin/JS project")
|
||||||
|
|||||||
+29
-4
@@ -1,25 +1,49 @@
|
|||||||
package org.jetbrains.kotlin.tools.projectWizard.projectTemplates
|
package org.jetbrains.kotlin.tools.projectWizard.projectTemplates
|
||||||
|
|
||||||
|
import TemplateTag
|
||||||
import org.intellij.lang.annotations.Language
|
import org.intellij.lang.annotations.Language
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
|
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
|
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
|
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsSingleplatformModuleConfigurator
|
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.MppModuleConfigurator
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.defaultTarget
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
|
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.templates.*
|
import org.jetbrains.kotlin.tools.projectWizard.templates.*
|
||||||
|
|
||||||
|
private fun Module.createTag(): TemplateTag? = when (configurator) {
|
||||||
|
is MppModuleConfigurator -> TemplateTag.MPP
|
||||||
|
is AndroidModuleConfigurator -> TemplateTag.ANDROID
|
||||||
|
is JSConfigurator -> TemplateTag.JS
|
||||||
|
is ModuleConfiguratorWithModuleType -> when (configurator.moduleType) {
|
||||||
|
ModuleType.jvm -> TemplateTag.JVM
|
||||||
|
ModuleType.js -> TemplateTag.JS
|
||||||
|
ModuleType.native -> TemplateTag.NATIVE
|
||||||
|
ModuleType.common -> null
|
||||||
|
null -> null
|
||||||
|
}
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
sealed class ProjectTemplate : DisplayableSettingItem {
|
sealed class ProjectTemplate : DisplayableSettingItem {
|
||||||
abstract val title: String
|
abstract val title: String
|
||||||
override val text: String get() = title
|
override val text: String get() = title
|
||||||
abstract val htmlDescription: String
|
abstract val htmlDescription: String
|
||||||
abstract val suggestedProjectName: String
|
abstract val suggestedProjectName: String
|
||||||
abstract val projectKind: ProjectKind
|
abstract val projectKind: ProjectKind
|
||||||
|
val tags: List<TemplateTag>
|
||||||
|
get() = setsPluginSettings
|
||||||
|
.firstOrNull { it.setting == KotlinPlugin::modules.reference }
|
||||||
|
?.value
|
||||||
|
?.safeAs<List<Module>>()
|
||||||
|
?.withAllSubModules(includeSourcesets = true)
|
||||||
|
?.mapNotNull(Module::createTag)
|
||||||
|
?.distinct()
|
||||||
|
?.sortedBy(TemplateTag::priority)
|
||||||
|
.orEmpty()
|
||||||
|
|
||||||
private val setsDefaultValues: List<SettingWithValue<*, *>>
|
private val setsDefaultValues: List<SettingWithValue<*, *>>
|
||||||
get() = listOf(KotlinPlugin::projectKind.reference withValue projectKind)
|
get() = listOf(KotlinPlugin::projectKind.reference withValue projectKind)
|
||||||
@@ -101,6 +125,7 @@ object CustomSingleplatformProjectTemplate : ProjectTemplate() {
|
|||||||
override val htmlDescription = title
|
override val htmlDescription = title
|
||||||
override val suggestedProjectName = "myKotlinJvmProject"
|
override val suggestedProjectName = "myKotlinJvmProject"
|
||||||
override val projectKind = ProjectKind.Singleplatform
|
override val projectKind = ProjectKind.Singleplatform
|
||||||
|
|
||||||
override val setsPluginSettings: List<SettingWithValue<*, *>>
|
override val setsPluginSettings: List<SettingWithValue<*, *>>
|
||||||
get() = listOf(
|
get() = listOf(
|
||||||
KotlinPlugin::modules withValue listOf(
|
KotlinPlugin::modules withValue listOf(
|
||||||
|
|||||||
+1
-1
@@ -54,7 +54,7 @@ class KtorServerTemplate : Template() {
|
|||||||
FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main
|
FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main
|
||||||
)
|
)
|
||||||
|
|
||||||
val serverEngine by enumSetting<KtorServerEngine>("Ktor Server", GenerationPhase.PROJECT_GENERATION)
|
val serverEngine by enumSetting<KtorServerEngine>("Ktor Server Engine", GenerationPhase.PROJECT_GENERATION)
|
||||||
|
|
||||||
val imports = InterceptionPoint("imports", emptyList<String>())
|
val imports = InterceptionPoint("imports", emptyList<String>())
|
||||||
val routes = InterceptionPoint("routes", emptyList<String>())
|
val routes = InterceptionPoint("routes", emptyList<String>())
|
||||||
|
|||||||
Reference in New Issue
Block a user