diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Workbench.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Workbench.java index 1f72999498176ede3e3f6f884583620d12cc70ac..95897fa901328ace8eba16bcdd0012edffb5cd43 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Workbench.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/Workbench.java @@ -2691,6 +2691,7 @@ UIEvents.Context.TOPIC_CONTEXT, cancelEarlyStartup(); if (workbenchService != null) workbenchService.unregister(); + workbenchService = null; // for dynamic UI Platform.getExtensionRegistry().removeRegistryChangeListener(extensionEventHandler); 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 690af33e51a0b099a51115bb7e9f32c4019cf470..8028f18914d4927039f1d70ae090a78bb773e765 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,7 +11,9 @@ package org.eclipse.ui.internal.menus; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.expressions.Expression; @@ -19,61 +21,87 @@ 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.internal.workbench.swt.AbstractPartRenderer; import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.model.application.ui.MElementContainer; +import org.eclipse.e4.ui.model.application.ui.MUIElement; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.e4.ui.model.application.ui.basic.MWindow; +import org.eclipse.e4.ui.model.application.ui.menu.MMenu; import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution; import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution; import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl; +import org.eclipse.e4.ui.services.IServiceConstants; import org.eclipse.e4.ui.workbench.modeling.ExpressionContext; import org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord; +import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer; import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarContributionRecord; +import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory; import org.eclipse.jface.action.ContributionManager; import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.MenuManager; import org.eclipse.ui.ISourceProvider; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.internal.WorkbenchWindow; import org.eclipse.ui.internal.e4.compatibility.E4Util; +import org.eclipse.ui.internal.services.IWorkbenchLocationService; import org.eclipse.ui.internal.services.ServiceLocator; import org.eclipse.ui.menus.AbstractContributionFactory; import org.eclipse.ui.menus.IMenuService; /** * @since 3.5 - * + * */ public class WorkbenchMenuService implements IMenuService { private IEclipseContext e4Context; - // private ServiceLocator serviceLocator; + private ServiceLocator serviceLocator; private ExpressionContext legacyContext; private MenuPersistence persistence; private Map factoriesToContributions = new HashMap(); + private IWorkbenchWindow window; + private Map managers = new HashMap(); /** * @param serviceLocator * @param e4Context */ public WorkbenchMenuService(ServiceLocator serviceLocator, IEclipseContext e4Context) { - // this.serviceLocator = serviceLocator; + this.serviceLocator = serviceLocator; this.e4Context = e4Context; persistence = new MenuPersistence(e4Context.get(MApplication.class), e4Context); } - /* (non-Javadoc) - * @see org.eclipse.ui.services.IServiceWithSources#addSourceProvider(org.eclipse.ui.ISourceProvider) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.services.IServiceWithSources#addSourceProvider(org.eclipse + * .ui.ISourceProvider) */ public void addSourceProvider(ISourceProvider provider) { // TODO Auto-generated method stub } - /* (non-Javadoc) - * @see org.eclipse.ui.services.IServiceWithSources#removeSourceProvider(org.eclipse.ui.ISourceProvider) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.services.IServiceWithSources#removeSourceProvider(org. + * eclipse.ui.ISourceProvider) */ public void removeSourceProvider(ISourceProvider provider) { // TODO Auto-generated method stub } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.ui.services.IDisposable#dispose() */ public void dispose() { @@ -84,8 +112,12 @@ public class WorkbenchMenuService implements IMenuService { return location.getScheme().startsWith("toolbar"); //$NON-NLS-1$ } - /* (non-Javadoc) - * @see org.eclipse.ui.menus.IMenuService#addContributionFactory(org.eclipse.ui.menus.AbstractContributionFactory) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.menus.IMenuService#addContributionFactory(org.eclipse. + * ui.menus.AbstractContributionFactory) */ public void addContributionFactory(final AbstractContributionFactory factory) { MenuLocationURI location = new MenuLocationURI(factory.getLocation()); @@ -133,6 +165,17 @@ public class WorkbenchMenuService implements IMenuService { factoriesToContributions.put(factory, menuContribution); MApplication app = e4Context.get(MApplication.class); app.getMenuContributions().add(menuContribution); + + // OK, now update any managers that use this uri + for (Map.Entry entry : managers.entrySet()) { + MenuLocationURI mgrURI = entry.getValue(); + if (mgrURI.getScheme().equals(location.getScheme()) + && mgrURI.getPath().equals(location.getPath())) { + ContributionManager mgr = entry.getKey(); + populateContributionManager(mgr, mgrURI.toString()); + mgr.update(true); + } + } } private void processToolbarChildren(AbstractContributionFactory factory, @@ -151,8 +194,12 @@ public class WorkbenchMenuService implements IMenuService { app.getToolBarContributions().add(toolBarContribution); } - /* (non-Javadoc) - * @see org.eclipse.ui.menus.IMenuService#removeContributionFactory(org.eclipse.ui.menus.AbstractContributionFactory) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.menus.IMenuService#removeContributionFactory(org.eclipse + * .ui.menus.AbstractContributionFactory) */ public void removeContributionFactory(AbstractContributionFactory factory) { Object contribution; @@ -166,25 +213,128 @@ public class WorkbenchMenuService implements IMenuService { app.getToolBarContributions().remove(contribution); } } + + // OK, now remove any managers that use this uri + MenuLocationURI location = new MenuLocationURI(factory.getLocation()); + List toRemove = new ArrayList(); + for (Map.Entry entry : managers.entrySet()) { + MenuLocationURI mgrURI = entry.getValue(); + if (mgrURI.getScheme().equals(location.getScheme()) + && mgrURI.getPath().equals(location.getPath())) { + toRemove.add(entry.getKey()); + } + } + for (ContributionManager mgr : toRemove) { + mgr.removeAll(); + managers.remove(mgr); + } } - /* (non-Javadoc) - * @see org.eclipse.ui.menus.IMenuService#populateContributionManager(org.eclipse.jface.action.ContributionManager, java.lang.String) + protected IWorkbenchWindow getWindow() { + if (serviceLocator == null) + return null; + + IWorkbenchLocationService wls = (IWorkbenchLocationService) serviceLocator + .getService(IWorkbenchLocationService.class); + + if (window == null) { + window = wls.getWorkbenchWindow(); + } + if (window == null) { + IWorkbench wb = wls.getWorkbench(); + if (wb != null) { + window = wb.getActiveWorkbenchWindow(); + } + } + return window; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.menus.IMenuService#populateContributionManager(org.eclipse + * .jface.action.ContributionManager, java.lang.String) */ public void populateContributionManager(ContributionManager mgr, String location) { - // TODO Auto-generated method stub + MenuLocationURI uri = new MenuLocationURI(location); + // Track this call by recording the manager and location! + if (!managers.containsKey(mgr)) { + managers.put(mgr, uri); + } + + // Now handle registering dynamic additions by querying E4 model + if (!(mgr instanceof MenuManager)) { + return; + } + MenuManager menu = (MenuManager) mgr; + MMenu menuModel = getMenuModel(menu, uri); + + IRendererFactory factory = e4Context.get(IRendererFactory.class); + AbstractPartRenderer obj = factory.getRenderer(menuModel, null); + if (obj instanceof MenuManagerRenderer) { + MenuManagerRenderer renderer = (MenuManagerRenderer) obj; + renderer.reconcileManagerToModel(menu, menuModel); + renderer.processContributions(menuModel, false, false); + // double cast because we're bad people + renderer.processContents((MElementContainer) ((Object) menuModel)); + } + } + + protected MMenu getMenuModel(MenuManager menu, MenuLocationURI location) { + // FIXME See if we can find the already existing matching menu with this + // id? + if ("org.eclipse.ui.main.menu".equals(location.getPath())) //$NON-NLS-1$ + { + WorkbenchWindow workbenchWindow = (WorkbenchWindow) getWindow(); + MWindow window = workbenchWindow.getModel(); + return window.getMainMenu(); + } + + // TODO Otherwise create one + MMenu menuModel = null; + // if ("popup".equals(location.getScheme())) { //$NON-NLS-1$ + // menuModel = MenuFactoryImpl.eINSTANCE.createPopupMenu(); + // menuModel.getTags().add(ContributionsAnalyzer.MC_POPUP); + // } else { + menuModel = MenuFactoryImpl.eINSTANCE.createMenu(); + menuModel.getTags().add(ContributionsAnalyzer.MC_MENU); + // } + menuModel.setLabel(menu.getMenuText()); + menuModel.setElementId(menu.getId()); + if (menuModel.getElementId() == null) { + menuModel.setElementId(location.getPath()); + } + + MPart modelPart = (MPart) e4Context.get(IServiceConstants.ACTIVE_PART); + if (modelPart != null) { + modelPart.getMenus().add(menuModel); + } + IRendererFactory factory = e4Context.get(IRendererFactory.class); + AbstractPartRenderer obj = factory.getRenderer(menuModel, null); + if (obj instanceof MenuManagerRenderer) { + MenuManagerRenderer renderer = (MenuManagerRenderer) obj; + renderer.linkModelToManager(menuModel, menu); + } + return menuModel; } - /* (non-Javadoc) - * @see org.eclipse.ui.menus.IMenuService#releaseContributions(org.eclipse.jface.action.ContributionManager) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.menus.IMenuService#releaseContributions(org.eclipse.jface + * .action.ContributionManager) */ public void releaseContributions(ContributionManager mgr) { // TODO Auto-generated method stub } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.ui.menus.IMenuService#getCurrentState() */ public IEvaluationContext getCurrentState() { @@ -214,7 +364,7 @@ public class WorkbenchMenuService implements IMenuService { */ public void registerVisibleWhen(IContributionItem item, Expression visibleWhen, Set restriction, String createIdentifierId) { - // TODO Auto-generated method stub + // TODO Remove - no longer used } @@ -223,7 +373,7 @@ public class WorkbenchMenuService implements IMenuService { * @param restriction */ public void unregisterVisibleWhen(IContributionItem item, Set restriction) { - // TODO Auto-generated method stub + // TODO Remove - no longer used }