The new model wizard is an extensible wizard framework used to provide a centralized means of creating models. There are two workflows within the wizard. The first page of the new model wizard provides the user with the choice to either create a new model from a standard template or from an existing model.
If the user selects to create a new model from a standard template the following page is shown. This page displays a list of templates alongside their corresponding categories. Templates and categories are contributed by the developer to provide the user with a model to start modeling with their application. The user must select a template, input the necessary data, and continue on to finish the wizard which will result in the creation of a new model based on the selected template.
If the user selects to create a model from an existing model the following page is shown. This page lets the user browse the workspace to find a model to find an existing model. Upon completion of the wizard, a new model based on the existing model will be created.
The new model project wizard wraps the new model wizard to provide a means to additionally create a project to contain the model. All contributions to the new model wizard will also be contributed to the new model project wizard.
Templates can either be contributed statically through template directories or dynamically by template factories. Contributing static templates is the easier of the two methods as custom handlers are required when working with dynamic templates.
A static templates resides in the file system as a model file and is defined by a template definition file.
Static templates are contributed by specifying the directory containing the template file.
To contribute a template directory extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and set the templateDirectory path
to be the path to the directory located within the same plugin which contains the template files.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <templateDirectory path="templates/"/> </extension>
When contributing template directories, the directory should contain the template definition file whose file extension is .templatedef.ve, the model template and the template icon:
Example directory containing template files:
The template definition file can either be a properties file or XML. The XML format supports the definition of multiple templates, while there can only be one properties file for each template.
There are 6 required properties when defining a template:
name
: This is the name of the template to be displayed in the new model wizard.description
: This is the description of the template to be displayed in the new model wizard.modelName
: This is the default name of the model to be created from this template and is displayed in the new model wizard.id
: A unique identifier used to reference the template.templateFile
: The template file name, including the file extension, located within the same directory as the template definition file.icon
: The icon file name, including the file extension, located within the same directory as the template definition file.
The icon is displayed along side the name
within the new model wizard.Example properties template definition file:
name=Main Template description=Create main model. modelName=mainModel id=com.ibm.examples.templates.mainTemplate templateFile=mainTemplate.foo icon=mainTemplate.gif
Example XML template definition file with multiple template definitions:
<templates> <template name="Support Template1" description="Create support model." modelName="supportModel" id="com.ibm.examples.templates.supportTemplate.template1" templateFile="supportTemplate1.foo" icon="supportTemplate1.gif"> </template> <template name="Support Template2" description="Create support model." modelName="supportModel" id="com.ibm.examples.templates.supportTemplate.template2" templateFile="supportTemplate2.foo" icon="supportTemplate2.gif"> </template> </templates>
The template model handler is used to create the final model from the template upon finishing
the wizard. By default, any template file contributed through a template directory will utilize the
com.ibm.xtools.common.ui.wizards.handlers.FileTemplateModelHandler
. This handler creates a working copy of the template model
in the workspace and opens the new model using its default editor.
If the default template model handler is not sufficient
then a custom template model handler is required. To contribute a custom template model handler for all
templates provided within a template directory, when defining the templateDirectory
, additionally
set the handler
to be a class which extends
com.ibm.xtools.common.ui.wizards.handlers.ITemplateModelHandler
.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <templateDirectory path="templates/" handler="com.ibm.examples.MyTemplateModelHandler"/> </extension>
For the template model handler choose to either extend
com.ibm.xtools.common.ui.wizards.handlers.FileTemplateModelHandler
or
com.ibm.xtools.common.ui.wizards.handlers.AbstractTemplateModelHandler
or implement
com.ibm.xtools.common.ui.wizards.handlers.ITemplateModelHandler
and write a handler
from scratch.
Implementing
ITemplateModelHandler
requires providing implementation
for two methods:
createTemplateConfiguration(ITemplate template)
and
createFiles(IProgressMonitor progressMonitor, TemplateConfiguration config)
The
createTemplateConfiguration(ITemplate template)
method should return a
TemplateConfiguration
for the given template.
The template configuration is populated by the wizard with information such as the location to create
the new model, the new model file name, etc...
The wizard calls the
createFiles(IProgressMonitor progressMonitor, TemplateConfiguration config)
method when the wizard finishes. This method performs the actions necessary to create a new model using
the data from the template configuration. If the operation is successful, this method should return
true
. If the operation cannot successfully complete, returning
false
will abort the wizard finish operation.
A template factory is used to programmatically contribute templates that may not relate to a physical
file in the system. To contribute a template factory extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and set the templateFactory class
to be a class which extends
com.ibm.xtools.common.ui.wizards.templates.ITemplateFactory
.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <templateFactory class="com.ibm.examples.MyTemplateFactory"/> </extension>
Only a single method is required when implementing
ITemplateFactory
.
getTemplates()
which returns an array of
ITemplate
s.
The factory must populate the following template data for a template to be valid:
id
: A unique identifier used to reference the template.name
: This is the name of the template to be displayed in the new model wizard.description
: This is the description of the template to be displayed in the new model wizard.model name
: This is the default name of the model to be created from this template and is displayed in the new model wizard.model file extension
: The file extension of the model file to be create from this template.icon URL
: The URL for the icon that is to be displayed along side the name
within the new model wizard.template model handler
: Unlike contributing template directories, the templates contributed through a template factory
must have a custom template model handler.public class MyTemplateFactory implements ITemplateFactory { public ITemplate[] getTemplates() { BasicTemplate template = new BasicTemplate(); // populate template information template.setId("com.ibm.examples.templates.supportTemplate.dynamicTemplate"); template.setName("Dynamic Support Template"); template.setDescription("Create support model."); template.setModelName("supportModel"); template.setModelFileExtension("foo"); try { newTemplate.setIconURL(new URL("file", null, "/icons/supportTemplate.gif")); } catch (MalformedURLException mue) { // log error } // set the template model handler newTemplate.setTemplateModelHandler(new MyTemplateModelHandler()); return new ITemplate[] { template }; } }
Categories are used to categorize templates in the new model wizard. To contribute
a category extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and create a
category
element with a unique id
and a label
to be displayed in the wizard.
Optionally a category may specify the ID of its parent
category.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <category id="com.ibm.examples.category1" label="My Category"/> <category id="com.ibm.examples.category1_1" label="My Sub Category" parent="com.ibm.examples.category1"/> </extension>
The next step is to bind a template to the new category. Binding templates (whether they are contributed through a template directory or by a template factory) to categories is necessary, otherwise neither will show up in the new model wizard.
To bind templates to a category extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and create a
templateCategoryBinding
element. Set the categoryRef
to be the ID of the
category for which the templates will be bound to. The templates are specified by adding
template
elements.
Templates can be referenced in two different ways. To reference a single
template by ID, set match
to "equals
" and set ref
to be the ID of the template. To reference multiple templates using a pattern match against the template ID,
set match
to "pattern
" and set ref
to be a regular expression pattern.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <templateCategoryBinding categoryRef="com.ibm.examples.category1"> <template ref="com.ibm.examples.template.mainTemplate" match="equals"/> </templateCategoryBinding> <templateCategoryBinding categoryRef="com.ibm.examples.category1_1"> <template ref="com\.ibm\.xtools\.example\.templates.supportTemplate\..*" match="pattern"/> </templateCategoryBinding> </extension>
To allow the user to configure template parameters, additional wizard pages may be contributed to
the new model wizard for a specific template. This can be done using template configuration page groups.
A group consists of one or more wizard pages which implement
com.ibm.xtools.common.ui.wizards.pagegroups.ITemplateConfigurationPage
.
The group has the ability to create a workflow between
each page it contributes. When the wizard finishes, the group is given the opportunity to modify the
newly created model.
To contribute template configuration page groups extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and create a
templateConfigurationPageGroup
element. Set class
to be a class which extends
com.ibm.xtools.common.ui.wizards.pagegroups.ITemplateConfigurationPageGroup
and
provide a unique id
. The template configuration page group must be bound to templates
by adding template
references
similar to when creating category template bindings.
Additionally, template configuration page groups may be ordered by specifying the afterRef
attribute which ensures that this group will be displayed after the referenced group. Similar to template referencing,
there are two ways to reference the group. To reference a single
group by ID, set match
to "equals
" and set afterRef
to be the ID of the group which this group will come after. To reference multiple groups using a pattern match against the group ID,
set match
to "pattern
" and set afterRef
to be a regular expression pattern. Note that specifying afterRef
does not ensure this group will be
displayed immediately after the specified group; there may be additional groups displayed in between depending on other contributions.
Clients that wish to contribute a linear list of configuration pages may utilize the
LinearTemplateConfigurationPageGroup
which is an abstract implementation of
ITemplateConfigurationPageGroup
. This group will navigate one or more pages in linear order.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <templateConfigurationPageGroup class="com.ibm.examples.MyMainTemplateConfigurationPageGroup" id="com.ibm.examples.MyMainTemplateConfigurationPageGroup"> <template ref="com.ibm.examples.templates.mainTemplate" match="equals"/> </templateConfigurationPageGroup> <templateConfigurationPageGroup afterMatch="pattern" afterRef="com.ibm.examples.MyMainTemplateConfigurationPageGroup" class="com.ibm.examples.MyTemplateConfigurationPageGroup" id="com.ibm.examples.MyTemplateConfigurationPageGroup"> <template ref="com\.ibm\.example\.templates\..*" match="pattern"/> </templateConfigurationPageGroup> </extension>
If a template is contributed by use of a
templateDirectory
and no custom
template model handler is specified,
to propagate the user input data from the wizard pages contributed by the group, create an instance of
com.ibm.xtools.common.ui.wizards.handlers.IContentCreator
and add it to the
TemplateConfiguration
set by the wizard on the group.
The content creator has a single method to implement which can be used to customized the newly created model(s).
Otherwise, if a template is contributed along with a custom template model handler,
either the handler must be made to support content creators, or the handler must provide a custom
TemplateConfiguration
which can be populated with the user input data. For extensibility
purposes, all handlers should be made to support content creators.
To have the new model, created from a template, participate in UI Reduction, activity template bindings are used. These bindings allow the template owner to dictate which UI components should be visible when working with the template model. For more information on UI reduction click here.
To create an activity template binding extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and create an
activityTemplateBinding
element. The activityTemplateBinding
must contain
one template
reference and one more more activity
references.
Activities can be referenced in two different ways. To reference a single
activity by ID, set match
to "equals
" and set ref
to be the ID of the activity. To reference multiple activities using a pattern match against the activity ID,
set match
to "pattern
" and set ref
to be a regular expression pattern.
The activities must be bound to templates
by adding a template
reference
similar to when creating category template bindings.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <activityTemplateBinding required="true"> <activity ref="com.ibm.examples.mainUIReductionActivity" match="equals"/> <template ref="com.ibm.example.templates.mainTemplate" match="equals"/> </activityTemplateBinding> <activityTemplateBinding required="false"> <activity ref="com.ibm.examples.supportUIReductionActivity" match="equals"/> <template ref="com\.ibm\.example\.templates\.supportTemplates\..*" match="pattern"/> </activityTemplateBinding> </extension>
The activities configuration page works in conjunction with activity template bindings and allows the user to customize these activities prior to writing them to the newly created model.
The activities configuration page can be contributed by
contributing a template configuration page group, and setting the
class
attribute to be
com.ibm.xtools.common.ui.wizards.pagegroups.ActivitiesTemplateConfigurationPageGroup
. The id
attribute must be set to a unique identifier.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <templateConfigurationPageGroup afterMatch="pattern" afterRef=".*" class="com.ibm.xtools.common.ui.wizards.pagegroups.ActivitiesTemplateConfigurationPageGroup" id="com.ibm.xtools.examples"> <template ref=".*" match="pattern"/> </templateConfigurationPageGroup> </extension>
The existing model handler is used to create the final model from an existing model upon finishing the wizard. Its function is similar to the template model handler in that it creates a model from a configuration.
To contribute an existing model handler extend the
com.ibm.xtools.common.ui.wizards.newModelWizard
extension-point and create a
templateConfigurationPageGroup
element. Set class
to be a class which extends
com.ibm.xtools.common.ui.wizards.handlers.IExistingModelHandler
and set
extensions
to be a comma separated list of supported model file extensions.
<extension point="com.ibm.xtools.common.ui.wizards.newModelWizard"> <existingModelHandler class="com.ibm.examples.MyExistingModelHandler" extensions="foo, bar"/> </extension>
For the existing model handler choose to either extend
com.ibm.xtools.common.ui.wizards.handlers.AbstractExistingModelHandler
or implement
com.ibm.xtools.common.ui.wizards.handlers.IExistingModelHandler
and write a handler
from scratch.
Implementing
IExistingModelHandler
requires providing implementation
for two methods:
createExistingModelConfiguration(IFile sourceModel)
and
createFiles(IProgressMonitor progressMonitor, ExistingModelConfiguration config)
The
createExistingModelConfiguration(IFile sourceModel)
method should return an
ExistingModelConfiguration
for the given source model.
The existing model configuration is populated by the wizard with information such as the location to create
the new model, the new model file name, etc...
The wizard calls the
createFiles(IProgressMonitor progressMonitor, ExistingModelConfiguration config)
method when the wizard finishes. This method performs the actions necessary to create a new model using
the data from the existing model configuration. If the operation is successful, this method should return
true
. If the operation cannot successfully complete, returning
false
will abort the wizard finish operation.