Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java')
-rwxr-xr-xbundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseMenuRenderer.java127
1 files changed, 127 insertions, 0 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 8722825f3..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,21 +10,47 @@
*******************************************************************************/
package org.eclipse.fx.ui.workbench.renderers.base;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+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;
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);
@@ -41,9 +67,74 @@ public abstract class BaseMenuRenderer<N> extends BaseRenderer<MMenu, WMenu<N>>
handleShowing(element);
}
});
+ widget.setHidingCallback(new Runnable() {
+
+ @Override
+ public void run() {
+ 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();
+ }
+ });
}
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) {
@SuppressWarnings("unchecked")
@@ -51,7 +142,10 @@ public abstract class BaseMenuRenderer<N> extends BaseRenderer<MMenu, WMenu<N>>
r.checkEnablement(e);
}
}
+
+ context.dispose();
}
+
@Override
public void doProcessContent(MMenu element) {
@@ -69,6 +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 dc = (MDynamicMenuContribution) element;
+ if( dc.getObject() != null ) {
+
+ }
+ }
+
if (element.isToBeRendered() && element.isVisible() && element.getWidget() != null) {
hideChild(parent, element);
}
@@ -79,6 +181,11 @@ 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.registerLifecycleURI(element, c.getContributionURI());
+// continue;
+// }
if (element.isToBeRendered() && element.isVisible()) {
if (element.getWidget() == null) {
engineCreateWidget(element);
@@ -103,6 +210,26 @@ public abstract class BaseMenuRenderer<N> extends BaseRenderer<MMenu, WMenu<N>>
}
@Override
+ protected int getRenderedIndex(MUIElement parent, MUIElement element) {
+ EObject eElement = (EObject) element;
+
+ EObject container = eElement.eContainer();
+ @SuppressWarnings("unchecked")
+ List<MUIElement> list = (List<MUIElement>) container.eGet(eElement.eContainmentFeature());
+ int idx = 0;
+ for( MUIElement u : list ) {
+ if( u.isToBeRendered() && u.isVisible() && !(u instanceof MDynamicMenuContribution) ) {
+ if( u == element ) {
+ return idx;
+ }
+ idx++;
+ }
+ }
+ return -1;
+ }
+
+
+ @Override
public void hideChild(MMenu container, MUIElement changedObj) {
WMenu<N> menu = getWidget(container);

Back to the top