diff options
author | Tom Schindl | 2014-06-25 22:51:06 +0000 |
---|---|---|
committer | Tom Schindl | 2014-06-25 22:51:06 +0000 |
commit | d0d965d544177b4035526ccdefda101dd8fc0dd2 (patch) | |
tree | 7e111c784bffdc9f7a7f0d5c89d9d248d80cc333 | |
parent | 310eeafedae92b2a95470e4e1c61ecb1272825f7 (diff) | |
download | org.eclipse.efxclipse-d0d965d544177b4035526ccdefda101dd8fc0dd2.tar.gz org.eclipse.efxclipse-d0d965d544177b4035526ccdefda101dd8fc0dd2.tar.xz org.eclipse.efxclipse-d0d965d544177b4035526ccdefda101dd8fc0dd2.zip |
Bug 438200 - Make ToolItem loop check optional
8 files changed, 113 insertions, 47 deletions
diff --git a/bundles/runtime/org.eclipse.fx.ui.services/src/org/eclipse/fx/ui/services/Constants.java b/bundles/runtime/org.eclipse.fx.ui.services/src/org/eclipse/fx/ui/services/Constants.java index b1bfeb099..908332e0e 100644 --- a/bundles/runtime/org.eclipse.fx.ui.services/src/org/eclipse/fx/ui/services/Constants.java +++ b/bundles/runtime/org.eclipse.fx.ui.services/src/org/eclipse/fx/ui/services/Constants.java @@ -28,6 +28,12 @@ public final class Constants { public static final String APP_FOCUS_NODE = "efx_APP_FOCUS_NODE"; //$NON-NLS-1$
/**
+ * Context key with the timer value used for tool item check
+ */
+ @NonNull
+ public static final String TOOLITEM_TIMER = "efx_TOOLITEM_TIMER"; //$NON-NLS-1$
+
+ /**
* Root topic for fx specific events
*/
@NonNull
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/AbstractE4Application.java b/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/AbstractE4Application.java index d10703edd..91f849220 100644 --- a/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/AbstractE4Application.java +++ b/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/AbstractE4Application.java @@ -72,6 +72,7 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.fx.osgi.util.LoggerCreator; +import org.eclipse.fx.ui.services.Constants; import org.eclipse.fx.ui.services.restart.RestartService; import org.eclipse.fx.ui.services.sync.UISynchronize; import org.eclipse.fx.ui.workbench.base.internal.Activator; @@ -169,7 +170,7 @@ public abstract class AbstractE4Application implements IApplication { appContext.set(Realm.class, createRealm(appContext)); appContext.set(IApplicationContext.class, applicationContext); appContext.set(IResourceUtilities.class, createResourceUtility(appContext)); - + // Check if DS is running if (!appContext.containsKey("org.eclipse.e4.ui.workbench.modeling.EModelService")) { //$NON-NLS-1$ throw new IllegalStateException("Core services not available. Please make sure that a declarative service implementation (such as the bundle 'org.eclipse.equinox.ds') is available!"); //$NON-NLS-1$ @@ -198,6 +199,16 @@ public abstract class AbstractE4Application implements IApplication { } } } + String toolItemTimer = getArgValue(Constants.TOOLITEM_TIMER, applicationContext, false); + if( toolItemTimer != null ) { + try { + appContext.set(Constants.TOOLITEM_TIMER, Long.valueOf(toolItemTimer)); + } catch(NumberFormatException e) { + LOGGER.error("Unable to parse '"+Constants.TOOLITEM_TIMER+"' value '"+toolItemTimer+"'", e); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ + } + + } + // Create the app model and its context MApplication appModel = loadApplicationModel(applicationContext, appContext); appModel.setContext(appContext); diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/META-INF/MANIFEST.MF b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/META-INF/MANIFEST.MF index 1c36e87c0..21de9a36f 100755 --- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/META-INF/MANIFEST.MF +++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/META-INF/MANIFEST.MF @@ -17,7 +17,10 @@ Require-Bundle: org.eclipse.e4.ui.model.workbench;bundle-version="0.10.1", org.eclipse.fx.ui.lifecycle, org.eclipse.fx.ui.keybindings.e4;bundle-version="0.9.0", org.eclipse.fx.ui.keybindings;bundle-version="0.9.0", - org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional + org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional, + org.eclipse.fx.core.di;bundle-version="1.0.0", + org.eclipse.fx.ui.services;bundle-version="1.0.0", + org.eclipse.e4.ui.services;bundle-version="1.1.0" Import-Package: javax.annotation;version="1.0.0", javax.inject;version="1.0.0", org.osgi.service.event;version="1.3.0" diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseToolBarRenderer.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseToolBarRenderer.java index ec5fa19eb..958b05d6f 100755 --- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseToolBarRenderer.java +++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseToolBarRenderer.java @@ -16,11 +16,19 @@ import java.util.Iterator; import java.util.List; import javax.annotation.PostConstruct; +import javax.inject.Inject; +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.contexts.RunAndTrack; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.model.application.ui.MUIElement; import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement; +import org.eclipse.e4.ui.services.IServiceConstants; +import org.eclipse.e4.ui.workbench.Selector; +import org.eclipse.e4.ui.workbench.UIEvents; +import org.eclipse.fx.core.di.ScopedObjectFactory; +import org.eclipse.fx.ui.services.Constants; import org.eclipse.fx.ui.workbench.renderers.base.EventProcessor.ChildrenHandler; import org.eclipse.fx.ui.workbench.renderers.base.widget.WToolBar; import org.eclipse.fx.ui.workbench.renderers.base.widget.WWidget; @@ -33,53 +41,80 @@ import org.eclipse.fx.ui.workbench.renderers.base.widget.WWidget; */ public abstract class BaseToolBarRenderer<N> extends BaseRenderer<MToolBar, WToolBar<N>> implements ChildrenHandler<MToolBar, MToolBarElement> { List<MToolBarElement> widgets = new ArrayList<MToolBarElement>(); - private Thread syncThread; - - /** - * Create an instance - */ - public BaseToolBarRenderer() { - this.syncThread = new Thread("ToolItem Enablement Sync") { //$NON-NLS-1$ - @SuppressWarnings("unchecked") - @Override - public void run() { - while (true) { - MToolBarElement[] iterationCopy; - - // not ideal because we'll probably check items are already - // removed - // from the ui - synchronized (BaseToolBarRenderer.this.widgets) { - iterationCopy = BaseToolBarRenderer.this.widgets.toArray(new MToolBarElement[0]); - } - - for (int i = 0; i < iterationCopy.length; i++) { - MToolBarElement e = iterationCopy[i]; - if (e.getRenderer() instanceof BaseItemRenderer<?, ?>) { - final MToolBarElement tmp = e; - final BaseItemRenderer<MToolBarElement, ?> r = (BaseItemRenderer<MToolBarElement, ?>) tmp.getRenderer(); - if (tmp.getRenderer() != null) { - r.checkEnablement(tmp); - } + + @Inject + IEclipseContext context; + + @PostConstruct + void init(IEventBroker eventBroker) { + Object value = this.context.get(Constants.TOOLITEM_TIMER); + Selector noop = m -> true; + if( value != null && value instanceof Number ) { + Thread syncThread = new Thread("ToolItem Enablement Sync") { //$NON-NLS-1$ + @Override + public void run() { + while (true) { + checkExecute(noop); + try { + Thread.sleep(((Number)value).longValue()); + } catch (InterruptedException e) { + getLogger().error("Failed to sleep", e); //$NON-NLS-1$ } } - - try { - Thread.sleep(400); - } catch (InterruptedException e) { - getLogger().error("Failed to sleep", e); //$NON-NLS-1$ - } } - } - }; - this.syncThread.setDaemon(true); - this.syncThread.start(); - } - - @PostConstruct - void init(IEventBroker eventBroker) { + }; + syncThread.setDaemon(true); + syncThread.start(); + } + EventProcessor.attachChildProcessor(eventBroker, this); EventProcessor.attachVisibleProcessor(eventBroker, this); + eventBroker.subscribe(ScopedObjectFactory.KEYMODIFED_TOPIC, e -> checkExecute(m -> true)); + eventBroker.subscribe(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, e -> { + Object d = e.getProperty(IEventBroker.DATA); + if( d instanceof Selector ) { + checkExecute((Selector) d); + } else if( UIEvents.ALL_ELEMENT_ID.equals(d)) { + checkExecute(m -> true); + } else if( d != null ) { + checkExecute(m -> d.equals(m.getElementId())); + } + }); + this.context.runAndTrack(new RunAndTrack() { + + @Override + public boolean changed(IEclipseContext context) { + context.get(IServiceConstants.ACTIVE_CONTEXTS); + context.get(IServiceConstants.ACTIVE_SELECTION); + context.get(IServiceConstants.ACTIVE_PART); + checkExecute(noop); + return true; + } + }); + + } + + void checkExecute(Selector selector) { + MToolBarElement[] iterationCopy; + + // not ideal because we'll probably check items are already + // removed + // from the ui + synchronized (BaseToolBarRenderer.this.widgets) { + iterationCopy = BaseToolBarRenderer.this.widgets.toArray(new MToolBarElement[0]); + } + + for (int i = 0; i < iterationCopy.length; i++) { + MToolBarElement e = iterationCopy[i]; + if (e.getRenderer() instanceof BaseItemRenderer<?, ?> && selector.select(e)) { + final MToolBarElement tmp = e; + @SuppressWarnings("unchecked") + final BaseItemRenderer<MToolBarElement, ?> r = (BaseItemRenderer<MToolBarElement, ?>) tmp.getRenderer(); + if (tmp.getRenderer() != null) { + r.checkEnablement(tmp); + } + } + } } @Override diff --git a/testcases/org.eclipse.fx.testcases.e4/META-INF/MANIFEST.MF b/testcases/org.eclipse.fx.testcases.e4/META-INF/MANIFEST.MF index df4da2e7d..c82c332a0 100755 --- a/testcases/org.eclipse.fx.testcases.e4/META-INF/MANIFEST.MF +++ b/testcases/org.eclipse.fx.testcases.e4/META-INF/MANIFEST.MF @@ -32,7 +32,8 @@ Require-Bundle: org.eclipse.e4.ui.model.workbench;bundle-version="0.10.1", org.eclipse.fx.ui.modelviewer;bundle-version="1.0.0", org.eclipse.osgi.services;bundle-version="3.3.100", org.eclipse.fx.core;bundle-version="1.0.0", - org.eclipse.fx.core.fxml;bundle-version="1.0.0" + org.eclipse.fx.core.fxml;bundle-version="1.0.0", + org.eclipse.fx.core.di;bundle-version="1.0.0" Bundle-ActivationPolicy: lazy Import-Package: javafx.animation;version="2.0.0", javafx.application;version="2.0.0", diff --git a/testcases/org.eclipse.fx.testcases.e4/plugin.xml b/testcases/org.eclipse.fx.testcases.e4/plugin.xml index a0b1462e6..aa6df0d9d 100755 --- a/testcases/org.eclipse.fx.testcases.e4/plugin.xml +++ b/testcases/org.eclipse.fx.testcases.e4/plugin.xml @@ -23,6 +23,10 @@ name="lifeCycleURI" value="bundleclass://org.eclipse.fx.testcases.e4/org.eclipse.fx.testcases.e4.lifecycle.ApplicationLifecycle"> </property> + <property + name="efx_TOOLITEM_TIMER_dummy" + value="400"> + </property> </product> </extension> <extension diff --git a/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler0.java b/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler0.java index 7b5858140..1fb8cfd2c 100755 --- a/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler0.java +++ b/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler0.java @@ -6,6 +6,7 @@ import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.fx.core.di.ScopedObjectFactory; @SuppressWarnings("restriction") public class Handler0 { @@ -23,7 +24,8 @@ public class Handler0 { } else { v = Integer.valueOf(v.intValue()+1); } - application.getContext().set("test", v); + application.getContext().get(ScopedObjectFactory.class).put("test", v); +// application.getContext().set("test", v); } } diff --git a/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler1.java b/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler1.java index 6945dec2d..0e1fe518b 100755 --- a/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler1.java +++ b/testcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler1.java @@ -1,12 +1,15 @@ package org.eclipse.fx.testcases.e4.handlers; import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.e4.ui.workbench.UIEvents; +import org.eclipse.fx.core.di.ScopedObjectFactory; @SuppressWarnings("restriction") public class Handler1 { @Execute - public void execute(MApplication application) { + public void execute(MApplication application, IEventBroker broker) { System.err.println("Executing H1"); Integer v = (Integer) application.getContext().get("test_2"); if( v == null ) { @@ -15,6 +18,7 @@ public class Handler1 { v = Integer.valueOf(v.intValue()+1); } application.getContext().set("test_2", v); + broker.send(UIEvents.REQUEST_ENABLEMENT_UPDATE_TOPIC, UIEvents.ALL_ELEMENT_ID); } } |