title |
---|
Project Wizard. Adding Support for Creating New Project Types. |
Working with the project wizard can be illustrated with the RedLine SmallTalk plugin
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
.
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 setting for project creation
- Handling activities during project creation
- Initial environment configuration
To create a new module type and an extension
<moduleType id="MY_MODULE" implementationClass="st.redline.smalltalk.module.MyModuleType"/>
to the
plugin.xml
.
A custom module type should extend the
ModuleType
generic from
ModuleBuilder
.
The following
module type implementation
of a custom module type show how this instance can be registered and implemented.
To set up a new module environment
ModuleBuilder
class should be extended and registered as an extension point like the following snippet shows:
<extensions defaultExtensionNs="com.intellij">
<moduleBuilder builderClass="org.jetbrains.plugins.ruby.rails.facet.versions.MyModuleBuilder"/>
</extensions>
Functionality which is mandatory to implement consists of:
-
Setting up a root model for the new module by overriding
public abstract void setupRootModel(ModifiableRootModel modifiableRootModel) throws ConfigurationException;
-
Getting a module type
public abstract ModuleType getModuleType();
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
SmallTalk module type
to see how
JavaModuleBuilder
can be derived.
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
Method
public void moduleCreated(@NotNull final Module module);
executed tasks right after a module has been created, these may include configuring roots looking up for an SDK and setting it up, adding a specific facet if required and others. For more details please see the following SmallTalk custom module type implementation.
Adding new steps to the module wizard can be done by overriding the
public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider);
method in a custom
module builder.
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.
The following
implementation
for the SmallTalk project type illustrates how a custom wizard step can be created.
The
RsModuleWizardStep
class is derived from
ModuleWizardStep
,
which has two methods to be overridden:
-
defines how the step will look like
public JComponent getComponent();
-
commits data from UI into ModuleBuilder and WizardContext
public void updateDataModel();
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 point of view of an end-user, please see Facet documentation section.
To support the creation of your module when a project is imported from existing sources, extend ProjectStructureDetector
.
To detect your files your module supports implement
public abstract DirectoryProcessingResult detectRoots(@NotNull File dir, @NotNull File[] children, @NotNull File base,
@NotNull List<DetectedProjectRoot> result);
Refer to the Smalltalk project structure detector
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.
@Override
public void setupProjectStructure(@NotNull final Collection<DetectedProjectRoot> roots,
@NotNull final ProjectDescriptor projectDescriptor,
@NotNull final 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);
}
}