From 2d66e04c48991203af1c624a69877928796b40e8 Mon Sep 17 00:00:00 2001 From: Sopot Cela Date: Tue, 19 Nov 2013 12:13:09 +0100 Subject: Bug 391430 - Dynamically creating / deleting menu items in Menu and MPopupMenu doesn't work Change-Id: I0257600c4aa8f2f4fba8944787f401a7d205f804 Signed-off-by: Sopot Cela --- .../renderers/swt/MenuManagerRenderer.java | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'bundles') diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java index 349c94262ed..49ffbd75a6d 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRenderer.java @@ -250,6 +250,29 @@ public class MenuManagerRenderer extends SWTPartRenderer { } }; + private EventHandler childrenUpdater = new EventHandler() { + + public void handleEvent(Event event) { + Object changedObj = event.getProperty(UIEvents.EventTags.ELEMENT); + if (changedObj instanceof MMenu) { + MMenu menuModel = (MMenu) changedObj; + MenuManager manager = getManager(menuModel); + if (manager == null) + return; + if (UIEvents.isREMOVE(event)) { + MMenuElement menuElement = (MMenuElement) event + .getProperty(UIEvents.EventTags.OLD_VALUE); + handleMenuElementRemove(manager, menuElement); + } else if (UIEvents.isADD(event)) { + MMenuElement menuElement = (MMenuElement) event + .getProperty(UIEvents.EventTags.NEW_VALUE); + handleMenuElementAdd(manager, menuElement); + } + } + + } + }; + private MenuManagerRendererFilter rendererFilter; @PostConstruct @@ -260,6 +283,8 @@ public class MenuManagerRenderer extends SWTPartRenderer { eventBroker.subscribe(UIEvents.Item.TOPIC_ENABLED, enabledUpdater); eventBroker .subscribe(UIEvents.UIElement.TOPIC_ALL, toBeRenderedUpdater); + eventBroker.subscribe(UIEvents.ElementContainer.TOPIC_CHILDREN, + childrenUpdater); context.set(MenuManagerRenderer.class, this); Display display = context.get(Display.class); @@ -276,6 +301,29 @@ public class MenuManagerRenderer extends SWTPartRenderer { } + /** + * @param manager + * @param menuElement + */ + protected void handleMenuElementAdd(MenuManager manager, + MMenuElement menuElement) { + modelProcessSwitch(manager, menuElement); + } + + /** + * @param manager + * @param menuElement + */ + protected void handleMenuElementRemove(MenuManager manager, + MMenuElement menuElement) { + if (menuElement instanceof MMenu) { + MMenu menuModel = (MMenu) menuElement; + manager.remove(getManager(menuModel)); + } else + manager.remove(getContribution(menuElement)); + manager.update(false); + } + @PreDestroy public void contextDisposed() { eventBroker.unsubscribe(itemUpdater); @@ -283,6 +331,7 @@ public class MenuManagerRenderer extends SWTPartRenderer { eventBroker.unsubscribe(selectionUpdater); eventBroker.unsubscribe(enabledUpdater); eventBroker.unsubscribe(toBeRenderedUpdater); + eventBroker.unsubscribe(childrenUpdater); ContextInjectionFactory.uninject(MenuManagerEventHelper.showHelper, context); -- cgit v1.2.3