IDEA-332234 [NPW] new: replaced language multistep by language project generators

GitOrigin-RevId: e7ecdeb6a3e74cf66711c8bc6d8f6fc80324c756
This commit is contained in:
Sergei Vorobyov
2024-01-05 12:03:29 +00:00
committed by intellij-monorepo-bot
parent 146a4eeda6
commit 4b102d80f0
26 changed files with 452 additions and 369 deletions
@@ -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<TemplatesGroup>();
var generatorNewProjectWizards = new ArrayList<GeneratorNewProjectWizard>();
//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<TemplatesGroup>();
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<TemplatesGroup> {
ProjectTypeListRenderer(java.util.List<TemplatesGroup> 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<TemplatesGroup> 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<TemplatesGroup> {
private final @NotNull WizardContext myContext;
private final @NotNull java.util.List<TemplatesGroup> myGroups;
ProjectTypeListItemDescriptor(@NotNull WizardContext context, @NotNull java.util.List<TemplatesGroup> 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);
}
}
}
@@ -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;
}
@@ -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<T extends AbstractProjectWizard> ext
return createProjectFromWizard();
}
protected Project createProjectFromTemplate(@NotNull Consumer<? super NewProjectWizardStep> adjuster) throws IOException {
return createProjectFromTemplate(UIBundle.message("label.project.wizard.project.generator.name"), adjuster);
}
protected Project createProjectFromTemplate(
@NotNull String group,
@NotNull Consumer<? super NewProjectWizardStep> adjuster
@@ -216,10 +211,6 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
return createModuleFromWizard(project);
}
protected Module createModuleFromTemplate(@NotNull Project project, @NotNull Consumer<? super NewProjectWizardStep> adjuster) throws IOException {
return createModuleFromTemplate(project, UIBundle.message("label.project.wizard.module.generator.name"), adjuster);
}
protected Module createModuleFromTemplate(
@NotNull Project project,
@NotNull String group,
@@ -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
@@ -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.
*/
@@ -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 {
@@ -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<NewProjectWizardLanguageStep> {
companion object {
@JvmField
val EP_NAME: ExtensionPointName<LanguageNewProjectWizard> = ExtensionPointName("com.intellij.newProjectWizard.language")
}
}
@@ -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<String>
@Deprecated("See LanguageNewProjectWizardData documentation for details")
var language: String
companion object {
@Deprecated("See LanguageNewProjectWizardData documentation for details")
val KEY: Key<LanguageNewProjectWizardData> = Key.create(LanguageNewProjectWizardData::class.java.name)
@JvmStatic
@Deprecated("See LanguageNewProjectWizardData documentation for details")
val NewProjectWizardStep.languageData: LanguageNewProjectWizardData?
get() = data.getUserData(KEY)
}
@@ -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)
}
}
}
@@ -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)
}
}
@@ -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)
}
}
@@ -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<NewProjectWizardLanguageStep, LanguageNewProjectWizard>(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<String> 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<String> {
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<String> = 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<String>, AbstractObservableProperty<String>() {
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
}
}
@@ -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<P : NewProjectWizardStep> {
/**
* 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<P : NewProjectWizardStep> {
/**
* 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
}
@@ -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
}
@@ -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)
}
}
}
@@ -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)
}
}
}
@@ -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<LanguageGeneratorNewProjectWizard>("com.intellij.newProjectWizard.languageGenerator")
}
}
@@ -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)
}
@@ -470,6 +470,7 @@
<extensionPoint name="documentationActionProvider" interface="com.intellij.codeInsight.documentation.DocumentationActionProvider" dynamic="true"/>
<extensionPoint name="newProjectWizard.language" interface="com.intellij.ide.wizard.LanguageNewProjectWizard" dynamic="true"/>
<extensionPoint name="newProjectWizard.languageGenerator" interface="com.intellij.ide.wizard.language.LanguageGeneratorNewProjectWizard" dynamic="true"/>
<extensionPoint name="newProject.onboarding.tips" interface="com.intellij.ide.wizard.NewProjectOnboardingTips" dynamic="true"/>
@@ -1605,8 +1605,6 @@
<persistentFsConnectionListener implementation="com.intellij.openapi.vfs.impl.jar.ArchiveCachesCleaner"/>
<applicationService serviceInterface="com.intellij.platform.ide.progress.TaskSupport"
serviceImplementation="com.intellij.openapi.progress.impl.PlatformTaskSupport" preload="true"/>
<registryKey key="new.project.wizard.modal.plugin.install" description="Enables modal lanungage plugins installing"
defaultValue="false"/>
<searchEverywhereContributor implementation="com.intellij.find.impl.TextSearchContributor$Companion$Factory"/>
<applicationService serviceInterface="com.intellij.openapi.vfs.newvfs.persistent.FsRootDataLoader"
@@ -1,8 +1,8 @@
// 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.plugins.gradle.setup
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.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.testFramework.useProjectAsync
@@ -139,9 +139,8 @@ class GradleCreateProjectTest : GradleCreateProjectTestCase() {
baseData!!.path = testRoot.path
}.withProjectAsync { project ->
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
@@ -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")
}
}
@@ -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,
@@ -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
}
}
@@ -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<MavenServerConnector>()
// 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 {
@@ -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()
}