# Kontextmenüs an Viewer binden



## dzim (11. Nov 2009)

Hi,

ich habe mal wieder ein kleines Problem(chen):
Ich versuche ein Kontextmenü an einen TreeViewer zu hängen und es will mir einfach nicht gelingen.

Meine Ausgangssituation ist wie folgt:
* ich habe einen Editor, in dem über ein StackLayout verschiedene Seiten angezeigt werden können (vergleichbar zu einem Viewer, aber hier geht es mehr im Verarbeitungsschritte, für die ich einen separaten Wizard-Dialog als unpassend empfand)
* die Seiten selbst sind mittels ScrolledForms / Detail-Master-Blöcken designt und bestehen mitunter aus verschiedenen selbst erstellten Composites (für bestimmte Aufgaben jeweils)
* die Composites werden mittels des FormToolkits für Forms adaptiert - sind als selbst "normale" SWT-Composites
* ich arbeite gerade an einem dieser Komposites, welches einen TreeViewer enthält

Ich möchte nun an das zuletzt genannte Composite (oder besser den Viewer darin) ein Kontextmenü anfügen.
Ich habe dazu folgende (prototypische) Methode erstellt, die ich auf Basis eines wesentlich älteren Programms zusammengebaut habe:

```
private void createContextMenu(Viewer viewer) {

		MenuManager manager = new MenuManager("#PopupMenu");

		manager.setRemoveAllWhenShown(true);
		manager.addMenuListener(new IMenuListener() {

			@Override
			public void menuAboutToShow(IMenuManager manager) {

				// ------------------- DEFINITELY ACTIVATE -------------------
				addFilterAction.setEnabled(true);

				// ------------- DECIDE WETHER TO ACTIVATE IT OR NOT----------
				boolean enabled = false;
				if (filterTreeViewer.getSelection() != null
						&& (IStructuredSelection) filterTreeViewer
								.getSelection() instanceof Filter)
					enabled = true;
				else
					enabled = false;

				removeFilterAction.setEnabled(enabled);
				editFilterAction.setEnabled(enabled);

				// ------------- SET UP MENU ACTIONS -------------------------
				Filter selectedFilter = (Filter) ((IStructuredSelection) filterTreeViewer
						.getSelection()).getFirstElement();

				((GuidedConfigRemoveFilterAction) removeFilterAction)
						.setFilterToRemove(selectedFilter);
				((GuidedConfigRemoveFilterAction) removeFilterAction)
						.setParentFilter(getParentfilter(selectedFilter));

				((GuidedConfigEditFilterAction) editFilterAction)
						.setFilterToEdit(selectedFilter);

				// ------------- ADD TO MENU ---------------------------------
				manager.add(addFilterAction);
				manager.add(removeFilterAction);
				manager.add(new Separator(
						IWorkbenchActionConstants.MB_ADDITIONS));
				manager.add(editFilterAction);
			}
		});

		Menu menu = manager.createContextMenu(viewer.getControl());

		// add to parent

		viewer.getControl().setMenu(menu);
		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
				.getActivePart().getSite().registerContextMenu(manager, viewer);
	}
```

Ich habe auch versucht ein ganz einfaches Menü direkt an den Tree zu hängen, aber ich hatte dabei keinen Erforlg. Es gibt keine Fehler, Warnings oder sonstiges im Log, es erscheint nur einfach kein Menü.

Ich steh hier auf dem Schlauch und weiß nicht weiter.
Ich habe auch schon Versucht es mittels org.eclipse.ui.menues oder org.eclipse.ui.popupMenues hinzubekommen, das ist mir allerdings auch nicht gelungen (wobei ich denke, das hier die erste, die Command-basierte Variante, mir eh nicht weiterhelfen kann, oder?)

Für eure Vorschläge, Ideen und vielleicht auch Kritiken bin ich schon mal im Vorfeld dankbar!

Daniel


----------



## Vayu (11. Nov 2009)

Bist du dir sicher, dass du createContextMenu auch in createPartControl() oder deiner init()-Methode aufrufst?
Meine Methoden sehen nämlich ziemlich identisch aus 

btw
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                .getActivePart().getSite().registerContextMenu(manager, viewer);

kannst auch abkürzen durch
getSite().registerContextMenu(manager, viewer);


----------



## dzim (11. Nov 2009)

Ja, ich hab diese Methode schon aufgerufen. In meinen konkreten Fall im Konstruktor meines Composites, denn:

Wie ich sagte, befindet sich das Menü nicht (direkt) in einem Editor, sondern in einem Composite, das genau genommen in einer Section steckt, welche in einem ScrolledForm steckt, welches auf einem Composite mit StackLayout liegt, was dann endlich mal in einem Editor landet.

Somit steht mir das einfache getSite() leider nicht zur Verfügung :-/

Und ich komm da gerade nicht weiter, weil ich das Problem nicht sehe, was dazu führt, das mein Menü nicht angezeigt wird (BTW: Debuggen hat mir da auch nicht weitergeholfen, ich weiß jetzt nur, dass das Menü definitiv erstellt wird)


----------



## Vayu (11. Nov 2009)

häng dich mal in die MenuManager.fireAboutToShow(IMenuManager manager)
und schau, ob du in den listeners mit drin bist.
Nachher hat der Editor, deinen Viewer gar nicht als listener, weil er ja "irgendwie" unten drunter eingehängt wird.


----------



## dzim (11. Nov 2009)

ich dächte, dass dann wenigstens das einfache Menü mittels

```
viewer.getControl().setMenu(menu);
```
zum Tragen kommt...

Und: nein, der kommt erst gar nicht an die fireAboutToShow(IMenuManager)-Methode ran. Beim Debuggen jedenfalls hat nichts geklappt.


----------



## dzim (16. Nov 2009)

gibt's hier noch irgendwelche Tipps?


----------

