diff options
Diffstat (limited to 'bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java')
-rw-r--r-- | bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java index e10afdd4bab..b22cb04d625 100644 --- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java +++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuManagerShowProcessor.java @@ -7,17 +7,27 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Marco Descher <marco@descher.at> - Bug 389063 Dynamic Menu Contribution *******************************************************************************/ package org.eclipse.e4.ui.workbench.renderers.swt; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.inject.Inject; +import org.eclipse.e4.core.contexts.ContextInjectionFactory; +import org.eclipse.e4.core.contexts.EclipseContextFactory; import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.services.contributions.IContributionFactory; +import org.eclipse.e4.ui.di.AboutToShow; import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer; import org.eclipse.e4.ui.internal.workbench.swt.Policy; import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator; import org.eclipse.e4.ui.model.application.ui.MContext; +import org.eclipse.e4.ui.model.application.ui.menu.MDynamicMenuContribution; import org.eclipse.e4.ui.model.application.ui.menu.MMenu; +import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement; import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu; import org.eclipse.e4.ui.workbench.modeling.EModelService; import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory; @@ -49,6 +59,9 @@ public class MenuManagerShowProcessor implements IMenuListener2 { @Inject private MenuManagerRenderer renderer; + @Inject + private IContributionFactory contributionFactory; + private HashMap<Menu, Runnable> pendingCleanup = new HashMap<Menu, Runnable>(); /* @@ -65,6 +78,7 @@ public class MenuManagerShowProcessor implements IMenuListener2 { MenuManager menuManager = (MenuManager) manager; final MMenu menuModel = renderer.getMenuModel(menuManager); final Menu menu = menuManager.getMenu(); + if (menuModel != null && menuManager != null) { cleanUp(menu, menuModel, menuManager); } @@ -89,6 +103,8 @@ public class MenuManagerShowProcessor implements IMenuListener2 { * @see * org.eclipse.jface.action.IMenuListener2#menuAboutToHide(org.eclipse.jface * .action.IMenuManager) + * + * SWT.Show post processing method for MenuManager */ public void menuAboutToHide(IMenuManager manager) { if (!(manager instanceof MenuManager)) { @@ -98,10 +114,81 @@ public class MenuManagerShowProcessor implements IMenuListener2 { final MMenu menuModel = renderer.getMenuModel(menuManager); final Menu menu = menuManager.getMenu(); if (menuModel != null) { + processDynamicElements(menuModel, menuManager); showMenu(menu, menuModel, menuManager); } } + /** + * HashMap key for storage of {@link MDynamicMenuContribution} elements used + * in {@link #processDynamicElements(MMenu, MenuManager)} + */ + protected static final String DYNAMIC_ELEMENT_STORAGE_KEY = MenuManagerShowProcessor.class + .getSimpleName() + ".dynamicElements"; //$NON-NLS-1$ + + /** + * Process dynamic menu contributions provided by + * {@link MDynamicMenuContribution} application model elements + * + * @param menuModel + * @param menuManager + * + */ + private void processDynamicElements(MMenu menuModel, MenuManager menuManager) { + MMenuElement[] ml = menuModel.getChildren().toArray( + new MMenuElement[menuModel.getChildren().size()]); + for (int i = 0; i < ml.length; i++) { + + MMenuElement currentMenuElement = ml[i]; + if (currentMenuElement instanceof MDynamicMenuContribution) { + Object contribution = ((MDynamicMenuContribution) currentMenuElement) + .getObject(); + if (contribution == null) { + IEclipseContext context = modelService + .getContainingContext(menuModel); + contribution = contributionFactory.create( + ((MDynamicMenuContribution) currentMenuElement) + .getContributionURI(), context); + ((MDynamicMenuContribution) currentMenuElement) + .setObject(contribution); + } + + IEclipseContext dynamicMenuContext = EclipseContextFactory + .create(); + ArrayList<MMenuElement> mel = new ArrayList<MMenuElement>(); + dynamicMenuContext.set(List.class, mel); + ContextInjectionFactory.invoke(contribution, AboutToShow.class, + dynamicMenuContext); + + // remove existing entries for this dynamic contribution item if + // there are any + Map<String, Object> storageMap = currentMenuElement + .getTransientData(); + @SuppressWarnings("unchecked") + ArrayList<MMenuElement> dump = (ArrayList<MMenuElement>) storageMap + .get(DYNAMIC_ELEMENT_STORAGE_KEY); + if (dump != null && dump.size() > 0) + renderer.removeDynamicMenuContributions(menuManager, + menuModel, dump); + + storageMap.remove(DYNAMIC_ELEMENT_STORAGE_KEY); + + // ensure that each element of the list has a valid element id + // and set the parent of the entries + for (int j = 0; j < mel.size(); j++) { + MMenuElement menuElement = mel.get(j); + if (menuElement.getElementId() == null + || menuElement.getElementId().length() < 1) + menuElement.setElementId(currentMenuElement + .getElementId() + "." + j); //$NON-NLS-1$ + menuElement.setParent(currentMenuElement.getParent()); + renderer.modelProcessSwitch(menuManager, menuElement); + } + storageMap.put(DYNAMIC_ELEMENT_STORAGE_KEY, mel); + } + } + } + private void cleanUp(final Menu menu, MMenu menuModel, MenuManager menuManager) { trace("cleanUp", menu, null); //$NON-NLS-1$ |