Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Schindl2014-06-25 22:51:06 +0000
committerTom Schindl2014-06-25 22:51:06 +0000
commitd0d965d544177b4035526ccdefda101dd8fc0dd2 (patch)
tree7e111c784bffdc9f7a7f0d5c89d9d248d80cc333
parent310eeafedae92b2a95470e4e1c61ecb1272825f7 (diff)
downloadorg.eclipse.efxclipse-d0d965d544177b4035526ccdefda101dd8fc0dd2.tar.gz
org.eclipse.efxclipse-d0d965d544177b4035526ccdefda101dd8fc0dd2.tar.xz
org.eclipse.efxclipse-d0d965d544177b4035526ccdefda101dd8fc0dd2.zip
Bug 438200 - Make ToolItem loop check optional
-rw-r--r--bundles/runtime/org.eclipse.fx.ui.services/src/org/eclipse/fx/ui/services/Constants.java6
-rw-r--r--bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/AbstractE4Application.java13
-rwxr-xr-xbundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/META-INF/MANIFEST.MF5
-rwxr-xr-xbundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/BaseToolBarRenderer.java119
-rwxr-xr-xtestcases/org.eclipse.fx.testcases.e4/META-INF/MANIFEST.MF3
-rwxr-xr-xtestcases/org.eclipse.fx.testcases.e4/plugin.xml4
-rwxr-xr-xtestcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler0.java4
-rwxr-xr-xtestcases/org.eclipse.fx.testcases.e4/src/org/eclipse/fx/testcases/e4/handlers/Handler1.java6
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);
}
}

Back to the top