From a03510e3c09866446c428e1f613db66abd27f7f6 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 28 Feb 2020 18:26:58 +0300 Subject: [PATCH] Wizard: add tags for project templates --- .../ui/firstStep/FirstWizardStepComponent.kt | 24 ++++++++++++++ .../tools/projectWizard/wizard/ui/ui.kt | 23 ++++++++----- .../new-project-wizard/src/TemplateTag.kt | 28 ++++++++++++++++ .../plugins/kotlin/KotlinPlugin.kt | 2 +- .../projectTemplates/ProjectTemplate.kt | 33 ++++++++++++++++--- .../templates/KtorServerTemplate.kt | 2 +- 6 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 libraries/tools/new-project-wizard/src/TemplateTag.kt diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt index a3152414db5..54bc66dd0e1 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt @@ -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) { + 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) } } \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt index 0ca1d081b17..aac91b424c7 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt @@ -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.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 } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/TemplateTag.kt b/libraries/tools/new-project-wizard/src/TemplateTag.kt new file mode 100644 index 00000000000..f8f46e630f1 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/TemplateTag.kt @@ -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() + private fun tag(text: String, tooltip: String? = null): TemplateTag = + TemplateTag(text, tooltip, priority = allTags.size).also { + allTags += it + } + + val ALL: List + get() = allTags + + val MPP = tag("Multiplatform") + val JVM = tag("JVM") + val JS = tag("JS") + val NATIVE = tag("Native") + val ANDROID = tag("Android") + } +} diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt index e8645d7b14d..ee11f5e6c1e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt @@ -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") diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index 8858c9f16a3..9a36756176e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -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 + get() = setsPluginSettings + .firstOrNull { it.setting == KotlinPlugin::modules.reference } + ?.value + ?.safeAs>() + ?.withAllSubModules(includeSourcesets = true) + ?.mapNotNull(Module::createTag) + ?.distinct() + ?.sortedBy(TemplateTag::priority) + .orEmpty() private val setsDefaultValues: List> 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> get() = listOf( KotlinPlugin::modules withValue listOf( diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt index 4e3615fb660..9a1129a9799 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt @@ -54,7 +54,7 @@ class KtorServerTemplate : Template() { FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main ) - val serverEngine by enumSetting("Ktor Server", GenerationPhase.PROJECT_GENERATION) + val serverEngine by enumSetting("Ktor Server Engine", GenerationPhase.PROJECT_GENERATION) val imports = InterceptionPoint("imports", emptyList()) val routes = InterceptionPoint("routes", emptyList())