ContextMenu nach selectedTreeItem anpassen?

Plattformprogrammierung: ContextMenu nach selectedTreeItem anpassen?

OSGi, Eclipse RCP und Co.
  1. ContextMenu nach selectedTreeItem anpassen? #1
    sicLotus


    ContextMenu nach selectedTreeItem anpassen? - Standard ContextMenu nach selectedTreeItem anpassen?
    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.

  2. ContextMenu nach selectedTreeItem anpassen? #2
    Huecheln


    Hi,

    wenn du dein Contextmenu über Extension Points erstellt hast, empfehle ich dir folgende Tutorials:

    Eclipse Commands Tutorial
    Eclipse Commands Advanced - Tutorial

    Eclipse RCP


    Mit den Beispielen sollte es funktionieren...

  3. ContextMenu nach selectedTreeItem anpassen? #3
    sicLotus


    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 Code:
    1.  
    2. public Boolean isDeletable() {
    3. return Boolean.TRUE;
    4. }


    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?

  4. ContextMenu nach selectedTreeItem anpassen? #4
    Huecheln


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

  5. ContextMenu nach selectedTreeItem anpassen? #5
    sicLotus


    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.

  6. ContextMenu nach selectedTreeItem anpassen? #6
    Huecheln


    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 Themen zu ContextMenu nach selectedTreeItem anpassen?
  1. Jscrollpane nach zoomen anpassen
    Von Löwenherz im Forum Java Basics - Anfänger-Themen
    Antworten: 20
    Letzter Beitrag: 03.09.2012, 14:26
  2. JTable nach erzeugung anpassen.
    Von motoric18 im Forum Java Basics - Anfänger-Themen
    Antworten: 4
    Letzter Beitrag: 08.12.2011, 09:13
  3. ContextMenu
    Von mane im Forum AWT, Swing, JavaFX & SWT
    Antworten: 2
    Letzter Beitrag: 22.06.2010, 08:32
  4. JTable mit ContextMenü
    Von Foermchen82 im Forum AWT, Swing, JavaFX & SWT
    Antworten: 1
    Letzter Beitrag: 11.02.2010, 09:01
  5. ListView / TreeView - ContextMenu?
    Von Buckethead im Forum Allgemeine Java-Themen
    Antworten: 18
    Letzter Beitrag: 02.09.2008, 16:28
Sie betrachten gerade ContextMenu nach selectedTreeItem anpassen?