Bug 366528 - [Compatibility] Implement IMenuService#populateContributionManager Alternate implementation. The model elements for populated toolbars and menus are treated as transient data. Must provide a "bridge" context for the renderers to find and must hook up the UIEventPublisher as they're not in the hierarchy.
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java index 8891f7b..5b305f8 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
@@ -32,6 +32,7 @@ import org.eclipse.e4.ui.model.application.ui.menu.MMenu; import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu; import org.eclipse.e4.ui.model.application.ui.menu.MToolItem; +import org.eclipse.e4.ui.model.internal.ModelUtils; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.IResourceUtilities; import org.eclipse.e4.ui.workbench.modeling.EModelService; @@ -544,6 +545,10 @@ protected IEclipseContext getContext(MUIElement part) { if (part instanceof MContext) { return ((MContext) part).getContext(); + } else if (part.getTransientData().containsKey( + ModelUtils.CONTAINING_CONTEXT)) { + return (IEclipseContext) part.getTransientData().get( + ModelUtils.CONTAINING_CONTEXT); } return getContextForParent(part); }
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java index b5c66bf..ed5d751 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
@@ -48,6 +48,7 @@ import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu; import org.eclipse.e4.ui.model.application.ui.menu.MToolItem; +import org.eclipse.e4.ui.model.internal.ModelUtils; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.IResourceUtilities; import org.eclipse.e4.ui.workbench.modeling.EModelService; @@ -872,6 +873,10 @@ protected IEclipseContext getContext(MUIElement part) { if (part instanceof MContext) { return ((MContext) part).getContext(); + } else if (part.getTransientData().containsKey( + ModelUtils.CONTAINING_CONTEXT)) { + return (IEclipseContext) part.getTransientData().get( + ModelUtils.CONTAINING_CONTEXT); } return getContextForParent(part); }
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 f4d21bf..8e6d3e2 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
@@ -466,8 +466,7 @@ return false; } if (menuBar || isPartMenu(menuModel)) { - final IEclipseContext parentContext = modelService - .getContainingContext(menuModel); + final IEclipseContext parentContext = getContext(menuModel); parentContext.runAndTrack(new RunAndTrack() { @Override public boolean changed(IEclipseContext context) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java index 6855518..18f034c 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerRendererFilter.java
@@ -260,8 +260,7 @@ if (cmd == null) { return; } - final IEclipseContext lclContext = modelService - .getContainingContext(item); + final IEclipseContext lclContext = renderer.getContext(item); EHandlerService service = lclContext.get(EHandlerService.class); final IEclipseContext staticContext = EclipseContextFactory .create(MMRF_STATIC_CONTEXT);
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java index df3e0b1..590d342 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
@@ -339,8 +339,7 @@ return false; } if (record.anyVisibleWhen()) { - final IEclipseContext parentContext = modelService - .getContainingContext(toolbarModel); + final IEclipseContext parentContext = getContext(toolbarModel); parentContext.runAndTrack(new RunAndTrack() { @Override public boolean changed(IEclipseContext context) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java index 1fbc751..7850546 100644 --- a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java +++ b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java
@@ -56,6 +56,7 @@ import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.model.application.ui.menu.MMenu; import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; +import org.eclipse.e4.ui.model.internal.ModelUtils; import org.eclipse.e4.ui.services.IStylingEngine; import org.eclipse.e4.ui.workbench.IPresentationEngine; import org.eclipse.e4.ui.workbench.IResourceUtilities; @@ -668,6 +669,10 @@ private IEclipseContext getContext(MUIElement parent) { if (parent instanceof MContext) { return ((MContext) parent).getContext(); + } else if (parent.getTransientData().containsKey( + ModelUtils.CONTAINING_CONTEXT)) { + return (IEclipseContext) parent.getTransientData().get( + ModelUtils.CONTAINING_CONTEXT); } return modelService.getContainingContext(parent); }
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4Workbench.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4Workbench.java index fc78a1c..3d58b6e 100644 --- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4Workbench.java +++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4Workbench.java
@@ -70,6 +70,7 @@ } uiEventPublisher = new UIEventPublisher(appContext); + appContext.set(UIEventPublisher.class, uiEventPublisher); ((Notifier) uiRoot).eAdapters().add(uiEventPublisher); }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java index 561659b..51c787b 100755 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java
@@ -20,6 +20,7 @@ import org.eclipse.e4.core.contexts.ContextFunction; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer; +import org.eclipse.e4.ui.internal.workbench.UIEventPublisher; import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.MApplicationElement; @@ -40,6 +41,7 @@ import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarContributionRecord; import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer; import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory; +import org.eclipse.emf.common.notify.Notifier; import org.eclipse.jface.action.ContributionManager; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.MenuManager; @@ -364,6 +366,7 @@ } toolbars.add(tb); tb.getTransientData().put(ModelUtils.CONTAINING_CONTEXT, ctx); + ((Notifier) tb).eAdapters().add(ctx.get(UIEventPublisher.class)); } private void addMenu(MApplicationElement model, MMenu menu, IEclipseContext ctx) { @@ -377,6 +380,7 @@ } menus.add(menu); menu.getTransientData().put(ModelUtils.CONTAINING_CONTEXT, ctx); + ((Notifier) menu).eAdapters().add(ctx.get(UIEventPublisher.class)); } protected MMenu getMenuModel(MenuManager menuManager, MenuLocationURI location) {
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/Bug320857Test.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/Bug320857Test.java index 4ee42fb..fed8931 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/Bug320857Test.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/Bug320857Test.java
@@ -57,8 +57,9 @@ applicationContext.set(MApplication.class.getName(), application); application.setContext(applicationContext); E4Workbench.processHierarchy(application); - ((Notifier) application).eAdapters().add( - new UIEventPublisher(applicationContext)); + final UIEventPublisher ep = new UIEventPublisher(applicationContext); + ((Notifier) application).eAdapters().add(ep); + applicationContext.set(UIEventPublisher.class, ep); } private IPresentationEngine getEngine() {
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java index 1089b7a..1e0bbf7 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java
@@ -10156,8 +10156,9 @@ private void initialize() { E4Workbench.processHierarchy(application); - ((Notifier) application).eAdapters().add( - new UIEventPublisher(applicationContext)); + final UIEventPublisher ep = new UIEventPublisher(applicationContext); + ((Notifier) application).eAdapters().add(ep); + applicationContext.set(UIEventPublisher.class, ep); applicationContext.set(ISaveHandler.class.getName(), new ISaveHandler() {
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/ESelectionServiceTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/ESelectionServiceTest.java index 7f9896a..b8b24a4 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/ESelectionServiceTest.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/ESelectionServiceTest.java
@@ -1109,8 +1109,9 @@ }); application.setContext(applicationContext); E4Workbench.processHierarchy(application); - ((Notifier) application).eAdapters().add( - new UIEventPublisher(applicationContext)); + final UIEventPublisher ep = new UIEventPublisher(applicationContext); + ((Notifier) application).eAdapters().add(ep); + applicationContext.set(UIEventPublisher.class, ep); } static class SelectionListener implements ISelectionListener {
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/HeadlessApplicationElementTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/HeadlessApplicationElementTest.java index a9b39a4..d25a1a7 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/HeadlessApplicationElementTest.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/HeadlessApplicationElementTest.java
@@ -27,8 +27,9 @@ applicationElement = createApplicationElement(applicationContext); // Hook the global notifications - ((Notifier) applicationElement).eAdapters().add( - new UIEventPublisher(applicationContext)); + final UIEventPublisher ep = new UIEventPublisher(applicationContext); + ((Notifier) applicationElement).eAdapters().add(ep); + applicationContext.set(UIEventPublisher.class, ep); } protected abstract MApplicationElement createApplicationElement(
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/UIEventsTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/UIEventsTest.java index 20ecce0..59e9cf8 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/UIEventsTest.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/UIEventsTest.java
@@ -234,8 +234,9 @@ // Create the test harness and hook up the event publisher MTestHarness allData = MTestFactory.eINSTANCE.createTestHarness(); - ((Notifier) allData).eAdapters().add( - new UIEventPublisher(applicationContext)); + final UIEventPublisher ep = new UIEventPublisher(applicationContext); + ((Notifier) allData).eAdapters().add(ep); + applicationContext.set(UIEventPublisher.class, ep); // AppElement reset(allTesters);