[Eclipse RCP] TreeViewer - Wie per Rechtsklick Menü öffnen?

headaX

Grünschnabel
Hallo liebe Forenmitglieder,

Fragestellung:
Wie kann ich bei einem "TreeViewer" abhängig vom Typ eines selektierten TreeItems ein Menü anzeigen lassen?
Wie gehe ich das am geschicktesten an? Wie/Wo sollte ich das Menü anlegen? Stichwort "Extensions".
(Nach mehrstündiger Foren- und Google-Suche habe ich leider dazu nichts wirklich Brauchbares gefunden.)

Hintergrund:
für ein simples Kontaktverwaltungsprogramm bin ich am Erstellen einer Kontaktliste. Diese hat die Struktur(Root->Gruppen->Kontakte).
Dies ist mir auch soweit mit einem "TreeViewer" gelungen.
Nun, soll es allerdings noch möglich sein, per Klick mit der rechten Maustaste abhängig vom Typ d. Baumelements(Gruppe / Kontakt)
ein spezielles Menü anzuzeigen.

Vielen Dank schonmal im Voraus!

Gruß headaX
 
Hey,

Ist ein riesengrosses Thema welches du da ansprichst. Ich habe selbst schon Popup-Menüs programmiert. Ganz lecker ist die Lösung
wenn deine Popup-Menüs (bei Rechtsklick) durch einen Context definiert werden. Je nach aktiviertem Context wird ein anderes Menü angezeigt,
also genau das was du suchst.

Ich weiss jetzt gerade nicht ob ein Popup-Menü einer Tabelle angehängt werden kann, doch darum kannst du dich später kümmern,
wir nehmen hier jetzt mal an es funktioniert.

Stichwort Extension:
Es gibt den Menüpunkt org.eclipse.ui.menus, dort kannst du neue MenuContributions erzeugen. Für ein Popup-Menü würde die location-URI einer solchen MenuContribution
wie folgt lauten: popup:YourViewIDhere
In dieses MenuContribution kannst du dann bereits erfasste Commands (Extension: org.eclipse.ui.commands) einfügen.

Versuche doch mal ein solches Menü mit Commands zu erfassen und lass mich wissen ob du das hingekriegt hast. Ich kann dir danach gerne noch weiterhelfen.

P.S. Bei einem Rechtsklick auf die angegebene View sollte sich das Popup Menü öffnen.

Freundliche Grüsse
CKingZesi
 
Hallo CKingZesi,

danke, der von Dir beschriebene Weg hat sehr gut geklappt! Mithilfe des "SelectionProviders" des "TreeViewers" funktionieren auch alle registrierten "Commands" ohne Einschränkung.
Jetzt müsste es eine Möglichkeit geben, dieses Menü dynamisch anzupassen. D.h. bei Selektion eines Kontakts bzw. einer Gruppe die entsprechenden "Commands" zu registrieren bzw. rauszuschmeißen.

Eine andere Möglichkeit wäre mit der Extension "org.eclipse.ui.popupMenus" eine "ObjectContribution", die bei Rechtsklick-Selektion eines Objektes(Kontakt / Gruppe) ein Menü öffnet, zu erstellen und dann "Actions" hinzuzufügen, die wiederum die "Commands" ausführen. Scheinbar kann man auch Untermenüs einbinden. Das ist mir allerdings noch nicht gelungen. Der Umweg über die "Actions" nervt bei dieser Lösung etwas.

Also eine Realisierung der 1. Lösung würde mir am besten gefallen. Hast Du - oder jemand anderes - das schon einmal umgesetzt?

Gruß headaX
 
Zuletzt bearbeitet:
Hey,

Also das ganze ist 1. ohne Actions und 2. ohne umständliches Einbinden oder Auswerfen von Commands möglich.

In den Extensions gibt es den Punkt org.eclipse.ui.handler, dort kann jedem Command ein Handler zugewiesen werden. Für einen Command können auch mehrere Handler registriert werden. Diese Handler können danach durch sogenannte Contexte aktiviert oder sichtbar gemacht werden.

Ein Context ist ein "Zustand" der Applikation. Es können mehrere Contexte gleichzeitig aktiv sein und ein Context kann auch mehrmals aktiviert werden. Durch diese Aktivierung und Deaktivierung muss sich der Programmierer nicht um die Erstellung des Menüs kümmern. Das Menü wird definiert und dessen Inhalte anschliessend durch Contexte gesteuert. Dabei ist es möglich auch keinen Menüpunkt anzuzeigen.

Contexte gibt es unter der Extension org.eclipse.ui.contexts...

Jeder Handler kann mit dem Punkt "visibleWhen" an einen Context gebunden werden. Dabei muss die folgende Kombination angegeben werden um einem Context zu horchen.

"visibleWhen" -> with Variable: activeContexts -> iterate Variable: or -> [ContextID]

Ist der Context mit der [ContextID] aktiv geschaltet, so ist der entsprechende Command aktiv, egal in welchem Menü oder in welcher Toolbar er sich befindet. Das Aktivschalten eines Context weiss ich jetzt gerade nicht mehr, ich werde am Montag mehr darüber schreiben. Aber ich denke das Google sich dort auch ein wenig auskennt...

Bei weiteren Fragen... ich lese das Forum jeden Tag...

Freundliche Grüsse
CKingZesi
 
Hallo,

ich habe das Problem jetzt folgendermaßen gelöst:
Ich habe eine "MenuContribution" angelegt mit der "locationURI" popup:<viewID>.
In diese habe ich wiederum "Commands" hinzugefügt bzw. die schon erstellten unter dem "Extension Point" org.eclipse.ui.commands auf diese "MenuContribution" per ID verlinkt.

Um nun die entsprechenden "Commands" abhängig von der Selektion(Kontakt / Gruppe) anzuzeigen, musste ich nur noch Folgendes tun:
Rechtsklick auf einen "Command" in der "MenuContribution". ->
New -> visibleWhen ->
New -> with(variable: selection) ->
New -> iterate(operator: or, ifEmpty: false) ->
New -> instanceof(value: <Die entsprechende Klasse(bei mir Kontakt, Gruppe)>)

So klappt das Ganze eigentlich ziemlich gut. Deine Lösung, CKingZesi, interessiert mich aber trotzdem, vor allem für aufwändigere Projekte scheint das segensreich zu sein.
Kannst Du mir tiefergehende Lektüre empfehlen bzgl. Programmdesign mit Eclipse RCP?

Gruß headaX
 

Neue Beiträge

Zurück