Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java87
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$

Back to the top