Wizard: add tags for project templates

This commit is contained in:
Ilya Kirillov
2020-02-28 18:26:58 +03:00
parent d639816393
commit a03510e3c0
6 changed files with 98 additions and 14 deletions
@@ -1,5 +1,9 @@
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.reference
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.ui.*
import java.awt.BorderLayout
import javax.swing.Box
import javax.swing.BoxLayout
import javax.swing.JComponent
import java.awt.Component as AwtComponent
class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.ideContext) {
private val buildSystemSubStep = BuildSystemSubStep(wizard.ideContext).asSubComponent()
@@ -83,14 +90,31 @@ class TemplatesSubStep(ideContext: IdeContext) : SubStep(ideContext) {
}
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()
fun setTemplate(template: ProjectTemplate) {
addTagsToPanel(template.tags)
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 {
bordered()
add(tagsPanel, BorderLayout.NORTH)
add(descriptionPanel, BorderLayout.CENTER)
}
}
@@ -1,15 +1,15 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import TemplateTag
import com.intellij.icons.AllIcons
import com.intellij.ide.plugins.newui.TagComponent
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.ActionPlaces
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.ui.JBColor
import com.intellij.ui.JBSplitter
import com.intellij.ui.PopupHandler
import com.intellij.ui.ToolbarDecorator
import com.intellij.ui.*
import com.intellij.ui.components.JBLabel
import com.intellij.ui.components.JBTextField
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.UIUtil
import org.jetbrains.kotlin.idea.KotlinIcons
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.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.UiConstants.GAP_BORDER_SIZE
import java.awt.BorderLayout
import java.awt.Cursor
import java.awt.Font
import java.awt.LayoutManager
import java.awt.*
import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent
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 {
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")
}
}
@@ -123,7 +123,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
}
enum class ProjectKind(override val text: String) : DisplayableSettingItem {
Singleplatform("Singleplatform JVM project"),
Singleplatform("Singleplatform project"),
Multiplatform("Multiplatform project"),
Android("Android project"),
Js("Kotlin/JS project")
@@ -1,25 +1,49 @@
package org.jetbrains.kotlin.tools.projectWizard.projectTemplates
import TemplateTag
import org.intellij.lang.annotations.Language
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsSingleplatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.MppModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.defaultTarget
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
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.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.buildsystem.*
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 {
abstract val title: String
override val text: String get() = title
abstract val htmlDescription: String
abstract val suggestedProjectName: String
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<*, *>>
get() = listOf(KotlinPlugin::projectKind.reference withValue projectKind)
@@ -101,6 +125,7 @@ object CustomSingleplatformProjectTemplate : ProjectTemplate() {
override val htmlDescription = title
override val suggestedProjectName = "myKotlinJvmProject"
override val projectKind = ProjectKind.Singleplatform
override val setsPluginSettings: List<SettingWithValue<*, *>>
get() = listOf(
KotlinPlugin::modules withValue listOf(
@@ -54,7 +54,7 @@ class KtorServerTemplate : Template() {
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 routes = InterceptionPoint("routes", emptyList<String>())