Add Menu - eclipse-capella/capella GitHub Wiki
Add some dependencies to your plugins, as Create Basic Addon
org.eclipse.ui.commands
<extension point="org.eclipse.ui.commands">
<command
id="org.polarsys.capella.xxxx.command1"
defaultHandler="org.polarsys.capella.xxxx.handlers.Command1Handler"
name="Command 1">
</command>
</extension>
org.eclipse.ui.menus
<extension point="org.eclipse.ui.menu">
<!-- Create an empty -->
<menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions">
<menu id="org.polarsys.capella.xxxx"
label="XXXXXX">
<separator visible="true" name="mainCommands"/>
</menu>
</menuContribution>
<!-- Add a command to this menu -->
<menuContribution locationURI="popup:org.polarsys.capella.xxxx?after=mainCommands">
<command
commandId="org.polarsys.capella.xxxx.command1"
id="org.polarsys.capella.xxxx.command1"
style="push">
</command>
</menuContribution>
</extension>
Create a class for your command in the src folder (with java packages) similar to:
import java.util.Collection;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import org.polarsys.capella.common.ef.command.ICommand;
import org.polarsys.capella.common.helpers.TransactionHelper;
import org.polarsys.capella.core.model.handler.helpers.CapellaAdapterHelper;
import org.polarsys.capella.common.ef.command.AbstractReadWriteCommand;
import org.polarsys.capella.core.data.ctx.SystemFunction;
public class Command1Handler extends AbstractHandler {
//Execute command from createCommand on the selected model elements
public Object execute(final ExecutionEvent event) throws ExecutionException {
IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelection(event);
Collection<EObject> semanticElements = CapellaAdapterHelper.resolveSemanticObjects(selection.toList());
ICommand cmd = createCommand(semanticElements);
TransactionHelper.getExecutionManager(semanticElements).execute(cmd);
return null;
}
protected ICommand createCommand(Collection<EObject> selection) {
//Rename the selected System Function
return new AbstractReadWriteCommand() {
@Override
public void run() {
System.out.println(selection.toString());
for (EObject object : selection) {
if (object instanceof SystemFunction) {
((SystemFunction) object).setName("new name");
}
}
}
};
}
}
Don't forget, this class shall be referenced into the defaultHandler
section of the command in the plugin.xml file (there shall have no warning)
Now that the menu appears, you can choose to put it somewhere more convenient.
In the locationURI of your menu, locationURI="popup:org.eclipse.ui.popup.any?after=additions"
, instead of additions
, you can choose group.showIn
allowing you to add a menu aside Show in Project Explorer
If you want to restrict the menu to a dedicated view, instead of org.eclipse.ui.popup.any
, you can choose capella.project.explorer#PopupMenu
List of insertion points in Project Explorer
List of insertion points and id of existing views
The most important insertion points group.showIn
and group.sendTo
are available on most of views (see above).
If you create a new View, you will also be able to display all menus registered under these insertion points by registering them like other views did (Semantic Browser).
In your menu, where you choose to add a command, you can add conditions on command visibility.
<command commandId="org.polarsys.capella.xxxx.command1" id="org.polarsys.capella.xxxx.command1" style="push">
<visibleWhen checkEnabled="false">
<with variable="activeMenuSelection">
<iterate ifEmpty="false">
<or>
<!-- Enable on Diagram elements -->
<instanceof value="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
</instanceof>
<!-- Enable on Model elements -->
<instanceof value="org.eclipse.emf.ecore.EObject">
</instanceof>
<!-- Enable on Aird file -->
<adapt type="org.eclipse.core.resources.IResource">
<test property="org.eclipse.core.resources.extension" value="aird" />
</adapt>
</or>
</iterate>
</with>
</visibleWhen>
</command>
You can add an icon on your command
org.eclipse.ui.commandImages
<extension point="org.eclipse.ui.commandImages">
<image commandId="org.polarsys.capella.xxxx.command1"
icon="icons/full/etool16/add_element.gif">
</image>
</extension>
You can add an category on your command, regrouping all your commands
org.eclipse.ui.commands
<extension point="org.eclipse.ui.commands">
<category
id="org.polarsys.capella.xxxx.category1"
name="Extension commands">
</category>
<command
id="org.polarsys.capella.xxxx.command1"
categoryId="org.polarsys.capella.xxxx.category1"
<!-- ... -->
>
</command>
</extension>