Ergänzungen für Workbench-Menüs

Es wurden bereits mehrere unterschiedliche Erweiterungspunkte vorgestellt, an denen die Workbench durch verschiedene Menüs und Symbolleisten ergänzt werden kann. Sie müssen daher ermitteln können, welcher Erweiterungspunkt für einen bestimmten Zweck zu verwenden ist. Die folgende Tabelle fasst die unterschiedlichen Menüergänzungen sowie deren Verwendung zusammen.

Name des Erweiterungspunkts

Position der Aktionen

Details

viewActions

Die Aktionen werden in der lokalen Symbolleiste und dem lokalen Pull-down-Menü einer spezifischen Sicht angezeigt.

Es muss eine Aktionsklasse bereitgestellt werden, die IViewActionDelegate implementiert. Anzugeben sind die ID der Ergänzung und die ID der Zielsicht, in der die Aktion angezeigt werden soll. Bezeichnung und Image geben die Darstellung der Aktion in der Benutzerschnittstelle vor. Der Pfad gibt die Position bezogen auf die übrigen Menü- und Symbolleistenelemente der Sicht an.

editorActions

Die Aktionen werden einem Editor zugeordnet und im Menü und/oder in der Symbolleiste der Sicht angezeigt.

Es muss eine Aktionsklasse bereitgestellt werden, die IEditorActionDelegate implementiert. Anzugeben sind die ID der Ergänzung und die ID des Zieleditors, in dem die Aktion angezeigt werden soll. Bezeichnung und Image geben die Darstellung der Aktion in der Benutzerschnittstelle vor. Separate Menü- und Symbolleistenpfade geben das Vorhandensein und die Position der Ergänzung in Menü und Symbolleiste der Workbench an.

popupMenu

Die Aktionen werden im Kontextmenü eines Editors oder einer Sicht angezeigt. Aktionen, die einem Objekttyp zugeordnet sind, werden in allen Kontextmenüs von Sichten und Editoren angezeigt, die diesen Objekttyp enthalten. Aktionen, die einem spezifischen Kontextmenü zugeordnet sind, werden ausschließlich in diesem Kontextmenü angezeigt.

Objektergänzungen geben den Typ des Objekts an, in dessen Kontextmenü die Aktion angezeigt werden soll. Die Aktion wird in den Kontextmenüs aller Sichten und Editoren angezeigt, die diesen Objekttyp enthalten. Es muss eine Aktionsklasse bereitgestellt werden, die IObjectActionDelegate implementiert. 
Ergänzungen für Anzeigefunktionen geben die ID des Zielkontextmenüs an, in dem die Menüoption angezeigt werden soll. Es muss eine Aktionsklasse bereitgestellt werden, die IEditorActionDelegate oder IViewActionDelegate implementiert. 

actionSets

Die Aktionen werden in den Hauptmenüs und der Symbolleiste der Workbench angezeigt. Die Aktionen sind in Aktionssets gruppiert. Alle Aktionen eines Aktionssets werden in den Workbench-Menüs und Symbolleisten gemäß den vom Benutzer definierten Einstellungen für Aktionssets und der aktuellen Perspektive in der Workbench angezeigt.

Es muss eine Aktionsklasse bereitgestellt werden, die IWorkbenchWindowActionDelegate oder IWorkbenchWindowPulldownDelegate implementiert. Anzugeben sind Name und ID des Aktionssets. Es müssen alle Aktionen aufgelistet werden, die für dieses Aktionsset definiert sind. Für jede Aktion geben separate Menü- und Symbolleistenpfade das Vorhandensein und die Position der Ergänzung in Menü und Symbolleiste der Workbench an.

Pfade für Menüs und Symbolleisten

Sie haben bereits viele Aktionsergänzungen kennen gelernt, die den Pfad für die Position der Aktion angeben. Die Bedeutung dieser Pfade soll im Folgenden näher erläutert werden, und zwar zunächst am Beispiel des Workbench-Menüs Hilfe.

Benannte Gruppen

Die Positionen für das Einfügen neuer Menüs, neuer Menüoptionen oder neuer Symbolleistenelemente werden durch benannte Gruppen definiert. Eine benannte Gruppe ist mit einem Segment oder einem Platzhalter vergleichbar, mit dessen Hilfe die Menü- oder Symbolleistenergänzung an einer bestimmten Stelle im Menü oder in der Symbolleiste eingefügt werden kann.

Die Workbench definiert alle Namen von Gruppensegmenten in der Klasse IWorkbenchActionConstants. In allen Workbench-Menüs werden benannte Gruppen an den Stellen platziert, an denen zu erwarten ist, dass Plug-ins neue Aktionen einfügen.

Die folgende Beschreibung des Menüs "Hilfe" stammt aus der Klassendefinition von IWorkbenchActionConstants.

Standard Help menu actions
Start group HELP_START "start"
End group HELP_END "end"
About action ABOUT "About"

Das Workbench-Menü "Hilfe" besteht in der Standardeinstellung aus einer benannten Gruppe namens start, auf die eine benannte Gruppe namens end und dann eine Aktion About folgt. Es werden deshalb zwei Gruppen verwendet, weil Plug-ins die Möglichkeit haben sollen, zu steuern, auf welcher Ebene sie im Menü "Hilfe" angezeigt werden. Wenn Sie ein Menü definieren, können Sie so viele Platzhalter angeben, wie Sie wollen. Durch das Hinzufügen weiterer Platzhalter können andere Plug-ins besser steuern, wo deren Ergänzungen in Bezug auf vorhandene Ergänzungen angezeigt werden sollen.

Zuvor muss jedoch berücksichtigt werden, dass das Menü "Hilfe" weitere Optionen enthält, die durch Plug-ins hinzugefügt werden. Das Hilfe-Plug-in fügt beispielsweise ein Aktionsset zur Workbench hinzu, das ein Menü "Inhaltsverzeichnis der Hilfetexte" enthält. Aus diesem Plug-in namens org.eclipse.help.ui stammt die folgende Befehlsdatei plugin.xml:

<extension 
    point="org.eclipse.ui.actionSets">
    <actionSet
        id="org.eclipse.help.internal.ui.HelpActionSet"
        label="%help"
        visible="true">
        <action id="org.eclipse.help.internal.ui.HelpAction"
            menubarPath="help/helpEnd"
            label="%helpcontents"
            class="org.eclipse.help.internal.ui.ShowHelp"/>
    </actionSet>
</extension>

Die neue Hilfeaktion wird in die Gruppe helpEnd des Hilfemenüs gestellt. Wenn durch keine anderen Plug-ins Erweiterungen für das Hilfemenü bereitgestellt werden, bedeutet dies, dass die Menüoption "Inhaltsverzeichnis der Hilfetexte" als erste Option im Menü über der Option "Info über" angezeigt wird. Falls ein anderes Plug-in eine Option ergänzen soll, die immer über der Option "Inhaltsverzeichnis der Hilfetexte" erscheinen soll, könnte dieses Plug-in in seinem Pfad die Gruppe helpStart angeben.

Symbolleistenpfade funktionieren auf ganz ähnliche Weise. Immer dann, wenn ein Pfad angegeben ist, muss er mit dem Namen einer Gruppe in der Symbolleiste enden.

Vollständig qualifizierte Pfade für Menüs und Symbolleisten

Ein vollständiger Pfad für ein Menü oder eine Symbolleiste ist einfach eine Liste von Paaren, die aus einem Menünamen und einer benannten Gruppe bestehen. Die Menünamen für die Workbench sind ebenfalls in IWorkbenchActionConstants definiert. Auf diese Weise kann ermittelt werden, dass der vollständig qualifizierte Pfadname für die oben beschriebene Hilfeaktion help/helpEnd lautet.

Manche Menüs enthalten verschachtelte Untermenüs. An dieser Stelle kommen längere Pfade ins Spiel. Wenn im Hilfemenü ein Untermenü namens submenu mit einer benannten Gruppe namens submenuStart definiert wäre, würde der vollständig qualifizierte Menüpfad für eine Aktion im neuen Untermenü help/submenu/submenuStart lauten.

Bezeichnungen von Benutzerschnittstellen auslagern

Das oben beschriebene Beispiel demonstriert außerdem eine Technik, mit der Zeichenfolgen, die in der Benutzerschnittstelle angezeigt werden, ausgelagert werden können. Dies ist hilfreich, wenn die Benutzerschnittstelle des Plug-ins in andere Sprachen übersetzt werden soll. Die Zeichenfolgen in der Datei plugin.xml können ausgelagert werden, indem die Zeichenfolgen durch einen Schlüssel (z. B. %help,%helpcontents) ersetzt und in der Datei plugin.properties Einträge mit dem folgenden Format erstellt werden:

help = "Hilfe"
helpContents = "Inhaltsverzeichnis der Hilfetexte"

Auf diese Weise kann die Datei plugin.properties in unterschiedliche Sprachen übersetzt werden, und die Datei plugin.xml muss nicht geändert werden.

Neue Menüs und Gruppen hinzufügen

In vielen der bislang dargestellten Beispiele wurden die Aktionen, die durch die Beispiel-Plug-ins ergänzt wurden, zu vorhandenen benannten Gruppen in Menüs und Symbolleisten hinzugefügt.

Über die Erweiterungspunkte actionSets, viewActions, editorActions und popupMenus können außerdem neue Menüs und Gruppen in einer Ergänzung definiert werden. Das bedeutet, dass Sie neue Untermenüs oder neue Pull-down-Menüs definieren und Ihre Aktionen zu diesen Menüs hinzufügen können. In diesem Fall enthält der Pfad für die neue Aktion den Namen des neu definierten Menüs.

Diese Technik wurde bereits angewandt, als das Tool für Readme-Dateien ein neues Menü für sein Aktionsset definierte. Da Sie sich jetzt ausführlicher mit Menüpfaden beschäftigt haben, soll die entsprechende Befehlsdatei noch einmal betrachtet werden:

<extension 
    point = "org.eclipse.ui.actionSets">
    <actionSet id="org_eclipse_ui_examples_readmetool_actionSet"
        label="ReadMe Actions"
        visible="true">
        <menu id="org_eclipse_ui_examples_readmetool"
            label="Readme &amp;File Editor"
            path="window/additions"> 
            <separator name="slot1"/>
            <separator name="slot2"/>
            <separator name="slot3"/>
        </menu>
        <action id="org_eclipse_ui_examples_readmetool_readmeAction"
            menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
            toolbarPath="readme"
            label="&amp;Open Readme Browser@Ctrl+R"
            tooltip="Open Readme Browser"
            helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
            icon="icons/basic/ctool16/openbrwsr.gif"
            class="org.eclipse.ui.examples.readmetool.WindowActionDelegate"
            enablesFor="1">
            <selection class="org.eclipse.core.resources.IFile"
                name="*.readme">
            </selection>
        </action>
    </actionSet>
</extension>

Es wurde ein Menü namens org_eclipse_ui_examples_readmetool hinzugefügt. Seine Bezeichnung ist die Zeichenfolge Readme &File Editor. In diesem Menü werden die drei benannten Gruppen slot1, slot2 und slot3 definiert. Das neue Menü wird zum Pfad window/additions hinzugefügt.

Wenn Sie zu IWorkbenchActionConstants zurückgehen, wird diese Definition des Menüs "Fenster" im Javadoc angezeigt:

* <h3>Standard Window menu actions</h3>
* <ul>
* <li>Extra Window-like action group (<code>WINDOW_EXT</code>)</li> 

Bei genauerer Betrachtung der Klassendefinition können diese zugehörigen Definitionen festgestellt werden:

public static final String MENU_PREFIX = "";
...
public static final String M_WINDOW = MENU_PREFIX+"window";
...
public static final String MB_ADDITIONS = "additions"; // Group.
...
public static final String WINDOW_EXT = MB_ADDITIONS; // Group.

Aus diesen Informationen können Sie den Pfad zusammensetzen, den Sie beim Hinzufügen einer Option zum Workbench-Menü "Fenster" benötigen. Das Menü selbst heißt window, es definiert ein Segment namens additions. Daher wird zum Hinzufügen eines eigenen neuen Menüs der Pfad window/additions verwendet.

In der Deklaration des Aktionsset wird unter Verwendung des Pfads window/org_eclipse_ui_examples_readmetool/slot1 eine Aktion zum neu definierten Menü hinzugefügt.

Andere Plug-ins könnten durch die Verwendung desselben Pfads (oder auch über eines der anderen Segmente) ein eigenes Menü zu diesem Menü hinzufügen.

Im Allgemeinen ist es nicht besonders sinnvoll, ein Menü oder eine Symbolleiste eines anderen Plug-ins dadurch hinzuzufügen, dass der Pfadname aus der Datei plugin.xml abgeleitet wird. Es ist nämlich möglich, dass die Namen der Pfade in einer künftigen Version des Plug-ins geändert werden. Daher empfiehlt es sich, eine öffentliche Schnittstelle (wie etwa IWorkbenchActionConstants) zu definieren, die genau angibt, welche Menüs, Symbolleistengruppen und Segmente durch andere Plug-ins verwendet werden dürfen.