# ListView / TreeView - ContextMenu?



## Buckethead (1. Sep 2008)

Hi Leute,
also ich befasse mich im Moment mit dem Plugin development für Eclipse und habe einen MultipageEditor eingebaut, welcher aus einer ListView bzw TreeView besteht.
Meine Frage ist nun, wie ich ein Kontextmenü (also bei Rechtsklick auf ein Element) in die beiden Views bekomme. Muss ich das Menu den Views oder dem Tree bzw dem Table zuordnen und überhaupt.. Irgenwie sind bisher alle Bemühungen gescheitert..

Danke schonmal im Vorraus!


----------



## Wildcard (1. Sep 2008)

Auf Rechtsklick reagieren. Für das Eclipse Context Menu, schau dir mal den MenuManager an, ein genaues Codebeispiel habe ich gerade nicht im Kopf, ist aber nicht weiter schwierig.


----------



## the_alien (1. Sep 2008)

Ich poste mal kurz meine Methode zum Aufbau eines simplen Contextmenüs

```
private void createContextMenu() {
		//create menu manager
		MenuManager manager = new MenuManager();
		manager.setRemoveAllWhenShown(true);
		//register listener to fill the menu when about to be shown
		manager.addMenuListener(new IMenuListener() {
			public void menuAboutToShow(IMenuManager mgr) {
				mgr.add(new MyAction1());
                                mgr.add(new Seperator());
                               //etc
			}
		});
		
		//create menu
		Menu menu = manager.createContextMenu(viewer.getControl());
		viewer.getControl().setMenu(menu);
		
		//register menu for extension
		getSite().registerContextMenu(manager, viewer);
	}
```

Wenn du es lieber per xml aufbaust (z.b. damit dein Plugin noch nicht geladen wird) dann guck mal hier rein:
http://help.eclipse.org/help33/inde...tension-points/org_eclipse_ui_popupMenus.html

Gruß


----------



## Buckethead (1. Sep 2008)

Hey danke, also es öffnet sich auf jeden Fall ein Kontextmenü.
Nur: Dort sind vordefinierte Punkte wie "Run As" etc eingetragen. wie bekomme ich diese weg?
Danke nochmal


----------



## the_alien (2. Sep 2008)

Wie genau hast du das Menü gemacht und worauf beruht dein Editor?


----------



## Buckethead (2. Sep 2008)

Also ich hab einfach deinen Code kopiert, aber keine weiteren Menüpunkte hinzugefügt.
Ich hatte mir ein leeres Kontextmenü gewünscht, nur sind leider schon einige Menüpunkte wie "run as" oder "debug as" vorhanden. Und was meinst du damit worauf der Editor basiert? Es ist ein einfacher MultipageEditor mit zwei views..

Danke nochmal


----------



## Wildcard (2. Sep 2008)

Beim MenuManager werden auch die Contributions anderer Plugins auf deine Selection angewendet (das meinte ich auch weiter oben mit dem Eclipse Context Menu). Versuch mal setRemoveAllWhenShown(true)


----------



## Buckethead (2. Sep 2008)

Das steht auch schon im Code. Trotzdem gehts noch nicht so recht.


----------



## the_alien (2. Sep 2008)

Dann nimm mal die letzte Zeile aus dem Quellcode raus, genau da werden nämlich die anderen Contributions anderer Plugins eingefügt.

Die hier: 
getSite().registerContextMenu(manager, viewer);


----------



## Buckethead (2. Sep 2008)

Ich war mir sicher jede Zeile schonmal einzeln auskommentiert zu haben.. Scheinbar nicht, oh man.
Also das geht jetzt schonmal, Danke!

Noch ne kurze Frage:
Wenn ich Einträge hinzufügen will, muss ich das folgerndermaßen machen?

```
mgr.add(new IAction() {

			@Override
			public void addPropertyChangeListener(
					IPropertyChangeListener listener) {
				// TODO Auto-generated method stub
				etc...

			}
```
Scheint mir nicht so sinnvoll, da man ja alle MEthoden von diesem Interface implementieren müsste, was ja schon einige sind..
Gibts da vielleicht eine bessere Lösung?


----------



## the_alien (2. Sep 2008)

Der einfachste weg ist die Aciton Klasse zu nutzen statt des Interfaces.


```
mgr.add(new Action() { 
public void run() {
//DO SOMETHING
}});
```


----------



## Buckethead (2. Sep 2008)

Ok, aber wie schaffe ich es einen neuen Eintrag hinzuzufügen?.. Mit setText() geht es ja schonmal nicht..


----------



## the_alien (2. Sep 2008)

Du übergibst dem Konstruktor einen String.

new Action("alles löschen")


----------



## Buckethead (2. Sep 2008)

Hm ok, hätte mir einfach mal die Kontruktoren angucken sollen..

Vielen Dank für die echt gute Hilfe, wenn ich später noch Fragen habe meld ich mich nochmal (keine Angst, werde jetzt mir erstmal die ganzen Sachen genau angucken und ausprobieren ) :wink:


----------



## Buckethead (2. Sep 2008)

Also eine Sache ist mir nicht ganz klar:
Ich will beim Rechtsklick auf ein Element in dem Viewer genau das angeklickte Element auswählen. Dazu Muss ich meiner Meinung nach die MausPosition ermitteln.
Mit 
	
	
	
	





```
((TableViewer) viewer).getTable().getItem(...);
```
Komme ich wohl auch ran, aber: In der API steht, das "getItem()" sowohl einen Integer als auch einen Point als Parameter akzeptiert werden.
Wenn ich jetzt die MausPosition mit 
	
	
	
	





```
MouseInfo.getPointerInfo().getLocation()
```
 abfrage und übergeben will sagt er mir, dass nur Integer akzeptiert werden..

Weiß jemand vielleicht eine Lösung?

Edit: OK, es handelt sich um eine andere Klasse Point.. Kann mit trotzdem jmd helfen mein Problem zu lösen?


----------



## the_alien (2. Sep 2008)

Weiss nicht wie es im TableViewer aussieht, aber mein TreeViewer macht das ganz automatisch...


----------



## Buckethead (2. Sep 2008)

Was meinst du mit ganz automatisch? Also wenn ich dem Viewer ein Kontextmenü hinzufüge kann ich ja überall klicken und das Menü erscheint. Wie komme ich jetzt an das angeklickte Item bzw null wenn keines angeklickt wurde?


----------



## the_alien (2. Sep 2008)

Achso, wenn du nur wissen willst welches Element selektiert ist, dann kannst du das mit getSelection() machen.
Es hörte sich so an, als ob bei einem Rechtsklick das Element im Viewer nicht markiert (ausgewählt) würde.


----------



## Buckethead (2. Sep 2008)

Ahh..
Mir ist gar nicht aufgefallen, dass er die Elemente schon selektiert und man ja somit schon ein Element ausgewählt hat.

Jetzt klappt alles, Danke nochmal


----------

