MPS 2021.2 Help

Extending the Transformation Menu Language

Overview

The menu language may be extended by adding a new location with location-specific features, or by adding a new menu part type.

Adding Locations and Features

To add a location, define a concept extending TransformationLocation. Required and optional features are specified using behavior methods:

  • Override getAvailableFeatures() to return all feature concepts available for the location (both optional and required).

  • Override getRequiredFeatures() to return all feature concepts required for the location.

To add a feature, define a concept extending TransformationFeature.

Menu parts that implement IExtensibleMenuPart will have to specify features that are required by the location(s) they are in. Such parts are (generally) generated into a class implementing interface ActionItem and additional interfaces as generated by switch_TransformationLocation_actionItemInterfaces. The features are generated into class members of the generated menu part class.

You should also extend switch_TransformationLocation_asStringArray to specify the identifier(s) that you will use to query items for the location at run time.

Adding Menu Part Types

Extend the TransformationMenuPart concept and define the structure, editor, etc. of the custom menu part. A menu part may implement two additional interfaces: IParameterizableMenuPart, for parts that support being used inside TransformationMenuPart_Parameterized, and IExtensibleMenuPart, for parts that have location-specific features or additional parameters for the standard features. For example, TransformationMenuPart_Action is both an IParameterizableMenuPart and an IExtensibleMenuPart, while TransformationMenuPart_Intention is only extensible (to provide the wrapped intention as a parameter to its queries) but not parameterizable (since a parameterized intention can be used instead).

Each menu part specified in a section should ultimately be generated into a list of zero or more expressions of type interface MenuPart (placeholder parts are generated into zero menu parts).

To generate code for your menu part you need to extend one or two template switches: switch_TransformationMenuPart_declare and possibly switch_TransformationMenuPart_create.

By default, switch_TransformationMenuPart_declare will declare a (static) inner class and attach the generatedClass mapping label to it. Next, switch_TransformationMenuPart_create generates into a new expression creating an instance of the class specified by generatedClass mapping label.

If the default behavior fits your use case, it is enough to extend only switch_TransformationMenuPart_declare to generate a class implementing MenuPart, attaching the generatedClass mapping label to it. In case of more complex scenarios you may gain more flexibility by extending both switches.

Last modified: 23 March 2021