RCP ContextMenu nach selectedTreeItem anpassen?

sicLotus

Bekanntes Mitglied
Hi,

folgende Frage:
Ich hab 1 Kontextmenü mit einigen Befehlen, z.B. "Neu" und "Öffnen".
Dieses Kontextmenü wird auf eine ExplorerView angewandt, das Kontextmenü ist also in der gesamten View aufrufbar.

In der Explorerview sind mehrere TreeItems die man auswählen kann. Als Beispiel: "Auto", "Haus" und "Garten".

Für jedes dieser TreeItems gibts jetzt also dieses Kontextmenü mit Neu und Öffnen. Allerdings soll z.B. bei Haus der Befehl "Öffnen" nicht auswählbar sein. Bei den anderen beiden aber schon.

Meine Frage ist nun: geht das? Ich möchte quasi, dass jede Klasse der TreeItems selbst bestimmen kann, welchen Menübefehl sie anzeigt bzw. ausführen lässt. (ausgegraut reicht ja auch).

Mein Problem ist quasi, dass das Menü bei jedem Aufruf neu initialisiert werden müsste und die Daten sich aus dem jeweiligen TreeItem geholt werden müssten, ob der Befehl aktiviert oder deaktiviert ist. Gibt es eine Möglichkeit zu sagen, wenn das Kontextmenü aufgerufen wird, soll es vorher aktualisiert werden oder so?

Für jeden Rat wäre ich dankbar.
 

sicLotus

Bekanntes Mitglied
Die Tutorials hab ich mir durchglesen. Der letzte Link hat allerdings nicht funktioniert.
An sich ist mir ja klar wie das Prinzip funktioniert. Das Problem was ich habe, wo kann ich den refresh aufrufen? Ich hab eine Klasse für jeden Tree (z.B. Garten). In diesem hab ich eine Methode, die einen Boolean liefert, je nachdem ob ein Command ausgeführt werden darf, ungefähr so:
Java:
public Boolean isDeletable() {
return Boolean.TRUE;
}

Ich hab nen SourceProvider (abgeleitet vom AbstractSourceProvider), dieser müsste ja dann den Refresh implementieren. (Das heißt alle Commands durchgehen und entscheiden ob sie aktiviert oder deaktiviert sind.) In dem Tutorial wäre das wohl so öhnlich wie toogleEnabled();

Mein Problem ist halt, ich weiß nicht wo oder wie ich den refresh bei jedem Rechtsklick aufrufen könnte.
Beim toogleEnabled, da wird ja aktiv beim Drücken eines Buttons dafür gesorgt das die Methode aufgerufen wird. Gibts dafür überhaupt ne Möglichkeit?
 

Huecheln

Mitglied
Für das letzte Tutorial muss du nach "rcp context menu visiblewhen" googlen und den zweiten Treffer nehmen.


Ich weiß jetzt nicht, wie du dein Kontextmenü erstellst. Mit den Tutorials wollte ich dir nur zeigen, wie ich es mache und es auch funktioniert.

Der Vorteil mit den Extension Points ist, dass du nur die Funktion in Form eines Commands implementieren musst. Der Rest (Erstellen des Context Menüs, Aufrufen, verfügbar oder nicht) wird automatisch gesteuert.
Nur als Beispiel, wie deinem View ein Context Menu hinzugefügt wird (Auszug aus Plugin.xml):

<extension point="org.eclipse.ui.menus">
<menuContribution locationURI="popup:[ViewID]">
<command
commandId="com.example.somecommand"
style="push">
</command>
</menuContribution>
</extension>

Ob das Ding dann zur Auswahl steht wird so gesteuert:

<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>

In deiner View-Klasse musst du das Context Menü noch registrieren (Tutorial) und fertig...
 

sicLotus

Bekanntes Mitglied
Ich hab mir das andere Tutorial auch noch angeschaut. Auch das hilft mir an meiner Stelle einfach nicht weiter, weil es bei enabledWhen nicht in die Tiefe geht.

Ich versteh nicht, was es mir bringen soll, wenn ich mit instanceOf über ein Objekt iteriere...

Also ich versteh quasi diese Zeilen nicht komplett:
<activeWhen>
<with variable="selection">
<iterate ifEmpty="false" operator="or">
<instanceof value="com.example.SomeObject"/>
</iterate>
</with>
</activeWhen>

activeWhen ist klar, der Menüpunkt wird aktiviert, wenn etwas eintritt..
Jetzt weiß ich aber schon nicht weiter.. with variable = "selection".. wo wird diese Variable denn deklariert? Musste ich die selber anlegen? Ich erinnere mich vage in dem einen Tutorial da wurde sowas glaube gemacht..

Falls jemand die paar Zeilen kurz erklären könnte, wäre das wirklich hilfreich.
 

Huecheln

Mitglied
Das Ganze funktioniert auch nur wenn du in deiner View Klasse das Kontextmenü bei der Workbench registrierst. Im letzten Tutorial ist dieses Beispiel:

Code:
MenuManager menuManager = new MenuManager();
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
table.setMenu(menuManager.createContextMenu(table));

getSite().setSelectionProvider(tableViewer);

Das funktioniert natürlich auch mit einem Tree.

<activeWhen>

<with variable="selection">
--> ist eine Liste der selektierten Elemente. Hier musst du nichts deklarieren.

<iterate ifEmpty="false" operator="or">
--> mit iterate wird angegeben, dass über diese Selektion iteriert werden soll und mit "or" wird angegeben, das es reicht wenn ein Element auf die folgende Bedingung zutrifft.

<instanceof value="com.example.SomeObject"/>
--> gibt an, von welcher Klasse das selektierte Objekt sein darf, damit der Menüpunkt auftaucht

</iterate>
</with>
</activeWhen>

Ansonsten hilft es auch (bei mir damals), die Tutorials von Beginn an durchzuspielen. Das ist einfacher als mitten in einem Tutorial anzufangen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Eclipse: Contextmenu id erhalten? Plattformprogrammierung 9
D Nach Sprachpaket Installation kann eclipse nicht mehr gestartet werden Plattformprogrammierung 4
B Eclipse zeigt Fehler nach Java-Update auf 1.8.0_40 Plattformprogrammierung 3
S RCP Nach erfolgreicher Erstellung der View, wie weitermachen? Plattformprogrammierung 1
H PHP Perspective nach Run immer im Vordergrund - Was tun Plattformprogrammierung 0
J Charset-Problem nach Plugin-Export Plattformprogrammierung 1
N RCP Tabelle nach mehreren kriterien sortieren Plattformprogrammierung 2
B RCP LinkageError nach Produktexport Plattformprogrammierung 3
M RCP TableViewer schrumpft in View nach manueller Resize auf 1 Zeile Plattformprogrammierung 5
A RCP RAP-Bundle nach Installation nicht auffindbar?! Plattformprogrammierung 5
A RCP HTTP ERROR 404; einwandfreier Start nach Browser-Reload Plattformprogrammierung 4
S xpend ecore::EJavaObjet nach Integer oder String Plattformprogrammierung 11
M Nach Umbenennung der Packages viele Probleme Plattformprogrammierung 11
dzim Migration einer bestehenden Applikation nach e4 Plattformprogrammierung 11
lumo RCP libraries werden nach dem export nicht gefunden Plattformprogrammierung 17
dzim RCP Überführen einer RCP-Anwendung nach RAP Plattformprogrammierung 11
B Cross Build von WinXP, Fail nach Splash auf MAC Plattformprogrammierung 2
N Neustart nach preference-Änderung Plattformprogrammierung 13
M Nach Export läuft Applikation nicht mehr??? Plattformprogrammierung 2
G swt widget disposed nach update auf 3.2 Plattformprogrammierung 4

Ähnliche Java Themen


Oben