hillion     02/02/25 07:05:33

  Modified:    samples  starfield.svg
               sources/org/apache/batik/bridge
                        AbstractGraphicsNodeBridge.java
                        AbstractSVGGradientElementBridge.java
                        BridgeContext.java BridgeEventSupport.java
                        DocumentLoader.java RepaintManager.java
                        RepaintRateManager.java SVGAElementBridge.java
                        SVGGElementBridge.java SVGImageElementBridge.java
                        SVGSVGElementBridge.java SVGTextElementBridge.java
                        SVGUseElementBridge.java ScriptingEnvironment.java
                        UpdateManager.java
               sources/org/apache/batik/dom AbstractDocument.java
                        AbstractNode.java
               sources/org/apache/batik/dom/svg DefaultSVGContext.java
                        SVGContext.java SVGOMDocument.java
               sources/org/apache/batik/script/rhino
                        EventTargetWrapHandler.java RhinoInterpreter.java
               sources/org/apache/batik/swing/svg JSVGComponent.java
                        SVGLoadEventDispatcher.java
               sources/org/apache/batik/util RunnableQueue.java
  Added:       sources/org/apache/batik/bridge NoRepaintRunnable.java
               sources/org/apache/batik/script Window.java
               sources/org/apache/batik/script/rhino WindowWrapper.java
  Removed:     sources/org/apache/batik/script JavaFunction.java
               sources/org/apache/batik/script/rhino RhinoFunction.java
  Log:
  - Scripts are now evaluated from the update thread,
  - defined a 'window' object to expose batik to the script writers.
  
  Revision  Changes    Path
  1.3       +22 -20    xml-batik/samples/starfield.svg
  
  Index: starfield.svg
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/starfield.svg,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- starfield.svg     18 Feb 2002 12:39:48 -0000      1.2
  +++ starfield.svg     25 Feb 2002 15:05:31 -0000      1.3
  @@ -14,7 +14,7 @@
   <!-- A star field                                                              -->
   <!--                                                                           -->
   <!-- @author [EMAIL PROTECTED]                                                  -->
  -<!-- @version $Id: starfield.svg,v 1.2 2002/02/18 12:39:48 hillion Exp $ -->
  +<!-- @version $Id: starfield.svg,v 1.3 2002/02/25 15:05:31 hillion Exp $ -->
   <!-- ========================================================================= -->
   
   <svg xmlns="http://www.w3.org/2000/svg";
  @@ -115,14 +115,15 @@
           var showControlPanel = false
           var helpText1 = "Click on the title to show the control panel"
           var helpText2 = "Click on the title to hide the control panel"
  -
  +        var startDate;
  +        var nframe;
   
           //
           // Decreases the number of stars. If numberOfStars is at his min value,
           // do nothing.
           //
           function decreaseNumberOfStars(evt) {
  -            if (numberOfStars == starIncrement) {
  +            if (numberOfStars == 0) {
                   return
               }
   
  @@ -132,7 +133,7 @@
               updateText("number-label", numberOfStars)
   
               unitCount--
  -            units.setAttributeNS(null, "width", ""+(unitCount * 10))
  +            units.setAttributeNS(null, "width", unitCount * 10)
           }
   
           //
  @@ -150,7 +151,7 @@
               updateText("number-label", numberOfStars)
   
               unitCount++
  -            units.setAttributeNS(null, "width", ""+(unitCount * 10))
  +            units.setAttributeNS(null, "width", unitCount * 10)
   
           }
   
  @@ -170,6 +171,8 @@
               grp.replaceChild(newelt, elt)
           }
   
  +        var itv;
  +
           //
           // Starts the animation loops.
           //
  @@ -183,32 +186,31 @@
               }
               updateText("help", helpText1)
   
  -            setTimeout("animateStars()", 50, new Date(), 0)
  -
  -            startDate = new Date();
  +            itv = setInterval("animateStars()", 50)
  + 
  +            startDate = new Date()
  +            nframe = 0
           }
   
           //
  -        // The stars animation.
  +        // Animates the stars.
           //
  -        function animateStars(dt, n) {
  +        function animateStars() {
               for (var i = 0; i < starIncrement * 10; i++) {            
                   stars[i].update()
               }
  -            if (n < 10) {
  -                n++
  +            if (nframe < 10) {
  +                nframe++
               } else {
                   var d = new Date()
  -                var dt = d - dt
  +                var dt = d - startDate
                   var val = Math.round(10000 / dt)
   
                   updateText("fps1", val);
                   updateText("fps2", val);
  -                dt = d
  -                n = 0
  +                startDate = d
  +                nframe = 0
               }
  -
  -            setTimeout("animateStars()", 50, dt, n)
           }
   
           //
  @@ -220,10 +222,10 @@
                   showControlPanel = !showControlPanel
                   if (showControlPanel) {
                       updateText("help", helpText2)
  -                    setTimeout("controlPanelAnimation()", 50, 20, 1)
  +                    setTimeout(controlPanelAnimation, 50, 20, 1)
                   } else {
                       updateText("help", helpText1)
  -                    setTimeout("controlPanelAnimation()", 50, 0, -1)
  +                    setTimeout(controlPanelAnimation, 50, 0, -1)
                   }
               }            
           }
  @@ -237,7 +239,7 @@
               elt.setAttributeNS(null, "transform", "translate(0 " + ((n - 100) * 
sgn) + ")");
   
               if (n < 200) {
  -                setTimeout("controlPanelAnimation()", 50, n + 20, sgn)
  +                setTimeout(controlPanelAnimation, 50, n + 20, sgn)
               } else {
                   controlPanelMoving = false;
               }
  
  
  
  1.14      +3 -2      
xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java
  
  Index: AbstractGraphicsNodeBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- AbstractGraphicsNodeBridge.java   15 Feb 2002 14:58:44 -0000      1.13
  +++ AbstractGraphicsNodeBridge.java   25 Feb 2002 15:05:31 -0000      1.14
  @@ -39,7 +39,7 @@
    * </ul>
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: AbstractGraphicsNodeBridge.java,v 1.13 2002/02/15 14:58:44 
tkormann Exp $
  + * @version $Id: AbstractGraphicsNodeBridge.java,v 1.14 2002/02/25 15:05:31 hillion 
Exp $
    */
   public abstract class AbstractGraphicsNodeBridge extends AbstractSVGBridge
       implements BridgeUpdateHandler, GraphicsNodeBridge, ErrorConstants {
  @@ -200,7 +200,8 @@
       /**
        * The listener class for 'DOMAttrModified' event.
        */
  -    protected class DOMAttrModifiedEventListener implements EventListener {
  +    protected class DOMAttrModifiedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMAttrModfied' events and deleguates to the
  
  
  
  1.5       +3 -2      
xml-batik/sources/org/apache/batik/bridge/AbstractSVGGradientElementBridge.java
  
  Index: AbstractSVGGradientElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/AbstractSVGGradientElementBridge.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AbstractSVGGradientElementBridge.java     15 Feb 2002 14:58:44 -0000      1.4
  +++ AbstractSVGGradientElementBridge.java     25 Feb 2002 15:05:31 -0000      1.5
  @@ -33,7 +33,7 @@
    * Bridge class for vending gradients.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: AbstractSVGGradientElementBridge.java,v 1.4 2002/02/15 14:58:44 
tkormann Exp $
  + * @version $Id: AbstractSVGGradientElementBridge.java,v 1.5 2002/02/25 15:05:31 
hillion Exp $
    */
   public abstract class AbstractSVGGradientElementBridge extends AbstractSVGBridge
       implements PaintBridge, ErrorConstants {
  @@ -199,7 +199,8 @@
       /**
        * The listener class for 'DOMAttrModified' event.
        */
  -    protected class DOMAttrModifiedEventListener implements EventListener {
  +    protected class DOMAttrModifiedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMAttrModfied' events and deleguates to the
  
  
  
  1.38      +6 -2      xml-batik/sources/org/apache/batik/bridge/BridgeContext.java
  
  Index: BridgeContext.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeContext.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- BridgeContext.java        22 Feb 2002 16:52:09 -0000      1.37
  +++ BridgeContext.java        25 Feb 2002 15:05:31 -0000      1.38
  @@ -22,6 +22,8 @@
   import java.util.Map;
   
   import org.apache.batik.css.HiddenChildElementSupport;
  +import org.apache.batik.dom.svg.DefaultSVGContext;
  +import org.apache.batik.dom.svg.SVGOMDocument;
   import org.apache.batik.gvt.GraphicsNode;
   import org.apache.batik.gvt.TextPainter;
   import org.apache.batik.script.Interpreter;
  @@ -31,6 +33,8 @@
   
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.events.EventListener;
   import org.w3c.dom.svg.SVGDocument;
   
   import org.apache.batik.gvt.filter.GraphicsNodeRableFactory;
  @@ -47,7 +51,7 @@
    * a SVG DOM tree such as the current viewport or the user agent.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: BridgeContext.java,v 1.37 2002/02/22 16:52:09 tkormann Exp $
  + * @version $Id: BridgeContext.java,v 1.38 2002/02/25 15:05:31 hillion Exp $
    */
   public class BridgeContext implements ErrorConstants {
   
  @@ -217,7 +221,7 @@
       // end debug leak
       */
   
  -    // properties
  +    // properties ////////////////////////////////////
   
       /**
        * Sets the text painter that will be used by text nodes. This attributes
  
  
  
  1.24      +4 -4      
xml-batik/sources/org/apache/batik/bridge/BridgeEventSupport.java
  
  Index: BridgeEventSupport.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeEventSupport.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- BridgeEventSupport.java   18 Feb 2002 09:11:58 -0000      1.23
  +++ BridgeEventSupport.java   25 Feb 2002 15:05:31 -0000      1.24
  @@ -56,7 +56,7 @@
    * on the GVT root to propagate GVT events to the DOM.
    * @author <a href="mailto:[EMAIL PROTECTED]>Christophe Jolif</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: BridgeEventSupport.java,v 1.23 2002/02/18 09:11:58 hillion Exp $
  + * @version $Id: BridgeEventSupport.java,v 1.24 2002/02/25 15:05:31 hillion Exp $
    */
   class BridgeEventSupport implements SVGConstants {
       private static final String[] EVENT_ATTRIBUTES_GRAPHICS = {
  @@ -218,7 +218,7 @@
        * by the bridge on the unload event.
        */
       private static class SVGUnloadListener
  -        implements EventListener {
  +        implements UnwrappedEventListener {
           private class Entry {
               String type;
               EventListener caller;
  @@ -280,7 +280,7 @@
       }
   
       private static class GVTUnloadListener
  -        implements EventListener {
  +        implements UnwrappedEventListener {
           private EventDispatcher dispatcher;
           private Listener listener;
           GVTUnloadListener(EventDispatcher dispatcher, Listener listener) {
  @@ -417,7 +417,7 @@
           }
       }
   
  -    public static class ScriptCaller implements EventListener {
  +    public static class ScriptCaller implements UnwrappedEventListener {
           private String script = null;
           private BridgeContext context;
           private String language;
  
  
  
  1.12      +5 -5      xml-batik/sources/org/apache/batik/bridge/DocumentLoader.java
  
  Index: DocumentLoader.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/DocumentLoader.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DocumentLoader.java       24 Oct 2001 14:52:35 -0000      1.11
  +++ DocumentLoader.java       25 Feb 2002 15:05:31 -0000      1.12
  @@ -30,7 +30,7 @@
    * maintaining a cache.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: DocumentLoader.java,v 1.11 2001/10/24 14:52:35 tkormann Exp $
  + * @version $Id: DocumentLoader.java,v 1.12 2002/02/25 15:05:31 hillion Exp $
    */
   public class DocumentLoader {
   
  @@ -72,7 +72,8 @@
       /**
        * Returns a document from the specified uri.
        * @param uri the uri of the document
  -     * @exception IOException if an I/O error occured while loading the document
  +     * @exception IOException if an I/O error occured while loading
  +     * the document
        */
       public Document loadDocument(String uri) throws IOException {
           int n = uri.indexOf('#');
  @@ -82,10 +83,9 @@
           DocumentState state = (DocumentState)cacheMap.get(uri);
           if (state == null) {
               Document document = documentFactory.createDocument(uri);
  -            DefaultSVGContext ctx
  -                = (DefaultSVGContext)((SVGOMDocument)document).getSVGContext();
  +            SVGOMDocument svgDoc = (SVGOMDocument)document;
  +            DefaultSVGContext ctx = (DefaultSVGContext)svgDoc.getSVGContext();
               ctx.setUserStyleSheetURI(userAgent.getUserStyleSheetURI());
  -
               DocumentDescriptor desc = documentFactory.getDocumentDescriptor();
               state = new DocumentState(uri, document, desc);
               cacheMap.put(uri, state);
  
  
  
  1.10      +22 -43    xml-batik/sources/org/apache/batik/bridge/RepaintManager.java
  
  Index: RepaintManager.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/RepaintManager.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- RepaintManager.java       22 Feb 2002 16:52:09 -0000      1.9
  +++ RepaintManager.java       25 Feb 2002 15:05:31 -0000      1.10
  @@ -26,7 +26,7 @@
    * This class manages the rendering of a GVT tree.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: RepaintManager.java,v 1.9 2002/02/22 16:52:09 tkormann Exp $
  + * @version $Id: RepaintManager.java,v 1.10 2002/02/25 15:05:31 hillion Exp $
    */
   public class RepaintManager {
       
  @@ -46,6 +46,15 @@
       protected boolean enabled;
   
       /**
  +     * The repaint runnable.
  +     */
  +    protected Runnable repaintRunnable = new Runnable() {
  +            public void run() {
  +                repaint();
  +            }
  +        };
  +
  +    /**
        * Creates a new repaint manager.
        */
       public RepaintManager(UpdateManager um, ImageRenderer r) {
  @@ -54,52 +63,22 @@
       }
       
       /**
  -     * Provokes a repaint, if needed.
  -     * @param b If true, waits until the repaint has finished.
  +     * Repaints the dirty areas, if needed.
        */
  -    public void repaint(boolean b) throws InterruptedException {
  -        if (!enabled) {
  -            return;
  -        }
  -        final UpdateTracker ut = updateManager.getUpdateTracker();
  -        Runnable r = new Runnable() {
  -                public void run() {
  -                    if (ut.hasChanged()) {
  -                        List dirtyAreas = ut.getDirtyAreas();
  -                        if (dirtyAreas != null) {
  -                            // Calls the UpdateManager methods
  -                            // to allow events to be fired.
  -                            updateManager.modifiedAreas(dirtyAreas);
  -                            updateManager.updateRendering(dirtyAreas);
  -                        }
  -                        ut.clear();
  -                    }
  -                }
  -            };
  -        if (updateManager.getUpdateRunnableQueue().getThread() == null) {
  -            return;
  -        }
  -        if (b) {
  -            updateManager.getUpdateRunnableQueue().invokeAndWait(r);
  -        } else {
  -            updateManager.getUpdateRunnableQueue().invokeLater(r);
  +    public void repaint() {
  +        UpdateTracker ut = updateManager.getUpdateTracker();
  +        if (ut.hasChanged()) {
  +            List dirtyAreas = ut.getDirtyAreas();
  +            if (dirtyAreas != null) {
  +                // Calls the UpdateManager methods
  +                // to allow events to be fired.
  +                updateManager.modifiedAreas(dirtyAreas);
  +                updateManager.updateRendering(dirtyAreas);
  +            }
  +            ut.clear();
           }
       }
   
  -    /**
  -     * Suspends the repaint management.
  -     */
  -    public void disable() {
  -        enabled = false;
  -    }
  -
  -    /**
  -     * Suspends the repaint management.
  -     */
  -    public void enable() {
  -        enabled = true;
  -    }
  -    
       /**
        * Call this to let the Repaint Manager know that certain areas
        * in the image have been modified and need to be rerendered..
  
  
  
  1.2       +19 -4     
xml-batik/sources/org/apache/batik/bridge/RepaintRateManager.java
  
  Index: RepaintRateManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/RepaintRateManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RepaintRateManager.java   11 Feb 2002 13:14:29 -0000      1.1
  +++ RepaintRateManager.java   25 Feb 2002 15:05:31 -0000      1.2
  @@ -8,12 +8,14 @@
   
   package org.apache.batik.bridge;
   
  +import org.apache.batik.util.RunnableQueue;
  +
   /**
    * This class is responsible of deciding whether or not a repaint is needed.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thomas DeWeese</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: RepaintRateManager.java,v 1.1 2002/02/11 13:14:29 hillion Exp $
  + * @version $Id: RepaintRateManager.java,v 1.2 2002/02/25 15:05:31 hillion Exp $
    */
   public class RepaintRateManager extends Thread {
       
  @@ -44,18 +46,31 @@
        * current frame-rate easily)
        */
       public void run() {
  -        long lastFrameTime, currentTime, tm, sleepTime;
  +        long lastFrameTime;
  +        long currentTime;
  +        long tm;
  +        long sleepTime;
  +
  +        final RepaintManager rm = updateManager.getRepaintManager();
  +        Runnable repaintRunnable = new NoRepaintRunnable() {
  +                public void run() {
  +                    rm.repaint();
  +                }
  +            };
  +        RunnableQueue rq = updateManager.getUpdateRunnableQueue();
  +
           try {
               while (!Thread.currentThread().isInterrupted()) {
                   lastFrameTime = System.currentTimeMillis();
   
  -                updateManager.getRepaintManager().repaint(true);
  +                rq.invokeAndWait(repaintRunnable);
   
                   currentTime = System.currentTimeMillis();
                   tm = currentTime - lastFrameTime;
                   sleepTime = targetFrameTime-tm;
  -                if (sleepTime > 0)
  +                if (sleepTime > 0) {
                       sleep(sleepTime);
  +                }
               }
           } catch (InterruptedException e) {
           }
  
  
  
  1.12      +7 -4      xml-batik/sources/org/apache/batik/bridge/SVGAElementBridge.java
  
  Index: SVGAElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGAElementBridge.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- SVGAElementBridge.java    19 Nov 2001 08:29:25 -0000      1.11
  +++ SVGAElementBridge.java    25 Feb 2002 15:05:31 -0000      1.12
  @@ -25,7 +25,7 @@
    * Bridge class for the &lt;a> element.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: SVGAElementBridge.java,v 1.11 2001/11/19 08:29:25 tkormann Exp $
  + * @version $Id: SVGAElementBridge.java,v 1.12 2002/02/25 15:05:31 hillion Exp $
    */
   public class SVGAElementBridge extends AbstractGraphicsNodeBridge {
   
  @@ -87,7 +87,8 @@
       /**
        * To handle a click on an anchor.
        */
  -    protected static class AnchorListener implements EventListener {
  +    protected static class AnchorListener
  +        implements UnwrappedEventListener {
   
           protected UserAgent userAgent;
   
  @@ -115,7 +116,8 @@
       /**
        * To handle a mouseover on an anchor and set the cursor.
        */
  -    protected static class CursorMouseOverListener implements EventListener {
  +    protected static class CursorMouseOverListener
  +        implements UnwrappedEventListener {
   
           protected UserAgent userAgent;
   
  @@ -146,7 +148,8 @@
       /**
        * To handle a mouseout on an anchor and set the cursor.
        */
  -    protected static class CursorMouseOutListener implements EventListener {
  +    protected static class CursorMouseOutListener
  +        implements UnwrappedEventListener {
   
           protected UserAgent userAgent;
   
  
  
  
  1.15      +5 -3      xml-batik/sources/org/apache/batik/bridge/SVGGElementBridge.java
  
  Index: SVGGElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGGElementBridge.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- SVGGElementBridge.java    15 Feb 2002 14:58:44 -0000      1.14
  +++ SVGGElementBridge.java    25 Feb 2002 15:05:31 -0000      1.15
  @@ -26,7 +26,7 @@
    * Bridge class for the &lt;g> element.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: SVGGElementBridge.java,v 1.14 2002/02/15 14:58:44 tkormann Exp $
  + * @version $Id: SVGGElementBridge.java,v 1.15 2002/02/25 15:05:31 hillion Exp $
    */
   public class SVGGElementBridge extends AbstractGraphicsNodeBridge {
   
  @@ -190,7 +190,8 @@
       /**
        * The listener class for 'DOMNodeInserted' event.
        */
  -    protected class DOMNodeInsertedEventListener implements EventListener {
  +    protected class DOMNodeInsertedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMNodeInserted' events and deleguates to the
  @@ -210,7 +211,8 @@
       /**
        * The listener class for 'DOMNodeRemoved' event.
        */
  -    protected class DOMNodeRemovedEventListener implements EventListener {
  +    protected class DOMNodeRemovedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMNodeRemoved' events and deleguates to the
  
  
  
  1.39      +3 -2      
xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java
  
  Index: SVGImageElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- SVGImageElementBridge.java        19 Feb 2002 18:01:29 -0000      1.38
  +++ SVGImageElementBridge.java        25 Feb 2002 15:05:31 -0000      1.39
  @@ -53,7 +53,7 @@
    * Bridge class for the &lt;image> element.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: SVGImageElementBridge.java,v 1.38 2002/02/19 18:01:29 deweese Exp $
  + * @version $Id: SVGImageElementBridge.java,v 1.39 2002/02/25 15:05:31 hillion Exp $
    */
   public class SVGImageElementBridge extends AbstractGraphicsNodeBridge {
   
  @@ -355,7 +355,8 @@
        * A simple DOM listener to forward events from the SVG image document to
        * the original document.
        */
  -    protected static class ForwardEventListener implements EventListener {
  +    protected static class ForwardEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * The root element of the SVG image.
  
  
  
  1.24      +3 -2      
xml-batik/sources/org/apache/batik/bridge/SVGSVGElementBridge.java
  
  Index: SVGSVGElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGSVGElementBridge.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- SVGSVGElementBridge.java  15 Feb 2002 14:58:44 -0000      1.23
  +++ SVGSVGElementBridge.java  25 Feb 2002 15:05:31 -0000      1.24
  @@ -33,7 +33,7 @@
    * Bridge class for the &lt;svg> element.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: SVGSVGElementBridge.java,v 1.23 2002/02/15 14:58:44 tkormann Exp $
  + * @version $Id: SVGSVGElementBridge.java,v 1.24 2002/02/25 15:05:31 hillion Exp $
    */
   public class SVGSVGElementBridge extends AbstractSVGBridge
       implements GraphicsNodeBridge, ErrorConstants {
  @@ -259,7 +259,8 @@
       /**
        * The listener class for 'DOMAttrModified' event.
        */
  -    protected class DOMAttrModifiedEventListener implements EventListener {
  +    protected class DOMAttrModifiedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMAttrModfied' events and deleguates to the
  
  
  
  1.50      +3 -2      
xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java
  
  Index: SVGTextElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- SVGTextElementBridge.java 15 Feb 2002 14:58:45 -0000      1.49
  +++ SVGTextElementBridge.java 25 Feb 2002 15:05:31 -0000      1.50
  @@ -60,7 +60,7 @@
    * Bridge class for the &lt;text> element.
    *
    * @author <a href="[EMAIL PROTECTED]>Bill Haneman</a>
  - * @version $Id: SVGTextElementBridge.java,v 1.49 2002/02/15 14:58:45 tkormann Exp $
  + * @version $Id: SVGTextElementBridge.java,v 1.50 2002/02/25 15:05:31 hillion Exp $
    */
   public class SVGTextElementBridge extends AbstractSVGBridge
       implements BridgeUpdateHandler, GraphicsNodeBridge, ErrorConstants {
  @@ -308,7 +308,8 @@
       /**
        * The listener class for 'DOMAttrModified' event.
        */
  -    protected class DOMAttrModifiedEventListener implements EventListener {
  +    protected class DOMAttrModifiedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMAttrModfied' events and deleguates to the
  
  
  
  1.21      +3 -2      
xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java
  
  Index: SVGUseElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- SVGUseElementBridge.java  15 Feb 2002 14:58:45 -0000      1.20
  +++ SVGUseElementBridge.java  25 Feb 2002 15:05:31 -0000      1.21
  @@ -37,7 +37,7 @@
    * Bridge class for the &lt;use> element.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Thierry Kormann</a>
  - * @version $Id: SVGUseElementBridge.java,v 1.20 2002/02/15 14:58:45 tkormann Exp $
  + * @version $Id: SVGUseElementBridge.java,v 1.21 2002/02/25 15:05:31 hillion Exp $
    */
   public class SVGUseElementBridge extends AbstractSVGBridge
       implements GraphicsNodeBridge, ErrorConstants {
  @@ -285,7 +285,8 @@
       /**
        * The listener class for 'DOMAttrModified' event.
        */
  -    protected class DOMAttrModifiedEventListener implements EventListener {
  +    protected class DOMAttrModifiedEventListener
  +        implements UnwrappedEventListener {
   
           /**
            * Handles 'DOMAttrModfied' events and deleguates to the
  
  
  
  1.9       +256 -312  
xml-batik/sources/org/apache/batik/bridge/ScriptingEnvironment.java
  
  Index: ScriptingEnvironment.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/ScriptingEnvironment.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ScriptingEnvironment.java 22 Feb 2002 14:06:41 -0000      1.8
  +++ ScriptingEnvironment.java 25 Feb 2002 15:05:31 -0000      1.9
  @@ -16,12 +16,12 @@
   import java.net.MalformedURLException;
   import java.net.URL;
   
  -import java.util.Collections;
   import java.util.HashSet;
   import java.util.Iterator;
  -import java.util.LinkedList;
   import java.util.List;
   import java.util.Set;
  +import java.util.Timer;
  +import java.util.TimerTask;
   
   import org.apache.batik.dom.svg.SVGOMDocument;
   
  @@ -30,9 +30,7 @@
   import org.apache.batik.script.Interpreter;
   import org.apache.batik.script.InterpreterException;
   import org.apache.batik.script.InterpreterPool;
  -import org.apache.batik.script.JavaFunction;
   
  -import org.apache.batik.util.Lock;
   import org.apache.batik.util.RunnableQueue;
   import org.apache.batik.util.SVGConstants;
   
  @@ -52,7 +50,7 @@
    * This class contains the informations needed by the SVG scripting.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: ScriptingEnvironment.java,v 1.8 2002/02/22 14:06:41 hillion Exp $
  + * @version $Id: ScriptingEnvironment.java,v 1.9 2002/02/25 15:05:31 hillion Exp $
    */
   public class ScriptingEnvironment {
   
  @@ -158,13 +156,13 @@
       }
       
   
  -    private final static String EVENT_NAME = "evt";
  -    private final static String ARG_NAME = "arg__";
  +    private final static String EVENT_NAME = "event";
  +    private final static String ALTERNATE_EVENT_NAME = "evt";
   
       /**
  -     * The scripting lock.
  +     * The timer for periodic or delayed tasks.
        */
  -    protected Lock scriptingLock;
  +    Timer timer = new Timer(true);
   
       /**
        * The update manager.
  @@ -182,195 +180,81 @@
       protected RunnableQueue updateRunnableQueue;
   
       /**
  -     * Whether the scripts must be suspended.
  -     */
  -    protected volatile boolean suspended;
  -
  -    /**
        * The bridge context.
        */
       protected BridgeContext bridgeContext;
  -    
  +
       /**
  -     * The suspend lock.
  +     * The user-agent.
        */
  -    protected Object suspendLock = new Object();
  -
  +    protected UserAgent userAgent;
  +    
       /**
        * The document to manage.
        */
       protected Document document;
   
       /**
  -     * The alert function.
  -     */
  -    protected JavaFunction alertFunction;
  -
  -    /**
  -     * The live scripting threads.
  -     */
  -    protected List liveThreads =
  -        Collections.synchronizedList(new LinkedList());
  -
  -    /**
  -     * Whether this environment has been interrupted.
  -     */
  -    protected boolean interrupted;
  -
  -    /**
        * Creates a new ScriptingEnvironment.
        * @param um The update manager.
        */
       public ScriptingEnvironment(UpdateManager um) {
  -        scriptingLock = new Lock();
           updateManager = um;
           bridgeContext = updateManager.getBridgeContext();
  -        document = updateManager.getDocument();
  +        userAgent     = bridgeContext.getUserAgent();
  +        document      = updateManager.getDocument();
  +        updateRunnableQueue = um.getUpdateRunnableQueue();
       }
   
       /**
  -     * Initializes the environment of the given interpreter.
  +     * Creates a new Window object.
        */
  -    public void initializeEnvironment(Interpreter interp, String lang) {
  -        interp.bindObject("alert", getAlertFunction());
  -        interp.bindObject("setTimeout", getSetTimeoutFunction(lang));
  +    public Window createWindow(Interpreter interp, String lang) {
  +        return new Window(interp, lang);
       }
   
       /**
  -     * Returns the scripting lock.
  +     * Creates a new Window object.
        */
  -    public Lock getScriptingLock() {
  -        return scriptingLock;
  +    public Window createWindow() {
  +        return new Window(null, null);
       }
   
       /**
  -     * Runs an event handler.
  -     */
  -    public void runEventHandler(String script, Event evt, String lang) {
  -        new EventHandlerThread(script, evt, lang).start();
  -    }
  -
  -    /**
  -     * Runs a function.
  -     */
  -    public void runFunction(String function,
  -                            Object[] args,
  -                            String lang,
  -                            long delay) {
  -        new FunctionCallThread(function, args, lang, delay).start();
  -    }
  -
  -    /**
  -     * Interrupts the scripts.
  -     */
  -    public void interruptScripts() {
  -        synchronized (liveThreads) {
  -            interrupted = true;
  -            Iterator it = liveThreads.iterator();
  -            while (it.hasNext()) {
  -                scriptingLock.unlock();
  -                ((Thread)it.next()).interrupt();
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Suspends the scripts.
  -     */
  -    public void suspendScripts() {
  -        suspended = true;
  -    }
  -
  -    /**
  -     * Resumes the scripts.
  +     * Initializes the environment of the given interpreter.
        */
  -    public void resumeScripts() {
  -        synchronized (suspendLock) {
  -            suspended = false;
  -            suspendLock.notifyAll();
  -        }
  +    public void initializeEnvironment(Interpreter interp, String lang) {
  +        interp.bindObject("window", new Window(interp, lang));
       }
   
       /**
  -     * Begins a script evaluation section.
  +     * Runs an event handler.
        */
  -    public void beginScript() {
  -        try {
  -            scriptingLock.lock();
  -        } catch (InterruptedException e) {
  -            throw new StopScriptException();
  -        }
  -        synchronized (suspendLock) {
  -            if (suspended) {
  -                try {
  -                    suspendLock.wait();
  -                } catch (InterruptedException e) {
  -                    throw new StopScriptException();
  -                }
  +    public void runEventHandler(String script, Event evt, String lang) {
  +        Interpreter interpreter = bridgeContext.getInterpreter(lang);
  +        if (interpreter == null) {
  +            if (userAgent != null) {
  +                userAgent.displayError
  +                    (new Exception("unknow language: " + lang));
               }
           }
   
  -        if (repaintManager == null) {
  -            repaintManager = updateManager.getRepaintManager();
  -            if (repaintManager == null) {
  -                throw new StopScriptException();
  -            }
  -            updateRunnableQueue = updateManager.getUpdateRunnableQueue();
  -        }
   
  -        repaintManager.disable();
  -        if (updateRunnableQueue.getThread() == null) {
  -            scriptingLock.unlock();
  -            throw new StopScriptException();
  -        }
  -        updateRunnableQueue.suspendExecution(true);
  -    }
  -
  -    /**
  -     * Ends a script evaluation section.
  -     */
  -    public void endScript() {
  -        synchronized (suspendLock) {
  -            if (suspended) {
  -                try {
  -                    suspendLock.wait();
  -                } catch (InterruptedException e) {
  -                    throw new StopScriptException();
  -                }
  -            }
  -        }
  -        repaintManager.enable();
  -        if (updateRunnableQueue.getThread() == null) {
  -            scriptingLock.unlock();
  -            throw new StopScriptException();
  -        }
  -        updateRunnableQueue.resumeExecution();
  -    
  +        interpreter.bindObject(EVENT_NAME, evt);
  +        interpreter.bindObject(ALTERNATE_EVENT_NAME, evt);
  +            
           try {
  -            repaintManager.repaint(true);
  -        } catch (InterruptedException e) {
  -            throw new StopScriptException();
  +            interpreter.evaluate(script);
  +        } catch (InterpreterException ie) {
  +            handleInterpreterException(ie);
           }
  -        scriptingLock.unlock();
       }
   
       /**
  -     * Pauses the current script for the given amount of time.
  +     * Interrupts the periodic tasks.
        */
  -    public void pauseScript(long millis) {
  -        long t1 = System.currentTimeMillis();
  -        endScript();
  -        long t2 = System.currentTimeMillis();
  -        millis -= t2 - t1;
  -        if (millis < 0) {
  -            millis = 0;
  -        }
  -        try {
  -            Thread.sleep(millis);
  -        } catch (InterruptedException e) {
  -        } finally {
  -            beginScript();
  -        }
  +    public void interrupt() {
  +        timer.cancel();
       }
   
       /**
  @@ -432,16 +316,12 @@
                   interpreter.evaluate(reader);
   
               } catch (IOException e) {
  -                UserAgent ua = bridgeContext.getUserAgent();
  -                if (ua != null) {
  -                    ua.displayError(e);
  +                if (userAgent != null) {
  +                    userAgent.displayError(e);
                   }
  +                return;
               } catch (InterpreterException e) {
  -                UserAgent ua = bridgeContext.getUserAgent();
  -                if (ua != null) {
  -                    Exception ex = e.getException();
  -                    ua.displayError((ex == null) ? e : ex);
  -                }
  +                handleInterpreterException(e);
                   return;
               }
           }
  @@ -487,18 +367,15 @@
               elt.getAttributeNS(null, SVGConstants.SVG_ONLOAD_ATTRIBUTE);
           EventListener l = null;
           if (s.length() > 0) {
  -            l = new EventListener() {
  +            l = new UnwrappedEventListener() {
                       public void handleEvent(Event evt) {
                           try {
                               interp.bindObject(EVENT_NAME, evt);
  +                            interp.bindObject(ALTERNATE_EVENT_NAME, evt);
                               interp.evaluate(new StringReader(s));
                           } catch (IOException io) {
                           } catch (InterpreterException e) {
  -                            UserAgent ua = bridgeContext.getUserAgent();
  -                            if (ua != null) {
  -                                Exception ex = e.getException();
  -                                ua.displayError((ex == null) ? e : ex);
  -                            }
  +                            handleInterpreterException(e);
                           }
                       }
                   };
  @@ -511,206 +388,273 @@
       }
   
       /**
  -     * Returns the 'alert' function.
  +     * Handles the given exception.
        */
  -    protected JavaFunction getAlertFunction() {
  -        if (alertFunction == null) {
  -            alertFunction = new JavaFunction() {
  -                    public Class[] getParameterTypes() {
  -                        return new Class[] { String.class };
  -                    }
  -                    public Object call(Object[] arguments) {
  -                        javax.swing.JOptionPane.showMessageDialog
  -                            (null, (String)arguments[0]);
  -                        return null;
  -                    }
  -                };
  +    protected void handleInterpreterException(InterpreterException ie) {
  +        if (userAgent != null) {
  +            Exception ex = ie.getException();
  +            userAgent.displayError((ex == null) ? ie : ex);
           }
  -        return alertFunction;
       }
   
  +    /**
  +     * To wrap an event listener.
  +     */
  +    protected class EventListenerWrapper implements UnwrappedEventListener {
   
  -    protected final static Class[] ST_PARAMS = { String.class, Long.TYPE };
  +        /**
  +         * The wrapped event listener.
  +         */
  +        protected EventListener eventListener;
  +
  +        /**
  +         * Creates a new EventListenerWrapper.
  +         */
  +        public EventListenerWrapper(EventListener el) {
  +            eventListener = el;
  +        }
  +
  +        public void handleEvent(final Event evt) {
  +            eventListener.handleEvent(evt);
  +        }
  +    }
   
       /**
  -     * Returns the 'setTimeout' function.
  +     * To interpret a script.
        */
  -    protected JavaFunction getSetTimeoutFunction(final String lang) {
  -        return new JavaFunction() {
  -                public Class[] getParameterTypes() {
  -                    return ST_PARAMS;
  -                }
  -                public Object call(Object[] args) {
  -                    Object[] fargs = new Object[args.length - 2];
  -                    for (int i = 0; i < fargs.length; i++) {
  -                        fargs[i] = args[i + 2];
  -                    }
  -                    runFunction((String)args[0], fargs, lang,
  -                                ((Long)args[1]).longValue());
  -                    return null;
  -                }
  -            };
  +    protected class EvaluateRunnable implements Runnable {
  +        protected Interpreter interpreter;
  +        protected String script;
  +        public EvaluateRunnable(String s, Interpreter interp) {
  +            interpreter = interp;
  +            script = s;
  +        }
  +        public void run() {
  +            try {
  +                interpreter.evaluate(script);
  +            } catch (InterpreterException ie) {
  +                handleInterpreterException(ie);
  +            }
  +        }
       }
   
       /**
  -     * To run a piece of script.
  +     * To interpret a script.
        */
  -    protected abstract class ScriptingThread extends Thread {
  +    protected class EvaluateIntervalRunnable implements Runnable {
  +        /**
  +         * Incremented each time this runnable is added to the queue.
  +         */
  +        public int count;
   
  -        protected UserAgent userAgent;
           protected Interpreter interpreter;
  +        protected String script;
  +
  +        public EvaluateIntervalRunnable(String s, Interpreter interp) {
  +            interpreter = interp;
  +            script = s;
  +        }
  +        public void run() {
  +            count--;
  +            try {
  +                interpreter.evaluate(script);
  +            } catch (InterpreterException ie) {
  +                handleInterpreterException(ie);
  +            }
  +        }
  +    }
   
  +    /**
  +     * To call a Runnable.
  +     */
  +    protected class EvaluateRunnableRunnable implements Runnable {
           /**
  -         * Creates a new scripting thread.
  +         * Incremented each time this runnable is put in the queue.
            */
  -        public ScriptingThread(String lang) {
  -            BridgeContext bc = updateManager.getBridgeContext();
  -            userAgent = bc.getUserAgent();
  -            Document doc = updateManager.getDocument();
  -            interpreter = bc.getInterpreter(lang);
  -            if (interpreter == null) {
  +        public int count;
  +
  +        protected Runnable runnable;
  +
  +        public EvaluateRunnableRunnable(Runnable r) {
  +            runnable = r;
  +        }
  +        public void run() {
  +            count--;
  +            try {
  +                runnable.run();
  +            } catch (Exception e) {
                   if (userAgent != null) {
  -                    userAgent.displayError
  -                        (new Exception("unknow language: " + lang));
  +                    userAgent.displayError(e);
                   }
               }
           }
  +    }
  +
  +    /**
  +     * Represents the window object of this environment.
  +     */
  +    public class Window implements org.apache.batik.script.Window {
   
           /**
  -         * The main method.
  +         * The associated interpreter.
            */
  -        public void run() {
  -            try {
  -                liveThreads.add(this);
  -                if (interrupted) {
  -                    return;
  -                }
  -                if (interpreter != null) {
  -                    try {
  -                        beginScript();
  -                    } catch (StopScriptException e) {
  -                        return;
  -                    }
  -                    
  -                    try {
  -                        interpreter.evaluate(getScript());
  -                    } catch (InterpreterException ie) {
  -                        Exception ex = ie.getException();
  -                        if (ex instanceof StopScriptException) {
  +        protected Interpreter interpreter;
  +
  +        /**
  +         * The associated language.
  +         */
  +        protected String language;
  +
  +        /**
  +         * Creates a new Window for the given language.
  +         */
  +        public Window(Interpreter interp, String lang) {
  +            interpreter = interp;
  +            language = lang;
  +        }
  +
  +        /**
  +         * Implements {@link
  +         * org.apache.batik.script.Window#setInterval(String,long)}.
  +         */
  +        public Object setInterval(final String script, long interval) {
  +            TimerTask tt = new TimerTask() {
  +                    EvaluateIntervalRunnable eir =
  +                        new EvaluateIntervalRunnable(script, interpreter);
  +                    public void run() {
  +                        if (eir.count > 1) {
                               return;
                           }
  -                        if (userAgent != null) {
  -                            userAgent.displayError((ex != null) ? ex : ie);
  -                        }
  +                        eir.count++;
  +                        updateRunnableQueue.invokeLater(eir);
                       }
  -                    if (!interrupted) {
  -                        try {
  -                            endScript();
  -                        } catch (StopScriptException e) {
  +                };
  +
  +            timer.schedule(tt, interval, interval);
  +            return tt;
  +        }
  +
  +        /**
  +         * Implements {@link
  +         * org.apache.batik.script.Window#setInterval(Runnable,long)}.
  +         */
  +        public Object setInterval(final Runnable r, long interval) {
  +            TimerTask tt = new TimerTask() {
  +                    EvaluateRunnableRunnable eihr =
  +                        new EvaluateRunnableRunnable(r);
  +                    public void run() {
  +                        if (eihr.count > 1) {
  +                            return;
                           }
  +                        eihr.count++;
  +                        updateRunnableQueue.invokeLater(eihr);
                       }
  -                }
  -            } finally {
  -                liveThreads.remove(this);
  -            }
  +                };
  +
  +            timer.schedule(tt, interval, interval);
  +            return tt;
           }
   
           /**
  -         * Returns the script to execute.
  +         * Implements {@link
  +         * org.apache.batik.script.Window#clearInterval(Object)}.
            */
  -        protected abstract String getScript();
  +        public void clearInterval(Object interval) {
  +            ((TimerTask)interval).cancel();
  +        }
   
  -    }
  +        /**
  +         * Implements {@link
  +         * org.apache.batik.script.Window#setTimeout(String,long)}.
  +         */
  +        public Object setTimeout(final String script, long timeout) {
  +            TimerTask tt = new TimerTask() {
  +                    public void run() {
  +                        updateRunnableQueue.invokeLater
  +                            (new EvaluateRunnable(script, interpreter));
  +                    }
  +                };
   
  -    /**
  -     * To run a function.
  -     */
  -    protected class FunctionCallThread extends ScriptingThread {
  -        protected String function;
  -        protected Object[] arguments;
  -        protected long delay;
  +            timer.schedule(tt, timeout);
  +            return tt;
  +        }
   
           /**
  -         * Creates a new FunctionCallThread.
  +         * Implements {@link
  +         * org.apache.batik.script.Window#setTimeout(Runnable,long)}.
            */
  -        public FunctionCallThread(String fname,
  -                                  Object[] args,
  -                                  String lang,
  -                                  long delay) {
  -            super(lang);
  -            function = fname;
  -            arguments = args;
  -            this.delay = delay;
  +        public Object setTimeout(final Runnable r, long timeout) {
  +            TimerTask tt = new TimerTask() {
  +                    public void run() {
  +                        updateRunnableQueue.invokeLater(new Runnable() {
  +                                public void run() {
  +                                    try {
  +                                        r.run();
  +                                    } catch (Exception e) {
  +                                        if (userAgent != null) {
  +                                            userAgent.displayError(e);
  +                                        }
  +                                    }
  +                                }
  +                            });
  +                    }
  +                };
  +
  +            timer.schedule(tt, timeout);
  +            return tt;
           }
   
           /**
  -         * The main method.
  +         * Implements {@link
  +         * org.apache.batik.script.Window#clearTimeout(Object)}.
            */
  -        public void run() {
  -            if (delay > 0) {
  -                try {
  -                    sleep(delay);
  -                } catch (InterruptedException e) {
  -                    return;
  -                }
  -            }
  -            super.run();
  +        public void clearTimeout(Object timeout) {
  +            ((TimerTask)timeout).cancel();
           }
   
           /**
  -         * Returns the script to execute.
  +         * Displays an alert dialog box.
            */
  -        protected String getScript() {
  -            if (function.endsWith("()")) {
  -                function = function.substring(0, function.length() - 2);
  -            }
  -            StringBuffer sb = new StringBuffer(function);
  -
  -            sb.append("(");
  -            if (arguments.length > 0) {
  -                String s = ARG_NAME + 0;
  -                sb.append(s);
  -                interpreter.bindObject(s, arguments[0]);
  -                for (int i = 1; i < arguments.length; i++) {
  -                    s = ARG_NAME + i;
  -                    sb.append(",");
  -                    sb.append(s);
  -                    interpreter.bindObject(s, arguments[i]);
  -                }
  -            }
  -            sb.append(")");
  -            return sb.toString();
  +        public void alert(String message) {
  +            javax.swing.JOptionPane.showMessageDialog
  +                (null, "Script alert:\n" + message);
           }
  -    }
   
  -    /**
  -     * To run an event handler.
  -     */
  -    protected class EventHandlerThread extends ScriptingThread {
  -        protected String script;
  -        protected Event event;
  +        /**
  +         * Displays a confirm dialog box.
  +         */
  +        public boolean confirm(String message) {
  +            return javax.swing.JOptionPane.showConfirmDialog
  +                    (null, "Script confirm:\n" + message,
  +                     "Confirm",javax.swing.JOptionPane.YES_NO_OPTION) ==
  +                    javax.swing.JOptionPane.YES_OPTION;
  +        }
   
           /**
  -         * Creates a new EventHandlerThread.
  +         * Displays an input dialog box.
            */
  -        public EventHandlerThread(String script, Event evt, String lang) {
  -            super(lang);
  -            this.script = script;
  -            event = evt;
  +        public String prompt(String message) {
  +            return javax.swing.JOptionPane.showInputDialog
  +                ("Script prompt:\n" + message);
           }
   
           /**
  -         * Returns the script to execute.
  +         * Displays an input dialog box, given the default value.
            */
  -        protected String getScript() {
  -            interpreter.bindObject(EVENT_NAME, event);
  -            return script;
  +        public String prompt(String message, String defVal) {
  +            return (String)javax.swing.JOptionPane.showInputDialog
  +                (null,
  +                 "Script prompt:\n" + message,
  +                 "Prompt",
  +                 javax.swing.JOptionPane.PLAIN_MESSAGE,
  +                 null, null, defVal);
           }
  -    }
   
  -    protected static class StopScriptException
  -        extends RuntimeException {
  -        public StopScriptException() {
  +        /**
  +         * Returns the associated interpreter.
  +         */
  +        public Interpreter getInterpreter() {
  +            return interpreter;
           }
       }
   }
  
  
  
  1.12      +18 -30    xml-batik/sources/org/apache/batik/bridge/UpdateManager.java
  
  Index: UpdateManager.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UpdateManager.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- UpdateManager.java        22 Feb 2002 11:30:54 -0000      1.11
  +++ UpdateManager.java        25 Feb 2002 15:05:31 -0000      1.12
  @@ -44,7 +44,7 @@
    * This class provides features to manage the update of an SVG document.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: UpdateManager.java,v 1.11 2002/02/22 11:30:54 hillion Exp $
  + * @version $Id: UpdateManager.java,v 1.12 2002/02/25 15:05:31 hillion Exp $
    */
   public class UpdateManager implements RunnableQueue.RunHandler {
   
  @@ -164,30 +164,19 @@
   
       /**
        * Dispatches an 'SVGLoad' event to the document.
  -     * NOTES:
  -     * - This method starts the update manager threads so one can't use
  -     *   the update runnable queue to invoke this method.
  -     * - The scripting lock is taken. Is is released by a call to
  -     *   manageUpdates().
        */
       public synchronized void dispatchSVGLoadEvent()
           throws InterruptedException {
  -        // Locking avoid execution of scripts scheduled by calls
  -        // to the setTimeout() function.
  -        // The lock is be released by a call to manageUpdates().
  -        scriptingEnvironment.getScriptingLock().lock();
  -
           scriptingEnvironment.loadScripts();
           scriptingEnvironment.dispatchSVGLoadEvent();
  -        
  -        updateRunnableQueue.resumeExecution();
  +
       }
   
       /**
        * Finishes the UpdateManager initialization.
        */
       public void manageUpdates(final ImageRenderer r) {
  -        updateRunnableQueue.invokeLater(new Runnable() {
  +        updateRunnableQueue.preemptLater(new Runnable() {
                   public void run() {
                       synchronized (UpdateManager.this) {
                           startingTime = System.currentTimeMillis();
  @@ -207,14 +196,13 @@
                           repaintRateManager =
                               new RepaintRateManager(UpdateManager.this);
                           repaintRateManager.start();
  -                        
  -                        scriptingEnvironment.getScriptingLock().unlock();
  -                        
  +
                           fireManagerStartedEvent();
                           started = true;
                       }
                   }
               });
  +        updateRunnableQueue.resumeExecution();
       }
   
   
  @@ -263,7 +251,7 @@
       /**
        * Tells whether the update manager is currently running.
        */
  -    public boolean isRunning() {
  +    public synchronized boolean isRunning() {
           return running;
       }
   
  @@ -305,18 +293,20 @@
               if (started) {
                   dispatchSVGUnLoadEvent();
               } else {
  -                resume();
  -                updateRunnableQueue.invokeLater(new Runnable() {
  +                // Invoke first to cancel the pending tasks
  +                updateRunnableQueue.preemptLater(new Runnable() {
                           public void run() {
                               synchronized (UpdateManager.this) {
  +                                running = false;
                                   if (repaintManager != null) {
                                       repaintRateManager.interrupt();
                                   }
  -                                scriptingEnvironment.interruptScripts();
  +                                scriptingEnvironment.interrupt();
                                   updateRunnableQueue.getThread().interrupt();
                               }
                           }
                       });
  +                resume();
               }
           }
       }
  @@ -331,8 +321,8 @@
               throw new IllegalStateException("UpdateManager not started.");
           }
   
  -        resume();
  -        updateRunnableQueue.invokeLater(new Runnable() {
  +        // Invoke first to cancel the pending tasks
  +        updateRunnableQueue.preemptLater(new Runnable() {
                   public void run() {
                       synchronized (UpdateManager.this) {
                           Event evt =
  @@ -343,12 +333,13 @@
                           running = false;
                       
                           repaintRateManager.interrupt();
  -                        scriptingEnvironment.interruptScripts();
  +                        scriptingEnvironment.interrupt();
                           updateRunnableQueue.getThread().interrupt();
                           fireManagerStoppedEvent();
                       }
                   }
               });
  +        resume();
       }
   
       /**
  @@ -518,6 +509,9 @@
        * has returned.
        */
       public void runnableInvoked(RunnableQueue rq, Runnable r) {
  +        if (running && !(r instanceof NoRepaintRunnable)) {
  +            repaintManager.repaint();
  +        }
       }
   
       /**
  @@ -527,9 +521,6 @@
           if (suspendCalled) {
               running = false;
               suspendStartTime = System.currentTimeMillis();
  -            if (scriptingEnvironment != null) {
  -                scriptingEnvironment.suspendScripts();
  -            }
               fireManagerSuspendedEvent();
           }
       }
  @@ -544,9 +535,6 @@
               suspendCalled = false;
               suspendedTime = System.currentTimeMillis() - suspendStartTime;
               fireManagerResumedEvent();
  -            if (scriptingEnvironment != null) {
  -                scriptingEnvironment.resumeScripts();
  -            }
           }
       }
   }
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/bridge/NoRepaintRunnable.java
  
  Index: NoRepaintRunnable.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  
  package org.apache.batik.bridge;
  
  /**
   * A tagging interface to prevent a repaint at the end of the
   * execution of this runnable.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
   * @version $Id: NoRepaintRunnable.java,v 1.1 2002/02/25 15:05:31 hillion Exp $
   */
  public interface NoRepaintRunnable extends Runnable {
  }
  
  
  
  1.12      +18 -7     xml-batik/sources/org/apache/batik/dom/AbstractDocument.java
  
  Index: AbstractDocument.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/AbstractDocument.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- AbstractDocument.java     19 Nov 2001 13:39:55 -0000      1.11
  +++ AbstractDocument.java     25 Feb 2002 15:05:32 -0000      1.12
  @@ -19,7 +19,9 @@
   import java.util.WeakHashMap;
   
   import org.apache.batik.dom.events.DocumentEventSupport;
  +
   import org.apache.batik.dom.traversal.TraversalSupport;
  +
   import org.apache.batik.i18n.Localizable;
   import org.apache.batik.i18n.LocalizableSupport;
   
  @@ -34,8 +36,11 @@
   import org.w3c.dom.NamedNodeMap;
   import org.w3c.dom.Node;
   import org.w3c.dom.NodeList;
  +
   import org.w3c.dom.events.DocumentEvent;
   import org.w3c.dom.events.Event;
  +import org.w3c.dom.events.EventListener;
  +
   import org.w3c.dom.traversal.DocumentTraversal;
   import org.w3c.dom.traversal.NodeFilter;
   import org.w3c.dom.traversal.NodeIterator;
  @@ -45,7 +50,7 @@
    * This class implements the {@link org.w3c.dom.Document} interface.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: AbstractDocument.java,v 1.11 2001/11/19 13:39:55 hillion Exp $
  + * @version $Id: AbstractDocument.java,v 1.12 2002/02/25 15:05:32 hillion Exp $
    */
   public abstract class AbstractDocument
       extends    AbstractParentNode
  @@ -250,8 +255,9 @@
                   break;
   
               case PROCESSING_INSTRUCTION_NODE:
  -                result = createProcessingInstruction(importedNode.getNodeName(),
  -                                                     importedNode.getNodeValue());
  +                result = createProcessingInstruction
  +                    (importedNode.getNodeName(),
  +                     importedNode.getNodeValue());
                   deep = false;
                   break;
   
  @@ -297,7 +303,9 @@
       /**
        * Returns an ElementsByTagName object from the cache, if any.
        */
  -    public ElementsByTagName getElementsByTagName(Node n, String ns, String ln) {
  +    public ElementsByTagName getElementsByTagName(Node n,
  +                                                  String ns,
  +                                                  String ln) {
           if (elementsByTagNames == null) {
               return null;
           }
  @@ -334,7 +342,8 @@
       public Event createEvent(String eventType) throws DOMException {
           if (documentEventSupport == null) {
               documentEventSupport =
  -                
((AbstractDOMImplementation)implementation).createDocumentEventSupport();
  +                ((AbstractDOMImplementation)implementation).
  +                    createDocumentEventSupport();
           }
        return documentEventSupport.createEvent(eventType);
       }
  @@ -353,7 +362,8 @@
           if (traversalSupport == null) {
               traversalSupport = new TraversalSupport();
           }
  -        return traversalSupport.createNodeIterator(this, root, whatToShow, filter,
  +        return traversalSupport.createNodeIterator(this, root, whatToShow,
  +                                                   filter,
                                                      entityReferenceExpansion);
       }
   
  @@ -366,7 +376,8 @@
                                          NodeFilter filter, 
                                          boolean entityReferenceExpansion)
           throws DOMException {
  -        return TraversalSupport.createTreeWalker(this, root, whatToShow, filter,
  +        return TraversalSupport.createTreeWalker(this, root, whatToShow,
  +                                                 filter,
                                                    entityReferenceExpansion);
       }
   
  
  
  
  1.9       +6 -3      xml-batik/sources/org/apache/batik/dom/AbstractNode.java
  
  Index: AbstractNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/AbstractNode.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AbstractNode.java 19 Nov 2001 13:39:56 -0000      1.8
  +++ AbstractNode.java 25 Feb 2002 15:05:32 -0000      1.9
  @@ -35,7 +35,7 @@
    * This class implements the {@link org.w3c.dom.Node} interface.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: AbstractNode.java,v 1.8 2001/11/19 13:39:56 hillion Exp $
  + * @version $Id: AbstractNode.java,v 1.9 2002/02/25 15:05:32 hillion Exp $
    */
   public abstract class AbstractNode
       implements ExtendedNode,
  @@ -287,7 +287,8 @@
        * org.w3c.dom.Node#isSupported(String,String)}.
        */
       public boolean isSupported(String feature, String version) {
  -        return getCurrentDocument().getImplementation().hasFeature(feature, 
version);
  +        return getCurrentDocument().getImplementation().hasFeature(feature,
  +                                                                   version);
       }
   
       /**
  @@ -381,9 +382,10 @@
       public void addEventListener(String type,
                                    EventListener listener,
                                    boolean useCapture) {
  +        AbstractDocument doc = getCurrentDocument();
           if (eventSupport == null) {
               eventSupport = new EventSupport();
  -            getCurrentDocument().setEventsEnabled(true);
  +            doc.setEventsEnabled(true);
           }
           eventSupport.addEventListener(type, listener, useCapture);
       }
  @@ -397,6 +399,7 @@
                                       EventListener listener,
                                       boolean useCapture) {
           if (eventSupport != null) {
  +            AbstractDocument doc = getCurrentDocument();
               eventSupport.removeEventListener(type, listener, useCapture);
           }
       }
  
  
  
  1.7       +1 -2      
xml-batik/sources/org/apache/batik/dom/svg/DefaultSVGContext.java
  
  Index: DefaultSVGContext.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/dom/svg/DefaultSVGContext.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultSVGContext.java    12 Sep 2001 16:57:07 -0000      1.6
  +++ DefaultSVGContext.java    25 Feb 2002 15:05:32 -0000      1.7
  @@ -10,12 +10,11 @@
   
   import org.apache.batik.css.svg.DefaultSVGCSSContext;
   
  -
   /**
    * This class is the placeholder for SVG application informations.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: DefaultSVGContext.java,v 1.6 2001/09/12 16:57:07 hillion Exp $
  + * @version $Id: DefaultSVGContext.java,v 1.7 2002/02/25 15:05:32 hillion Exp $
    */
   public class DefaultSVGContext
       extends    DefaultSVGCSSContext
  
  
  
  1.4       +1 -2      xml-batik/sources/org/apache/batik/dom/svg/SVGContext.java
  
  Index: SVGContext.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SVGContext.java   1 Feb 2001 13:45:49 -0000       1.3
  +++ SVGContext.java   25 Feb 2002 15:05:32 -0000      1.4
  @@ -14,7 +14,7 @@
    * This interface is the placeholder for SVG application informations.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: SVGContext.java,v 1.3 2001/02/01 13:45:49 tkormann Exp $
  + * @version $Id: SVGContext.java,v 1.4 2002/02/25 15:05:32 hillion Exp $
    */
   public interface SVGContext extends SVGCSSContext {
   
  @@ -22,5 +22,4 @@
        * Return the pixel to millimeters factor.
        */
       float getPixelToMM();
  -
   }
  
  
  
  1.43      +6 -1      xml-batik/sources/org/apache/batik/dom/svg/SVGOMDocument.java
  
  Index: SVGOMDocument.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMDocument.java,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- SVGOMDocument.java        18 Oct 2001 17:29:06 -0000      1.42
  +++ SVGOMDocument.java        25 Feb 2002 15:05:32 -0000      1.43
  @@ -54,12 +54,17 @@
   
   import org.w3c.dom.css.CSSStyleDeclaration;
   import org.w3c.dom.css.DocumentCSS;
  +
  +import org.w3c.dom.events.EventListener;
  +
   import org.w3c.dom.stylesheets.LinkStyle;
   import org.w3c.dom.stylesheets.StyleSheet;
   import org.w3c.dom.stylesheets.StyleSheetList;
  +
   import org.w3c.dom.svg.SVGDocument;
   import org.w3c.dom.svg.SVGLangSpace;
   import org.w3c.dom.svg.SVGSVGElement;
  +
   import org.w3c.dom.views.AbstractView;
   import org.w3c.dom.views.DocumentView;
   
  @@ -67,7 +72,7 @@
    * This class implements {@link SVGDocument}.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: SVGOMDocument.java,v 1.42 2001/10/18 17:29:06 hillion Exp $
  + * @version $Id: SVGOMDocument.java,v 1.43 2002/02/25 15:05:32 hillion Exp $
    */
   public class SVGOMDocument
       extends    AbstractDocument
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/script/Window.java
  
  Index: Window.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  
  package org.apache.batik.script;
  
  /**
   * This interface represents the 'window' object defined in the global
   * environment of a SVG document.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
   * @version $Id: Window.java,v 1.1 2002/02/25 15:05:32 hillion Exp $
   */
  public interface Window {
  
      /**
       * Evaluates the given string repeatedly after the given amount of
       * time.  This method does not stall the script: the evaluation is
       * scheduled and the script continues its execution.
       * @return an object representing the interval created.
       */
      Object setInterval(String script, long interval);
  
      /**
       * Calls the 'run' method of the given Runnable repeatedly after
       * the given amount of time.  This method does not stall the
       * script: the evaluation is scheduled and the script continues
       * its execution.
       * @return an object representing the interval created.
       */
      Object setInterval(Runnable r, long interval);
  
      /**
       * Cancels an interval that was set by a call to 'setInterval'.
       */
      void clearInterval(Object interval);
  
      /**
       * Evaluates the given string after the given amount of time.
       * This method does not stall the script: the evaluation is
       * scheduled and the script continues its execution.
       * @return an object representing the timeout created.
       */
      Object setTimeout(String script, long timeout);
  
      /**
       * Calls the 'run' method of the given Runnable after the given
       * amount of time.  This method does not stall the script: the
       * evaluation is scheduled and the script continues its execution.
       * @return an object representing the timeout created.
       */
      Object setTimeout(Runnable r, long timeout);
  
      /**
       * Cancels an timeout that was set by a call to 'setTimeout'.
       */
      void clearTimeout(Object timeout);
  
      /**
       * Displays an alert dialog box.
       */
      void alert(String message);
  
      /**
       * Displays a confirm dialog box.
       */
      boolean confirm(String message);
  
      /**
       * Displays an input dialog box.
       * @return The input of the user, or null if the dialog was cancelled.
       */
      String prompt(String message);
  
      /**
       * Displays an input dialog box, given the default value.
       * @return The input of the user, or null if the dialog was cancelled.
       */
      String prompt(String message, String defVal);
  
      /**
       * Returns the associated interpreter.
       */
      Interpreter getInterpreter();
  }
  
  
  
  1.4       +3 -1      
xml-batik/sources/org/apache/batik/script/rhino/EventTargetWrapHandler.java
  
  Index: EventTargetWrapHandler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/script/rhino/EventTargetWrapHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- EventTargetWrapHandler.java       24 Jan 2001 14:51:02 -0000      1.3
  +++ EventTargetWrapHandler.java       25 Feb 2002 15:05:33 -0000      1.4
  @@ -13,13 +13,15 @@
   
   import org.w3c.dom.events.EventTarget;
   
  +import org.apache.batik.script.Window;
  +
   /**
    * This is an utility class allowing to pass an ECMAScript function
    * as a parameter of the <code>addEventListener</code> method of
    * <code>EventTarget</code> objects as DOM Level 2 recommendation
    * required.
    * @author <a href="mailto:[EMAIL PROTECTED]";>Christophe Jolif</a>
  - * @version $Id: EventTargetWrapHandler.java,v 1.3 2001/01/24 14:51:02 cjolif Exp $
  + * @version $Id: EventTargetWrapHandler.java,v 1.4 2002/02/25 15:05:33 hillion Exp $
    */
   class EventTargetWrapHandler implements WrapHandler {
       private RhinoInterpreter interpreter;
  
  
  
  1.13      +35 -9     
xml-batik/sources/org/apache/batik/script/rhino/RhinoInterpreter.java
  
  Index: RhinoInterpreter.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/script/rhino/RhinoInterpreter.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- RhinoInterpreter.java     22 Feb 2002 16:52:09 -0000      1.12
  +++ RhinoInterpreter.java     25 Feb 2002 15:05:33 -0000      1.13
  @@ -20,7 +20,7 @@
   
   import org.apache.batik.script.Interpreter;
   import org.apache.batik.script.InterpreterException;
  -import org.apache.batik.script.JavaFunction;
  +import org.apache.batik.script.Window;
   
   import org.mozilla.javascript.Context;
   import org.mozilla.javascript.Function;
  @@ -37,7 +37,7 @@
    * A simple implementation of <code>Interpreter</code> interface to use
    * Rhino ECMAScript interpreter.
    * @author <a href="mailto:[EMAIL PROTECTED]";>Christophe Jolif</a>
  - * @version $Id: RhinoInterpreter.java,v 1.12 2002/02/22 16:52:09 tkormann Exp $
  + * @version $Id: RhinoInterpreter.java,v 1.13 2002/02/25 15:05:33 hillion Exp $
    */
   public class RhinoInterpreter implements Interpreter {
       private static String[] TO_BE_IMPORTED = {
  @@ -91,7 +91,7 @@
                   p[i] = new NativeJavaPackage(TO_BE_IMPORTED[i]);
               }
               importer.importPackage(ctx, globalObject, p, null);
  -            ctx.setWrapHandler(wrapHandler = new EventTargetWrapHandler(this));
  +            ctx.setWrapHandler(wrapHandler);
           } finally {
               Context.exit();
           }
  @@ -239,17 +239,28 @@
           Context ctx = Context.enter();
           ctx.setWrapHandler(wrapHandler);
           try {
  -            if (object instanceof JavaFunction) {
  -                JavaFunction jf = (JavaFunction)object;
  -                globalObject.put(name, globalObject,
  -                                 new RhinoFunction(jf, globalObject));
  -                return;
  -            }
               Scriptable jsObject =  Context.toObject(object, globalObject);
               globalObject.put(name, globalObject, jsObject);
           } finally {
               Context.exit();
           }
  +
  +        if (name.equals("window") && object instanceof Window) {
  +            try {
  +                // Defines the 'Window' class.
  +                ScriptableObject.defineClass(globalObject,
  +                                             WindowWrapper.class);
  +
  +                // Wrap the given window object.
  +                evaluate(new StringReader("window = new Window(window)"));
  +
  +                // The window becomes the global object.
  +                globalObject =
  +                    (ScriptableObject)globalObject.get("window", globalObject);
  +            } catch (Exception e) {
  +                // Cannot happen.
  +            }
  +        }
       }
   
       /**
  @@ -263,6 +274,21 @@
           try {
               arg = Context.toObject(arg, globalObject);
               Object[] args = {arg};
  +            handler.call(ctx, globalObject, globalObject, args);
  +        } finally {
  +            Context.exit();
  +        }
  +    }
  +
  +    /**
  +     * To be used by <code>WindowWrapper</code>.
  +     */
  +    void callHandler(Function handler,
  +                     Object[] args)
  +        throws JavaScriptException {
  +        Context ctx = Context.enter();
  +        ctx.setWrapHandler(wrapHandler);
  +        try {
               handler.call(ctx, globalObject, globalObject, args);
           } finally {
               Context.exit();
  
  
  
  1.1                  
xml-batik/sources/org/apache/batik/script/rhino/WindowWrapper.java
  
  Index: WindowWrapper.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  
  package org.apache.batik.script.rhino;
  
  import org.mozilla.javascript.Context;
  import org.mozilla.javascript.Function;
  import org.mozilla.javascript.FunctionObject;
  import org.mozilla.javascript.JavaScriptException;
  import org.mozilla.javascript.NativeJavaObject;
  import org.mozilla.javascript.Scriptable;
  import org.mozilla.javascript.ScriptableObject;
  import org.mozilla.javascript.Undefined;
  import org.mozilla.javascript.WrappedException;
  import org.mozilla.javascript.Wrapper;
  
  import org.apache.batik.script.Interpreter;
  import org.apache.batik.script.InterpreterException;
  import org.apache.batik.script.Window;
  
  /**
   * This class wraps a Window object to expose it to the interpreter.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
   * @version $Id: WindowWrapper.java,v 1.1 2002/02/25 15:05:33 hillion Exp $
   */
  public class WindowWrapper extends ScriptableObject {
      
      /**
       * The rhino interpreter.
       */
      protected RhinoInterpreter interpreter;
  
      /**
       * The wrapped window.
       */
      protected Window window;
  
      /**
       * Creates a new WindowWrapper.
       */
      public WindowWrapper() {
      }
  
      /**
       * The ecmascript constructor for the Window class.
       */
      public static Object jsConstructor(Context cx, Object[] args, 
                                         Function ctorObj, boolean inNewExpr) {
          WindowWrapper result = new WindowWrapper();
          result.window = (Window)((Wrapper)args[0]).unwrap();
          return result;
      }    
  
      public String getClassName() {
          return "Window";
      }
  
      public String toString() {
          return "[object Window]";
      }
  
      /**
       * Wraps the 'setInterval' methods of the Window interface.
       */
      public static Object jsFunction_setInterval(Context cx,
                                                  Scriptable thisObj,
                                                  Object[] args,
                                                  Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          if (len < 2) {
              throw Context.reportRuntimeError("invalid argument count");
          }
          long to = ((Long)NativeJavaObject.coerceType
                     (Long.TYPE, args[1])).longValue();
          if (args[0] instanceof Function) {
              Object[] fargs = new Object[len - 2];
              for (int i = 2, j = 0; i < len; i++, j++) {
                  fargs[j] = args[i];
              }
              RhinoInterpreter interp =
                  (RhinoInterpreter)window.getInterpreter();
              FunctionWrapper fw;
              fw = new FunctionWrapper(interp, (Function)args[0], fargs);
              return window.setInterval(fw, to);
          }
          String script =
              (String)NativeJavaObject.coerceType(String.class, args[0]);
          return window.setInterval(script, to);
      }
  
      /**
       * Wraps the 'setTimeout' methods of the Window interface.
       */
      public static Object jsFunction_setTimeout(Context cx,
                                                 Scriptable thisObj,
                                                 Object[] args,
                                                 Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          if (len < 2) {
              throw Context.reportRuntimeError("invalid argument count");
          }
          long to = ((Long)NativeJavaObject.coerceType
                     (Long.TYPE, args[1])).longValue();
          if (args[0] instanceof Function) {
              Object[] fargs = new Object[len - 2];
              for (int i = 2, j = 0; i < len; i++, j++) {
                  fargs[j] = args[i];
              }
              RhinoInterpreter interp =
                  (RhinoInterpreter)window.getInterpreter();
              FunctionWrapper fw;
              fw = new FunctionWrapper(interp, (Function)args[0], fargs);
              return window.setTimeout(fw, to);
          }
          String script =
              (String)NativeJavaObject.coerceType(String.class, args[0]);
          return window.setTimeout(script, to);
      }
  
      /**
       * Wraps the 'clearInterval' method of the Window interface.
       */
      public static void jsFunction_clearInterval(Context cx,
                                                  Scriptable thisObj,
                                                  Object[] args,
                                                  Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          if (len >= 1) {
              window.clearInterval(NativeJavaObject.coerceType
                                   (Object.class, args[0]));
          }
      }
  
      /**
       * Wraps the 'clearTimeout' method of the Window interface.
       */
      public static void jsFunction_clearTimeout(Context cx,
                                                 Scriptable thisObj,
                                                 Object[] args,
                                                 Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          if (len >= 1) {
              window.clearTimeout(NativeJavaObject.coerceType
                                  (Object.class, args[0]));
          }
      }
  
      /**
       * Wraps the 'alert' method of the Window interface.
       */
      public static void jsFunction_alert(Context cx,
                                          Scriptable thisObj,
                                          Object[] args,
                                          Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          if (len >= 1) {
              String message =
                  (String)NativeJavaObject.coerceType(String.class, args[0]);
              window.alert(message);
          }
      }
  
      /**
       * Wraps the 'confirm' method of the Window interface.
       */
      public static boolean jsFunction_confirm(Context cx,
                                               Scriptable thisObj,
                                               Object[] args,
                                               Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          if (len >= 1) {
              String message =
                  (String)NativeJavaObject.coerceType(String.class, args[0]);
              return window.confirm(message);
          }
          return false;
      }
  
      /**
       * Wraps the 'prompt' method of the Window interface.
       */
      public static String jsFunction_prompt(Context cx,
                                             Scriptable thisObj,
                                             Object[] args,
                                             Function funObj)
          throws JavaScriptException {
          int len = args.length;
          WindowWrapper ww = (WindowWrapper)thisObj;
          Window window = ww.window;
          switch (len) {
          case 0:
              return "";
  
          case 1:
              String message =
                  (String)NativeJavaObject.coerceType(String.class, args[0]);
              String result = window.prompt(message);
              return (result == null) ? "" : result;
  
          default:
              message =
                  (String)NativeJavaObject.coerceType(String.class, args[0]);
              String defVal =
                  (String)NativeJavaObject.coerceType(String.class, args[1]);
              result = window.prompt(message, defVal);
              return (result == null) ? "" : result;
          }
      }
  
      /**
       * To wrap a function in an handler.
       */
      protected static class FunctionWrapper implements Runnable {
  
          /**
           * The current interpreter.
           */
          protected RhinoInterpreter interpreter;
  
          /**
           * The function wrapper.
           */
          protected Function function;
  
          /**
           * The arguments.
           */
          protected Object[] arguments;
  
          /**
           * Creates a function wrapper.
           */
          public FunctionWrapper(RhinoInterpreter ri,
                                 Function f,
                                 Object[] args) {
              interpreter = ri;
              function = f;
              arguments = args;
          }
  
          /**
           * Calls the function.
           */
          public void run() {
              try {
                  interpreter.callHandler(function, arguments);
              } catch (JavaScriptException e) {
                  throw new WrappedException(e);
              }
          }
      }
  }
  
  
  
  1.44      +4 -1      xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java
  
  Index: JSVGComponent.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- JSVGComponent.java        22 Feb 2002 11:30:54 -0000      1.43
  +++ JSVGComponent.java        25 Feb 2002 15:05:33 -0000      1.44
  @@ -180,7 +180,7 @@
    * building/rendering a document (invalid XML file, missing attributes...).</p>
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: JSVGComponent.java,v 1.43 2002/02/22 11:30:54 hillion Exp $
  + * @version $Id: JSVGComponent.java,v 1.44 2002/02/25 15:05:33 hillion Exp $
    */
   public class JSVGComponent extends JGVTComponent {
   
  @@ -347,6 +347,9 @@
        * Returns the current update manager.
        */
       public UpdateManager getUpdateManager() {
  +        if (svgLoadEventDispatcher != null) {
  +            return svgLoadEventDispatcher.getUpdateManager();
  +        }
           if (nextUpdateManager != null) {
               return nextUpdateManager;
           }
  
  
  
  1.3       +5 -3      
xml-batik/sources/org/apache/batik/swing/svg/SVGLoadEventDispatcher.java
  
  Index: SVGLoadEventDispatcher.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/swing/svg/SVGLoadEventDispatcher.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SVGLoadEventDispatcher.java       22 Feb 2002 11:30:54 -0000      1.2
  +++ SVGLoadEventDispatcher.java       25 Feb 2002 15:05:33 -0000      1.3
  @@ -26,7 +26,7 @@
    * This class dispatches the SVGLoadEvent event on a SVG document.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: SVGLoadEventDispatcher.java,v 1.2 2002/02/22 11:30:54 hillion Exp $
  + * @version $Id: SVGLoadEventDispatcher.java,v 1.3 2002/02/25 15:05:33 hillion Exp $
    */
   public class SVGLoadEventDispatcher extends Thread {
   
  @@ -108,12 +108,14 @@
       /**
        * Adds a SVGLoadEventDispatcherListener to this SVGLoadEventDispatcher.
        */
  -    public void addSVGLoadEventDispatcherListener(SVGLoadEventDispatcherListener l) 
{
  +    public void addSVGLoadEventDispatcherListener
  +        (SVGLoadEventDispatcherListener l) {
           listeners.add(l);
       }
   
       /**
  -     * Removes a SVGLoadEventDispatcherListener from this SVGLoadEventDispatcher.
  +     * Removes a SVGLoadEventDispatcherListener from this
  +     * SVGLoadEventDispatcher.
        */
       public void removeSVGLoadEventDispatcherListener
           (SVGLoadEventDispatcherListener l) {
  
  
  
  1.10      +3 -2      xml-batik/sources/org/apache/batik/util/RunnableQueue.java
  
  Index: RunnableQueue.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/RunnableQueue.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- RunnableQueue.java        18 Feb 2002 09:11:59 -0000      1.9
  +++ RunnableQueue.java        25 Feb 2002 15:05:33 -0000      1.10
  @@ -17,7 +17,7 @@
    * invocation in a single thread.
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
  - * @version $Id: RunnableQueue.java,v 1.9 2002/02/18 09:11:59 hillion Exp $
  + * @version $Id: RunnableQueue.java,v 1.10 2002/02/25 15:05:33 hillion Exp $
    */
   public class RunnableQueue implements Runnable {
   
  @@ -89,7 +89,7 @@
       public static RunnableQueue createRunnableQueue() {
           RunnableQueue result = new RunnableQueue();
           synchronized (result) {
  -            Thread t = new Thread(result);
  +            Thread t = new Thread(result, "RunnableQueue-" + threadCount++);
               t.setDaemon(true);
               t.start();
               while (result.getThread() == null) {
  @@ -101,6 +101,7 @@
           }
           return result;
       }
  +    private static int threadCount;
       
       /**
        * Runs this queue.
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to