# ActionSets vor dem Start deaktivieren & Menüanordnung



## Gonzo17 (10. Jul 2009)

Heyho,

ich bin beim Basteln an meinem RCP Plug-In mal wieder auf ein paar Sachen gestoßen, die ich nicht lösen kann (oder nur unschön). 

Zuerst einmal ist mir aufgefallen, dass ein paar Buttons in meiner CoolBar sind, die ich da nicht haben möchte. Und in den Menüs auch. Also hab ich mich erkundigt, wo die herkommen und habe herausgefunden, dass manche der Plug-Ins, die ich einbinde, ActionSets haben und diese Buttons/Menüeintrage eben daher stammen. Die Sache ist nun die, dass ich nicht einfach in den ActionSets der Plug-Ins rumpfuschen kann, also muss ich sie nachträglich löschen, deaktivieren oder unsichtbar machen. Ich habe versucht, das über die Methode "perspective.getAlwaysOnActionSets()" zu regeln, aber dazu muss ich ja erstmal die Perspective haben, die ich standardmässig benutze. Ich weiss aber nicht, wie ich die bekommen soll, wenn noch kein IWorkbenchWindow erstellt wurde. Im Moment sieht es in meiner ApplicationWorkbenchWindowAdvisor Class so aus: 


```
@Override
	public void postWindowCreate() {
		IWorkbenchWindow window = getWindowConfigurer().getWindow();
		IPerspectiveDescriptor perspectiveDescriptor = window.getWorkbench()
				.getPerspectiveRegistry().getPerspectives()[0];
		Perspective perspective = ((WorkbenchPage) window.getActivePage())
				.findPerspective(perspectiveDescriptor);
				
		IActionSetDescriptor[] actionSets = perspective.getAlwaysOnActionSets();

// hier soll dann etwas mit den ActionSets passieren
		}
	}
```

Ein ActionSet zu verstecken klappt mit "setInitiallyVisible(false)" eigentlich auch ganz gut, ABER! Da ich das erst aufrufe, nachdem das Fenster erstellt wurde (wie der Name postCreateWindow ja sagt), werden die ActionSets beim ersten Aufrufen des Programms noch angezeigt. Beim zweiten Aufruf dann logischerweise nicht mehr, aber das ist ja nicht Sinn und Zweck der Sache. Ich würds ja in die preWindowOpen-Methode schreiben, aber da zu diesem Zeitpunkt kein IWorkbenchWindow erstellt wurde, kann ich auch nich die Perspective finden. Zwickmühle.  

Meine erste Frage wäre also, wie man ActionSets geschickter außer Gefecht setzen kann oder wie man die Perspective unabhängig vom Fenster ansprechen kann (falls das überhaupt geht, da zweifle ich dran..).


Nun mein zweites Problem. Ich hab für mein RCP Plug-In ein Menü gebastelt, weil die Menüs ja nicht mitgeliefert werden (die Actions, die sich dahinter vergeben, zum größten Teil aber schon). War auch nich viel Aufwand, mehr Schreib- wie Denkarbeit. Leider sieht das ein bisschen unschön aus. Zuerst kommt "mein" Menü mit "File", "Edit", "Window" und "Help", danach kommt "Search" (das ich nicht erstellt habe, sondern wohl durch ein ActionSet in irgendeinem Plug-In hinzukommt) und noch ein Menüpunkt von einem andern Plug-In. Ist deshalb unschön, weil es so sein sollte, wie man es kennt. "Help" ganz rechts, als letztes Element im Menü. Jetzt hab ich schon was weiss ich wie versucht, auf das GANZE Menü zuzugreifen, also "mein" Menü und die Menüpunkte, die automatisch ergänzt wurden. Aber irgendwie wills mir nich gelingen. Ich möchte das Menü einfach nur neu anordnen. Und was auch auffällt (unter XP sieht man das fast nicht, aber unter Vista). Da sind zwischen zwei Menüs jeweils wenige Pixel mehr Platz als vorgesehen. Wenn man unter XP mit der Maus drauf geht, dann ist da ein kleiner Punkt, unter Vista ist da einfach nur ein bisschen mehr Freiraum. Ich vermute, dass das irgendwelche leeren Menüelemente sind oder sowas und die sollte man eigentlich auch raushauen. 

Meine zweite Frage ist also: wie kann ich auf das komplette Menü, so wie es angezeigt wird, zugreifen, um es zu sortieren?

Bin über jede Antwort froh.


----------



## Wildcard (12. Jul 2009)

Du kannst Menus von anderen PlugIns verstecken in dem du den capabilities Extension Point verwendst. Damit lassen sich Contributions von allen plugin.xml Namensbasiert ausblenden. Um herauszufinden welcher Button von welchem PlugIn kommt hilft der PlugIn Spy (Alt + Shift + F1)


----------



## Gonzo17 (12. Jul 2009)

Klasse, das hört sich doch vielversprechend an, danke.  Werde es morgen sofort testen. 

Und weisst du wie ich die Menüanordnung gescheit gebacken bekomme? Sieht halt bescheiden aus, wenn das Menü wild durcheinandergewürfelt ist und nicht so, wie man sich das erhofft.


----------



## Gonzo17 (15. Jul 2009)

Für die, die es interessiert. Ich habe nun ne Möglichkeit gefunden, die Menü-Struktur zu beeinflußen. Zugegeben, ich finds nicht sehr schön, aber besser als nichts. 

Um alle Items zu bekommen, die im Menü stehen, muss man in einer WorkbenchWindowAdvisor-Klasse (bei mir ApplicationWorkbenchWindowAdvisor) in der postWindowCreate()-Methode folgende Zeilen hinzufügen:


```
MenuManager menuManager = ((ApplicationWindow) getWindowConfigurer()
				.getWindow()).getMenuBarManager();
IContributionItem item = menuManager.getItems()[x];
```

Damit kann man dann eigentlich machen, was man will. Ich hab meine Menüanordnung so realisiert, dass ich mit einer for-Schleife die Items durchlaufen bin und die beiden Einträge an die Stelle gesetzt habe, wo sie hin sollen. Dabei muss man beachten, dass das Item zuerst gelöscht und dann wieder zum Menü hinzugefügt werden muss:


```
menuManager.remove(item);
item.dispose();
menuManager.add(item); 
item.fill(menuManager.getMenu(), menuManager.getItems().length - 1);
```

Dieses Beispiel fügt das Item an den Schluß hinzu. Statt der add-Methode kann man auch insert verwenden und dann die gewünschte Stelle angeben. 

Wenn noch jemand Verbesserungsvorschläge hat würd ich die natürlich gerne hören, bin dankbar für jede Hilfe.


----------

