# Programatische Erweiterung des Menues eines



## reinsle (15. Nov 2009)

Hallo Forum, 

wie im vorherigen Post baue ich an einer Anwendung, die eine Verbindung zu einer Datenbank aufbauen kann. Jetzt möchte ich gerne optional mehrere Verbindungen anbieten. Vom UI her habe ich mir das so gedacht, das ich für den Connect-Command eine Pull-Down-Componente verwende. Hier kann ich ja ein Menue definieren. Gibt es eine Möglichkeit, dieses Menue per Code zu erweitern? Ich würde gerne die verfügbaren Connections, die über eine Preference-Page konfiguriert werden, über das Drop-Down anbieten, dann kann der User eine Connection wählen, und mit dieser dann arbeiten. Dazu sollen dann bei einer aktiven Verbindung die anderen Einträge disables sein. Ist sowas machbar?

Vielen Dank

Robert


----------



## Gast2 (15. Nov 2009)

Warum willst du es per Code erweitern und nicht in der plugin.xml ??? schau dir das mal an
Eclipse RCP - Tutorial (Eclipse 3.5)

da werden beide wege gezeigt


----------



## reinsle (15. Nov 2009)

Hy SirWayne,

ich kenne das Tutorial, aber da ist nur der Weg über die Plugin.xml drinne (Ausser ich hab was überlesen *gg*).

Über die plugin.xml gehts bei mir nicht, da die Datenbankverbindungen nicht von vorneherein feststehen, diese sind über einen Preference-Dialog konfiguriert. Da komm ich imo noch per Programm hin.

Robert


----------



## Gast2 (15. Nov 2009)

Hier mal ein Beispiel

```
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

    private IWorkbenchAction saveAction;

    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
        super(configurer);
    }

    protected void makeActions(IWorkbenchWindow window){
      saveAction = ActionFactory.SAVE.create(window);
      register(saveAction);
    }

    protected void fillMenuBar(IMenuManager menuBar) {

      final MenuManager fileMenu = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
fileMenu .add(saveActions);
    }

    protected void fillCoolBar(ICoolBarManager coolBar) {

      IToolBarManager toolbar1 = new ToolBarManager(SWT.FLAT | SWT.RIGHT);

    }
```


----------



## reinsle (16. Nov 2009)

Hy SirWayne,

vielleicht stelle ich mich jetzt gerade besonders blöde an, aber wenn ich in ein Menue eingreifen will, dann brauch ich doch die Referenz auf das Top-Menue.

Beispiel:  


```
protected void fillMenuBar(IMenuManager menuBar) {
		MenuManager fileMenu = new MenuManager("&File",
				IWorkbenchActionConstants.M_FILE);
		menuBar.add(fileMenu);
	}
```

hier wird als Beispiel das File-Menu dem Haupt-Menue hinzugefügt. Dazu habe ich aber zugriff auf das Hauptmenue. Den habe ich aber in meinem Beispiel / Problem nicht. Bzw. um es richtiger zu sagen, ich meine ihn nicht zu haben, oder hab ihn noch ned gefunden 

Robert


----------



## Gast2 (16. Nov 2009)

he was??? Versteh ich nicht...
Du hast den menumanager und da kannst du deine untermenus adden...
Was genau ist dein Problem?


----------



## reinsle (16. Nov 2009)

Hy,

hab ichs doch geschafft dich zu verwirren 

Also ich hab einen Handler definiert. Dazu über die Plugin.xml ein Command. Dieses Command bau ich jetzt in meine Toolbar ein:

[XML]
  <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="toolbarrg.eclipse.ui.main.toolbar?after=additions">
         <toolbar
               id="...connection">
            <command
                  commandId="...command.ConnectionCommand"
                  icon="icons/remdisc.gif"
                  label="Connect"
                  style="pulldown"
                  tooltip="Aufbau der Datenbankverbindung">
            </command>
         </toolbar>
      </menuContribution>
   </extension>
[/XML]

Zusätzlich hab ich das Menue definiert:

[XML]
      <menuContribution
            locationURI="menu:...command.ConnectionCommand">
         <command
               commandId="...command.PreferencesCommand"
               icon="icons/db16x16.gif"
               style="push">
         </command>
      </menuContribution>
[/XML]

Das ist jetzt das Menue, wenn ich auf den Pull-Down am Button klicke, aufgeht.
Und genau dieses Menue würde ich jetzt gerne erweitern. Allerdings wie gesagt aus dem Programmcode heraus. Weil die Actionen, die ich hier brauche abhängig von den definierten Connections sind, die ich über eine Preference-Page hab.

Robert


----------



## Gast2 (16. Nov 2009)

Irgendwie reden wir aneinander vorbei...
Du hast einen DropDown Button in deiner Toolbar und willst nun das contextMenü erstellen?


----------



## reinsle (16. Nov 2009)

Jap 

und was ich im Moment (noch) nicht kapiere, wie ich das menue, das ich per plugin.xml erstellt habe, im Java-Code erweitern kann.

Robert


----------



## Gast2 (16. Nov 2009)

reinsle hat gesagt.:


> Jap
> 
> und was ich im Moment (noch) nicht kapiere, wie ich das menue, das ich per plugin.xml erstellt habe, im Java-Code erweitern kann.
> 
> Robert



Ich glaub nicht dass das geht


----------



## reinsle (22. Nov 2009)

Hy zusammen,

also es geht doch *ggg*

Manchmal hilft Augen auf beim Eierkauf.

Was mich stutzig gemacht hat, das man beim Menue eine class-Angabe hat. Dort habe ich mal weitergeforscht.







Die Java-Klasse:


```
public void createContributionItems(IServiceLocator serviceLocator,
			IContributionRoot additions) {
		try {
			ConnectionDescriptorList list = ConnectionPreferencePage.readConnectionsFromStore(ConnectionActivator.getDefault().getPreferenceStore());
			for (int i = 0; i < list.getConnections().size(); i++) {
				ConnectionDescriptor desc = list.getConnections().get(i);
				CommandContributionItemParameter p = new CommandContributionItemParameter(serviceLocator, "", "de.on_ergy.sova.connection.command.ActiveConnectionCommand", SWT.PUSH);
				p.label = desc.getName();
				if (desc.getName().equals(list.getActiveName())) {
					p.icon = ConnectionActivator.imageDescriptorFromPlugin(ConnectionActivator.PLUGIN_ID, ConnectionImageRegistry.ICON_AKTIV);
				}
				CommandContributionItem item = new CommandContributionItem(p);
				item.setVisible(!ConnectionActivator.isConnected());
				additions.addContributionItem(item, null);
				
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
			Status status = new Status(IStatus.ERROR, ConnectionActivator.PLUGIN_ID, e.getMessage(), e);
			ErrorDialog ed = new ErrorDialog(Display.getDefault().getActiveShell(), "Fehler", "Fehler beim auslesen der Connections", status, IStatus.ERROR);
			ed.open();
		}
		CommandContributionItemParameter p = new CommandContributionItemParameter(serviceLocator, "", "de.on_ergy.sova.connection.command.PreferencesCommand", SWT.PUSH);
		p.icon = ConnectionActivator.imageDescriptorFromPlugin(ConnectionActivator.PLUGIN_ID, ConnectionImageRegistry.ICON_DB);
		CommandContributionItem item = new CommandContributionItem(p);
		additions.addContributionItem(item, null);
	}
```

und damit geht auch das dynamische erweitern des Push-Down Menues.

Robert


----------

