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/03/20 18:10:39 UTC

svn commit: r756633 - in /incubator/pivot/trunk: core/src/pivot/util/concurrent/ tutorials/src/pivot/tutorials/stocktracker/ wtk/src/pivot/wtk/ wtk/src/pivot/wtk/effects/ wtk/src/pivot/wtk/skin/ wtk/src/pivot/wtk/skin/terra/ wtk/src/pivot/wtkx/

Author: gbrown
Date: Fri Mar 20 17:10:35 2009
New Revision: 756633

URL: http://svn.apache.org/viewvc?rev=756633&view=rev
Log:
Replace setTimeout() and setInterval() with scheduleCallback() and scheduleRecurringCallback(), respectively; pass a Resources argument as a constructor to WTKXSerializer instead of the more generic Dictionary<String, Object>.


Modified:
    incubator/pivot/trunk/core/src/pivot/util/concurrent/Dispatcher.java
    incubator/pivot/trunk/tutorials/src/pivot/tutorials/stocktracker/StockTracker.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/ApplicationContext.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/effects/Transition.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/ComponentSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/MenuItemSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/TextAreaSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraPanoramaSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraScrollBarSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraSpinnerSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTextInputSkin.java
    incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java

Modified: incubator/pivot/trunk/core/src/pivot/util/concurrent/Dispatcher.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/core/src/pivot/util/concurrent/Dispatcher.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/core/src/pivot/util/concurrent/Dispatcher.java (original)
+++ incubator/pivot/trunk/core/src/pivot/util/concurrent/Dispatcher.java Fri Mar 20 17:10:35 2009
@@ -28,6 +28,11 @@
  * currently dispatched as soon as they are added to the queue. Need to complete
  * the pooling implementation.
  * <p>
+ * TODO Add a flag that allows the monitor thread to run as a non-daemon, and
+ * define a shutdown() or cancel() method that will stop the thread. This will
+ * allow ApplicationContext to control the dispatcher lifecycle and prevent
+ * the thread from being randomly killed by applets.
+ * <p>
  * TODO Is there a way to throw an AbortException when an item is removed
  * from the queue, without having to rely on methods like abort()?
  *

Modified: incubator/pivot/trunk/tutorials/src/pivot/tutorials/stocktracker/StockTracker.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tutorials/src/pivot/tutorials/stocktracker/StockTracker.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/tutorials/src/pivot/tutorials/stocktracker/StockTracker.java (original)
+++ incubator/pivot/trunk/tutorials/src/pivot/tutorials/stocktracker/StockTracker.java Fri Mar 20 17:10:35 2009
@@ -203,7 +203,7 @@
 
         refreshTable();
 
-        ApplicationContext.setInterval(new Runnable() {
+        ApplicationContext.scheduleRecurringCallback(new Runnable() {
             public void run() {
                 refreshTable();
             }

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/ApplicationContext.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/ApplicationContext.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/ApplicationContext.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/ApplicationContext.java Fri Mar 20 17:10:35 2009
@@ -67,39 +67,7 @@
  */
 public abstract class ApplicationContext {
     /**
-     * Resource cache dictionary implementation.
-     *
-     * @author gbrown
-     */
-    public static final class ResourceCacheDictionary
-        implements Dictionary<URL, Object>, Iterable<URL> {
-        public Object get(URL key) {
-            return resourceCache.get(key);
-        }
-
-        public Object put(URL key, Object value) {
-            return resourceCache.put(key, value);
-        }
-
-        public Object remove(URL key) {
-            return resourceCache.remove(key);
-        }
-
-        public boolean containsKey(URL key) {
-            return resourceCache.containsKey(key);
-        }
-
-        public boolean isEmpty() {
-            return resourceCache.isEmpty();
-        }
-
-        public Iterator<URL> iterator() {
-            return new ImmutableIterator<URL>(resourceCache.iterator());
-        }
-    }
-
-    /**
-     * Native AWT display host.
+     * Native display host.
      *
      * @author gbrown
      */
@@ -1061,30 +1029,47 @@
         }
     }
 
-    private static class IntervalTask extends TimerTask {
-        private Runnable runnable = null;
+    /**
+     * Resource cache dictionary implementation.
+     *
+     * @author gbrown
+     */
+    public static final class ResourceCacheDictionary
+        implements Dictionary<URL, Object>, Iterable<URL> {
+        public Object get(URL key) {
+            return resourceCache.get(key);
+        }
 
-        public IntervalTask(Runnable runnable) {
-            this.runnable = runnable;
+        public Object put(URL key, Object value) {
+            return resourceCache.put(key, value);
         }
 
-        public void run() {
-            queueCallback(runnable);
+        public Object remove(URL key) {
+            return resourceCache.remove(key);
+        }
+
+        public boolean containsKey(URL key) {
+            return resourceCache.containsKey(key);
+        }
+
+        public boolean isEmpty() {
+            return resourceCache.isEmpty();
+        }
+
+        public Iterator<URL> iterator() {
+            return new ImmutableIterator<URL>(resourceCache.iterator());
         }
     }
 
-    private static class TimeoutTask extends TimerTask {
+    public static class ScheduledCallback extends TimerTask {
         private Runnable runnable = null;
-        int timeoutID = -1;
 
-        public TimeoutTask(Runnable runnable, int timeoutID) {
+        private ScheduledCallback(Runnable runnable) {
             this.runnable = runnable;
-            this.timeoutID = timeoutID;
         }
 
         public void run() {
-            queueCallback(runnable, true);
-            clearTimeout(timeoutID);
+            queueCallback(runnable);
         }
     }
 
@@ -1096,9 +1081,8 @@
     private static HashMap<URL, Object> resourceCache = new HashMap<URL, Object>();
     private static ResourceCacheDictionary resourceCacheDictionary = new ResourceCacheDictionary();
 
-    private static Timer timer = new Timer(true);
-    private static HashMap<Integer, TimerTask> timerTaskMap = new HashMap<Integer, TimerTask>();
-    private static int nextTimerTaskID = 0;
+    // TODO Create/destroy this in subclass
+    protected static Timer timer = new Timer();
 
     private static final String DEFAULT_THEME_CLASS_NAME = "pivot.wtk.skin.terra.TerraTheme";
 
@@ -1167,102 +1151,54 @@
     }
 
     /**
-     * Schedules a task for repeated execution. The task will be executed on the
-     * UI thread.
+     * Schedules a task for one-time execution. The task will be executed on
+     * the UI thread.
      *
      * @param runnable
      * The task to execute.
      *
-     * @param period
-     * The interval at which the task should be executed.
-     *
-     * @return An integer ID that can be used to cancel execution of the task.
+     * @param delay
+     * The length of time to wait before executing the task.
      */
-    public static int setInterval(Runnable runnable, long period) {
-        int intervalID = nextTimerTaskID++;
-
-        IntervalTask intervalTask = new IntervalTask(runnable);
-        timerTaskMap.put(intervalID, intervalTask);
-
-        try {
-            timer.schedule(intervalTask, 0, period);
-        } catch (IllegalStateException exception) {
-            System.out.println(exception.getMessage());
-
-            // TODO This is a workaround for an apparent bug in the Mac OSX
-            // Java Plugin, which appears to prematurely kill the timer thread.
-            // Remove this when the issue is fixed.
-            timer = new Timer(true);
-            timerTaskMap.clear();
-            timerTaskMap.put(intervalID, intervalTask);
-            timer.schedule(intervalTask, 0, period);
-        }
+    public static ScheduledCallback scheduleCallback(Runnable callback, long delay) {
+        ScheduledCallback scheduledCallback = new ScheduledCallback(callback);
+        timer.schedule(scheduledCallback, delay);
 
-        return intervalID;
+        return scheduledCallback;
     }
 
     /**
-     * Cancels execution of a scheduled task.
+     * Schedules a task for repeated execution. The task will be executed on the
+     * UI thread and will begin executing immediately.
+     *
+     * @param runnable
+     * The task to execute.
      *
-     * @param intervalID
-     * The ID of the task to cancel.
+     * @param period
+     * The interval at which the task will be repeated.
      */
-    public static void clearInterval(int intervalID) {
-        clearTimerTask(intervalID);
+    public static ScheduledCallback scheduleRecurringCallback(Runnable callback, long period) {
+        return scheduleRecurringCallback(callback, 0, period);
     }
 
     /**
-     * Schedules a task for execution after an elapsed time.
+     * Schedules a task for repeated execution. The task will be executed on the
+     * UI thread.
      *
      * @param runnable
      * The task to execute.
      *
-     * @param timeout
-     * The time after which the task should begin executing.
-     */
-    public static int setTimeout(Runnable runnable, long timeout) {
-        int timeoutID = nextTimerTaskID++;
-
-        TimeoutTask timeoutTask = new TimeoutTask(runnable, timeoutID);
-        timerTaskMap.put(timeoutID, timeoutTask);
-
-        try {
-            timer.schedule(timeoutTask, timeout);
-        } catch (IllegalStateException exception) {
-            System.out.println(exception.getMessage());
-
-            // TODO This is a workaround for an apparent bug in the Mac OSX
-            // Java Plugin, which appears to prematurely kill the timer thread.
-            // Remove this when the issue is fixed.
-            timer = new Timer(true);
-            timerTaskMap.clear();
-            timerTaskMap.put(timeoutID, timeoutTask);
-            timer.schedule(timeoutTask, timeout);
-        }
-
-        return timeoutID;
-    }
-
-    /**
-     * Cancels execution of a scheduled task.
+     * @param delay
+     * The length of time to wait before the first execution of the task
      *
-     * @param timeoutID
-     * The ID of the task to cancel.
+     * @param period
+     * The interval at which the task will be repeated.
      */
-    public static void clearTimeout(int timeoutID) {
-        clearTimerTask(timeoutID);
-    }
+    public static ScheduledCallback scheduleRecurringCallback(Runnable callback, long delay, long period) {
+        ScheduledCallback scheduledCallback = new ScheduledCallback(callback);
+        timer.schedule(scheduledCallback, delay, period);
 
-    /**
-     * Cancels execution of a timer task.
-     *
-     * @param timerTaskID
-     */
-    private static void clearTimerTask(int timerTaskID) {
-        TimerTask timerTask = timerTaskMap.remove(timerTaskID);
-        if (timerTask != null) {
-            timerTask.cancel();
-        }
+        return scheduledCallback;
     }
 
     /**

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/effects/Transition.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/effects/Transition.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/effects/Transition.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/effects/Transition.java Fri Mar 20 17:10:35 2009
@@ -33,19 +33,13 @@
 
     private long startTime = 0;
     private long currentTime = 0;
-    private int intervalID = -1;
+    private ApplicationContext.ScheduledCallback transitionCallback = null;
 
     public static final int DEFAULT_DURATION = 0;
     public static final int DEFAULT_RATE = 15;
 
     private final Runnable updateCallback = new Runnable() {
         public void run() {
-            if (intervalID == -1) {
-                // TODO Figure out why this is happening
-                // System.out.println("Interval task executed after it was canceled.");
-                return;
-            }
-
             currentTime = System.currentTimeMillis();
 
             long endTime = startTime + duration;
@@ -117,7 +111,7 @@
             throw new IllegalArgumentException("duration is negative.");
         }
 
-        if (intervalID != -1) {
+        if (transitionCallback != null) {
             throw new IllegalStateException("Transition is currently running.");
         }
 
@@ -148,7 +142,7 @@
             throw new IllegalArgumentException("rate is negative.");
         }
 
-        if (intervalID != -1) {
+        if (transitionCallback != null) {
             throw new IllegalStateException("Transition is currently running.");
         }
 
@@ -216,7 +210,7 @@
      * it is not
      */
     public boolean isRunning() {
-        return (intervalID != -1);
+        return (transitionCallback != null);
     }
 
     /**
@@ -240,7 +234,7 @@
      * <tt>null</tt> if no notification is necessary
      */
     public void start(TransitionListener transitionListener) {
-        if (intervalID != -1) {
+        if (transitionCallback != null) {
             throw new IllegalStateException("Transition is currently running.");
         }
 
@@ -249,7 +243,8 @@
         startTime = System.currentTimeMillis();
         currentTime = startTime;
 
-        intervalID = ApplicationContext.setInterval(updateCallback, getInterval());
+        transitionCallback = ApplicationContext.scheduleRecurringCallback(updateCallback,
+            getInterval());
 
         update();
     }
@@ -259,10 +254,11 @@
      * {@link TransitionListener#transitionCompleted(Transition)} event.
      */
     public void stop() {
-        if (intervalID != -1) {
-            ApplicationContext.clearInterval(intervalID);
-            intervalID = -1;
+        if (transitionCallback != null) {
+            transitionCallback.cancel();
         }
+
+        transitionCallback = null;
     }
 
     /**
@@ -270,7 +266,7 @@
      * {@link TransitionListener#transitionCompleted(Transition)} event.
      */
     public void end() {
-    	if (intervalID != -1) {
+    	if (transitionCallback != null) {
         	currentTime = startTime + duration;
         	stop();
         	update();

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/ComponentSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/ComponentSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/ComponentSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/ComponentSkin.java Fri Mar 20 17:10:35 2009
@@ -70,7 +70,7 @@
     private int height = 0;
 
     private ShowTooltipCallback showTooltipCallback = new ShowTooltipCallback();
-    private int showTooltipTimeoutID = -1;
+    private ApplicationContext.ScheduledCallback scheduledShowTooltipCallback = null;
 
     public static final int SHOW_TOOLTIP_TIMEOUT = 1000;
 
@@ -182,14 +182,14 @@
 
     // Component mouse events
     public boolean mouseMove(Component component, int x, int y) {
-        if (showTooltipTimeoutID != -1) {
-            ApplicationContext.clearTimeout(showTooltipTimeoutID);
-            showTooltipTimeoutID = -1;
+        if (scheduledShowTooltipCallback != null) {
+            scheduledShowTooltipCallback.cancel();
+            scheduledShowTooltipCallback = null;
         }
 
         if (getComponent().getTooltipText() != null) {
-            showTooltipTimeoutID = ApplicationContext.setTimeout(showTooltipCallback,
-                SHOW_TOOLTIP_TIMEOUT);
+            scheduledShowTooltipCallback =
+                ApplicationContext.scheduleCallback(showTooltipCallback, SHOW_TOOLTIP_TIMEOUT);
         }
 
         return false;
@@ -199,9 +199,9 @@
     }
 
     public void mouseOut(Component component) {
-        if (showTooltipTimeoutID != -1) {
-            ApplicationContext.clearTimeout(showTooltipTimeoutID);
-            showTooltipTimeoutID = -1;
+        if (scheduledShowTooltipCallback != null) {
+            scheduledShowTooltipCallback.cancel();
+            scheduledShowTooltipCallback = null;
         }
     }
 

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/MenuItemSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/MenuItemSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/MenuItemSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/MenuItemSkin.java Fri Mar 20 17:10:35 2009
@@ -34,9 +34,10 @@
 public abstract class MenuItemSkin extends ButtonSkin implements Menu.ItemListener {
     protected MenuPopup menuPopup = new MenuPopup();
 
-    protected int buttonPressTimeoutID = -1;
     protected int buttonPressInterval = 200;
 
+    protected ApplicationContext.ScheduledCallback buttonPressCallback = null;
+
     @Override
     public void install(Component component) {
         super.install(component);
@@ -62,11 +63,14 @@
     public void mouseOver(Component component) {
         super.mouseOver(component);
 
-        ApplicationContext.clearInterval(buttonPressTimeoutID);
+        if (buttonPressCallback != null) {
+            buttonPressCallback.cancel();
+            buttonPressCallback = null;
+        }
 
         final Menu.Item menuItem = (Menu.Item)getComponent();
         if (menuItem.getMenu() != null) {
-            buttonPressTimeoutID = ApplicationContext.setTimeout(new Runnable() {
+            buttonPressCallback = ApplicationContext.scheduleCallback(new Runnable() {
                 public void run() {
                     menuItem.press();
                 }
@@ -79,13 +83,21 @@
     @Override
     public void mouseOut(Component component) {
         super.mouseOut(component);
-        ApplicationContext.clearInterval(buttonPressTimeoutID);
+
+        if (buttonPressCallback != null) {
+            buttonPressCallback.cancel();
+            buttonPressCallback = null;
+        }
     }
 
     @Override
     public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
         boolean consumed = super.mouseDown(component, button, x, y);
-        ApplicationContext.clearInterval(buttonPressTimeoutID);
+
+        if (buttonPressCallback != null) {
+            buttonPressCallback.cancel();
+            buttonPressCallback = null;
+        }
 
         return consumed;
     }
@@ -104,7 +116,10 @@
     public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
         boolean consumed = false;
 
-        ApplicationContext.clearInterval(buttonPressTimeoutID);
+        if (buttonPressCallback != null) {
+            buttonPressCallback.cancel();
+            buttonPressCallback = null;
+        }
 
         Menu.Item menuItem = (Menu.Item)getComponent();
         Menu menu = menuItem.getMenu();

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/TextAreaSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/TextAreaSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/TextAreaSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/TextAreaSkin.java Fri Mar 20 17:10:35 2009
@@ -1180,7 +1180,7 @@
     private Rectangle caret = new Rectangle();
     private boolean caretOn = false;
     private BlinkCursorCallback blinkCursorCallback = new BlinkCursorCallback();
-    private int blinkCursorIntervalID = -1;
+    private ApplicationContext.ScheduledCallback scheduledBlinkCursorCallback = null;
 
     private Font font;
     private Color color;
@@ -1312,17 +1312,18 @@
 
     private void showCaret(boolean show) {
         if (show) {
-            if (blinkCursorIntervalID == -1) {
-                blinkCursorIntervalID = ApplicationContext.setInterval(blinkCursorCallback,
-                    Platform.getCursorBlinkRate());
+            if (scheduledBlinkCursorCallback == null) {
+                scheduledBlinkCursorCallback =
+                    ApplicationContext.scheduleRecurringCallback(blinkCursorCallback,
+                        Platform.getCursorBlinkRate());
 
                 // Run the callback once now to show the cursor immediately
                 blinkCursorCallback.run();
             }
         } else {
-            if (blinkCursorIntervalID != -1) {
-                ApplicationContext.clearInterval(blinkCursorIntervalID);
-                blinkCursorIntervalID = -1;
+            if (scheduledBlinkCursorCallback != null) {
+                scheduledBlinkCursorCallback.cancel();
+                scheduledBlinkCursorCallback = null;
             }
         }
     }

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraPanoramaSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraPanoramaSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraPanoramaSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraPanoramaSkin.java Fri Mar 20 17:10:35 2009
@@ -166,8 +166,10 @@
             if (northButton.isMouseOver()) {
                 int scrollTop = Math.max(panorama.getScrollTop()
                     - (int)scrollDistance, 0);
-                if (scrollTop == 0) {
-                    ApplicationContext.clearInterval(scrollIntervalID);
+                if (scrollTop == 0
+                    && scheduledScrollCallback != null) {
+                    scheduledScrollCallback.cancel();
+                    scheduledScrollCallback = null;
                 }
 
                 panorama.setScrollTop(scrollTop);
@@ -175,8 +177,10 @@
                 int maxScrollTop = getMaxScrollTop();
                 int scrollTop = Math.min(panorama.getScrollTop()
                     + (int)scrollDistance, maxScrollTop);
-                if (scrollTop == maxScrollTop) {
-                    ApplicationContext.clearInterval(scrollIntervalID);
+                if (scrollTop == maxScrollTop
+                    && scheduledScrollCallback != null) {
+                    scheduledScrollCallback.cancel();
+                    scheduledScrollCallback = null;
                 }
 
                 panorama.setScrollTop(scrollTop);
@@ -185,8 +189,10 @@
                 int maxScrollLeft = getMaxScrollLeft();
                 int scrollLeft = Math.min(panorama.getScrollLeft()
                     + (int)scrollDistance, maxScrollLeft);
-                if (scrollLeft == maxScrollLeft) {
-                    ApplicationContext.clearInterval(scrollIntervalID);
+                if (scrollLeft == maxScrollLeft
+                    && scheduledScrollCallback != null) {
+                    scheduledScrollCallback.cancel();
+                    scheduledScrollCallback = null;
                 }
 
                 System.out.println(scrollLeft + ", " + maxScrollLeft);
@@ -194,8 +200,10 @@
             } else if (westButton.isMouseOver()) {
                 int scrollLeft = Math.max(panorama.getScrollLeft()
                     - (int)scrollDistance, 0);
-                if (scrollLeft == 0) {
-                    ApplicationContext.clearInterval(scrollIntervalID);
+                if (scrollLeft == 0
+                    && scheduledScrollCallback != null) {
+                    scheduledScrollCallback.cancel();
+                    scheduledScrollCallback = null;
                 }
 
                 System.out.println(scrollLeft);
@@ -234,18 +242,22 @@
         public void mouseOver(Component component) {
             // Start scroll timer
             scrollDistance = INITIAL_SCROLL_DISTANCE;
-            scrollIntervalID = ApplicationContext.setInterval(scrollCallback, SCROLL_RATE);
+            scheduledScrollCallback =
+                ApplicationContext.scheduleRecurringCallback(scrollCallback, SCROLL_RATE);
         }
 
         public void mouseOut(Component component) {
             // Stop scroll timer
-            ApplicationContext.clearInterval(scrollIntervalID);
+            if (scheduledScrollCallback != null) {
+                scheduledScrollCallback.cancel();
+                scheduledScrollCallback = null;
+            }
         }
     };
 
     private float scrollDistance = 0;
     private ScrollCallback scrollCallback = new ScrollCallback();
-    private int scrollIntervalID = -1;
+    private ApplicationContext.ScheduledCallback scheduledScrollCallback = null;
 
     private static final int SCROLL_RATE = 50;
     private static final float INITIAL_SCROLL_DISTANCE = 10;

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraScrollBarSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraScrollBarSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraScrollBarSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraScrollBarSkin.java Fri Mar 20 17:10:35 2009
@@ -70,8 +70,7 @@
         public IncrementType incrementType;
         public int stopValue;
 
-        private int timeoutID = -1;
-        private int intervalID = -1;
+        private ApplicationContext.ScheduledCallback scheduledScrollCallback = null;
 
         /**
          * Starts scrolling the specified scroll bar with no stop value.
@@ -113,8 +112,7 @@
          * Only one scroll bar may be automatically scrolled at one time
          */
         public void start(int direction, IncrementType incrementType, int stopValue) {
-            if (timeoutID != -1
-                || intervalID != -1) {
+            if (scheduledScrollCallback != null) {
                 throw new IllegalStateException("Already running");
             }
 
@@ -122,18 +120,12 @@
             this.incrementType = incrementType;
             this.stopValue = stopValue;
 
-            // Wait a timeout period, then begin repidly scrolling
-            timeoutID = ApplicationContext.setTimeout(new Runnable() {
+            // Wait a timeout period, then begin rapidly scrolling
+            scheduledScrollCallback = ApplicationContext.scheduleRecurringCallback(new Runnable() {
                 public void run() {
-                    intervalID = ApplicationContext.setInterval(new Runnable() {
-                        public void run() {
-                            scroll();
-                        }
-                    }, 30);
-
-                    timeoutID = -1;
+                    scroll();
                 }
-            }, 400);
+            }, 400, 30);
 
             // We initially scroll once to register that we've started
             scroll();
@@ -143,14 +135,9 @@
          * Stops any automatic scrolling in progress.
          */
         public void stop() {
-            if (timeoutID != -1) {
-                ApplicationContext.clearTimeout(timeoutID);
-                timeoutID = -1;
-            }
-
-            if (intervalID != -1) {
-                ApplicationContext.clearInterval(intervalID);
-                intervalID = -1;
+            if (scheduledScrollCallback != null) {
+                scheduledScrollCallback.cancel();
+                scheduledScrollCallback = null;
             }
         }
 

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraSpinnerSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraSpinnerSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraSpinnerSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraSpinnerSkin.java Fri Mar 20 17:10:35 2009
@@ -51,8 +51,7 @@
         public Spinner spinner;
         public int direction;
 
-        private int timeoutID = -1;
-        private int intervalID = -1;
+        private ApplicationContext.ScheduledCallback scheduledSpinnerCallback = null;
 
         /**
          * Starts spinning the specified spinner.
@@ -71,26 +70,19 @@
         public void start(Spinner spinner, int direction) {
             assert(direction != 0) : "Direction must be positive or negative";
 
-            if (timeoutID != -1
-                || intervalID != -1) {
+            if (scheduledSpinnerCallback != null) {
                 throw new IllegalStateException("Already running");
             }
 
             this.spinner = spinner;
             this.direction = direction;
 
-            // Wait a timeout period, then begin repidly spinning
-            timeoutID = ApplicationContext.setTimeout(new Runnable() {
+            // Wait a timeout period, then begin rapidly spinning
+            scheduledSpinnerCallback = ApplicationContext.scheduleRecurringCallback(new Runnable() {
                 public void run() {
-                    intervalID = ApplicationContext.setInterval(new Runnable() {
-                        public void run() {
-                            spin();
-                        }
-                    }, 30);
-
-                    timeoutID = -1;
+                    spin();
                 }
-            }, 400);
+            }, 400, 30);
 
             // We initially spin once to register that we've started
             spin();
@@ -124,14 +116,9 @@
          * Stops any automatic spinning in progress.
          */
         public void stop() {
-            if (timeoutID != -1) {
-                ApplicationContext.clearTimeout(timeoutID);
-                timeoutID = -1;
-            }
-
-            if (intervalID != -1) {
-                ApplicationContext.clearInterval(intervalID);
-                intervalID = -1;
+            if (scheduledSpinnerCallback != null) {
+                scheduledSpinnerCallback.cancel();
+                scheduledSpinnerCallback = null;
             }
         }
     }

Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTextInputSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTextInputSkin.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTextInputSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/skin/terra/TerraTextInputSkin.java Fri Mar 20 17:10:35 2009
@@ -224,10 +224,10 @@
     private int scrollLeft = 0;
 
     private BlinkCursorCallback blinkCursorCallback = new BlinkCursorCallback();
-    private int blinkCursorIntervalID = -1;
+    private ApplicationContext.ScheduledCallback scheduledBlinkCursorCallback = null;
 
     private ScrollSelectionCallback scrollSelectionCallback = new ScrollSelectionCallback();
-    private int scrollSelectionIntervalID = -1;
+    private ApplicationContext.ScheduledCallback scheduledScrollSelectionCallback = null;
 
     private Font font;
     private Color color;
@@ -470,17 +470,18 @@
 
     public void showCaret(boolean show) {
         if (show) {
-            if (blinkCursorIntervalID == -1) {
-                blinkCursorIntervalID = ApplicationContext.setInterval(blinkCursorCallback,
-                    Platform.getCursorBlinkRate());
+            if (scheduledBlinkCursorCallback == null) {
+                scheduledBlinkCursorCallback =
+                    ApplicationContext.scheduleRecurringCallback(blinkCursorCallback,
+                        Platform.getCursorBlinkRate());
 
                 // Run the callback once now to show the cursor immediately
                 blinkCursorCallback.run();
             }
         } else {
-            if (blinkCursorIntervalID != -1) {
-                ApplicationContext.clearInterval(blinkCursorIntervalID);
-                blinkCursorIntervalID = -1;
+            if (scheduledBlinkCursorCallback != null) {
+                scheduledBlinkCursorCallback.cancel();
+                scheduledBlinkCursorCallback = null;
             }
         }
     }
@@ -840,9 +841,9 @@
                 if (x >= 0
                     && x < textInput.getWidth()) {
                     // Stop the scroll selection timer
-                    if (scrollSelectionIntervalID != -1) {
-                        ApplicationContext.clearInterval(scrollSelectionIntervalID);
-                        scrollSelectionIntervalID = -1;
+                    if (scheduledScrollSelectionCallback != null) {
+                        scheduledScrollSelectionCallback.cancel();
+                        scheduledScrollSelectionCallback = null;
                     }
 
                     // Get the current selection
@@ -865,9 +866,10 @@
                 } else {
                     scrollSelectionCallback.x = x;
 
-                    if (scrollSelectionIntervalID == -1) {
-                        scrollSelectionIntervalID =
-                            ApplicationContext.setInterval(scrollSelectionCallback, SCROLL_RATE);
+                    if (scheduledScrollSelectionCallback == null) {
+                        scheduledScrollSelectionCallback =
+                            ApplicationContext.scheduleRecurringCallback(scrollSelectionCallback,
+                                SCROLL_RATE);
 
                         // Run the callback once now to scroll the selection immediately
                         scrollSelectionCallback.run();
@@ -907,9 +909,9 @@
 
         if (Mouse.getCapturer() == component) {
             // Stop the scroll selection timer
-            if (scrollSelectionIntervalID != -1) {
-                ApplicationContext.clearInterval(scrollSelectionIntervalID);
-                scrollSelectionIntervalID = -1;
+            if (scheduledScrollSelectionCallback != null) {
+                scheduledScrollSelectionCallback.cancel();
+                scheduledScrollSelectionCallback = null;
             }
 
             Mouse.release();

Modified: incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java?rev=756633&r1=756632&r2=756633&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java Fri Mar 20 17:10:35 2009
@@ -91,7 +91,7 @@
     }
 
     private URL location = null;
-    private Dictionary<String, Object> resources = null;
+    private Resources resources = null;
 
     private HashMap<String, Object> namedObjects = new HashMap<String, Object>();
     private HashMap<String, WTKXSerializer> includeSerializers = new HashMap<String, WTKXSerializer>();
@@ -120,7 +120,7 @@
         this(null);
     }
 
-    public WTKXSerializer(Dictionary<String, Object> resources) {
+    public WTKXSerializer(Resources resources) {
         this.resources = resources;
 
         try {
@@ -232,7 +232,7 @@
                                 String src = null;
                                 String namespace = null;
 
-                                Dictionary<String, Object> includeResources = resources;
+                                Resources includeResources = resources;
 
                                 ArrayList<Attribute> attributes = new ArrayList<Attribute>();