Commands II
Commands in selbstdefinierte Menüs einfügen
Auch selbstdefinierten Menüs können nachträglich mit einer menuContribution Commands oder Untermenüs hinzugefügt werden. Dazu wird die locationURI menu:[menuid] verwendet. Möchten wir im zuvor erzeugten Menü com.example.somemenu noch einen weiteren Eintrag ergänzen, könnten wir dies auch über eine separate Contribution erreichen. Diesen Weg beschreitet man vor allem, wenn man ein bestehendes Menü aus einem anderen Plug-in um weitere Menüeinträge ergänzen möchte:
<extension point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:com.example.somemenu?before=somemenuitem">
<command
commandId="org.eclipse.ui.file.refresh"
style="push">
</command>
</menuContribution>
</extension>
Commands in die Toolbar einfügen
Die Verwendung von Commands in der Toolbar erfolgt analog zu Menüs über den Extension Point org.eclipse.ui.menus. Als locationURI gibt man jedoch toolbar:org.eclipse.ui.main.toolbar an, statt menu wird ein toolbar-Element verwendet:
<extension point="org.eclipse.ui.menus">
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar id="com.example.sometoolbar">
<command
commandId="com.example.somecommand"
icon="icons/alt_window_16.gif"
style="push">
</command>
</toolbar>
</menuContribution>
</extension>
Commands zu Views hinzufügen
Über die locationURI toolbar:<viewId> können Sie einen Command zu einem View contributen:
<menuContribution locationURI="toolbar:com.example.someview">
<command
commandId="com.example.somecommand"
icon="icons/alt_window_16.gif"
style="push">
</command>
</menuContribution>
Commands in Kontextmenüs einfügen
Um einen Command in ein Kontextmenü hinzuzufügen, sollten Sie das Menü mit einem speziellen Separator an der Stelle, an der später hinzugefügte Commands erscheinen sollen, versehen:
MenuManager menuManager = new MenuManager();
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
table.setMenu(menuManager.createContextMenu(table));
Zudem muss das Kontextmenü bei der Workbench registriert werden. Dies geschieht über die Site des View- oder EditorParts. Die Angabe des ersten Parameters ID ist optional. Wird sie weggelassen, wird das Menü mit der ID des Parts registriert:
getSite().registerContextMenu("com.example.somepopup", menuManager, tableViewer);
Handelt es sich bei dem Control um einen JFace Viewer, sollte dieser der Site als SelectionProvider gesetzt werden, damit die Commands im Popup-Menü auf die aktuelle Selektion reagieren können:
getSite().setSelectionProvider(tableViewer);
Nun können Sie dem Popup-Menü über die URI popup:<menuId> Commands hinzufügen:
<extension point="org.eclipse.ui.menus">
<menuContribution locationURI="popup:com.example.somepopup">
<command
commandId="com.example.somecommand"
icon="icons/alt_window_16.gif"
style="push">
</command>
</menuContribution>
</extension>
Handler konditional aktivieren
Mit einem activeWhen-Element in der Handler-Contribution können Bedingungen festgelegt werden, unter denen ein Handler aktiv sein soll:
Ist kein Handler für einen Command aktiv, wird der Command deaktiviert, d.h. der Menüeintrag oder Toolbar-Button erscheint ausgegraut. Sind mehrere Handler für einen Command aktiv, greift der spezifischere Handler.
Für diese Ausdrücke stehen eine Reihe von Variablen zur Verfügung, mit denen Sie auf die Workbench-Umgebung reagieren können:
selectionactivePartIdactiveEditorIdactiveWorkbenchWindow.activePerspectiveactiveFocusControl,activeFocusControlId
Eine Übersicht der Variablen finden Sie unter Variables and the Command Framework sowie in der Klasse ISources:
Um die Funktionsweise zu verdeutlichen im Folgenden einige Beispiele für typische Ausdrücke zur Aktivierung von Command-Handlern:
-
Handler abhängig vom aktivem WorkbenchPart aktivieren

-
Handler abhängig vom Selektionstyp aktivieren

<extension point="org.eclipse.ui.handlers"> <handler commandId="com.example.somecommand"> <activeWhen> <with variable="selection"> <iterate ifEmpty="false" operator="or"> <instanceof value="com.example.SomeObject"/> </iterate> </with> </activeWhen> </handler> </extension>
-
Commands abhängig von der geöffneten Perspektive einblenden
<extension point="org.eclipse.ui.menus"> <menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar"> <toolbar id="com.example.addressbook.filetoolbar"> <command commandId="com.example.addressbook.somecommandid" style="push"> <visibleWhen checkEnabled="false"> <with variable="activeWorkbenchWindow.activePerspective"> <equals value="com.example.addressbook.someperspectiveid"/> </with> </visibleWhen> </command> </toolbar> </menuContribution> </extension>



Gibt es auch eine Möglichkeit mit dieser Methode ein Menü nur dann zu aktivieren, wenn die Perpektive dazu aktiv ist?