diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt index cb44dc294fc..958f997d65c 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt @@ -2,6 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep import com.intellij.ui.components.JBTextField import com.intellij.ui.layout.panel +import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.tools.projectWizard.core.Context @@ -17,8 +18,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module.Comp import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.isRootModule import org.jetbrains.kotlin.tools.projectWizard.templates.Template import org.jetbrains.kotlin.tools.projectWizard.templates.settings -import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent -import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.TitledComponent +import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.* import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.TextFieldComponent import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label @@ -123,6 +123,7 @@ private class ModuleTemplateComponent( override val needCentering: Boolean = false private val templateDescriptionLabel = label("") { fontColor = UIUtil.FontColor.BRIGHTER + addBorder(JBUI.Borders.empty(4, 4)) } override fun onInit() { @@ -134,10 +135,9 @@ private class ModuleTemplateComponent( templateDescriptionLabel.text = template?.description } - override val component = panel { - row { - dropDown.component(growX, comment = module.template?.description) - } + override val component = borderPanel { + addToCenter(dropDown.component) + addToBottom(templateDescriptionLabel) } override val title: String = "Template" diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java index 615b60788e4..7d29653d4c9 100644 --- a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/ProjectTemplateNewWizardProjectImportTestGenerated.java @@ -65,6 +65,11 @@ public class ProjectTemplateNewWizardProjectImportTestGenerated extends Abstract runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); } + @TestMetadata("multiplatformMobileLibrary") + public void testMultiplatformMobileLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/"); + } + @TestMetadata("nativeConsoleApplication") public void testNativeConsoleApplication() throws Exception { runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); @@ -118,6 +123,11 @@ public class ProjectTemplateNewWizardProjectImportTestGenerated extends Abstract runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); } + @TestMetadata("multiplatformMobileLibrary") + public void testMultiplatformMobileLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/"); + } + @TestMetadata("nativeConsoleApplication") public void testNativeConsoleApplication() throws Exception { runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); @@ -171,6 +181,11 @@ public class ProjectTemplateNewWizardProjectImportTestGenerated extends Abstract runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); } + @TestMetadata("multiplatformMobileLibrary") + public void testMultiplatformMobileLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/"); + } + @TestMetadata("nativeConsoleApplication") public void testNativeConsoleApplication() throws Exception { runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/build.gradle new file mode 100644 index 00000000000..5739b49a4ef --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/build.gradle @@ -0,0 +1,61 @@ +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.70' + id 'com.android.application' + id 'kotlin-android-extensions' +} +group = 'me.user' +version = '1.0-SNAPSHOT' + +repositories { + gradlePluginPortal() + google() + jcenter() + mavenCentral() +} +kotlin { + android() + iosX64('ios') + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib-common') + } + } + commonTest { + dependencies { + implementation kotlin('test-common') + implementation kotlin('test-annotations-common') + } + } + androidMain { + dependencies { + implementation kotlin('stdlib-jdk7') + implementation 'androidx.core:core-ktx:1.1.0' + } + } + androidTest { + + } + iosMain { + + } + iosTest { + + } + } +} +android { + compileSdkVersion 29 + defaultConfig { + applicationId 'me.user.android' + minSdkVersion 24 + targetSdkVersion 29 + versionCode 1 + versionName '1.0' + } + buildTypes { + 'release' { + minifyEnabled false + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/build.gradle.kts new file mode 100644 index 00000000000..638b0a3d8d6 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/build.gradle.kts @@ -0,0 +1,55 @@ +plugins { + kotlin("multiplatform") version "1.3.70" + id("com.android.application") + id("kotlin-android-extensions") +} +group = "me.user" +version = "1.0-SNAPSHOT" + +repositories { + gradlePluginPortal() + google() + jcenter() + mavenCentral() +} +kotlin { + android() + iosX64("ios") + sourceSets { + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib-common")) + } + } + val commonTest by getting { + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + val androidMain by getting { + dependencies { + implementation(kotlin("stdlib-jdk7")) + implementation("androidx.core:core-ktx:1.1.0") + } + } + val androidTest by getting + val iosMain by getting + val iosTest by getting + } +} +android { + compileSdkVersion(29) + defaultConfig { + applicationId = "me.user.android" + minSdkVersion(24) + targetSdkVersion(29) + versionCode = 1 + versionName = "1.0" + } + buildTypes { + getByName("release") { + isMinifyEnabled = false + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle new file mode 100644 index 00000000000..663e9016f42 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + jcenter() + } + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == 'com.android' || requested.id.name == 'kotlin-android-extensions') { + useModule('com.android.tools.build:gradle:3.5.2') + } + } + } +} +rootProject.name = 'MultiplatformMobileLibrary' + diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts new file mode 100644 index 00000000000..08495936547 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + jcenter() + } + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == "com.android" || requested.id.name == "kotlin-android-extensions") { + useModule("com.android.tools.build:gradle:3.5.2") + } + } + } +} +rootProject.name = "MultiplatformMobileLibrary" + diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/settings.yaml new file mode 100644 index 00000000000..e21db7a9cb7 --- /dev/null +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/settings.yaml @@ -0,0 +1,2 @@ +android: + androidSdkPath: android.sdk \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java index 1bf9b9d1522..eef608314b8 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java @@ -63,6 +63,11 @@ public class ProjectTemplateBuildFileGenerationTestGenerated extends AbstractPro runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformLibrary/"); } + @TestMetadata("multiplatformMobileLibrary") + public void testMultiplatformMobileLibrary() throws Exception { + runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/"); + } + @TestMetadata("nativeConsoleApplication") public void testNativeConsoleApplication() throws Exception { runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/nativeConsoleApplication/"); 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 e829db242a0..51de97e7947 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 @@ -4,6 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.* import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem @@ -54,6 +55,7 @@ sealed class ProjectTemplate : DisplayableSettingItem { MultiplatformLibrary, AndroidApplication, IOSApplication, + MultiplatformMobileLibrary, NativeConsoleApplication, JsBrowserApplication ) @@ -284,4 +286,41 @@ object IOSApplication : ProjectTemplate() { ) ) ) +} + +object MultiplatformMobileLibrary : ProjectTemplate() { + override val title = "Multiplatform Mobile Library" + override val description = "Create a library that supports sharing code between iOS and Android." + override val suggestedProjectName = "myMppMobileLibrary" + override val projectKind = ProjectKind.Multiplatform + + override val setsPluginSettings: List> + get() = listOf( + KotlinPlugin::modules withValue listOf( + MultiplatformModule( + "library", + listOf( + ModuleType.common.createDefaultTarget(), + Module( + "android", + AndroidTargetConfigurator, + null, + SourcesetType.ALL.map { type -> + Sourceset(type, dependencies = emptyList()) + }, + emptyList() + ), + Module( + "ios", + RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.iosX64), + null, + SourcesetType.ALL.map { type -> + Sourceset(type, dependencies = emptyList()) + }, + emptyList() + ) + ) + ) + ) + ) } \ No newline at end of file