Menu- und Toolbareinträge entfernen

rcp_user

Grünschnabel
Liebe RCP Experten,
ich habe mal wieder ein Problem was nach einer sauberen Lösung schreit!

Bei der Einbindung von anderen PlugIns in das eigene PlugIn wird die Menuleiste oftmals spezifisch um Menus ergänzt und die Toolbar um Einträge erweitert. Über plugin.xml hat man dabei nicht die Möglichkeit diese zu deaktivieren. Wie kann man in seiner RCP Anwendung auf saubere Art und Weise ausschließlich die eigenen Menu- und Toolbareinträge anzeigen lassen?

Hier meine momentane Lösung die leider beim Verlassen der Anwendung eine NullPointerException wirft. In der Methode postWindowOpen() der Klasse ApplicationWorkbenchWindowAdvisor führe ich folgenden Code aus:

Java:
MenuManager mbManager = ((ApplicationWindow)getWindowConfigurer().getWindow()).getMenuBarManager();
		for (int i = 0; i < mbManager.getItems().length; i++) {
			IContributionItem item = mbManager.getItems()[i];
			if (!item.getId().equals("myMenuID")) {
				item.setVisible(false);
				item.dispose();
			}
		}

CoolBarManager cbManager = ((ApplicationWindow)getWindowConfigurer().getWindow()).getCoolBarManager();
		for (int i = 0; i < cbManager.getItems().length; i++) {
			IContributionItem item = cbManager.getItems()[i];
			System.out.println(item.getId());
			if (!item.getId().equals("myActionSetID")) {
				item.setVisible(false);
				item.dispose();
			}	
		}
Ich bin dankbar für alle Ratschläge und Hinweise...
 
Zuletzt bearbeitet:
Wird vermutlich schwierig werden... Da der Grundgedanke des Frameworks ja ist, dass jedes Plugin seine Contributions liefern kann und das Blockieren derselben dem ja widerspricht... eigentlich wäre es die Sache derjenigen, die es zur Verfügung stellen, die Einträge nicht zu erzwingen sondern zum Beispiel von einem Parameter abhängig zu machen, aufgrund dessen Werts sie ein- resp. ausgeblendet werden.

Sollte es nicht so sein:

Eine Möglichkeit sie denoch zu entfernen wäre der Extensionpoint org.eclipse.ui.activities... der bietet die Möglichkeit Aktivitäten in der Workbench einzuschränken resp. zuzulassen... Wie dieser allerdings solche Aktivitäten erkennt, resp. wie du sie definierst, liest du am besten z.B. hier nach (auf Englisch), da das ganze eher komplex ist... Du müsstest Contributions aufgrund eines regulären Ausdrucks an ihren IDs identifizieren und dann abschalten, ausser jene, die das andere Plugin geschrieben haben, haben ihm bereits Activities zugewiesen, welche du dann einfach abschalten könntest...

Eine andere Möglichkeit - die zeitaufwändig ist - wäre, die andern plugins zu entpacken und ihr plugin.xml umzuschreiben, um Contributions zu entfernen... Da kenn ich auch Leute, die das tatsächlich auf die Art machen..

.bile
 
Besten Dank für die Antwort. Ich habe jetzt noch eine programmatische Lösung aus dem Netz gefischt, die relativ unkompliziert das gewünschte Verhalten leistet:

Einfach folgenden Snippet in die Methode makeActions() der Klasse ActionBarAdvisor einfügen umd ungewünschte ActionSets anderer PlugIns zu entfernen:

Java:
    // creates the list of unwanted actions
    ArrayList unWantedActions = new ArrayList();
    unWantedActions.add("org.eclipse.ui.WorkingSetActionSet");
    unWantedActions.add("org.eclipse.ui.actionSet.openFiles");
    unWantedActions.add("org.eclipse.update.ui.softwareUpdates");

    ActionSetRegistry reg = WorkbenchPlugin.getDefault().getActionSetRegistry();
    IActionSetDescriptor[] actionSets = reg.getActionSets();

    for (int i = 0; i < actionSets.length; i++) {
      if(unWantedActions.contains(actionSets[i].getId())) {
        IExtension ext = actionSets[i] .getConfigurationElement().getDeclaringExtension();
        // removes the unwanted action
        reg.removeExtension(ext, new Object[]{actionSets[i]});
      }
    }

Die IDs der ActionSets kann man beispielsweise mit folgendem Snippet in der Methode postWindowOpen() der Klasse ApplicationWorkbenchWindowAdivsor rauslesen:

Java:
                // lists all ActionSet IDs
		CoolBarManager cbManager = ((ApplicationWindow)getWindowConfigurer().getWindow()).getCoolBarManager();
		for (int i = 0; i < cbManager.getItems().length; i++) {
			IContributionItem item = cbManager.getItems()[i];
			System.out.println(item.getId());
		}
 
Zuletzt bearbeitet:
Nutz doch bitte code Tags, dann ist es wesentlich uebersichtilcher
Einfach ein [_JAVA] vor den Code und ein [_/JAVA] nach dem Code, ohne die Unterstriche
 

Neue Beiträge

Zurück