From 63884679a2d1ca84d820dc41ef5679e92e4dfa9c Mon Sep 17 00:00:00 2001 From: Karol Lewandowski Date: Fri, 25 Apr 2025 14:40:05 +0200 Subject: [PATCH] legacy_project_wizard.md: Cleanups --- .../reference_guide/legacy_project_wizard.md | 75 ++++++++----------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/topics/reference_guide/legacy_project_wizard.md b/topics/reference_guide/legacy_project_wizard.md index 76775eec5..02a9d2e13 100644 --- a/topics/reference_guide/legacy_project_wizard.md +++ b/topics/reference_guide/legacy_project_wizard.md @@ -4,31 +4,32 @@ Implementing a custom project creation wizard. -> Plugins targetting versions 2024.2 and newer should implement [](new_project_wizard.md). +> Plugins targeting versions 2024.2 and newer should implement the [](new_project_wizard.md). ## Project Wizard -Working with the project wizard can be illustrated with the [RedLine SmallTalk plugin](https://github.com/bulenkov/RedlineSmalltalk). See also [](intro_project_wizard.md). +Working with the project wizard can be illustrated with the [RedLine SmallTalk plugin](https://github.com/bulenkov/RedlineSmalltalk). +See also [](intro_project_wizard.md). ## Implementing a New Module Type -Additional support for specific tools and technologies is usually done via implementing some certain module type which is attached to the project. -New module type should be derived from the class [`ModuleType`](%gh-ic%/platform/lang-core/src/com/intellij/openapi/module/ModuleType.java). +Additional support for specific tools and technologies is usually done via implementing some certain module type, which is attached to the project. +A new module type should be derived from the class [`ModuleType`](%gh-ic%/platform/lang-core/src/com/intellij/openapi/module/ModuleType.java). ## Custom Project Wizard -Main utilities to configure a custom project wizard can be found in the package [`lang-api.ide.util.projectWizard`](%gh-ic%/platform/lang-api/src/com/intellij/ide/util/projectWizard). +The main utilities to configure a custom project wizard can be found in the package [`lang-api.ide.util.projectWizard`](%gh-ic%/platform/lang-api/src/com/intellij/ide/util/projectWizard). These classes and interfaces serve the following purposes: -* Modification of the configuration wizard view -* Adding new steps to the wizard -* Providing additional setting for project creation -* Handling activities during project creation -* Initial environment configuration +- Modification of the configuration wizard view +- Adding new steps to the wizard +- Providing additional settings for project creation +- Handling activities during project creation +- Initial environment configuration ### Module Type -To create a new module type add an extension +To create a new module type, add an extension: ```xml @@ -52,32 +56,24 @@ To set up a new module environment [`ModuleBuilder`](%gh-ic%/platform/lang-core/ ``` Functionality which is mandatory to implement consists of: - -* Setting up a root model for the new module by overriding - ```java - public abstract void setupRootModel( - ModifiableRootModel modifiableRootModel) throws ConfigurationException; - ``` -* Getting a module type - ```java - public abstract ModuleType getModuleType(); - ``` +- `void setupRootModel(ModifiableRootModel)` - sets up a root model for the new module +- `ModuleType getModuleType()` - returns a module type See [`JavaModuleBuilder`](%gh-ic%/java/openapi/src/com/intellij/ide/util/projectWizard/JavaModuleBuilder.java) to understand better how to implement a module builder. If your module type is based on the Java module and meant to support Java as well, extending [`JavaModuleBuilder`](%gh-ic%/java/openapi/src/com/intellij/ide/util/projectWizard/JavaModuleBuilder.java) is enough. No extension point needs to be registered. -Refer to [SmallTalk module type](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsModuleType.java) to see how [`JavaModuleBuilder`](%gh-ic%/java/openapi/src/com/intellij/ide/util/projectWizard/JavaModuleBuilder.java) can be derived. +Refer to the [SmallTalk module type](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsModuleType.java) to see how [`JavaModuleBuilder`](%gh-ic%/java/openapi/src/com/intellij/ide/util/projectWizard/JavaModuleBuilder.java) can be derived. -> Starting with the 2022.1 release, IntelliJ-based IDEs use the refreshed project wizard and some module builder base classes return `false` from `isAvailable()` when the new wizard is enabled. +> Starting with the 2022.1 release, IntelliJ-based IDEs use the refreshed project wizard, and some module builder base classes return `false` from `isAvailable()` when the new wizard is enabled. > If your module builder is not visible in 2022.1, make sure that your `ModuleBuilder.isAvailable()` returns `true`. > {style="note"} ### Implementing Module Builder Listener -Module builder listener reacts on a new module creation, which could be done either as a part of the project creation process, or as adding a new module to the already existing project. -To provide a certain behavior right after a module has been created, module builder should implement [`ModuleBuilderListener.moduleCreated(Module)`](%gh-ic%/platform/lang-core/src/com/intellij/ide/util/projectWizard/ModuleBuilderListener.java). +Module builder listener reacts on a new module creation, which could be done either as a part of the project creation process or as adding a new module to the already existing project. +To provide a certain behavior right after a module has been created, a module builder must implement [`ModuleBuilderListener.moduleCreated(Module)`](%gh-ic%/platform/lang-core/src/com/intellij/ide/util/projectWizard/ModuleBuilderListener.java). Examples of the tasks executed right after a module has been created may include configuring module roots, looking up for an SDK and setting it up, adding a specific facet if required, etc. For more details, please see the following [SmallTalk custom module type](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsModuleType.java) implementation. @@ -89,36 +85,31 @@ See an example [module builder](https://github.com/bulenkov/RedlineSmalltalk/blo If this method returns a non-empty array of [`ModuleWizardStep`](%gh-ic%/platform/lang-core/src/com/intellij/ide/util/projectWizard/ModuleWizardStep.java) objects, new steps will be shown in their indexing order while creating a new module. The following [implementation](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsModuleWizardStep.java) for the SmallTalk project type illustrates how a custom wizard step can be created. The [`RsModuleWizardStep`](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsModuleWizardStep.java) class is derived from `ModuleWizardStep`, which has two methods to be overridden: - -* ```java - public JComponent getComponent(); - ``` - defines how the step will look like -* ```java - public void updateDataModel(); - ``` - commits data from UI into `ModuleBuilder` and `WizardContext` +- `JComponent getComponent()` - defines the step's UI +- `void updateDataModel()` - commits data from UI into `ModuleBuilder` and `WizardContext` ## Facet -Facets in IntelliJ are the way to store multiple kinds of module-specific settings, for instance to make a language support or framework available in some given module. -To understand facets better from the end-user's point of view, see the [Facet](facet.md) documentation section. +Facets in IntelliJ are the way to store multiple kinds of module-specific settings, for example, to make a language support or framework available in some given module. +To understand facets better from the end-user's point of view, see the [](facet.md) documentation section. ## Implementing Project Structure Detector To support the creation of your module when a project is imported from existing sources, extend [`ProjectStructureDetector`](%gh-ic%/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/ProjectStructureDetector.java). To detect the files your module supports, implement `ProjectStructureDetector.detectRoots()`. -Refer to the [Smalltalk project structure detector](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsProjectStructureDetector.java) to see example implementation. +Refer to the [Smalltalk project structure detector](https://github.com/bulenkov/RedlineSmalltalk/blob/master/src/st/redline/smalltalk/module/RsProjectStructureDetector.java) to see an example implementation. But detecting the files is not enough, you also need to create a module for the project if appropriate by implementing `setupProjectStructure()`. Here is an example that creates a module if no other modules exist in the project structure. ```java @Override -public void setupProjectStructure(@NotNull Collection roots, - @NotNull ProjectDescriptor projectDescriptor, - @NotNull ProjectFromSourcesBuilder builder) { +public void setupProjectStructure( + @NotNull Collection roots, + @NotNull ProjectDescriptor projectDescriptor, + @NotNull ProjectFromSourcesBuilder builder) { + List modules = projectDescriptor.getModules(); if (modules.isEmpty()) { modules = new ArrayList<>();