Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Webster2012-02-02 18:44:15 +0000
committerPaul Webster2012-02-02 18:44:15 +0000
commitcd81bbdccdd6bd652c855e1579962ea5dd1e210f (patch)
tree106804dc6fde9082752316b88108d6ebc64548c3 /bundles/org.eclipse.ui.workbench/Eclipse UI
parentfc05e669af716337103c542f7fcfa98e4f622574 (diff)
downloadeclipse.platform.ui-cd81bbdccdd6bd652c855e1579962ea5dd1e210f.tar.gz
eclipse.platform.ui-cd81bbdccdd6bd652c855e1579962ea5dd1e210f.tar.xz
eclipse.platform.ui-cd81bbdccdd6bd652c855e1579962ea5dd1e210f.zip
Bug 366520 - [Compatibility] Failures in MenusTestSuite
The addContributionFactory(*) method can support the same pattern as the extension based one.
Diffstat (limited to 'bundles/org.eclipse.ui.workbench/Eclipse UI')
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/ContributionFactoryGenerator.java104
-rw-r--r--bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuFactoryGenerator.java63
-rwxr-xr-xbundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/WorkbenchMenuService.java44
3 files changed, 144 insertions, 67 deletions
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/ContributionFactoryGenerator.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/ContributionFactoryGenerator.java
new file mode 100644
index 00000000000..65706f91215
--- /dev/null
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/ContributionFactoryGenerator.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2012 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.ui.internal.menus;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.core.expressions.Expression;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.e4.core.contexts.ContextFunction;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
+import org.eclipse.e4.ui.model.application.ui.impl.UiFactoryImpl;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
+import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenuItem;
+import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.ui.internal.WorkbenchPlugin;
+import org.eclipse.ui.internal.services.ServiceLocator;
+import org.eclipse.ui.menus.AbstractContributionFactory;
+import org.eclipse.ui.menus.IMenuService;
+
+public class ContributionFactoryGenerator extends ContextFunction {
+ private AbstractContributionFactory factoryImpl;
+ private IConfigurationElement configElement;
+
+ public ContributionFactoryGenerator(AbstractContributionFactory factory) {
+ this.factoryImpl = factory;
+ }
+
+ public ContributionFactoryGenerator(IConfigurationElement element) {
+ configElement = element;
+ }
+
+ private AbstractContributionFactory getFactory() {
+ if (factoryImpl == null && configElement != null) {
+ try {
+ factoryImpl = (AbstractContributionFactory) configElement
+ .createExecutableExtension("class"); //$NON-NLS-1$
+ } catch (CoreException e) {
+ WorkbenchPlugin.log(e);
+ return null;
+ }
+ }
+ return factoryImpl;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.e4.core.contexts.ContextFunction#compute(org.eclipse.e4.core
+ * .contexts.IEclipseContext)
+ */
+ @Override
+ public Object compute(IEclipseContext context) {
+ AbstractContributionFactory factory = getFactory();
+ final IMenuService menuService = context.get(IMenuService.class);
+ final ContributionRoot root = new ContributionRoot(menuService, new HashSet<Object>(),
+ null, factory);
+ ServiceLocator sl = new ServiceLocator();
+ sl.setContext(context);
+ factory.createContributionItems(sl, root);
+ final List contributionItems = root.getItems();
+ final Map<IContributionItem, Expression> itemsToExpression = root.getVisibleWhen();
+ List<MMenuElement> menuElements = new ArrayList<MMenuElement>();
+ for (Object obj : contributionItems) {
+ if (obj instanceof IContributionItem) {
+ IContributionItem ici = (IContributionItem) obj;
+ MRenderedMenuItem renderedItem = MenuFactoryImpl.eINSTANCE.createRenderedMenuItem();
+ renderedItem.setElementId(ici.getId());
+ renderedItem.setContributionItem(ici);
+ if (itemsToExpression.containsKey(ici)) {
+ final Expression ex = itemsToExpression.get(ici);
+ MCoreExpression exp = UiFactoryImpl.eINSTANCE.createCoreExpression();
+ exp.setCoreExpressionId("programmatic." + ici.getId()); //$NON-NLS-1$
+ exp.setCoreExpression(ex);
+ renderedItem.setVisibleWhen(exp);
+ }
+ menuElements.add(renderedItem);
+ }
+ }
+ context.set(List.class, menuElements);
+
+ // return something disposable
+ return new Runnable() {
+ public void run() {
+ root.release();
+ }
+ };
+ }
+
+}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuFactoryGenerator.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuFactoryGenerator.java
index 0f61be45e67..c31fe1c5f8c 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuFactoryGenerator.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuFactoryGenerator.java
@@ -12,30 +12,16 @@
package org.eclipse.ui.internal.menus;
import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
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.model.application.MApplication;
-import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
-import org.eclipse.e4.ui.model.application.ui.impl.UiFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
-import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
-import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenuItem;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
import org.eclipse.e4.ui.model.application.ui.menu.MTrimContribution;
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.services.ServiceLocator;
-import org.eclipse.ui.menus.AbstractContributionFactory;
-import org.eclipse.ui.menus.IMenuService;
/**
* @since 3.102.0
@@ -80,54 +66,7 @@ public class MenuFactoryGenerator {
}
menuContribution.getTags().add(filter);
menuContribution.setVisibleWhen(MenuHelper.getVisibleWhen(configElement));
- ContextFunction generator = new ContextFunction() {
-
- @Override
- public Object compute(IEclipseContext context) {
- AbstractContributionFactory factory;
- try {
- factory = (AbstractContributionFactory) configElement
- .createExecutableExtension("class"); //$NON-NLS-1$
- } catch (CoreException e) {
- WorkbenchPlugin.log(e);
- return null;
- }
- final IMenuService menuService = context.get(IMenuService.class);
- final ContributionRoot root = new ContributionRoot(menuService,
- new HashSet<Object>(), null, factory);
- ServiceLocator sl = new ServiceLocator();
- sl.setContext(context);
- factory.createContributionItems(sl, root);
- final List contributionItems = root.getItems();
- final Map<IContributionItem, Expression> itemsToExpression = root.getVisibleWhen();
- List<MMenuElement> menuElements = new ArrayList<MMenuElement>();
- for (Object obj : contributionItems) {
- if (obj instanceof IContributionItem) {
- IContributionItem ici = (IContributionItem) obj;
- MRenderedMenuItem renderedItem = MenuFactoryImpl.eINSTANCE
- .createRenderedMenuItem();
- renderedItem.setElementId(ici.getId());
- renderedItem.setContributionItem(ici);
- if (itemsToExpression.containsKey(ici)) {
- final Expression ex = itemsToExpression.get(ici);
- MCoreExpression exp = UiFactoryImpl.eINSTANCE.createCoreExpression();
- exp.setCoreExpressionId("programmatic." + ici.getId()); //$NON-NLS-1$
- exp.setCoreExpression(ex);
- renderedItem.setVisibleWhen(exp);
- }
- menuElements.add(renderedItem);
- }
- }
- context.set(List.class, menuElements);
-
- // return something disposable
- return new Runnable() {
- public void run() {
- root.release();
- }
- };
- }
- };
+ ContextFunction generator = new ContributionFactoryGenerator(configElement);
menuContribution.getTransientData().put(ContributionRecord.FACTORY, generator);
menuContributions.add(menuContribution);
}
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 de21f0a9e4f..cfe9096a99c 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
@@ -11,12 +11,19 @@
package org.eclipse.ui.internal.menus;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Set;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.expressions.IEvaluationContext;
+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.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
+import org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.ui.ISourceProvider;
@@ -35,6 +42,7 @@ public class WorkbenchMenuService implements IMenuService {
// private ServiceLocator serviceLocator;
private ExpressionContext legacyContext;
private MenuPersistence persistence;
+ private Map<AbstractContributionFactory, MMenuContribution> factoriesToContributions = new HashMap<AbstractContributionFactory, MMenuContribution>();
/**
* @param serviceLocator
@@ -73,17 +81,43 @@ public class WorkbenchMenuService implements IMenuService {
/* (non-Javadoc)
* @see org.eclipse.ui.menus.IMenuService#addContributionFactory(org.eclipse.ui.menus.AbstractContributionFactory)
*/
- public void addContributionFactory(AbstractContributionFactory factory) {
- // TODO Auto-generated method stub
-
+ public void addContributionFactory(final AbstractContributionFactory factory) {
+ MMenuContribution menuContribution = MenuFactoryImpl.eINSTANCE.createMenuContribution();
+ menuContribution.setElementId(factory.getNamespace() + ":" + factory.hashCode()); //$NON-NLS-1$
+ MenuLocationURI location = new MenuLocationURI(factory.getLocation());
+
+ if ("org.eclipse.ui.popup.any".equals(location.getPath())) { //$NON-NLS-1$
+ menuContribution.setParentId("popup"); //$NON-NLS-1$
+ } else {
+ menuContribution.setParentId(location.getPath());
+ }
+ String query = location.getQuery();
+ if (query == null || query.length() == 0) {
+ query = "after=additions"; //$NON-NLS-1$
+ }
+ menuContribution.setPositionInParent(query);
+ menuContribution.getTags().add("scheme:" + location.getScheme()); //$NON-NLS-1$
+ String filter = ContributionsAnalyzer.MC_MENU;
+ if ("popup".equals(location.getScheme())) { //$NON-NLS-1$
+ filter = ContributionsAnalyzer.MC_POPUP;
+ }
+ menuContribution.getTags().add(filter);
+ ContextFunction generator = new ContributionFactoryGenerator(factory);
+ menuContribution.getTransientData().put(ContributionRecord.FACTORY, generator);
+ factoriesToContributions.put(factory, menuContribution);
+ MApplication app = e4Context.get(MApplication.class);
+ app.getMenuContributions().add(menuContribution);
}
/* (non-Javadoc)
* @see org.eclipse.ui.menus.IMenuService#removeContributionFactory(org.eclipse.ui.menus.AbstractContributionFactory)
*/
public void removeContributionFactory(AbstractContributionFactory factory) {
- // TODO Auto-generated method stub
-
+ MMenuContribution menuContribution;
+ if ((menuContribution = factoriesToContributions.remove(factory)) != null) {
+ MApplication app = e4Context.get(MApplication.class);
+ app.getMenuContributions().remove(menuContribution);
+ }
}
/* (non-Javadoc)

Back to the top