5.9 KiB
Legacy Project Wizard API
Implementing a custom project creation wizard.
Plugins targeting versions 2024.2 and newer should implement the .
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.
A new module type should be derived from the class ModuleType
.
Custom Project Wizard
The main utilities to configure a custom project wizard can be found in the package lang-api.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 settings for project creation
- Handling activities during project creation
- Initial environment configuration
Module Type
To create a new module type, implement ModuleType
parameterized by ModuleBuilder
and register it in the in plugin.xml file.
Implementing Module Builder
To set up a new module environment, ModuleBuilder
should be extended and registered in the .
Functionality which is mandatory to implement consists of:
void setupRootModel(ModifiableRootModel)
- sets up a root model for the new moduleModuleType getModuleType()
- returns a module type
See JavaModuleBuilder
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
is enough. No extension point needs to be registered. Refer to theGroovyAwareModuleBuilder
to see howJavaModuleBuilder
can be extended.
Starting with the 2022.1 release, IntelliJ-based IDEs use the refreshed project wizard, and some module builder base classes return
false
fromisAvailable()
when the new wizard is enabled. If your module builder is not visible in 2022.1, make sure that yourModuleBuilder.isAvailable()
returnstrue
.
{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, a module builder must implement ModuleBuilderListener.moduleCreated(Module)
.
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.
Adding New Wizard Steps
Adding new steps to the module wizard can be done by overriding AbstractModuleBuilder.createWizardSteps(WizardContext, ModulesProvider)
.
If this method returns a non-empty array of ModuleWizardStep
objects, new steps will be shown in their indexing order while creating a new module.
ModuleWizardStep
has two methods to be overridden:
JComponent getComponent()
- defines the step's UIvoid updateDataModel()
- commits data from UI intoModuleBuilder
andWizardContext
Facet
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 documentation section.
Implementing Project Structure Detector
To support the creation of your module when a project is imported from existing sources, extend ProjectStructureDetector
.
To detect the files your module supports, implement ProjectStructureDetector.detectRoots()
.
Detecting files is not enough - it is also required 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.
@Override
public void setupProjectStructure(
@NotNull Collection<DetectedProjectRoot> roots,
@NotNull ProjectDescriptor projectDescriptor,
@NotNull ProjectFromSourcesBuilder builder) {
List<ModuleDescriptor> modules = projectDescriptor.getModules();
if (modules.isEmpty()) {
modules = new ArrayList<>();
for (DetectedProjectRoot root : roots) {
modules.add(new ModuleDescriptor(root.getDirectory(),
MyModuleType.getInstance(), ContainerUtil.emptyList()));
}
projectDescriptor.setModules(modules);
}
}