diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java index 0fce8abe9846..bab127644cae 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/ProjectTypeStep.java @@ -12,6 +12,8 @@ import com.intellij.ide.util.newProjectWizard.*; import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase; import com.intellij.ide.util.projectWizard.*; import com.intellij.ide.wizard.*; +import com.intellij.ide.wizard.LanguageNewProjectWizard; +import com.intellij.ide.wizard.language.*; import com.intellij.internal.statistic.eventLog.FeatureUsageData; import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger; import com.intellij.internal.statistic.utils.PluginInfoDetectorKt; @@ -131,7 +133,7 @@ public final class ProjectTypeStep extends ModuleWizardStep implements SettingsS myProjectTypeList = new JBList<>(); myProjectTypeList.setModel(new CollectionListModel<>(groups)); myProjectTypeList.setSelectionModel(new SingleSelectionModel()); - myProjectTypeList.setCellRenderer(new ProjectTypeListRenderer(groups)); + myProjectTypeList.setCellRenderer(new ProjectTypeListRenderer(context, groups)); GridLayoutManager layout = (GridLayoutManager)myPanel.getLayout(); layout.setHGap(0); @@ -400,19 +402,30 @@ public final class ProjectTypeStep extends ModuleWizardStep implements SettingsS } } - var newWizardGroups = new ArrayList(); + var generatorNewProjectWizards = new ArrayList(); + //noinspection deprecation + LanguageNewProjectWizard.EP_NAME.forEachExtensionSafe(wizard -> { + generatorNewProjectWizards.add(new LegacyLanguageGeneratorNewProjectWizard(context, wizard)); + }); + LanguageGeneratorNewProjectWizard.EP_NAME.forEachExtensionSafe(wizard -> { + generatorNewProjectWizards.add(new BaseLanguageGeneratorNewProjectWizard(context, wizard)); + }); + generatorNewProjectWizards.removeIf(it -> !it.isEnabled()); + generatorNewProjectWizards.sort(Comparator.comparing(it -> it.getOrdinal())); + if (context.isCreatingNewProject()) { + generatorNewProjectWizards.add(new EmptyProjectGeneratorNewProjectWizard()); + } + var generatorNewProjectWizardGroups = ContainerUtil.map(generatorNewProjectWizards, it -> { + return new TemplatesGroup(new NewProjectModelBuilder(it)); + }); + groups.addAll(0, generatorNewProjectWizardGroups); + generatorNewProjectWizardGroups.forEach(it -> myTemplatesMap.put(it, new ArrayList<>())); + var newWizardUserGroups = new ArrayList(); if (context.isCreatingNewProject()) { - newWizardGroups.add(new TemplatesGroup(new NewProjectBuilder())); - newWizardGroups.add(new TemplatesGroup(new NewEmptyProjectBuilder())); newWizardUserGroups.addAll(getUserTemplatesMap(context)); } - else { - newWizardGroups.add(new TemplatesGroup(new NewModuleBuilder())); - } - groups.addAll(0, newWizardGroups); groups.addAll(newWizardUserGroups); - newWizardGroups.forEach(it -> myTemplatesMap.put(it, new ArrayList<>())); newWizardUserGroups.forEach(it -> myTemplatesMap.put(it, new ArrayList<>())); return groups; @@ -794,57 +807,9 @@ public final class ProjectTypeStep extends ModuleWizardStep implements SettingsS } private static class ProjectTypeListRenderer extends GroupedItemsListRenderer { - ProjectTypeListRenderer(java.util.List groups) { - super(new ListItemDescriptorAdapter<>() { - @Nullable - @Override - public String getTextFor(TemplatesGroup value) { - return value.getName(); - } - @Nullable - @Override - public String getTooltipFor(TemplatesGroup value) { - return value.getDescription(); - } - - @Nullable - @Override - public Icon getIconFor(TemplatesGroup value) { - return value.getIcon(); - } - - @Override - public String getCaptionAboveOf(TemplatesGroup value) { - var builder = value.getModuleBuilder(); - if (builder instanceof TemplateModuleBuilder) { - return UIBundle.message("list.caption.group.templates"); - } - else if (builder instanceof NewProjectBuilder) { - return UIBundle.message("list.caption.group.newProject"); - } - else if (builder instanceof NewModuleBuilder) { - return UIBundle.message("list.caption.group.newModule"); - } - else { - return UIBundle.message("list.caption.group.generators"); - } - } - - @Override - public boolean hasSeparatorAboveOf(TemplatesGroup value) { - int index = groups.indexOf(value); - if (index < 0) return false; - if (index == 0) return true; - TemplatesGroup upper = groups.get(index - 1); - if (value.getModuleBuilder() instanceof TemplateModuleBuilder && !(upper.getModuleBuilder() instanceof TemplateModuleBuilder)) { - return true; - } - - ModuleBuilder builder = upper.getModuleBuilder(); - return builder instanceof NewEmptyProjectBuilder || builder instanceof NewModuleBuilder; - } - }); + ProjectTypeListRenderer(@NotNull WizardContext context, @NotNull java.util.List groups) { + super(new ProjectTypeListItemDescriptor(context, groups)); } @Override @@ -886,4 +851,71 @@ public final class ProjectTypeStep extends ModuleWizardStep implements SettingsS } } } + + private static class ProjectTypeListItemDescriptor extends ListItemDescriptorAdapter { + + private final @NotNull WizardContext myContext; + private final @NotNull java.util.List myGroups; + + ProjectTypeListItemDescriptor(@NotNull WizardContext context, @NotNull java.util.List groups) { + myContext = context; + myGroups = groups; + } + + @Nullable + @Override + public String getTextFor(TemplatesGroup value) { + return value.getName(); + } + + @Nullable + @Override + public String getTooltipFor(TemplatesGroup value) { + return value.getDescription(); + } + + @Nullable + @Override + public Icon getIconFor(TemplatesGroup value) { + return value.getIcon(); + } + + @Override + public String getCaptionAboveOf(TemplatesGroup value) { + var builder = value.getModuleBuilder(); + if (builder instanceof TemplateModuleBuilder) { + return UIBundle.message("list.caption.group.templates"); + } + else if (builder instanceof NewProjectModelBuilder) { + return UIBundle.message("list.caption.group.newProject", myContext.isCreatingNewProjectInt()); + } + else { + return UIBundle.message("list.caption.group.generators"); + } + } + + @Override + public boolean hasSeparatorAboveOf(TemplatesGroup value) { + int index = myGroups.indexOf(value); + if (index < 0) return false; + if (index == 0) return true; + TemplatesGroup upper = myGroups.get(index - 1); + ModuleBuilder moduleBuilder = value.getModuleBuilder(); + ModuleBuilder upperModuleBuilder = upper.getModuleBuilder(); + if (!(moduleBuilder instanceof NewProjectModelBuilder) && upperModuleBuilder instanceof NewProjectModelBuilder) { + return true; + } + if (moduleBuilder instanceof TemplateModuleBuilder && !(upperModuleBuilder instanceof TemplateModuleBuilder)) { + return true; + } + return false; + } + } + + private static class NewProjectModelBuilder extends GeneratorNewProjectWizardBuilderAdapter { + + NewProjectModelBuilder(@NotNull GeneratorNewProjectWizard wizard) { + super(wizard); + } + } } diff --git a/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java b/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java index ed02bb6a34c0..0a25e9a11cc2 100644 --- a/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java +++ b/java/idea-ui/testSrc/com/intellij/ide/projectWizard/NewProjectWizardTest.java @@ -13,22 +13,18 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.IdeaTestUtil; -import com.intellij.ui.UIBundle; import com.intellij.util.SystemProperties; +import static com.intellij.ide.projectWizard.NewProjectWizardConstants.Language.JAVA; import static com.intellij.ide.projectWizard.generators.IntelliJJavaNewProjectWizardData.getJavaData; -import static com.intellij.ide.wizard.LanguageNewProjectWizardData.getLanguageData; /** * @author Dmitry Avdeev */ public class NewProjectWizardTest extends NewProjectWizardTestCase { + public void testCreateProject() throws Exception { - Project project = createProject(step -> { - if (step instanceof ProjectTypeStep) { - assertTrue(((ProjectTypeStep)step).setSelectedTemplate(UIBundle.message("label.project.wizard.project.generator.name"), null)); - } - }); + Project project = createProjectFromTemplate(JAVA, step -> {}); assertNotNull(project); Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk(); assertNotNull(sdk); @@ -40,7 +36,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { public void testModuleJdk() throws Exception { configureJdk(); - Project project = createProject(step -> {}); + Project project = createProjectFromTemplate(JAVA, step -> {}); final var manager = ModuleManager.getInstance(project); // Default module should have null JDK @@ -60,14 +56,13 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { }); // Project with default JDK - Project project = createProjectFromTemplate(step -> { + Project project = createProjectFromTemplate(JAVA, step -> { getJavaData(step).setSdk(defaultSdk); }); assertEquals(ProjectRootManager.getInstance(project).getProjectSdk().getName(), defaultSdk.getName()); // Module with custom JDK - createModuleFromTemplate(project, step -> { - getLanguageData(step).setLanguage("Java"); + createModuleFromTemplate(project, JAVA, step -> { getJavaData(step).setSdk(otherSdk); getJavaData(step).setModuleName(moduleName); }); @@ -106,7 +101,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { } public void testChangeSdk() throws Exception { - Project project = createProject(step -> {}); + Project project = createProjectFromTemplate(JAVA, step -> {}); Sdk jdk17 = IdeaTestUtil.getMockJdk17(); addSdk(jdk17); setProjectSdk(project, jdk17); @@ -124,7 +119,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { defaultExt.setLanguageLevel(LanguageLevel.JDK_1_4); defaultExt.setDefault(null); // emulate migration from previous build - Project project = createProject(step -> {}); + Project project = createProjectFromTemplate(JAVA, step -> {}); LanguageLevelProjectExtension extension = LanguageLevelProjectExtension.getInstance(project); Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk(); JavaSdkVersion version = JavaSdk.getInstance().getVersion(sdk); @@ -132,7 +127,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { } public void testSampleCode() throws Exception { - Project project = createProjectFromTemplate(step -> { + Project project = createProjectFromTemplate(JAVA, step -> { getJavaData(step).setAddSampleCode(true); }); final var mainSearch = FilenameIndex.getVirtualFilesByName("Main.java", GlobalSearchScope.projectScope(project)); @@ -151,7 +146,7 @@ public class NewProjectWizardTest extends NewProjectWizardTestCase { try { LanguageLevelProjectExtension.getInstance(defaultProject).setLanguageLevel(languageLevel); LanguageLevelProjectExtension.getInstance(defaultProject).setDefault(detect); - Project project = createProject(step -> {}); + Project project = createProjectFromTemplate(JAVA, step -> {}); assertEquals(languageLevel, LanguageLevelProjectExtension.getInstance(project).getLanguageLevel()); return project; } diff --git a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java index a8d570da2b60..7865658857eb 100644 --- a/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java +++ b/java/testFramework/src/com/intellij/ide/projectWizard/ProjectWizardTestCase.java @@ -27,7 +27,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.projectImport.ProjectImportProvider; import com.intellij.testFramework.HeavyPlatformTestCase; import com.intellij.testFramework.PlatformTestUtil; -import com.intellij.ui.UIBundle; import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; @@ -195,10 +194,6 @@ public abstract class ProjectWizardTestCase ext return createProjectFromWizard(); } - protected Project createProjectFromTemplate(@NotNull Consumer adjuster) throws IOException { - return createProjectFromTemplate(UIBundle.message("label.project.wizard.project.generator.name"), adjuster); - } - protected Project createProjectFromTemplate( @NotNull String group, @NotNull Consumer adjuster @@ -216,10 +211,6 @@ public abstract class ProjectWizardTestCase ext return createModuleFromWizard(project); } - protected Module createModuleFromTemplate(@NotNull Project project, @NotNull Consumer adjuster) throws IOException { - return createModuleFromTemplate(project, UIBundle.message("label.project.wizard.module.generator.name"), adjuster); - } - protected Module createModuleFromTemplate( @NotNull Project project, @NotNull String group, diff --git a/platform/platform-api/resources/messages/UIBundle.properties b/platform/platform-api/resources/messages/UIBundle.properties index d29c88403813..a67b3439d579 100644 --- a/platform/platform-api/resources/messages/UIBundle.properties +++ b/platform/platform-api/resources/messages/UIBundle.properties @@ -303,10 +303,7 @@ label.project.wizard.new.project.file.not.directory.error={0} is not a directory label.project.wizard.new.project.directory.already.taken.error=Project {0} already exists in this location label.project.wizard.new.module.name.exists.error=Module ''{0}'' already exists label.project.wizard.new.module.directory.already.taken.error=Module {0} already exists in this location -label.project.wizard.project.generator.name=New Project -label.project.wizard.project.generator.description=Create new project with predefined language and build system -label.project.wizard.module.generator.name=New Module -label.project.wizard.module.generator.description=Create new module with predefined language and build system +label.project.wizard.project.generator.description=Create a new {0,choice,0#module|1#project} with {1} language and a predefined build system label.project.wizard.empty.project.generator.name=Empty Project label.project.wizard.empty.project.generator.description=Create Empty Project label.project.wizard.empty.project.generator.full.description=A basic project with free structure. @@ -326,8 +323,7 @@ kotlin.dsl.validation.groupId.part.allowed.symbols=Part ''{0}'' is incorrect, it list.caption.group.generators=Generators list.caption.group.templates=Templates -list.caption.group.newProject=New Project -list.caption.group.newModule=New Module +list.caption.group.newProject=New {0,choice,0#Module|1#Project} new.project.wizard.popup.title.install.plugin=Install Plugin diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizard.kt b/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizard.kt index 98215a6c5c90..9e3f6186696e 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizard.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizard.kt @@ -3,6 +3,7 @@ package com.intellij.ide.wizard import com.intellij.ide.util.projectWizard.WizardContext import com.intellij.openapi.util.NlsContexts +import com.intellij.util.PlatformUtils import org.jetbrains.annotations.Nls import org.jetbrains.annotations.NonNls import javax.swing.Icon @@ -15,6 +16,7 @@ import javax.swing.Icon * project generators in PyCharm. */ interface GeneratorNewProjectWizard { + /** * The unique identifier to distinguish this generator from others in the new project wizard. */ @@ -30,6 +32,12 @@ interface GeneratorNewProjectWizard { */ val icon: Icon + /** + * The ordinal number by which all generators are sorted in the generator tray (on the left). + */ + val ordinal: Int + get() = Int.MAX_VALUE + /** * The description of the generator. */ @@ -42,6 +50,12 @@ interface GeneratorNewProjectWizard { val groupName: @Nls String? get() = null + /** + * Disabled generators will be excluded from the new project wizard. + * For example, you can use [PlatformUtils.isIdeaCommunity] or [PlatformUtils.isIdeaUltimate], etc. + */ + fun isEnabled(): Boolean = true + /** * Create the main new project wizard step for this generator. */ diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizardBuilderAdapter.kt b/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizardBuilderAdapter.kt index 33e228828059..e05b006f9abd 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizardBuilderAdapter.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/GeneratorNewProjectWizardBuilderAdapter.kt @@ -10,11 +10,14 @@ import javax.swing.Icon * [com.intellij.ide.util.projectWizard.ModuleBuilder] and register as an extension point. */ abstract class GeneratorNewProjectWizardBuilderAdapter(val wizard: GeneratorNewProjectWizard) : AbstractNewProjectWizardBuilder() { + + override fun getWeight(): Int = wizard.ordinal override fun getBuilderId(): String = NPW_PREFIX + wizard.id override fun getPresentableName(): String = wizard.name override fun getDescription(): String = wizard.description ?: "" override fun getGroupName(): String = wizard.groupName ?: super.getGroupName() override fun getNodeIcon(): Icon = wizard.icon + override fun isAvailable(): Boolean = wizard.isEnabled() override fun createStep(context: WizardContext): NewProjectWizardStep = wizard.createStep(context) companion object { diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizard.kt b/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizard.kt index 2da727f0f2cc..db20a6a9a44c 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizard.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizard.kt @@ -3,9 +3,14 @@ package com.intellij.ide.wizard import com.intellij.openapi.extensions.ExtensionPointName +@Suppress("DEPRECATION") @JvmDefaultWithCompatibility +@Deprecated("Use LanguageGeneratorNewProjectWizard instead") interface LanguageNewProjectWizard : NewProjectWizardMultiStepFactory { + companion object { + + @JvmField val EP_NAME: ExtensionPointName = ExtensionPointName("com.intellij.newProjectWizard.language") } } diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizardData.kt b/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizardData.kt index d7aa18a7cd0a..7f6e5c9283c7 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizardData.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/LanguageNewProjectWizardData.kt @@ -4,17 +4,36 @@ package com.intellij.ide.wizard import com.intellij.openapi.observable.properties.GraphProperty import com.intellij.openapi.util.Key +/** + * Deprecated + * + * The language new project wizard step was replaced by new project wizard generators. + * The language selector was moved from the right side of the wizard to the left tray. + * + * Please, use [com.intellij.ide.wizard.comment.LinkNewProjectWizardStep] instead of it for navigation between languages. + * + * @see GeneratorNewProjectWizard + * @see com.intellij.ide.wizard.comment.LinkNewProjectWizardStep + * @see com.intellij.ide.wizard.language.BaseLanguageGeneratorNewProjectWizard.getLanguageModelBuilderId + * @see NewProjectWizardLanguageStep + */ +@Suppress("DeprecatedCallableAddReplaceWith", "DEPRECATION") +@Deprecated("See LanguageNewProjectWizardData documentation for details") interface LanguageNewProjectWizardData : NewProjectWizardBaseData { + @Deprecated("See LanguageNewProjectWizardData documentation for details") val languageProperty: GraphProperty + @Deprecated("See LanguageNewProjectWizardData documentation for details") var language: String companion object { + @Deprecated("See LanguageNewProjectWizardData documentation for details") val KEY: Key = Key.create(LanguageNewProjectWizardData::class.java.name) @JvmStatic + @Deprecated("See LanguageNewProjectWizardData documentation for details") val NewProjectWizardStep.languageData: LanguageNewProjectWizardData? get() = data.getUserData(KEY) } diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/NewEmptyProjectBuilder.kt b/platform/platform-impl/src/com/intellij/ide/wizard/NewEmptyProjectBuilder.kt deleted file mode 100644 index 81c95d341e1b..000000000000 --- a/platform/platform-impl/src/com/intellij/ide/wizard/NewEmptyProjectBuilder.kt +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.wizard - -import com.intellij.ide.projectWizard.NewProjectWizardConstants.Generators -import com.intellij.ide.util.projectWizard.WizardContext -import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep -import com.intellij.ide.wizard.comment.CommentNewProjectWizardStep -import com.intellij.openapi.module.GeneralModuleType -import com.intellij.openapi.module.ModuleTypeManager -import com.intellij.openapi.project.Project -import com.intellij.ui.UIBundle -import com.intellij.util.ui.EmptyIcon -import javax.swing.Icon - -class NewEmptyProjectBuilder : GeneratorNewProjectWizardBuilderAdapter(EmptyNewProjectWizard()) { - class EmptyNewProjectWizard : GeneratorNewProjectWizard { - override val id: String = Generators.EMPTY_PROJECT - override val name: String = UIBundle.message("label.project.wizard.empty.project.generator.name") - override val description: String = UIBundle.message("label.project.wizard.empty.project.generator.description") - override val icon: Icon = EmptyIcon.ICON_0 - - override fun createStep(context: WizardContext): NewProjectWizardStep = - RootNewProjectWizardStep(context) - .nextStep(::CommentStep) - .nextStep(::newProjectWizardBaseStepWithoutGap) - .nextStep(::GitNewProjectWizardStep) - .nextStep(::Step) - } - - private class CommentStep(parent: NewProjectWizardStep) : CommentNewProjectWizardStep(parent) { - override val comment: String = UIBundle.message("label.project.wizard.empty.project.generator.full.description") - } - - private class Step(parent: NewProjectWizardStep) : AbstractNewProjectWizardStep(parent) { - override fun setupProject(project: Project) { - val moduleType = ModuleTypeManager.getInstance().findByID(GeneralModuleType.TYPE_ID) - val builder = moduleType.createModuleBuilder() - setupProjectFromBuilder(project, builder) - } - } -} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/NewModuleBuilder.kt b/platform/platform-impl/src/com/intellij/ide/wizard/NewModuleBuilder.kt deleted file mode 100644 index 53c98bcc9150..000000000000 --- a/platform/platform-impl/src/com/intellij/ide/wizard/NewModuleBuilder.kt +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.ide.wizard - -import com.intellij.ide.projectWizard.NewProjectWizardConstants.Generators -import com.intellij.ide.util.projectWizard.WizardContext -import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep -import com.intellij.ui.UIBundle -import com.intellij.util.ui.EmptyIcon -import javax.swing.Icon - -class NewModuleBuilder : GeneratorNewProjectWizardBuilderAdapter(SimpleNewModuleWizard()) { - class SimpleNewModuleWizard : GeneratorNewProjectWizard { - override val id: String = Generators.SIMPLE_MODULE - override val name: String = UIBundle.message("label.project.wizard.module.generator.name") - override val description: String = UIBundle.message("label.project.wizard.module.generator.description") - override val icon: Icon = EmptyIcon.ICON_0 - - override fun createStep(context: WizardContext): NewProjectWizardStep = - RootNewProjectWizardStep(context) - .nextStep(::NewProjectWizardBaseStep) - .nextStep(::NewProjectWizardLanguageStep) - } -} diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectBuilder.kt b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectBuilder.kt deleted file mode 100644 index bbcc12275a74..000000000000 --- a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectBuilder.kt +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.ide.wizard - -import com.intellij.ide.projectWizard.NewProjectWizardConstants.Generators -import com.intellij.ide.util.projectWizard.WizardContext -import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep -import com.intellij.ui.UIBundle -import com.intellij.util.ui.EmptyIcon -import javax.swing.Icon - -class NewProjectBuilder : GeneratorNewProjectWizardBuilderAdapter(SimpleNewProjectWizard()) { - class SimpleNewProjectWizard : GeneratorNewProjectWizard { - override val id: String = Generators.SIMPLE_PROJECT - override val name: String = UIBundle.message("label.project.wizard.project.generator.name") - override val description: String = UIBundle.message("label.project.wizard.project.generator.description") - override val icon: Icon = EmptyIcon.ICON_0 - - override fun createStep(context: WizardContext): NewProjectWizardStep = - RootNewProjectWizardStep(context) - .nextStep(::newProjectWizardBaseStepWithoutGap) - .nextStep(::GitNewProjectWizardStep) - .nextStep(::NewProjectWizardLanguageStep) - } -} diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardLanguageStep.kt b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardLanguageStep.kt index 48efab34984e..67bc78c4a013 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardLanguageStep.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardLanguageStep.kt @@ -1,128 +1,75 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.wizard -import com.intellij.icons.AllIcons -import com.intellij.ide.plugins.PluginManagerConfigurable -import com.intellij.ide.projectWizard.NewProjectWizardCollector.Base.logLanguageAddAction -import com.intellij.ide.projectWizard.NewProjectWizardCollector.Base.logLanguageChanged -import com.intellij.ide.projectWizard.NewProjectWizardCollector.Base.logLanguageFinished -import com.intellij.ide.projectWizard.NewProjectWizardCollector.Base.logLanguageLoadAction -import com.intellij.ide.projectWizard.NewProjectWizardConstants.Language +import com.intellij.ide.util.projectWizard.WizardContext import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData -import com.intellij.openapi.actionSystem.* -import com.intellij.openapi.actionSystem.impl.ActionButton -import com.intellij.openapi.actionSystem.impl.IdeaActionButtonLook -import com.intellij.openapi.application.ModalityState -import com.intellij.openapi.extensions.PluginId +import com.intellij.ide.wizard.language.BaseLanguageGeneratorNewProjectWizard +import com.intellij.openapi.Disposable +import com.intellij.openapi.observable.properties.AbstractObservableProperty import com.intellij.openapi.observable.properties.GraphProperty -import com.intellij.openapi.options.ShowSettingsUtil -import com.intellij.openapi.progress.ProgressManager -import com.intellij.openapi.project.DumbAwareAction -import com.intellij.openapi.project.Project -import com.intellij.openapi.ui.popup.JBPopupFactory -import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.InstallPluginTask -import com.intellij.openapi.util.registry.Registry -import com.intellij.ui.UIBundle -import com.intellij.ui.awt.RelativePoint -import com.intellij.ui.dsl.builder.BottomGap +import com.intellij.openapi.observable.properties.ObservableProperty +import com.intellij.openapi.observable.properties.PropertyGraph import com.intellij.ui.dsl.builder.Panel -import com.intellij.ui.dsl.builder.Row -import com.intellij.ui.dsl.builder.SegmentedButton -import com.intellij.ui.dsl.builder.components.SegmentedButtonBorder -import com.intellij.util.PlatformUtils -import org.jetbrains.annotations.Nls -import javax.swing.JComponent +@Suppress("DEPRECATION", "OVERRIDE_DEPRECATION") +@Deprecated("See LanguageNewProjectWizardData documentation for details") class NewProjectWizardLanguageStep( - parent: NewProjectWizardStep -) : AbstractNewProjectWizardMultiStep(parent, LanguageNewProjectWizard.EP_NAME), + parent: NewProjectWizardStep, + languageName: String +) : AbstractNewProjectWizardStep(parent), LanguageNewProjectWizardData, NewProjectWizardBaseData by parent.baseData!! { - override val self: NewProjectWizardLanguageStep = this + private val languagePropertyBridge = LanguagePropertyBridge(context, propertyGraph, languageName) - override val label: @Nls String = UIBundle.message("label.project.wizard.new.project.language") - - override val languageProperty: GraphProperty by ::stepProperty - override var language: String by ::step - - private var additionalStepPlugins = - if (PlatformUtils.isIdeaCommunity()) - mapOf( - Language.PYTHON to "PythonCore", - Language.SCALA to "org.intellij.scala" - ) - else - mapOf( - Language.GO to "org.jetbrains.plugins.go", - Language.RUBY to "org.jetbrains.plugins.ruby", - Language.PHP to "com.jetbrains.php", - Language.PYTHON to "Pythonid", - Language.SCALA to "org.intellij.scala", - Language.RUST to "com.jetbrains.rust" - ) - - override fun createAndSetupSwitcher(builder: Row): SegmentedButton { - return super.createAndSetupSwitcher(builder) - .whenItemSelectedFromUi { logLanguageChanged() } - } - - override fun setupSwitcherUi(builder: Panel) { - with(builder) { - row(label) { - createAndSetupSwitcher(this@row) - - if (additionalStepPlugins.isNotEmpty()) { - val plus = AdditionalStepsAction() - val actionButton = ActionButton( - plus, - null, - ActionPlaces.getPopupPlace("NEW_PROJECT_WIZARD"), - ActionToolbar.DEFAULT_MINIMUM_BUTTON_SIZE - ) - actionButton.setLook(IdeaActionButtonLook()) - actionButton.border = SegmentedButtonBorder() - cell(actionButton) - } - }.bottomGap(BottomGap.SMALL) - } - } - - override fun setupProject(project: Project) { - super.setupProject(project) - - logLanguageFinished() - } + override val languageProperty: GraphProperty = languagePropertyBridge + override var language: String by languagePropertyBridge init { data.putUserData(LanguageNewProjectWizardData.KEY, this) } - private inner class AdditionalStepsAction : DumbAwareAction(null, null, AllIcons.General.Add) { - override fun actionPerformed(e: AnActionEvent) { - logLanguageAddAction() - val additionalSteps = (additionalStepPlugins.keys - steps.keys).sorted().map { OpenMarketPlaceAction(it) } - JBPopupFactory.getInstance().createActionGroupPopup( - UIBundle.message("new.project.wizard.popup.title.install.plugin"), DefaultActionGroup(additionalSteps), - e.dataContext, - JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false - ).show(RelativePoint.getSouthOf(e.getData(PlatformCoreDataKeys.CONTEXT_COMPONENT) as JComponent)) - } + override fun setupUI(builder: Panel) { + languagePropertyBridge.fireInitEvent() } - private inner class OpenMarketPlaceAction(private val step: String) : DumbAwareAction({ step }) { - override fun actionPerformed(e: AnActionEvent) { - logLanguageLoadAction(step) - val pluginId = PluginId.getId(additionalStepPlugins[step]!!) - val component = e.dataContext.getData(PlatformCoreDataKeys.CONTEXT_COMPONENT)!! - if (Registry.`is`("new.project.wizard.modal.plugin.install", false)) { - ProgressManager.getInstance().run(InstallPluginTask(setOf(pluginId), ModalityState.stateForComponent(component))) - } - else { - ShowSettingsUtil.getInstance().editConfigurable(context.project, PluginManagerConfigurable()) { it -> - it.openMarketplaceTab("/tag: \"Programming Language\" $step") - } - } + private class LanguagePropertyBridge( + private val context: WizardContext, + private val propertyGraph: PropertyGraph, + private val languageName: String + ) : GraphProperty, AbstractObservableProperty() { + + override fun get(): String { + return languageName } + + /** + * This method needed to support legacy feature. + * It selects language in the left tray [com.intellij.ide.projectWizard.ProjectTypeStep] with [GeneratorNewProjectWizard]. + * Use [com.intellij.ide.wizard.comment.LinkNewProjectWizardStep] for navigation between languages. + */ + override fun set(value: String) { + val languageModelBuilderId = BaseLanguageGeneratorNewProjectWizard.getLanguageModelBuilderId(context, value) + context.requestSwitchTo(languageModelBuilderId) + } + + /** + * This method needed to support legacy feature. + * It submits all change events to consumers who initialize background tasks when their language is selected. + */ + fun fireInitEvent() { + fireChangeEvent(languageName) + } + + //@formatter:off + override fun dependsOn(parent: ObservableProperty<*>, update: () -> String) = + propertyGraph.dependsOn(this, parent, update = update) + override fun dependsOn(parent: ObservableProperty<*>, deleteWhenModified: Boolean, update: () -> String) = + propertyGraph.dependsOn(this, parent, deleteWhenModified, update = update) + override fun afterPropagation(listener: () -> Unit) = + propertyGraph.afterPropagation(listener = listener) + override fun afterPropagation(parentDisposable: Disposable?, listener: () -> Unit) = + propertyGraph.afterPropagation(parentDisposable, listener = listener) + //@formatter:on } } diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardMultiStepFactory.kt b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardMultiStepFactory.kt index a01915e301cb..16d0a3a8ce0b 100644 --- a/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardMultiStepFactory.kt +++ b/platform/platform-impl/src/com/intellij/ide/wizard/NewProjectWizardMultiStepFactory.kt @@ -3,19 +3,21 @@ package com.intellij.ide.wizard import com.intellij.ide.util.projectWizard.WizardContext import com.intellij.openapi.util.NlsContexts +import com.intellij.util.PlatformUtils /** * Describes fork in steps' tree in new project wizard. * Appends control and logic to switch UI from different vertical wizard steps, - * and applies data from steps which are selected when wizard's finish button is pressed. - * Steps can form tree structure, i.e. direct or indirect child of multistep can be multistep. + * and applies data from steps which are selected when the wizard's finish button is pressed. + * Steps can form tree structure, i.e., direct or indirect child of multistep can be multistep. * * @see NewProjectWizardStep */ @JvmDefaultWithCompatibility interface NewProjectWizardMultiStepFactory

{ + /** - * Name of step and label that should be used in multistep switcher. + * Name of the created step and label that should be used in multistep switcher. */ val name: @NlsContexts.Label String @@ -27,15 +29,17 @@ interface NewProjectWizardMultiStepFactory

{ /** * Disabled steps will be excluded from multistep switcher. + * For example, you can use [WizardContext.isCreatingNewProject] to filter factory if that factory cannot create new module. + * Or [PlatformUtils.isIdeaCommunity] or [PlatformUtils.isIdeaUltimate], etc. * - * @param context is context of wizard where created step will be displayed - * Use [WizardContext.isCreatingNewProject] to filter factory if that cannot create new module. + * @param context is context of wizard where the created step will be displayed. */ fun isEnabled(context: WizardContext): Boolean = true /** - * Creates new project wizard step with parent step. - * Parent is needed to transfer data from parents into children steps. + * Creates the new project wizard step with the [parent] step. + * + * @param parent is needed to transfer data from parents into children steps. */ fun createStep(parent: P): NewProjectWizardStep } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/comment/NewProjectLinkNewProjectWizardStep.kt b/platform/platform-impl/src/com/intellij/ide/wizard/comment/NewProjectLinkNewProjectWizardStep.kt deleted file mode 100644 index 144e1330c0e0..000000000000 --- a/platform/platform-impl/src/com/intellij/ide/wizard/comment/NewProjectLinkNewProjectWizardStep.kt +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.ide.wizard.comment - -import com.intellij.ide.wizard.NewModuleBuilder -import com.intellij.ide.wizard.NewProjectBuilder -import com.intellij.ide.wizard.NewProjectWizardStep -import org.jetbrains.annotations.Nls - -abstract class NewProjectLinkNewProjectWizardStep(parent: NewProjectWizardStep) : LinkNewProjectWizardStep(parent) { - - private val builder = if (context.isCreatingNewProject) NewProjectBuilder() else NewModuleBuilder() - - override val builderId: String = builder.builderId - - override val comment: String by lazy { getComment(builder.presentableName) } - - abstract fun getComment( - name: @Nls(capitalization = Nls.Capitalization.Title) String - ): @Nls(capitalization = Nls.Capitalization.Sentence) String -} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/language/BaseLanguageGeneratorNewProjectWizard.kt b/platform/platform-impl/src/com/intellij/ide/wizard/language/BaseLanguageGeneratorNewProjectWizard.kt new file mode 100644 index 000000000000..03dee52b2862 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/wizard/language/BaseLanguageGeneratorNewProjectWizard.kt @@ -0,0 +1,49 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ide.wizard.language + +import com.intellij.ide.projectWizard.NewProjectWizardConstants.Generators.SIMPLE_MODULE +import com.intellij.ide.projectWizard.NewProjectWizardConstants.Generators.SIMPLE_PROJECT +import com.intellij.ide.util.projectWizard.WizardContext +import com.intellij.ide.wizard.* +import com.intellij.ide.wizard.GeneratorNewProjectWizardBuilderAdapter.Companion.NPW_PREFIX +import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep +import com.intellij.ui.UIBundle +import javax.swing.Icon + +class BaseLanguageGeneratorNewProjectWizard( + private val context: WizardContext, + private val wizard: LanguageGeneratorNewProjectWizard +) : GeneratorNewProjectWizard { + + override val id: String = getLanguageGeneratorId(context, wizard.name) + + override val name: String = wizard.name + + override val icon: Icon = wizard.icon + + override val ordinal: Int = wizard.ordinal + + override val description: String = + UIBundle.message("label.project.wizard.project.generator.description", context.isCreatingNewProjectInt, wizard.name) + + override fun isEnabled(): Boolean = wizard.isEnabled(context) + + override fun createStep(context: WizardContext): NewProjectWizardStep = + RootNewProjectWizardStep(context) + .nextStep(::newProjectWizardBaseStepWithoutGap) + .nextStep(::GitNewProjectWizardStep) + .nextStep { @Suppress("DEPRECATION") NewProjectWizardLanguageStep(it, wizard.name) } + .nextStep(wizard::createStep) + + companion object { + + fun getLanguageGeneratorId(context: WizardContext, language: String): String { + val generator = if (context.isCreatingNewProject) SIMPLE_PROJECT else SIMPLE_MODULE + return "$generator.$language" + } + + fun getLanguageModelBuilderId(context: WizardContext, language: String): String { + return NPW_PREFIX + getLanguageGeneratorId(context, language) + } + } +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/language/EmptyProjectGeneratorNewProjectWizard.kt b/platform/platform-impl/src/com/intellij/ide/wizard/language/EmptyProjectGeneratorNewProjectWizard.kt new file mode 100644 index 000000000000..a053f63faba7 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/wizard/language/EmptyProjectGeneratorNewProjectWizard.kt @@ -0,0 +1,40 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ide.wizard.language + +import com.intellij.ide.projectWizard.NewProjectWizardConstants +import com.intellij.ide.util.projectWizard.WizardContext +import com.intellij.ide.wizard.* +import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep +import com.intellij.ide.wizard.comment.CommentNewProjectWizardStep +import com.intellij.openapi.module.GeneralModuleType +import com.intellij.openapi.module.ModuleTypeManager +import com.intellij.openapi.project.Project +import com.intellij.ui.UIBundle +import com.intellij.util.ui.EmptyIcon +import javax.swing.Icon + +class EmptyProjectGeneratorNewProjectWizard : GeneratorNewProjectWizard { + override val id: String = NewProjectWizardConstants.Generators.EMPTY_PROJECT + override val name: String = UIBundle.message("label.project.wizard.empty.project.generator.name") + override val description: String = UIBundle.message("label.project.wizard.empty.project.generator.description") + override val icon: Icon = EmptyIcon.ICON_16 + + override fun createStep(context: WizardContext): NewProjectWizardStep = + RootNewProjectWizardStep(context) + .nextStep(::CommentStep) + .nextStep(::newProjectWizardBaseStepWithoutGap) + .nextStep(::GitNewProjectWizardStep) + .nextStep(::Step) + + private class CommentStep(parent: NewProjectWizardStep) : CommentNewProjectWizardStep(parent) { + override val comment: String = UIBundle.message("label.project.wizard.empty.project.generator.full.description") + } + + private class Step(parent: NewProjectWizardStep) : AbstractNewProjectWizardStep(parent) { + override fun setupProject(project: Project) { + val moduleType = ModuleTypeManager.getInstance().findByID(GeneralModuleType.TYPE_ID) + val builder = moduleType.createModuleBuilder() + setupProjectFromBuilder(project, builder) + } + } +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/language/LanguageGeneratorNewProjectWizard.kt b/platform/platform-impl/src/com/intellij/ide/wizard/language/LanguageGeneratorNewProjectWizard.kt new file mode 100644 index 000000000000..c8a90d86b50e --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/wizard/language/LanguageGeneratorNewProjectWizard.kt @@ -0,0 +1,66 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.ide.wizard.language + +import com.intellij.ide.util.projectWizard.WizardContext +import com.intellij.ide.wizard.NewProjectWizardStep +import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.util.PlatformUtils +import org.jetbrains.annotations.Nls +import javax.swing.Icon + +/** + * A generator-based project wizard for specific language. + * These generators are present in the first part of the generator tray (on the left). + * + * @see com.intellij.ide.wizard.GeneratorNewProjectWizard + */ +interface LanguageGeneratorNewProjectWizard { + + /** + * The user-visible name of the generator. + * + * @see com.intellij.ide.wizard.GeneratorNewProjectWizard.name + */ + val name: @Nls(capitalization = Nls.Capitalization.Title) String + + /** + * The icon of the generator. + * + * @see com.intellij.ide.wizard.GeneratorNewProjectWizard.icon + */ + val icon: Icon + + /** + * The ordinal number by which all languages are sorted in the generator tray (on the left). + * + * @see com.intellij.ide.wizard.GeneratorNewProjectWizard.ordinal + */ + val ordinal: Int + get() = Int.MAX_VALUE + + /** + * Disabled generators will be excluded from the new project wizard. + * For example, you can use [WizardContext.isCreatingNewProject] to filter factory if that factory cannot create new module. + * Or [PlatformUtils.isIdeaCommunity] or [PlatformUtils.isIdeaUltimate], etc. + * + * @param context is context of wizard where the created step will be displayed. + * + * @see com.intellij.ide.wizard.GeneratorNewProjectWizard.isEnabled + */ + fun isEnabled(context: WizardContext): Boolean = true + + /** + * Creates the new project wizard step with the [parent] step. + * + * @param parent is needed to transfer data from parents into children steps. + * + * @see com.intellij.ide.wizard.GeneratorNewProjectWizard.createStep + */ + fun createStep(parent: NewProjectWizardStep): NewProjectWizardStep + + companion object { + + @JvmField + val EP_NAME = ExtensionPointName("com.intellij.newProjectWizard.languageGenerator") + } +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/wizard/language/LegacyLanguageGeneratorNewProjectWizard.kt b/platform/platform-impl/src/com/intellij/ide/wizard/language/LegacyLanguageGeneratorNewProjectWizard.kt new file mode 100644 index 000000000000..4b4f58509d7a --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/wizard/language/LegacyLanguageGeneratorNewProjectWizard.kt @@ -0,0 +1,41 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +@file:Suppress("DEPRECATION") + +package com.intellij.ide.wizard.language + +import com.intellij.ide.util.projectWizard.WizardContext +import com.intellij.ide.wizard.* +import com.intellij.ide.wizard.LanguageNewProjectWizard +import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep +import com.intellij.ide.wizard.language.BaseLanguageGeneratorNewProjectWizard.Companion.getLanguageGeneratorId +import com.intellij.ui.UIBundle +import com.intellij.util.ui.EmptyIcon +import org.jetbrains.annotations.ApiStatus +import javax.swing.Icon + +@ApiStatus.Internal +class LegacyLanguageGeneratorNewProjectWizard( + private val context: WizardContext, + private val wizard: LanguageNewProjectWizard +) : GeneratorNewProjectWizard { + + override val id: String = getLanguageGeneratorId(context, wizard.name) + + override val name: String = wizard.name + + override val icon: Icon = EmptyIcon.ICON_16 + + override val ordinal: Int = wizard.ordinal + + override val description: String = + UIBundle.message("label.project.wizard.project.generator.description", context.isCreatingNewProjectInt, wizard.name) + + override fun isEnabled(): Boolean = wizard.isEnabled(context) + + override fun createStep(context: WizardContext): NewProjectWizardStep = + RootNewProjectWizardStep(context) + .nextStep(::newProjectWizardBaseStepWithoutGap) + .nextStep(::GitNewProjectWizardStep) + .nextStep { NewProjectWizardLanguageStep(it, wizard.name) } + .nextStep(wizard::createStep) +} \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index 20320a88822b..6ed975bc879d 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -470,6 +470,7 @@ + diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 779c8b19810a..68d0c4a1c83e 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -1605,8 +1605,6 @@ - assertModules(project, "project") - createModuleByWizard(project) { + createModuleByWizard(project, JAVA) { baseData!!.path = testRoot.path + "/project" - languageData!!.language = "Java" javaBuildSystemData!!.buildSystem = "Gradle" javaGradleData!!.addSampleCode = false @@ -149,9 +148,8 @@ class GradleCreateProjectTest : GradleCreateProjectTestCase() { Assertions.assertEquals(GradleDsl.KOTLIN, javaGradleData!!.gradleDsl) Assertions.assertNull(javaGradleData!!.parentData) } - createModuleByWizard(project) { + createModuleByWizard(project, JAVA) { baseData!!.path = testRoot.path + "/project" - languageData!!.language = "Java" javaBuildSystemData!!.buildSystem = "Gradle" javaGradleData!!.addSampleCode = false @@ -167,8 +165,7 @@ class GradleCreateProjectTest : GradleCreateProjectTestCase() { }.useProjectAsync { project -> val projectNode1 = ExternalSystemApiUtil.findProjectNode(project, SYSTEM_ID, testRoot.path + "/project/untitled")!! val projectNode2 = ExternalSystemApiUtil.findProjectNode(project, SYSTEM_ID, testRoot.path + "/project/untitled1")!! - createModuleByWizard(project) { - languageData!!.language = "Java" + createModuleByWizard(project, JAVA) { javaBuildSystemData!!.buildSystem = "Gradle" javaGradleData!!.parentData = projectNode1.data javaGradleData!!.addSampleCode = false @@ -177,8 +174,7 @@ class GradleCreateProjectTest : GradleCreateProjectTestCase() { Assertions.assertEquals(testRoot.path + "/project/untitled", baseData!!.path) Assertions.assertEquals(GradleDsl.KOTLIN, javaGradleData!!.gradleDsl) } - createModuleByWizard(project) { - languageData!!.language = "Java" + createModuleByWizard(project, JAVA) { javaBuildSystemData!!.buildSystem = "Gradle" javaGradleData!!.parentData = projectNode2.data javaGradleData!!.addSampleCode = false diff --git a/plugins/gradle/java/testSources/setup/GradleCreateProjectTestCase.kt b/plugins/gradle/java/testSources/setup/GradleCreateProjectTestCase.kt index 339eb19c059e..8ebce2bde13e 100644 --- a/plugins/gradle/java/testSources/setup/GradleCreateProjectTestCase.kt +++ b/plugins/gradle/java/testSources/setup/GradleCreateProjectTestCase.kt @@ -3,11 +3,12 @@ package org.jetbrains.plugins.gradle.setup import com.intellij.ide.impl.NewProjectUtil import com.intellij.ide.projectWizard.NewProjectWizard +import com.intellij.ide.projectWizard.NewProjectWizardConstants.BuildSystem.GRADLE +import com.intellij.ide.projectWizard.NewProjectWizardConstants.Language.JAVA import com.intellij.ide.projectWizard.ProjectTypeStep import com.intellij.ide.projectWizard.generators.BuildSystemJavaNewProjectWizardData.Companion.javaBuildSystemData import com.intellij.ide.util.PropertiesComponent import com.intellij.ide.util.newProjectWizard.AbstractProjectWizard -import com.intellij.ide.wizard.LanguageNewProjectWizardData.Companion.languageData import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData import com.intellij.ide.wizard.NewProjectWizardStep import com.intellij.ide.wizard.NewProjectWizardStep.Companion.ADD_SAMPLE_CODE_PROPERTY_NAME @@ -54,7 +55,7 @@ abstract class GradleCreateProjectTestCase : GradleTestCase() { suspend fun createProjectByWizard(projectInfo: ProjectInfo): Project { Assertions.assertTrue(projectInfo.composites.isEmpty(), "NPW cannot create composite projects please use initProject instead.") val rootModuleInfo = projectInfo.rootModule - return createProjectByWizard { + return createProjectByWizard(JAVA) { configureWizardStepSettings(this, rootModuleInfo, null) }.withProjectAsync { project -> val projectRoot = testRoot.getDirectory(projectInfo.relativePath) @@ -65,7 +66,7 @@ abstract class GradleCreateProjectTestCase : GradleTestCase() { )!! for (moduleInfo in projectInfo.modules) { if (moduleInfo != rootModuleInfo) { - createModuleByWizard(project) { + createModuleByWizard(project, JAVA) { configureWizardStepSettings(this, moduleInfo, parentData.data) } } @@ -74,10 +75,9 @@ abstract class GradleCreateProjectTestCase : GradleTestCase() { } private fun configureWizardStepSettings(step: NewProjectWizardStep, moduleInfo: ModuleInfo, parentData: ProjectData?) { - step.languageData!!.language = "Java" - step.javaBuildSystemData!!.buildSystem = "Gradle" step.baseData!!.name = moduleInfo.name step.baseData!!.path = testRoot.toNioPath().getResolvedPath(moduleInfo.relativePath).parent.toCanonicalPath() + step.javaBuildSystemData!!.buildSystem = GRADLE step.javaGradleData!!.gradleDsl = when (moduleInfo.useKotlinDsl) { true -> GradleNewProjectWizardStep.GradleDsl.KOTLIN else -> GradleNewProjectWizardStep.GradleDsl.GROOVY @@ -90,7 +90,7 @@ abstract class GradleCreateProjectTestCase : GradleTestCase() { } suspend fun createProjectByWizard( - group: String = NEW_PROJECT, + group: String, wait: Boolean = true, configure: NewProjectWizardStep.() -> Unit ): Project { @@ -110,7 +110,7 @@ abstract class GradleCreateProjectTestCase : GradleTestCase() { suspend fun createModuleByWizard( project: Project, - group: String = NEW_MODULE, + group: String, wait: Boolean = true, configure: NewProjectWizardStep.() -> Unit ): Module? { @@ -180,8 +180,6 @@ abstract class GradleCreateProjectTestCase : GradleTestCase() { companion object { - val NEW_PROJECT = UIBundle.message("label.project.wizard.project.generator.name") - val NEW_MODULE = UIBundle.message("label.project.wizard.module.generator.name") val NEW_EMPTY_PROJECT = UIBundle.message("label.project.wizard.empty.project.generator.name") } } \ No newline at end of file diff --git a/plugins/kotlin/project-wizard/tests/test/org/jetbrains/kotlin/tools/projectWizard/wizard/GradleKotlinNewProjectWizardTest.kt b/plugins/kotlin/project-wizard/tests/test/org/jetbrains/kotlin/tools/projectWizard/wizard/GradleKotlinNewProjectWizardTest.kt index 520adba08f23..6db29a6fdfea 100644 --- a/plugins/kotlin/project-wizard/tests/test/org/jetbrains/kotlin/tools/projectWizard/wizard/GradleKotlinNewProjectWizardTest.kt +++ b/plugins/kotlin/project-wizard/tests/test/org/jetbrains/kotlin/tools/projectWizard/wizard/GradleKotlinNewProjectWizardTest.kt @@ -1,7 +1,9 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.tools.projectWizard.wizard -import com.intellij.ide.wizard.LanguageNewProjectWizardData.Companion.languageData +import com.intellij.ide.projectWizard.NewProjectWizardConstants.BuildSystem.GRADLE +import com.intellij.ide.projectWizard.NewProjectWizardConstants.Language.KOTLIN +import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData import com.intellij.ide.wizard.NewProjectWizardStep import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil @@ -164,12 +166,10 @@ class GradleKotlinNewProjectWizardTest : GradleCreateProjectTestCase() { generateOnboardingTips: Boolean = false, parentData: ProjectData? = null ) { - languageData!!.language = "Kotlin" - kotlinBuildSystemData!!.buildSystem = "Gradle" - kotlinBuildSystemData!!.path = testRoot.toNioPath().getResolvedPath(path).parent.toCanonicalPath() + baseData!!.name = name + baseData!!.path = testRoot.toNioPath().getResolvedPath(path).parent.toCanonicalPath() + kotlinBuildSystemData!!.buildSystem = GRADLE kotlinGradleData!!.parentData = parentData - kotlinBuildSystemData!!.name = name - kotlinBuildSystemData!!.language = "Kotlin" kotlinGradleData!!.gradleDsl = if (useKotlinDsl) GradleDsl.KOTLIN else GradleDsl.GROOVY kotlinGradleData!!.groupId = groupId kotlinGradleData!!.artifactId = name @@ -190,7 +190,7 @@ class GradleKotlinNewProjectWizardTest : GradleCreateProjectTestCase() { ) { runBlocking { - createProjectByWizard { + createProjectByWizard(KOTLIN) { setGradleWizardData( useKotlinDsl = useKotlinDsl, name = name, @@ -321,7 +321,7 @@ class GradleKotlinNewProjectWizardTest : GradleCreateProjectTestCase() { openProject("project").useProjectAsync { project -> val parentData = ExternalSystemApiUtil.findProjectNode(project, SYSTEM_ID, testRoot.path + "/$parentPath")!! val existingModules = project.modules.map { it.name } - createModuleByWizard(project) { + createModuleByWizard(project, KOTLIN) { setGradleWizardData( useKotlinDsl = useKotlinDsl, name = name, diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/archetype/MavenArchetypeNewProjectWizard.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/archetype/MavenArchetypeNewProjectWizard.kt index 551666e980be..2b0772ccc637 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/archetype/MavenArchetypeNewProjectWizard.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/archetype/MavenArchetypeNewProjectWizard.kt @@ -12,9 +12,9 @@ import com.intellij.ide.projectWizard.generators.BuildSystemJavaNewProjectWizard import com.intellij.ide.starters.local.StandardAssetsProvider import com.intellij.ide.util.projectWizard.WizardContext import com.intellij.ide.wizard.* -import com.intellij.ide.wizard.LanguageNewProjectWizardData.Companion.languageData import com.intellij.ide.wizard.NewProjectWizardChainStep.Companion.nextStep -import com.intellij.ide.wizard.comment.NewProjectLinkNewProjectWizardStep +import com.intellij.ide.wizard.comment.LinkNewProjectWizardStep +import com.intellij.ide.wizard.language.BaseLanguageGeneratorNewProjectWizard import com.intellij.openapi.externalSystem.service.ui.completion.TextCompletionComboBox import com.intellij.openapi.externalSystem.service.ui.completion.TextCompletionComboBoxConverter import com.intellij.openapi.externalSystem.service.ui.completion.TextCompletionField @@ -63,13 +63,15 @@ class MavenArchetypeNewProjectWizard : GeneratorNewProjectWizard { .nextStep(::Step) .nextStep(::AssetsStep) - private class CommentStep(parent: NewProjectWizardStep) : NewProjectLinkNewProjectWizardStep(parent) { - override fun getComment(name: String): String { - return MavenWizardBundle.message("maven.new.project.wizard.archetype.generator.comment", context.isCreatingNewProjectInt, name) - } + private class CommentStep(parent: NewProjectWizardStep) : LinkNewProjectWizardStep(parent) { + + override val builderId: String = + BaseLanguageGeneratorNewProjectWizard.getLanguageModelBuilderId(context, JAVA) + + override val comment: String = + MavenWizardBundle.message("maven.new.project.wizard.archetype.generator.comment", context.isCreatingNewProjectInt, JAVA) override fun onStepSelected(step: NewProjectWizardStep) { - step.languageData!!.language = JAVA step.javaBuildSystemData!!.buildSystem = MAVEN } } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerConnectorShutdownTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerConnectorShutdownTest.kt index a3f8193e8452..2928793ecb26 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerConnectorShutdownTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/server/MavenServerConnectorShutdownTest.kt @@ -1,8 +1,9 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.idea.maven.server +import com.intellij.ide.projectWizard.NewProjectWizardConstants.BuildSystem.MAVEN +import com.intellij.ide.projectWizard.NewProjectWizardConstants.Language.JAVA import com.intellij.ide.projectWizard.generators.BuildSystemJavaNewProjectWizardData.Companion.javaBuildSystemData -import com.intellij.ide.wizard.LanguageNewProjectWizardData.Companion.languageData import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData import com.intellij.maven.testFramework.assertWithinTimeout import com.intellij.openapi.util.Ref @@ -20,10 +21,9 @@ class MavenServerConnectorShutdownTest : MavenNewProjectWizardTestCase() { val connectorRef = Ref() // create project waitForProjectCreation { - createProjectFromTemplate { + createProjectFromTemplate(JAVA) { it.baseData!!.name = "project" - it.languageData!!.language = "Java" - it.javaBuildSystemData!!.buildSystem = "Maven" + it.javaBuildSystemData!!.buildSystem = MAVEN it.javaMavenData!!.sdk = mySdk } }.withProjectAsync { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenProjectWizardTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenProjectWizardTest.kt index 0e7087a779b5..2238dcfd60a2 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenProjectWizardTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/wizards/MavenProjectWizardTest.kt @@ -1,9 +1,10 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.idea.maven.wizards +import com.intellij.ide.projectWizard.NewProjectWizardConstants.BuildSystem.MAVEN +import com.intellij.ide.projectWizard.NewProjectWizardConstants.Language.JAVA import com.intellij.ide.projectWizard.ProjectTypeStep import com.intellij.ide.projectWizard.generators.BuildSystemJavaNewProjectWizardData.Companion.javaBuildSystemData -import com.intellij.ide.wizard.LanguageNewProjectWizardData.Companion.languageData import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData import com.intellij.ide.wizard.NewProjectWizardStep import com.intellij.openapi.application.EDT @@ -15,7 +16,6 @@ import com.intellij.testFramework.closeProjectAsync import com.intellij.testFramework.useProjectAsync import com.intellij.testFramework.utils.module.assertModules import com.intellij.testFramework.withProjectAsync -import com.intellij.ui.UIBundle import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext @@ -35,10 +35,9 @@ class MavenProjectWizardTest : MavenNewProjectWizardTestCase() { assumeTrue(isWorkspaceImport()) // create project waitForProjectCreation { - createProjectFromTemplate { + createProjectFromTemplate(JAVA) { it.baseData!!.name = "project" - it.languageData!!.language = "Java" - it.javaBuildSystemData!!.buildSystem = "Maven" + it.javaBuildSystemData!!.buildSystem = MAVEN it.javaMavenData!!.sdk = mySdk } }.withProjectAsync { project -> @@ -56,10 +55,9 @@ class MavenProjectWizardTest : MavenNewProjectWizardTestCase() { // create module waitForModuleCreation { - createModuleFromTemplate(project) { + createModuleFromTemplate(project, JAVA) { it.baseData!!.name = "untitled" - it.languageData!!.language = "Java" - it.javaBuildSystemData!!.buildSystem = "Maven" + it.javaBuildSystemData!!.buildSystem = MAVEN it.javaMavenData!!.sdk = mySdk it.javaMavenData!!.parentData = mavenProjectsManager.findProject(module) } @@ -76,10 +74,9 @@ class MavenProjectWizardTest : MavenNewProjectWizardTestCase() { assumeTrue(isWorkspaceImport()) // create project waitForProjectCreation { - createProjectFromTemplate { + createProjectFromTemplate(JAVA) { it.baseData!!.name = "project" - it.languageData!!.language = "Java" - it.javaBuildSystemData!!.buildSystem = "Maven" + it.javaBuildSystemData!!.buildSystem = MAVEN it.javaMavenData!!.sdk = mySdk } }.useProjectAsync { project -> @@ -91,10 +88,9 @@ class MavenProjectWizardTest : MavenNewProjectWizardTestCase() { // create waitForModuleCreation { - createModuleFromTemplate(project) { + createModuleFromTemplate(project, JAVA) { it.baseData!!.name = "untitled" - it.languageData!!.language = "Java" - it.javaBuildSystemData!!.buildSystem = "Maven" + it.javaBuildSystemData!!.buildSystem = MAVEN it.javaMavenData!!.sdk = mySdk it.javaMavenData!!.parentData = mavenProjectsManager.findProject(module) } @@ -112,10 +108,9 @@ class MavenProjectWizardTest : MavenNewProjectWizardTestCase() { fun `test configurator creates module in project structure modifiable model`() = runBlocking { assumeTrue(isWorkspaceImport()) waitForProjectCreation { - createProjectFromTemplate { + createProjectFromTemplate(JAVA) { it.baseData!!.name = "project" - it.languageData!!.language = "Java" - it.javaBuildSystemData!!.buildSystem = "Maven" + it.javaBuildSystemData!!.buildSystem = MAVEN it.javaMavenData!!.sdk = mySdk } }.useProjectAsync { project -> @@ -128,11 +123,10 @@ class MavenProjectWizardTest : MavenNewProjectWizardTestCase() { val module = waitForModuleCreation { withWizard({ modulesConfigurator.addNewModule(null)!! }) { this as ProjectTypeStep - assertTrue(setSelectedTemplate(UIBundle.message("label.project.wizard.module.generator.name"), null)) + assertTrue(setSelectedTemplate(JAVA, null)) val step = customStep as NewProjectWizardStep step.baseData!!.name = "untitled" - step.languageData!!.language = "Java" - step.javaBuildSystemData!!.buildSystem = "Maven" + step.javaBuildSystemData!!.buildSystem = MAVEN step.javaMavenData!!.sdk = mySdk }.single() }