diff options
-rwxr-xr-x | bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java | 84 |
1 files changed, 74 insertions, 10 deletions
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java index 6eb3b9270..7e43d36c2 100755 --- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java +++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.fx.ui.workbench.renderers.base; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -17,13 +18,19 @@ import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; +import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.services.contributions.IContributionFactory; import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.e4.ui.di.AboutToHide; +import org.eclipse.e4.ui.di.AboutToShow; import org.eclipse.e4.ui.model.application.ui.MUIElement; 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.emf.ecore.EObject; +import org.eclipse.fx.core.log.Log; +import org.eclipse.fx.core.log.Logger; import org.eclipse.fx.ui.lifecycle.ELifecycleService; import org.eclipse.fx.ui.lifecycle.annotations.PreClose; import org.eclipse.fx.ui.lifecycle.annotations.PreShow; @@ -31,11 +38,19 @@ import org.eclipse.fx.ui.workbench.renderers.base.EventProcessor.ChildrenHandler import org.eclipse.fx.ui.workbench.renderers.base.widget.WMenu; import org.eclipse.fx.ui.workbench.renderers.base.widget.WMenuElement; +@SuppressWarnings("restriction") public abstract class BaseMenuRenderer<N> extends BaseRenderer<MMenu, WMenu<N>> implements ChildrenHandler<MMenu, MMenuElement> { @Inject private ELifecycleService lifecycleService; + @Inject + private IContributionFactory contributionFactory; + + @Log + @Inject + private Logger logger; + @PostConstruct void init(IEventBroker eventBroker) { EventProcessor.attachChildProcessor(eventBroker, this); @@ -59,20 +74,66 @@ public abstract class BaseMenuRenderer<N> extends BaseRenderer<MMenu, WMenu<N>> IEclipseContext context = getModelContext(element).createChild("lifecycle"); context.set(MMenu.class, element); lifecycleService.validateAnnotation(PreClose.class, element, context); + + + for( MMenuElement e : element.getChildren().toArray(new MMenuElement[0]) ) { + if( e instanceof MDynamicMenuContribution ) { + MDynamicMenuContribution dc = (MDynamicMenuContribution) e; + + Object contrib = dc.getObject(); + if( contrib != null ) { + List<MMenuElement> list = new ArrayList<MMenuElement>(); + context.set(List.class, list); + try { + ContextInjectionFactory.invoke(contrib, AboutToHide.class, context, null); + element.getChildren().removeAll(list); + } catch(Throwable t) { + logger.debug("Unable to process the AboutToHide", t); + } + + } + } + } + context.dispose(); } }); -// for (MApplicationElement m: element.getChildren()) { -// if (!(m instanceof MDynamicMenuContribution)) continue; -// MDynamicMenuContribution c = (MDynamicMenuContribution) m; -// lifecycleService.registerLifecycleURI(element, c.getContributionURI()); -// } } void handleShowing(MMenu element) { IEclipseContext context = getModelContext(element).createChild("lifecycle"); context.set(MMenu.class, element); lifecycleService.validateAnnotation(PreShow.class, element, context); + + // we iterate of the copy because it is modified in between + for( MMenuElement e : element.getChildren().toArray(new MMenuElement[0]) ) { + if( e instanceof MDynamicMenuContribution ) { + MDynamicMenuContribution dc = (MDynamicMenuContribution) e; + if( dc.getObject() == null && dc.getContributionURI() != null ) { + try { + //TODO On which context should we create the instance, would + dc.setObject(contributionFactory.create(dc.getContributionURI(), context)); + } catch(Throwable t ) { + logger.debug("Unable to create contribution", t); + } + } + + Object contrib = dc.getObject(); + if( contrib != null ) { + List<MMenuElement> list = new ArrayList<MMenuElement>(); + context.set(List.class, list); + try { + ContextInjectionFactory.invoke(contrib, AboutToShow.class, context, null); + + int idx = element.getChildren().indexOf(e); + element.getChildren().addAll(idx, list); + } catch(Throwable t) { + logger.debug("Unable to process AboutToShow", t); + } + + } + } + } for (MMenuElement e : element.getChildren()) { if (e.getRenderer() instanceof BaseItemRenderer) { @@ -102,11 +163,14 @@ public abstract class BaseMenuRenderer<N> extends BaseRenderer<MMenu, WMenu<N>> Iterator<MMenuElement> iterator = elements.iterator(); while (iterator.hasNext()) { MMenuElement element = iterator.next(); -// if (element instanceof MDynamicMenuContribution) { -// MDynamicMenuContribution c = (MDynamicMenuContribution) element; -// lifecycleService.unregisterLifecycleContribution(element, c.getObject()); -// continue; -// } + + if( element instanceof MDynamicMenuContribution ) { + MDynamicMenuContribution dc = (MDynamicMenuContribution) element; + if( dc.getObject() != null ) { + + } + } + if (element.isToBeRendered() && element.isVisible() && element.getWidget() != null) { hideChild(parent, element); } |