Auf einen Blick: Eclipse Actions für Project und Package Explorer

Welche locationUri muss ich für eine menuContribution verwenden, um einen neuen Kontextmenüeintrag zum Projekt und/oder Package Explorer hinzuzufügen? Diese Frage stelle ich mir regelmäßig alle zwei bis drei Jahre und immer brauche ich viel zu lange, um die Antwort zu finden. Insbesondere, wenn ich den Eintrag an einer bestimmten Stelle platzieren will, und nicht irgendwo.

Um mir das nächste Mal die Antwort nicht wieder so lange aus verschiedenen Quellen zusammensuchen zu müssen, habe ich hier drei Listen mit geprüften Werten zusammengestellt. Und ich hoffe auch dem einen oder anderen mit dem selben Problem die Suche zu erleichtern.

Eintrag zur plugin.xml hinzufügen

Also, welchen Inhalt der project.xml brauche ich, um einen Kontextmenüeintrag zu registrieren und dem Kontextmenü beider Views hinzuzufügen:

<?xml version="1.0" encoding="windows-1252"?>
<?eclipse version="3.0"?>
<plugin>
    <extension point="org.eclipse.ui.menus">
        <menuContribution allPopups="false"
               locationURI="popup:org.eclipse.ui.popup.any?endof=group.open">
            <command commandId="com.itemis.test.MyOpenCommand"
                    label="Open My" style="push" tooltip="Open My Editor.">
            </command>
        </menuContribution>
    </extension>
    <extension point="org.eclipse.ui.commands">
        <command id="com.itemis.test.MyOpenCommand" name="Open My"
               
description="Open My Editor.">
        </command>
    </extension>
    <extension point="org.eclipse.ui.handlers">
        <handler commandId="com.itemis.test.MyOpenCommand"
                class="com.itemis.test.MyOpenHandler">
        </handler>
    </extension>
</plugin>

Liste: Project und Package Explorer

Und welcher genaue Wert muss nun verwendet werden, um den Eintrag richtig zu platzieren? Die folgende Liste führt die IDs auf, die von beiden Views akzeptiert werden. Der hinzugefügte Eintrag erscheint also in beiden Views und potentiell auch in denjenigen, die denselben Selektor unterstützen. Da die Reihenfolge der Views nicht identisch ist, wird der Eintrag aber nur ungefähr an derselben Stelle auftauchen. Ein exaktes Positionieren ist kaum möglich, da die endgültige Position auch von anderen Einträgen abhängt. Generell sind die Einträge so sortiert, dass Einträge weiter oben in der Liste auch weiter oben im Menü auftauchen.

popup:org.eclipse.ui.popup.any?before=group.new
popup:org.eclipse.ui.popup.any?after=group.new
popup:org.eclipse.ui.popup.any?endof=group.new
popup:org.eclipse.ui.popup.any?before=group.open
popup:org.eclipse.ui.popup.any?after=group.open
popup:org.eclipse.ui.popup.any?endof=group.open
popup:org.eclipse.ui.popup.any?before=group.edit
popup:org.eclipse.ui.popup.any?after=group.edit
popup:org.eclipse.ui.popup.any?endof=group.edit
popup:org.eclipse.ui.popup.any?before=group.reorganize
popup:org.eclipse.ui.popup.any?after=group.reorganize
popup:org.eclipse.ui.popup.any?endof=group.reorganize
popup:org.eclipse.ui.popup.any?before=group.search
popup:org.eclipse.ui.popup.any?after=group.search
popup:org.eclipse.ui.popup.any?endof=group.search
popup:org.eclipse.ui.popup.any?before=group.build
popup:org.eclipse.ui.popup.any?after=group.build
popup:org.eclipse.ui.popup.any?endof=group.build
popup:org.eclipse.ui.popup.any?before=group.generate
popup:org.eclipse.ui.popup.any?after=group.generate
popup:org.eclipse.ui.popup.any?endof=group.generate
popup:org.eclipse.ui.popup.any?before=additions
popup:org.eclipse.ui.popup.any?after=additions
popup:org.eclipse.ui.popup.any?endof=additions
popup:org.eclipse.ui.popup.any?before=group.properties
popup:org.eclipse.ui.popup.any?after=group.properties
popup:org.eclipse.ui.popup.any?endof=group.properties

Liste: Package Explorer

Wenn der neue Eintrag ausschließlich im Package Explorer auftauchen soll sind, folgende IDs möglich:

popup:org.eclipse.jdt.ui.PackageExplorer?before=group.new
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.new
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.new
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.goto
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.goto
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.goto
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.open
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.open
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.open
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.show
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.show
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.show
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.edit
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.edit
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.edit
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.reorganize
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.reorganize
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.reorganize
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.search
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.search
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.search
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.build
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.build
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.build
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.generate
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.generate
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.generate
popup:org.eclipse.jdt.ui.PackageExplorer?before=additions
popup:org.eclipse.jdt.ui.PackageExplorer?after=additions
popup:org.eclipse.jdt.ui.PackageExplorer?endof=additions
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.viewerSetup
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.viewerSetup
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.viewerSetup
popup:org.eclipse.jdt.ui.PackageExplorer?before=group.properties
popup:org.eclipse.jdt.ui.PackageExplorer?after=group.properties
popup:org.eclipse.jdt.ui.PackageExplorer?endof=group.properties

Liste: Project Explorer

Und schließlich folgen die IDs für das Kontextmenü vom Project Explorer:

popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.new
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.new
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.new
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.open
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.open
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.open
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.edit
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.edit
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.edit
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.reorganize
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.reorganize
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.reorganize
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.port
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.port
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.port
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.build
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.build
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.build
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.generate
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.generate
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.generate
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.search
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.search
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.search
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=additions
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=additions
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?before=group.properties
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=group.properties
popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?endof=group.properties

Selektoren

Für die Auswahl der richtigen ID ist nun ein wenig Ausprobieren zu empfehlen. Generell bedeutet der before Selektor, dass der Eintrag vor der spezifizierten Gruppe, also potentiell am Ende der vorhergehenden Gruppe, eingefügt wird.

Der Selektor after ist nicht ganz intuitiv, da er in etwa als “nach dem Anfang der spezifizierten Gruppe” zu verstehen ist. Der Eintrag erscheint also ganz am Anfang innerhalb der Gruppe.

Schließlich führt endof dazu, dass der Eintrag ganz am Ende der Gruppe auftaucht.

Über Arne Deutsch

Arne Deutsch arbeitet als IT-Berater bei der itemis AG in Bonn. Seine Schwerpunkte sind Language Engineering, Xtext und die Entwicklung von Tools für Eclipse.