You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/09/30 16:49:43 UTC

svn commit: r820287 - /incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java

Author: gbrown
Date: Wed Sep 30 14:49:42 2009
New Revision: 820287

URL: http://svn.apache.org/viewvc?rev=820287&view=rev
Log:
Make QueuedCallback public and return an instance of it from ApplicationContext.queueCallback(); ensure that ScheduledCallback cancels any outstanding queued callbacks.

Modified:
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java?rev=820287&r1=820286&r2=820287&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java Wed Sep 30 14:49:42 2009
@@ -1372,7 +1372,7 @@
      */
     public static final class ScheduledCallback extends TimerTask {
         private Runnable callback;
-        private volatile boolean cancelled = false;
+        private QueuedCallback queuedCallback = null;
 
         private ScheduledCallback(final Runnable callback) {
             this.callback = callback;
@@ -1380,32 +1380,53 @@
 
         @Override
         public void run() {
-            if (!cancelled) {
-                queueCallback(callback);
+            // Cancel any outstanding callback
+            if (queuedCallback != null) {
+                queuedCallback.cancel();
             }
+
+            queuedCallback = queueCallback(callback);
         }
 
         @Override
         public boolean cancel() {
-            cancelled = true;
+            // Cancel any outstanding callback
+            if (queuedCallback != null) {
+                queuedCallback.cancel();
+            }
+
             return super.cancel();
         }
     }
 
-    private static class QueuedCallback implements Runnable {
+    /**
+     * Class representing a queued callback.
+     */
+    public static class QueuedCallback implements Runnable {
         private Runnable callback;
+        private boolean executed = false;
+        private volatile boolean canceled = false;
 
-        public QueuedCallback(Runnable callback) {
+        private QueuedCallback(Runnable callback) {
             this.callback = callback;
         }
 
         public void run() {
-            callback.run();
+            if (!canceled) {
+                callback.run();
 
-            for (Display display : displays) {
-                display.validate();
+                for (Display display : displays) {
+                    display.validate();
+                }
+
+                executed = true;
             }
         }
+
+        public synchronized boolean cancel() {
+            canceled = true;
+            return (!executed);
+        }
     }
 
     private DisplayHost displayHost;
@@ -1589,8 +1610,8 @@
      * @param callback
      * The task to execute.
      */
-    public static void queueCallback(Runnable callback) {
-        queueCallback(callback, false);
+    public static QueuedCallback queueCallback(Runnable callback) {
+        return queueCallback(callback, false);
     }
 
     /**
@@ -1604,7 +1625,7 @@
      * If <tt>true</tt>, does not return until the task has executed.
      * Otherwise, returns immediately.
      */
-    public static void queueCallback(Runnable callback, boolean wait) {
+    public static QueuedCallback queueCallback(Runnable callback, boolean wait) {
         QueuedCallback queuedCallback = new QueuedCallback(callback);
 
         // TODO This is a workaround for a potential OS X bug; revisit
@@ -1623,6 +1644,8 @@
         } catch (Throwable throwable) {
             System.err.println("Unable to queue callback: " + throwable);
         }
+
+        return queuedCallback;
     }
 
     protected static void createTimer() {