Bug 330699 - [Compatibility] Toolbar drop downs do not appear
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java
index a0c79a2..de8ebf5 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java
@@ -23,6 +23,7 @@
import org.eclipse.e4.core.commands.ECommandService;
import org.eclipse.e4.core.commands.EHandlerService;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IContextFunction;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.services.contributions.IContributionFactory;
@@ -31,6 +32,7 @@
import org.eclipse.e4.ui.bindings.EBindingService;
import org.eclipse.e4.ui.internal.workbench.Activator;
import org.eclipse.e4.ui.internal.workbench.Policy;
+import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.model.application.MContribution;
import org.eclipse.e4.ui.model.application.commands.MParameter;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
@@ -40,11 +42,14 @@
import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
import org.eclipse.e4.ui.model.application.ui.menu.MItem;
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.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.bindings.TriggerSequence;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
@@ -68,9 +73,6 @@
@Inject
IEventBroker eventBroker;
- @Inject
- private IPresentationEngine engine;
-
private EventHandler itemUpdater = new EventHandler() {
public void handleEvent(Event event) {
// Ensure that this event is for a MToolItem
@@ -304,8 +306,7 @@
ti.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (e.detail == SWT.ARROW) {
- Menu menu = (Menu) engine.createGui(mmenu, ti
- .getParent().getShell(), null);
+ Menu menu = getMenu(mmenu, ti);
Rectangle itemBounds = ti.getBounds();
Point displayAt = ti.getParent().toDisplay(
@@ -421,4 +422,43 @@
});
}
}
+
+ /**
+ * @param mmenu
+ * @param shell
+ * @return
+ */
+ protected Menu getMenu(MMenu mmenu, ToolItem toolItem) {
+ Object obj = mmenu.getWidget();
+ if (obj instanceof Menu) {
+ return (Menu) obj;
+ }
+ // this is a temporary passthrough of the IMenuCreator
+ if (mmenu instanceof MRenderedMenu) {
+ obj = ((MRenderedMenu) mmenu).getContributionManager();
+ if (obj instanceof IContextFunction) {
+ final IEclipseContext lclContext = getContext(mmenu);
+ obj = ((IContextFunction) obj).compute(lclContext);
+ ((MRenderedMenu) mmenu).setContributionManager(obj);
+ }
+ if (obj instanceof IMenuCreator) {
+ final IMenuCreator creator = (IMenuCreator) obj;
+ final Menu menu = creator.getMenu(toolItem.getParent()
+ .getShell());
+ if (menu != null) {
+ toolItem.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (menu != null && !menu.isDisposed()) {
+ creator.dispose();
+ }
+ }
+ });
+ mmenu.setWidget(menu);
+ menu.setData(AbstractPartRenderer.OWNING_ME, menu);
+ return menu;
+ }
+ }
+ }
+ return null;
+ }
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
index d936a0e..a6554ae 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
@@ -507,54 +507,62 @@
MRenderedMenu menu = MenuFactoryImpl.eINSTANCE.createRenderedMenu();
ECommandService cs = app.getContext().get(ECommandService.class);
final ParameterizedCommand parmCmd = cs.createCommand(cmdId, null);
- menu.setContributionManager(new IMenuCreator() {
- private ActionDelegateHandlerProxy handlerProxy;
+ IContextFunction generator = new ContextFunction() {
+ @Override
+ public Object compute(IEclipseContext context) {
+ return new IMenuCreator() {
+ private ActionDelegateHandlerProxy handlerProxy;
- private ActionDelegateHandlerProxy getProxy() {
- if (handlerProxy == null) {
- handlerProxy = new ActionDelegateHandlerProxy(element,
- IWorkbenchRegistryConstants.ATT_CLASS, id, parmCmd, PlatformUI
+ private ActionDelegateHandlerProxy getProxy() {
+ if (handlerProxy == null) {
+ handlerProxy = new ActionDelegateHandlerProxy(element,
+ IWorkbenchRegistryConstants.ATT_CLASS, id, parmCmd,
+ PlatformUI
.getWorkbench().getActiveWorkbenchWindow(), null, null,
- null);
- }
- return handlerProxy;
- }
+ null);
+ }
+ return handlerProxy;
+ }
- private IWorkbenchWindowPulldownDelegate getDelegate() {
- getProxy();
- if (handlerProxy == null) {
- return null;
- }
- if (handlerProxy.getDelegate() == null) {
- handlerProxy.loadDelegate();
+ private IWorkbenchWindowPulldownDelegate getDelegate() {
+ getProxy();
+ if (handlerProxy == null) {
+ return null;
+ }
+ if (handlerProxy.getDelegate() == null) {
+ handlerProxy.loadDelegate();
- ISelectionService service = PlatformUI.getWorkbench()
- .getActiveWorkbenchWindow().getSelectionService();
- IActionDelegate delegate = handlerProxy.getDelegate();
- delegate.selectionChanged(handlerProxy.getAction(), service.getSelection());
- }
- return (IWorkbenchWindowPulldownDelegate) handlerProxy.getDelegate();
- }
+ ISelectionService service = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow().getSelectionService();
+ IActionDelegate delegate = handlerProxy.getDelegate();
+ delegate.selectionChanged(handlerProxy.getAction(),
+ service.getSelection());
+ }
+ return (IWorkbenchWindowPulldownDelegate) handlerProxy.getDelegate();
+ }
- public Menu getMenu(Menu parent) {
- IWorkbenchWindowPulldownDelegate2 delegate = (IWorkbenchWindowPulldownDelegate2) getDelegate();
- if (delegate == null) {
- return null;
- }
- return delegate.getMenu(parent);
- }
+ public Menu getMenu(Menu parent) {
+ IWorkbenchWindowPulldownDelegate2 delegate = (IWorkbenchWindowPulldownDelegate2) getDelegate();
+ if (delegate == null) {
+ return null;
+ }
+ return delegate.getMenu(parent);
+ }
- public Menu getMenu(Control parent) {
- return getDelegate() == null ? null : getDelegate().getMenu(parent);
- }
+ public Menu getMenu(Control parent) {
+ return getDelegate() == null ? null : getDelegate().getMenu(parent);
+ }
- public void dispose() {
- if (handlerProxy != null) {
- handlerProxy.dispose();
- handlerProxy = null;
- }
+ public void dispose() {
+ if (handlerProxy != null) {
+ handlerProxy.dispose();
+ handlerProxy = null;
+ }
+ }
+ };
}
- });
+ };
+ menu.setContributionManager(generator);
item.setMenu(menu);
} else {
item.setType(ItemType.PUSH);