diff options
author | Paul Webster | 2012-02-02 18:44:15 +0000 |
---|---|---|
committer | Paul Webster | 2012-02-02 18:44:15 +0000 |
commit | cd81bbdccdd6bd652c855e1579962ea5dd1e210f (patch) | |
tree | 106804dc6fde9082752316b88108d6ebc64548c3 /bundles/org.eclipse.ui.workbench/Eclipse UI | |
parent | fc05e669af716337103c542f7fcfa98e4f622574 (diff) | |
download | eclipse.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')
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) |