org.eclipse.ui.popupMenus

Am Erweiterungspunkt org.eclipse.ui.popupMenus kann ein Plug-in Ergänzungen für die Kontextmenüs anderer Sichten und Editoren bereitstellen.

Eine Aktion für ein spezifisches Kontextmenü können Sie über ihre ID (Ergänzungstyp viewerContribution) angeben. Sie können eine Aktion aber auch für einen Objekttyp (Ergänzungstyp objectContribution) ergänzen. 

Das Tool für Readme-Dateien definiert eine Ergänzung des Typs objectContribution. Die Befehlsdatei sieht folgendermaßen aus:

<extension point = "org.eclipse.ui.popupMenus">
    <objectContribution
        id="org.eclipse.ui.examples.readmetool"
        objectClass="org.eclipse.core.resources.IFile"
        nameFilter="*.readme">
        <action id="org.eclipse.ui.examples.readmetool.action1"
            label="Show Readme Action"
            icon="icons/basic/ctool16/openbrwsr.gif"
            menuBarPath="additions"
            helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
            class="org.eclipse.ui.examples.readmetool.PopupMenuActionDelegate" 
            enablesFor="1">
        </action>
    </objectContribution>
</extension>

Die Aktion "Show Readme Action" wird für die Objektklasse IFile hinzugefügt. Dies bedeutet, dass alle Sichten, die Objekte der Klasse IFile enthalten, die Ergänzung anzeigen, wenn Objekte IFile ausgewählt sind. Wie bereits beschrieben, werden die Auswahlkriterien durch einen Namensfilter (nameFilter="*.readme") und einen Filter für Einzelauswahl (enablesFor="1") weiter eingeschränkt. Die Registrierung dieses Menüs führt erst dann einen Code aus dem Plug-in aus, wenn die Menüoption tatsächlich ausgewählt wird.

Bei Auswahl der Menüoption führt die Workbench die angegebene Klasse aus. Da das Kontextmenü mit dem Ergänzungstyp objectContribution deklariert ist, muss die bereitgestellte Klasse die Schnittstelle IObjectActionDelegate implementieren. 

Die Aktion wird in PopupMenuActionDelegate implementiert.  

public void run(IAction action) {
    MessageDialog.openInformation(
        this.part.getSite().getShell(),
        "Readme Example",
        "Popup Menu Action executed");
}

Die Ergänzung des Kontextmenüs wird angezeigt, wenn in der Sicht "Navigator" eine Readme-Datei ausgewählt wird.

Der andere Typ einer Ergänzung für Kontextmenüs wird als viewerContribution bezeichnet.

Hinweis:  Der Name viewerContribution ist in gewisser Weise irreführend, denn er bezieht sich nicht auf JFace-Anzeigefunktionen. Der Name popupMenuContribution wäre unter Umständen eindeutiger.

Durch eine Ergänzung für Anzeigefunktionen (viewerContribution) wird das Kontextmenü einer spezifischen Sicht oder eine bestimmten Editors unter Verwendung der entsprechenden ID ergänzt. Die folgende Befehlsdatei zeigt, wie ein Plug-in eine spezifische Aktion im Kontextmenü für die Taskliste der Workbench registrieren könnte.

<extension point="org.eclipse.ui.popupMenus">
    <viewerContribution
        id="com.example.C2"
        targetID="org.eclipse.ui.views.TaskList">
        <action id="com.example.showExample"
            label="&amp;Show Example"
            menubarPath="additions"
            icon="icons/showExample.gif"
            helpContextId="com.example.show_action_context"
            class="com.example.actions.ExampleShowActionDelegate">
        </action>
    </viewerContribution>
</extension>

Wenn die Erweiterung den Ergänzungstyp viewerContribution hat, muss die bereitgestellte Klasse die Schnittstelle IEditorActionDelegate oder IViewActionDelegate implementieren. Dies richtet sich danach, ob die Aktion im Kontextmenü eines Editors oder einer Sicht ergänzt wird.

Im vorliegenden Beispiel wird die ID (id) des Kontextmenüs und der Pfad (path) im Kontextmenü für die Ergänzung angegeben.

Hinweis:  Für eine Ergänzung des Typs viewerContribution am Erweiterungspunkt popupMenus werden dieselben Schnittstellen wie an den Erweiterungspunkten viewActions und editorActions benötigt. Wenn Sie dieselbe Aktion zum Kontextmenü und zum lokalen Menü einer Sicht oder eines Editors hinzufügen wollen, können Sie für beide Erweiterungen dieselbe Klasse verwenden.