# IWorkbenchWindowActionDelegate programatisch registrieren



## foobar (7. Aug 2008)

Hi,

es geht immer noch um Actions ;-) Ich habe ein paar Actions die ich ApplicationActionAdvisor durch die Methode register registriere. Diese Actions verwende ich in einem Menü, daß zur Laufzeit erst erstellt wird, weil er zur laufzeit klar ist welche Menüeinträge überhaupt zur Verfügung stehen. Der Hintergrund ist der, daß die Anwendung per Customizing an die Wünsche des Kunden anpassbar ist. Daher kann man jeden Menüeintrag deaktivieren und nocht vieles mehr.
Jetzt habe ich aber das Problem, daß sich normale org.eclipse.jface.action.Actions nicht selbstständig enablen/disbalen können anhand der Selection.
Zu diesem Zweck gibt es ja die IWorkbenchWindowActionDelegate. Diese Delegateklasse kann ich aber nur deklarativ erstellen und einem ActionSet hinzufügen. Kann man das auch programatisch ohne ActionSet machen? Oder kann man org.eclipse.jface.action.Actions dazu bringen sich selbst um ihren enabledstate zu kümmern?

Viele Grüße,
foobar


----------



## dzim (7. Aug 2008)

Hm...
Also ich weiß nicht, ob ich das richtig verstanden hab, aber du willst, dass die Menüeinträge dynamisch bleiben - also on demand sich an und aus schalten.

Ich hab das nach einem Tutorial gemacht und mach das derzeit immer so (weiß aber gerade nicht mehr, welches Tutorial)

Ich habe eine Reihe ActionDelegates, die die eigentliche Arbeit machen (hab ich so gemacht, weil ich sie zumeist auch als Menüeinträge am RCP eintrage - aber bei weitem nicht alle)

Dann habe ich eine Reihe JFace-Actions, die die ActionDelegates nutzen:

```
public class OpenEditorAction extends Action {

	public OpenEditorAction(String title) {
		super(title);
	}

	@Override
	public void run() {
		OpenEditorActionDelegate openEditor = new OpenEditorActionDelegate();
		openEditor.init(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
		openEditor.run(this);
	}
}
```

Diese Action öffnet z.B. einen Editor mithilfe dieser ActionDelegate (Ich geb zu - das ist nicht immer super toll, aber es funktioniert :-D )


```
public class OpenEditorActionDelegate implements
		IWorkbenchWindowActionDelegate, IWorkbenchWindowPulldownDelegate {

	private IWorkbenchWindow window;

	public OpenEditorActionDelegate() {
	}

	@Override
	public void dispose() {
	}

	@Override
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}

	@Override
	public void run(IAction action) {

		// get all views as references
		IViewReference[] refs = window.getActivePage().getViewReferences();

		// iterate over these references until the active
		// (and hopefully calling) view for this ActionDelegate
		try {
			for (IViewReference ref : refs) {

				if (ref.getId().equals(SSDMainView.ID)) {

					// if a reference of the active view was found, load it
					SSDMainView ssdMV = ((SSDMainView) window.getActivePage()
							.findView(ref.getId()));

					// ... and retrieve the editor description
					String editorDescription = (String) ((IStructuredSelection) ssdMV
							.getViewer().getSelection()).getFirstElement();

					File file2Edit = null;
					String editorID = "";

					// ... create a file object, depending on this this
					// description
					if (editorDescription
							.equals(Config.SETTINGS_NAME)) {

						if (Activator.getModel().getWorkspace() != null) {
							file2Edit = new File(Activator.getModel()
									.getWorkspace(),
									Config.SETTINGS_XML);
						}

						editorID = "bla.rcp.setscrewdriver.ui.editor.SSDPrefilterEditor";

					} else if (editorDescription
							.equals(Config.REPORT_SETTINGS_NAME)) {

						if (Activator.getModel().getWorkspace() != null) {
							file2Edit = new File(Activator.getModel()
									.getWorkspace(),
									Config.REPORT_SETTINGS_XML);
						}

						editorID = "bla.rcp.setscrewdriver.ui.editor.SSDReportEditor";

					} else if (editorDescription
							.equals(Config.SELECTION_NAME)) {

						if (Activator.getModel().getWorkspace() != null) {
							file2Edit = new File(Activator.getModel()
									.getWorkspace(),
									Config.SCREENING_SELECTION_XML);
						}

						editorID = "bla.rcp.setscrewdriver.ui.editor.SSDSelectionEditor";
					}

					// ... create an instance of SetScrew dependend IEditorInput
					// use the description as a title and the file as the input
					SSDEditorInput input = new SSDEditorInput(
							editorDescription, file2Edit);

					if (file2Edit != null) {
						input.setFile(file2Edit);
					}


					window.getActivePage().openEditor(input, editorID, true,
							IWorkbenchPage.MATCH_ID);
				}
			}
		} catch (PartInitException e) {

			System.err.println(e.getMessage());
			Logger.logError(e);
		}
	}

	@Override
	public void selectionChanged(IAction action, ISelection selection) {
	}

	@Override
	public Menu getMenu(Control parent) {
		return parent.getMenu();
	}

}
```

Wenn das funzt öffnet sich der Editor (von einem View aus halt)
Dort habe ich dann eine private Var der Action


```
private OpenEditorAction openEditorAction;
```

in der _createPartControl()_ rufe ich am Ende die methode _initializeActions();_ auf:


```
openEditorAction = new OpenEditorAction("Open SSD Editor");
```

dann habe ich noch eine _createContextMenu(Composite parentControler);_-Methode die die ein Kontextmenü initialisiert


```
private void createContextMenu(Composite parentControler) {

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

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

			@Override
			public void menuAboutToShow(IMenuManager manager) {
				fillContextMenu(manager);
			}
		});
		Menu menu = mMgr.createContextMenu(parentControler);

		// add to parent composite
		parentControler.setMenu(menu);
		// add to viewers
		this.viewer.getControl().setMenu(menu);
		this.getSite().registerContextMenu(mMgr, this.viewer);
	}
```

...und die die Methode 


```
private void fillContextMenu(IMenuManager manager) {

		// ------------------- DEFINITELY ACTIVATE -------------------
		openWorkspaceAction.setEnabled(true);
		saveWorkspaceAction.setEnabled(true);
		saveWSToZipAction.setEnabled(true);
		openEditorAction.setEnabled(true);

		// ------------- DECIDE WETHER TO ACTIVATE IT OR NOT----------
		// decide if you enable or disable your Action (because of selected views... whatever)

		// ------------- ADD TO MENU ---------------------------------
		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
		manager.add(openEditorAction);

		// XXX add all actions here
	}
```

aufruft... und fertig

Hoffe das hilf vielleicht - bei mir klappts...


----------



## foobar (9. Aug 2008)

Erstmal Danke für deine Antwort.

Ich glaube aber, daß ich bei den jfaceActions bleibe und einfach eine Registry erstelle, um von überall daruf zugreifen zu können. Dann kann ich auch wieder Actions deaktivieren oder ein gesamtes Menü deaktivieren.


----------

