hillion     02/02/11 23:08:17

  Modified:    sources/org/apache/batik/bridge BridgeEventSupport.java
                        ScriptingEnvironment.java
               sources/org/apache/batik/script/rhino RhinoInterpreter.java
  Added:       sources/org/apache/batik/script JavaFunction.java
               sources/org/apache/batik/script/rhino RhinoFunction.java
  Log:
  'setTimeout' now works with optional parameters.
  
  Revision  Changes    Path
  1.21      +8 -21     
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.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- BridgeEventSupport.java   11 Feb 2002 13:14:29 -0000      1.20
  +++ BridgeEventSupport.java   12 Feb 2002 07:08:17 -0000      1.21
  @@ -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.20 2002/02/11 13:14:29 hillion Exp $
  + * @version $Id: BridgeEventSupport.java,v 1.21 2002/02/12 07:08:17 hillion Exp $
    */
   class BridgeEventSupport implements SVGConstants {
       private static final String[] EVENT_ATTRIBUTES_GRAPHICS = {
  @@ -315,29 +315,18 @@
           final ScriptingEnvironment se = ctx.getUpdateManager().
               getScriptingEnvironment();
   
  -     // add a function definition 'alert'
  -     final Interpreter inter =
  -         ctx.getInterpreterPool().getInterpreter(doc, "text/ecmascript");
  -     if (inter != null) {
  -            try {
  -                javax.swing.JOptionPane pane = new javax.swing.JOptionPane();
  -                inter.bindObject("pane", pane);
  -                inter.evaluate("function alert(msg) { pane.showMessageDialog(null, 
msg); }");
  -                
  -                inter.bindObject("scriptEnv", se);
  -                inter.evaluate("function setTimeout(s, t) { 
scriptEnv.pauseScript(t); scriptEnv.runScript(s, 'text/ecmascript', null); }");
  -            } catch (Exception ex) {
  -                // nothing to do
  -                ex.printStackTrace();
  -            }
  -     }
  -
  +        String lang = null;
           for (int i = 0; i < list.getLength(); i++) {
               language = (selement = (Element)list.item(i)).
                   getAttribute("type");
               final Interpreter interpret =
                   ctx.getInterpreterPool().getInterpreter(doc, language);
               if (interpret != null) {
  +                if (language != lang) {
  +                    se.setEnvironment(interpret, language);
  +                }
  +                lang = language;
  +
                   final StringBuffer script = new StringBuffer();
                   for (Node n = selement.getFirstChild(); n != null;
                        n = n.getNextSibling()) {
  @@ -503,8 +492,6 @@
       }
   
       public static class ScriptCaller implements EventListener {
  -        private static String EVENT_NAME = "evt";
  -
           private String script = null;
           private BridgeContext context;
           private String language;
  @@ -520,7 +507,7 @@
           public void handleEvent(Event evt) {
               ScriptingEnvironment se =
                   context.getUpdateManager().getScriptingEnvironment();
  -            se.runScript(script, language, evt);
  +            se.runEventHandler(script, evt, language);
           }
       }
   }
  
  
  
  1.2       +154 -28   
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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ScriptingEnvironment.java 11 Feb 2002 13:14:29 -0000      1.1
  +++ ScriptingEnvironment.java 12 Feb 2002 07:08:17 -0000      1.2
  @@ -16,6 +16,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;
  @@ -27,11 +28,12 @@
    * 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.1 2002/02/11 13:14:29 hillion Exp $
  + * @version $Id: ScriptingEnvironment.java,v 1.2 2002/02/12 07:08:17 hillion Exp $
    */
   public class ScriptingEnvironment {
   
       private final static String EVENT_NAME = "evt";
  +    private final static String ARG_NAME = "arg__";
   
       /**
        * The scripting lock.
  @@ -54,11 +56,6 @@
       protected RunnableQueue updateRunnableQueue;
   
       /**
  -     * The active scripting threads.
  -     */
  -    protected List scripts = Collections.synchronizedList(new LinkedList());
  -
  -    /**
        * Whether the scripts must be suspended.
        */
       protected volatile boolean suspended;
  @@ -69,6 +66,11 @@
       protected Object suspendLock = new Object();
   
       /**
  +     * The alert function.
  +     */
  +    protected JavaFunction alertFunction;
  +
  +    /**
        * Creates a new ScriptingEnvironment.
        * @param um The update manager.
        */
  @@ -80,10 +82,60 @@
       }
   
       /**
  -     * Runs a script.
  +     * Sets the environment of the given interpreter.
  +     */
  +    public void setEnvironment(Interpreter interp, String lang) {
  +        interp.bindObject("alert", createAlertFunction());
  +        interp.bindObject("setTimeout", createSetTimeoutFunction(lang));
  +    }
  +
  +    private JavaFunction createAlertFunction() {
  +        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;
  +                    }
  +                };
  +        }
  +        return alertFunction;
  +    }
  +
  +
  +    private final static Class[] parameters = { String.class, Long.TYPE };
  +    private JavaFunction createSetTimeoutFunction(final String lang) {
  +        return new JavaFunction() {
  +                public Class[] getParameterTypes() {
  +                    return parameters;
  +                }
  +                public Object call(Object[] args) {
  +                    pauseScript(((Long)args[1]).longValue());
  +                    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);
  +                    return null;
  +                }
  +            };
  +    }
  +
  +    /**
  +     * Runs an event handler.
        */
  -    public void runScript(String script, String lang, Event evt) {
  -        new ScriptingThread(script, lang, evt).start();
  +    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) {
  +        new FunctionCallThread(function, args, lang).start();
       }
   
       /**
  @@ -170,51 +222,125 @@
       }
   
       /**
  -     * To run a script.
  +     * To run a piece of script.
        */
  -    protected class ScriptingThread extends Thread {
  -        protected String script;
  -        protected Event event;
  +    protected abstract class ScriptingThread extends Thread {
           protected UserAgent userAgent;
           protected Interpreter interpreter;
  -        public ScriptingThread(String script, String lang, Event evt) {
  -            this.script = script;
  -            event = evt;
  +
  +        /**
  +         * Creates a new scripting thread.
  +         */
  +        public ScriptingThread(String lang) {
               BridgeContext bc = updateManager.getBridgeContext();
               userAgent = bc.getUserAgent();
               Document doc = updateManager.getDocument();
               interpreter = bc.getInterpreterPool().getInterpreter(doc, lang);
  -            
               if (interpreter == null) {
                   if (userAgent != null) {
  -                    userAgent.displayError(new Exception("unknow language: "+
  -                                                         lang));
  +                    userAgent.displayError
  +                        (new Exception("unknow language: " + lang));
                   }
               }
           }
  +
  +        /**
  +         * The main method.
  +         */
           public void run() {
               if (interpreter != null) {
                   beginScript();
  -                scripts.add(this);
  -            
  -                if (event != null) {
  -                    interpreter.bindObject(EVENT_NAME, event);
  -                }
  +
                   try {
  -                    interpreter.evaluate(script);
  +                    interpreter.evaluate(getScript());
                   } catch (InterpreterException ie) {
                       Exception ex = ie.getException();
                       if (ex instanceof StopScriptException) {
  -                        scripts.remove(this);
                           return;
                       }
                       if (userAgent != null) {
                           userAgent.displayError((ex != null) ? ex : ie);
                       }
  +                } finally {
  +                    try {
  +                        endScript();
  +                    } catch (StopScriptException e) {
  +                    }
                   }
  -                scripts.remove(this);
  -                endScript();
               }
  +        }
  +
  +        /**
  +         * Returns the script to execute.
  +         */
  +        protected abstract String getScript();
  +
  +    }
  +
  +    /**
  +     * To run a function.
  +     */
  +    protected class FunctionCallThread extends ScriptingThread {
  +        protected String function;
  +        protected Object[] arguments;
  +
  +        /**
  +         * Creates a new FunctionCallThread.
  +         */
  +        public FunctionCallThread(String fname, Object[] args, String lang) {
  +            super(lang);
  +            function = fname;
  +            arguments = args;
  +        }
  +
  +        /**
  +         * Returns the script to execute.
  +         */
  +        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();
  +        }
  +    }
  +
  +    /**
  +     * To run an event handler.
  +     */
  +    protected class EventHandlerThread extends ScriptingThread {
  +        protected String script;
  +        protected Event event;
  +
  +        /**
  +         * Creates a new EventHandlerThread.
  +         */
  +        public EventHandlerThread(String script, Event evt, String lang) {
  +            super(lang);
  +            this.script = script;
  +            event = evt;
  +        }
  +
  +        /**
  +         * Returns the script to execute.
  +         */
  +        protected String getScript() {
  +            interpreter.bindObject(EVENT_NAME, event);
  +            return script;
           }
       }
   
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/script/JavaFunction.java
  
  Index: JavaFunction.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 an object which is transformed to a
   * function when binded to an interpreter.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
   * @version $Id: JavaFunction.java,v 1.1 2002/02/12 07:08:17 hillion Exp $
   */
  public interface JavaFunction {
  
      /**
       * Returns the know parameter types.
       */
      Class[] getParameterTypes();
  
      /**
       * Called by the interpreter. Arguments are casted to the types
       * returned by <code>getParameterTypes()</code>
       */
      Object call(Object[] arguments);
  }
  
  
  
  1.11      +16 -3     
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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- RhinoInterpreter.java     11 Feb 2002 13:14:29 -0000      1.10
  +++ RhinoInterpreter.java     12 Feb 2002 07:08:17 -0000      1.11
  @@ -20,6 +20,7 @@
   
   import org.apache.batik.script.Interpreter;
   import org.apache.batik.script.InterpreterException;
  +import org.apache.batik.script.JavaFunction;
   
   import org.mozilla.javascript.Context;
   import org.mozilla.javascript.Function;
  @@ -36,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.10 2002/02/11 13:14:29 hillion Exp $
  + * @version $Id: RhinoInterpreter.java,v 1.11 2002/02/12 07:08:17 hillion Exp $
    */
   public class RhinoInterpreter implements Interpreter {
       private static String[] TO_BE_IMPORTED = {
  @@ -231,8 +232,20 @@
        * @param object the Java object
        */
       public void bindObject(String name, Object object) {
  -        Scriptable jsObject =  Context.toObject(object, globalObject);
  -        globalObject.put(name, globalObject, jsObject);
  +        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();
  +        }
       }
   
       /**
  
  
  
  1.1                  
xml-batik/sources/org/apache/batik/script/rhino/RhinoFunction.java
  
  Index: RhinoFunction.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.JavaScriptException;
  import org.mozilla.javascript.NativeFunction;
  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.apache.batik.script.JavaFunction;
  
  /**
   * This class is used to call a JavaFunction.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stephane Hillion</a>
   * @version $Id: RhinoFunction.java,v 1.1 2002/02/12 07:08:17 hillion Exp $
   */
  public class RhinoFunction extends NativeFunction {
      
      /**
       * The JavaFunction to call.
       */
      protected JavaFunction javaFunction;
  
      /**
       * The parameter types.
       */
      protected Class[] paramTypes;
  
      /**
       * The global object.
       */
      protected ScriptableObject globalObject;
  
      /**
       * Creates a new RhinoFunction.
       */
      public RhinoFunction(JavaFunction jf,
                           ScriptableObject glob) {
          javaFunction = jf;
          paramTypes = jf.getParameterTypes();
          globalObject = glob;
      }
  
      /**
       * Called by the interpreter.
       */
      public Object call(Context cx,
                         Scriptable scope,
                         Scriptable thisObj,
                         Object[] args) throws JavaScriptException {
          Object[] jargs = new Object[args.length];
          for (int i = 0; i < paramTypes.length; i++) {
              args[i] = NativeJavaObject.coerceType(paramTypes[i],
                                                    args[i]);
          }
          Object result = javaFunction.call(args);
          if (result == null) {
              return Undefined.instance;
          } else {
              return Context.toObject(result, globalObject);
          }
      }
  
  
  }
  
  
  

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

Reply via email to