Multiple menus within the DevOps Modeling Platform can be customized using plug-ins. Pluglets cannot be used to extend menus. In this section we will cover the most common menus to extend.
Like any Eclipse-based application, menus can be easily contributed by extending the
org.eclipse.ui.actionSets
extension-point. The following example shows an extension that will add an action to a newly created menu.
actionSet
to group menu actions.label
and description
describing the action set.menu
to define a new menu.label
.action
to define the menu action.label
of the menu action.IWorkbenchWindowActionDelegate
.menubarPath
to be a slash-delimited path ('/') used to specify the location of this action in the menu bar.<extension point="org.eclipse.ui.actionSets"> <actionSet label="My Action Set" description="My action set description." visible="true" id="com.ibm.examples.actionSet"> <menu label="My Menu" id="com.ibm.examples.menu"> </menu> <action label="My Action" icon="icons/myIcon.gif" id="com.ibm.examples.actions.myAction" class="com.ibm.examples.actions.MenuActionDelegate" menubarPath="com.ibm.examples.menu/additions"> </action> </actionSet> </extension>
visible
is an optional attribute indicating whether the action set is initially visible when a perspective is open.
If the value is unspecified or false, in order to toggle the action set visibility go to Windows > Customize Perspective...
and navigate to the Commands tab. Find the action set to toggle in the Available command groups selection box.
The MenuActionDelegate
class extends
org.eclipse.gmf.runtime.common.ui.action.AbstractActionDelegate
and implements
IWorkbenchWindowActionDelegate
. In this example, the action simply opens a message dialog.
The AbstractActionDelegate
provides definitions for the methods that are found in most action delegate
interfaces in Eclipse. Therefore adding a new action delegate is simply a matter of subclassing
this class and declaring that the new class implements the desired action delegate interface.
public class MenuActionDelegate extends AbstractActionDelegate implements IWorkbenchWindowActionDelegate { protected void doRun(IProgressMonitor progressMonitor) { Shell shell = new Shell(); MessageDialog.openInformation( shell, "My Title", "Menu Action Example"); } }
Pop-up menus are contributed through the
org.eclipse.ui.popupMenus
extension-point.
This extension-point is used to add new actions to context menus owned by other plug-ins. Action contributions may be made against a specific object type (objectContribution) or against a specific context menu of a view or editor part (viewerContribution). When using objectContribution, the contribution will appear in all view or editor part context menus where objects of the specified type are selected. In contrast, using viewerContribution, the contribution will only appear in the specified view or editor part context menu, regardless of the selection.
To contribute actions to the pop-up menus for selectable elements within the Project Explorer, add a
viewerContribution
to a
org.eclipse.ui.popupMenus
extension with targetID
set to
org.eclipse.ui.navigator.ProjectExplorer#PopupMenu
.
action
.class
to be a class which implements
org.eclipse.ui.IViewActionDelegate
.label
for the action.menubarPath
to be a valid identifier of an existing menu in the hierarchy.
The default path is "additions".objectState
s.<extension point="org.eclipse.ui.popupMenus"> <viewerContribution targetID="org.eclipse.ui.navigator.ProjectExplorer#PopupMenu" id="com.ibm.examples.viewerContribution.projectExplorer"> <action class="com.ibm.examples.ProjectExplorerActionDelegate" label="Project Explorer Example Action" menubarPath="additions" id="com.ibm.examples.projectExplorerAction"> <enablement> <and> <objectState name="hasStereotype" value="MyProfile::MyStereotype"/> </and> </enablement> </action> </viewerContribution> </extension>
The ProjectExplorerActionDelegate
class extends
org.eclipse.gmf.runtime.common.ui.action.AbstractActionDelegate
and implements
IViewActionDelegate
. In this example, the action simply opens a message dialog.
public class ProjectExplorerActionDelegate extends AbstractActionDelegate implements IViewActionDelegate { protected void doRun(IProgressMonitor progressMonitor) { Shell shell = new Shell(); MessageDialog.openInformation( shell, "My Title", "Project Explorer Example Action"); } }
To contribute actions to the pop-up menus for selectable elements within a diagram editor, add a
viewerContribution
to a
org.eclipse.ui.popupMenus
extension with targetID
set to
org.eclipse.gmf.runtime.diagram.ui.DiagramEditorContextMenu
.
Defining the action
is similar to that of the
Project Explorer, except that the
class
should implement
org.eclipse.ui.IEditorActionDelegate
. Also, in this example the enablement criteria differs
so that the action will be enabled only if the selected element is the diagram.
<extension point="org.eclipse.ui.popupMenus"> <viewerContribution targetID="org.eclipse.gmf.runtime.diagram.ui.DiagramEditorContextMenu" id="com.ibm.examples.viewerContribution.diagram"> <action class="com.ibm.examples.DiagramEditorActionDelegate" label="Diagram Editor Example Action" menubarPath="additions" id="com.ibm.examples.menus.diagramAction"> <enablement> <and> <objectState name="notationType" value="Diagram"/> </and> </enablement> </action> </viewerContribution> </extension>
The DiagramEditorActionDelegate
class extends
org.eclipse.gmf.runtime.common.ui.action.AbstractActionDelegate
and
implements
IEditorActionDelegate
. In this example, the action simply opens a message dialog.
public class DiagramEditorActionDelegate extends AbstractActionDelegate implements IEditorActionDelegate { protected void doRun(IProgressMonitor progressMonitor) { Shell shell = new Shell(); MessageDialog.openInformation( shell, "My Title", "Diagram Editor Action Example"); } }
To contribute actions to the pop-up menus for selectable objects regardless of in what
editor or viewer the selection is made, add an
objectContribution
to a
org.eclipse.ui.popupMenus
extension with objectClass
set to
the name of a class or interface that all objects in the selection must subclass or implement.
In this example,
IAdaptableSelection
is used for the objectClass
.
GraphicalEditPart
s and UML Project Explorer tree elements implement this interface.
Defining the action
is similar to that of the
Project Explorer, except that the
class
should implement
org.eclipse.ui.IObjectActionDelegate
.
<extension point="org.eclipse.ui.popupMenus"> <objectContribution objectClass="org.eclipse.gmf.runtime.common.core.util.IAdaptableSelection" id="com.ibm.examples.objectContribution"> <action class="com.ibm.examples.ObjectActionDelegate" label="Object Example Action" menubarPath="additions" id="com.ibm.examples.objectAction" enablesFor="1"/> </objectContribution> </extension>
The ObjectActionDelegate
class extends
org.eclipse.gmf.runtime.common.ui.action.AbstractActionDelegate
and implements
IObjectActionDelegate
. In this example, the action simply opens a message dialog.
public class ObjectActionDelegate extends AbstractActionDelegate implements IObjectActionDelegate { protected void doRun(IProgressMonitor progressMonitor) { Shell shell = new Shell(); MessageDialog.openInformation( shell, "My Title", "Object Action Example""); } }
In many cases the menu actions described above may wish to modify the model. Model modifications should be
done within an
AbstractTransactionalCommand
executed on the correct operation history to automatically
support undo and redo of the command. The
AbstractTransactionalCommand
requires only implementing the
doExecuteWithResult
method.
In this example, the action delegate will extend the
org.eclipse.gmf.runtime.emf.ui.action.AbstractModelActionDelegate
class. It is an abstract parent
for all concrete action delegates that execute model commands. The only methods that are required
to be implemented are
getEditingDomain
() and
doRun(IProgressMonitor progressMonitor)
. Use the
execute
method to execute the transactional command.
public class MyToggleAbstractActionDelegate extends AbstractModelActionDelegate implements IViewActionDelegate { protected TransactionalEditingDomain getEditingDomain() { return UMLModeler.getEditingDomain(); } protected void doRun(IProgressMonitor progressMonitor) { ICommand command = getCommand(); EObject selection = (EObject) ((IAdaptable) getStructuredSelection() .getFirstElement()).getAdapter(EObject.class); if (selection instanceof Class) { final Class clazz = (Class)selection; execute(new AbstractTransactionalCommand(getEditingDomain(), "Toggle Is Abstract", null) { protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) { clazz.setIsAbstract(!clazz.isAbstract()); return CommandResult.newOKCommandResult(); } }, progressMonitor, null); } } }