hillion 02/02/11 05:14:30
Modified: samples/tests/spec/scripting xAnimOnClick.svg
sources/org/apache/batik/bridge BridgeEventSupport.java
RepaintManager.java UpdateManager.java
sources/org/apache/batik/gvt UpdateTracker.java
sources/org/apache/batik/script/rhino RhinoInterpreter.java
sources/org/apache/batik/swing/svg JSVGComponent.java
sources/org/apache/batik/util CSSConstants.java
RunnableQueue.java SVGConstants.java
Added: sources/org/apache/batik/bridge RepaintRateManager.java
ScriptingEnvironment.java
sources/org/apache/batik/util Lock.java
Log:
- Changed the threading model to allow multiple scripts to run at the same
time.
- ECMAScript function 'setTimeout' implemented.
- xAnimOnClick updated to use 'setTimeout'.
Revision Changes Path
1.2 +19 -9 xml-batik/samples/tests/spec/scripting/xAnimOnClick.svg
Index: xAnimOnClick.svg
===================================================================
RCS file: /home/cvs/xml-batik/samples/tests/spec/scripting/xAnimOnClick.svg,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- xAnimOnClick.svg 4 Feb 2002 20:11:34 -0000 1.1
+++ xAnimOnClick.svg 11 Feb 2002 13:14:29 -0000 1.2
@@ -15,7 +15,7 @@
<!-- 'onclick' event handler. -->
<!-- -->
<!-- @author [EMAIL PROTECTED] -->
-<!-- @version $Id: xAnimOnClick.svg,v 1.1 2002/02/04 20:11:34 deweese Exp $ -->
+<!-- @version $Id: xAnimOnClick.svg,v 1.2 2002/02/11 13:14:29 hillion Exp $ -->
<!-- ====================================================================== -->
<?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?>
@@ -26,16 +26,26 @@
<script type="text/ecmascript">
+ var r;
+ var doc;
+ var t;
+ var start;
+ var end;
+ var inc;
+ var frac;
+
function moveToX(evt, target, val){
- var r = evt.getTarget();
- var doc = r.getOwnerDocument();
- var t = doc.getElementById(target);
- var start = parseInt(t.getAttribute('x'));
- cyclopse(t, start, val, 1, 1);
+ r = evt.target;
+ doc = r.ownerDocument;
+ t = doc.getElementById(target);
+ start = parseInt(t.getAttribute('x'));
+ end = val;
+ inc = 1;
+ frac = 1;
+ cyclopse();
}
- function cyclopse(t, start, end, frac, inc) {
- while (1) {
+ function cyclopse() {
t.setAttribute('x', (end-start)*frac/100+start);
if (frac == 100) {
inc = -1;
@@ -43,7 +53,7 @@
inc = 1;
}
frac += inc;
- }
+ setTimeout('cyclopse()', 50);
}
</script>
1.20 +38 -64
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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- BridgeEventSupport.java 7 Feb 2002 08:01:06 -0000 1.19
+++ BridgeEventSupport.java 11 Feb 2002 13:14:29 -0000 1.20
@@ -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.19 2002/02/07 08:01:06 hillion Exp $
+ * @version $Id: BridgeEventSupport.java,v 1.20 2002/02/11 13:14:29 hillion Exp $
*/
class BridgeEventSupport implements SVGConstants {
private static final String[] EVENT_ATTRIBUTES_GRAPHICS = {
@@ -306,13 +306,32 @@
public static void loadScripts(BridgeContext ctx, Element element) {
UpdateManager um = ctx.getUpdateManager();
- RunnableQueue rq = um.getScriptingRunnableQueue();
- Document doc = um.getScriptingDocument();
+ Document doc = um.getDocument();
NodeList list = element.getElementsByTagNameNS(SVG_NAMESPACE_URI,
SVG_SCRIPT_TAG);
final UserAgent ua = ctx.getUserAgent();
String language = null;
Element selement = null;
+ 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();
+ }
+ }
+
for (int i = 0; i < list.getLength(); i++) {
language = (selement = (Element)list.item(i)).
getAttribute("type");
@@ -324,22 +343,18 @@
n = n.getNextSibling()) {
script.append(n.getNodeValue());
}
- rq.invokeLater(new Runnable() {
- public void run() {
- try {
- // use Reader mechanism => no caching
- // (will not be revaluated + <script> content is
- // generally bigger than the one in event attributes
- interpret.evaluate(new
StringReader(script.toString()));
- } catch (IOException io) {
- // will never appeared we don't use a file
- } catch (InterpreterException e) {
- if (ua != null)
- ua.displayError(new Exception("scripting error:
"+
- e.getMessage()));
- }
- }
- });
+ try {
+ // use Reader mechanism => no caching
+ // (will not be revaluated + <script> content is
+ // generally bigger than the one in event attributes
+ interpret.evaluate(new StringReader(script.toString()));
+ } catch (IOException io) {
+ // will never appeared we don't use a file
+ } catch (InterpreterException e) {
+ if (ua != null)
+ ua.displayError(new Exception("scripting error: "+
+ e.getMessage()));
+ }
} else {
if (ua != null) {
ua.displayError(new Exception("unknown language: "+language));
@@ -347,22 +362,6 @@
}
}
- // add a function definition 'alert'
- final Interpreter interpret =
- ctx.getInterpreterPool().getInterpreter(doc, language);
- if (interpret != null) {
- rq.invokeLater(new Runnable() {
- public void run() {
- try {
- javax.swing.JOptionPane pane = new
javax.swing.JOptionPane();
- interpret.bindObject("pane", pane);
- interpret.evaluate("function alert(msg) {
pane.showMessageDialog(null, msg); }");
- } catch (Exception ex) {
- // nothing to do
- }
- }
- });
- }
}
private static class GVTUnloadListener
@@ -507,7 +506,6 @@
private static String EVENT_NAME = "evt";
private String script = null;
- private UserAgent ua = null;
private BridgeContext context;
private String language;
@@ -515,38 +513,14 @@
String str,
String lang) {
script = str;
- context = ctx;
language = lang;
- ua = ctx.getUserAgent();
+ context = ctx;
}
public void handleEvent(Event evt) {
- UpdateManager um = context.getUpdateManager();
- final DocumentWrapper dw = um.getScriptingDocument();
- RunnableQueue rq = um.getScriptingRunnableQueue();
- final Interpreter interpreter = context.getInterpreterPool().
- getInterpreter(dw, language);
- if (interpreter == null) {
- if (ua != null)
- ua.displayError(new Exception("unknow language: "+
- language));
- return;
- }
- final Event ev = dw.createEventWrapper(evt);
- rq.invokeLater(new Runnable() {
- public void run() {
- interpreter.bindObject(EVENT_NAME, ev);
- try {
- // use the String version to enable caching mechanism
- interpreter.evaluate(script);
- } catch (InterpreterException e) {
- Exception ex = e.getException();
- if (ua != null) {
- ua.displayError((ex != null) ? ex : e);
- }
- }
- }
- });
+ ScriptingEnvironment se =
+ context.getUpdateManager().getScriptingEnvironment();
+ se.runScript(script, language, evt);
}
}
}
1.5 +49 -33 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- RepaintManager.java 31 Jan 2002 21:57:35 -0000 1.4
+++ RepaintManager.java 11 Feb 2002 13:14:29 -0000 1.5
@@ -16,57 +16,73 @@
* This class manages the rendering of a GVT tree.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: RepaintManager.java,v 1.4 2002/01/31 21:57:35 deweese Exp $
+ * @version $Id: RepaintManager.java,v 1.5 2002/02/11 13:14:29 hillion Exp $
*/
-public class RepaintManager extends Thread {
+public class RepaintManager {
/**
* The associated UpdateManager.
*/
protected UpdateManager updateManager;
- long targetFrameTime = 50;
+ /**
+ * Whether or not the manager is active.
+ */
+ protected boolean enabled;
/**
* Creates a new repaint manager.
*/
public RepaintManager(UpdateManager um) {
updateManager = um;
- setDaemon(true);
}
-
+
/**
- * The main method of this thread. This needs to have a target
- * frame rate, and it needs to ensure that it changes it target
- * frame rate to ensure that it sleeps for at least a few 10s of
- * millisecs per loop (it should also see if it can increase
- * framerate because it's made the last few frames with the
- * current frame-rate easily) */
- public void run() {
- long lastFrameTime, currentTime, tm, sleepTime;
- try {
- while (!Thread.currentThread().isInterrupted()) {
- lastFrameTime = System.currentTimeMillis();
- final UpdateTracker ut = updateManager.getUpdateTracker();
- if (ut.hasChanged()) {
- updateManager.getUpdateRunnableQueue().invokeAndWait
- (new Runnable() {
- public void run() {
- List dirtyAreas = ut.getDirtyAreas();
- updateManager.modifiedAreas(dirtyAreas);
- updateManager.updateRendering(dirtyAreas);
- ut.clear();
- }
- });
+ * Provokes a repaint, if needed.
+ * @param b If true, waits until the repaint has finished.
+ */
+ public void repaint(boolean b) {
+ 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) {
+ updateManager.modifiedAreas(dirtyAreas);
+ updateManager.updateRendering(dirtyAreas);
+ }
+ ut.clear();
+ }
}
- currentTime = System.currentTimeMillis();
- tm = currentTime - lastFrameTime;
- sleepTime = targetFrameTime-tm;
- if (sleepTime > 0)
- sleep(sleepTime);
+ };
+ if (updateManager.getUpdateRunnableQueue().getThread() == null) {
+ return;
+ }
+ if (b) {
+ try {
+ updateManager.getUpdateRunnableQueue().invokeAndWait(r);
+ } catch (InterruptedException e) {
}
- } catch (InterruptedException e) {
+ } else {
+ updateManager.getUpdateRunnableQueue().invokeLater(r);
}
}
+ /**
+ * Suspends the repaint management.
+ */
+ public void disable() {
+ enabled = false;
+ }
+
+ /**
+ * Suspends the repaint management.
+ */
+ public void enable() {
+ enabled = true;
+ }
+
}
1.5 +72 -52 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- UpdateManager.java 31 Jan 2002 21:57:35 -0000 1.4
+++ UpdateManager.java 11 Feb 2002 13:14:29 -0000 1.5
@@ -47,7 +47,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.4 2002/01/31 21:57:35 deweese Exp $
+ * @version $Id: UpdateManager.java,v 1.5 2002/02/11 13:14:29 hillion Exp $
*/
public class UpdateManager implements RunnableQueue.RunHandler {
@@ -67,21 +67,11 @@
protected ImageRenderer renderer;
/**
- * The document usable from the scripting thread.
- */
- protected DocumentWrapper scriptingDocument;
-
- /**
* The update RunnableQueue.
*/
protected RunnableQueue updateRunnableQueue;
/**
- * The scripting RunnableQueue.
- */
- protected RunnableQueue scriptingRunnableQueue;
-
- /**
* The initial time.
*/
protected long initialTime;
@@ -99,7 +89,7 @@
/**
* Whether the update manager is running.
*/
- protected boolean running;
+ protected volatile boolean running;
/**
* The listeners.
@@ -112,11 +102,21 @@
protected long startingTime;
/**
+ * The scripting environment.
+ */
+ protected ScriptingEnvironment scriptingEnvironment;
+
+ /**
* The repaint manager.
*/
protected RepaintManager repaintManager;
/**
+ * The repaint-rate manager.
+ */
+ protected RepaintRateManager repaintRateManager;
+
+ /**
* The update tracker.
*/
protected UpdateTracker updateTracker;
@@ -139,15 +139,16 @@
renderer = r;
updateRunnableQueue = RunnableQueue.createRunnableQueue();
- scriptingRunnableQueue = RunnableQueue.createRunnableQueue();
-
updateRunnableQueue.setRunHandler(this);
+ /*
DOMImplementationWrapper iw;
iw = new DOMImplementationWrapper(updateRunnableQueue,
scriptingRunnableQueue,
document.getImplementation());
+
scriptingDocument = new DocumentWrapper(iw, document);
+ */
updateTracker = new UpdateTracker();
@@ -157,21 +158,23 @@
}
repaintManager = new RepaintManager(this);
- repaintManager.start();
+ repaintRateManager = new RepaintRateManager(this);
+ repaintRateManager.start();
+ scriptingEnvironment = new ScriptingEnvironment(this);
}
/**
- * Returns the update RunnableQueue.
+ * Returns the bridge context.
*/
- public RunnableQueue getUpdateRunnableQueue() {
- return updateRunnableQueue;
+ public BridgeContext getBridgeContext() {
+ return bridgeContext;
}
/**
- * Returns the scripting RunnableQueue.
+ * Returns the update RunnableQueue.
*/
- public RunnableQueue getScriptingRunnableQueue() {
- return scriptingRunnableQueue;
+ public RunnableQueue getUpdateRunnableQueue() {
+ return updateRunnableQueue;
}
/**
@@ -189,10 +192,17 @@
}
/**
- * Returns a Document usable from the scripting thread.
+ * Returns the current Document.
+ */
+ public Document getDocument() {
+ return document;
+ }
+
+ /**
+ * Returns the scripting environment.
*/
- public DocumentWrapper getScriptingDocument() {
- return scriptingDocument;
+ public ScriptingEnvironment getScriptingEnvironment() {
+ return scriptingEnvironment;
}
/**
@@ -217,20 +227,20 @@
* Suspends the update manager.
*/
public void suspend() {
- scriptingRunnableQueue.suspendExecution(true);
- updateRunnableQueue.suspendExecution(true);
- running = false;
- suspendStartTime = System.currentTimeMillis();
+ if (running) {
+ running = false;
+ updateRunnableQueue.suspendExecution(false);
+ }
}
/**
* Resumes the update manager.
*/
public void resume() {
- scriptingRunnableQueue.resumeExecution();
- updateRunnableQueue.resumeExecution();
- running = true;
- suspendedTime = System.currentTimeMillis() - suspendStartTime;
+ if (!running) {
+ running = true;
+ updateRunnableQueue.resumeExecution();
+ }
}
/**
@@ -240,7 +250,6 @@
*/
public void dispatchSVGLoad() {
updateRunnableQueue.resumeExecution();
- scriptingRunnableQueue.resumeExecution();
updateRunnableQueue.invokeLater(new Runnable() {
public void run() {
@@ -268,23 +277,18 @@
* NOTE: this method must be called outside the update thread.
*/
public void dispatchSVGUnLoad() {
- try {
- updateRunnableQueue.invokeAndWait(new Runnable() {
- public void run() {
- Event evt =
((DocumentEvent)document).createEvent("SVGEvents");
- evt.initEvent("SVGUnload", false, false);
- ((EventTarget)(document.getDocumentElement())).
- dispatchEvent(evt);
- running = false;
-
- fireManagerStoppedEvent();
- }
- });
- } catch (InterruptedException e) {
- }
- repaintManager.interrupt();
- scriptingRunnableQueue.getThread().interrupt();
- updateRunnableQueue.getThread().interrupt();
+ resume();
+ updateRunnableQueue.invokeLater(new Runnable() {
+ public void run() {
+ Event evt = ((DocumentEvent)document).createEvent("SVGEvents");
+ evt.initEvent("SVGUnload", false, false);
+ ((EventTarget)(document.getDocumentElement())).
+ dispatchEvent(evt);
+ running = false;
+
+ fireManagerStoppedEvent();
+ }
+ });
}
/**
@@ -340,6 +344,7 @@
}
renderer.repaint(areas);
+
fireCompletedEvent(renderer.getOffScreen(), rects);
} catch (Exception e) {
fireFailedEvent();
@@ -386,6 +391,8 @@
((UpdateManagerListener)dll[i]).managerStopped(ev);
}
}
+ repaintRateManager.interrupt();
+ updateRunnableQueue.getThread().interrupt();
}
/**
@@ -406,6 +413,7 @@
* Fires a UpdateManagerEvent to notify that the manager was resumed.
*/
protected void fireManagerResumedEvent() {
+ suspendedTime = System.currentTimeMillis() - suspendStartTime;
Object[] dll = listeners.toArray();
if (dll.length > 0) {
@@ -471,14 +479,26 @@
* Called when the execution of the queue has been suspended.
*/
public void executionSuspended(RunnableQueue rq) {
- fireManagerSuspendedEvent();
+ if (!running) {
+ suspendStartTime = System.currentTimeMillis();
+ if (scriptingEnvironment != null) {
+ scriptingEnvironment.suspendScripts();
+ }
+ fireManagerSuspendedEvent();
+ }
}
/**
* Called when the execution of the queue has been resumed.
*/
public void executionResumed(RunnableQueue rq) {
- fireManagerResumedEvent();
+ if (running) {
+ suspendedTime = System.currentTimeMillis() - suspendStartTime;
+ fireManagerResumedEvent();
+ if (scriptingEnvironment != null) {
+ scriptingEnvironment.resumeScripts();
+ }
+ }
}
//
1.1
xml-batik/sources/org/apache/batik/bridge/RepaintRateManager.java
Index: RepaintRateManager.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;
/**
* 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 $
*/
public class RepaintRateManager extends Thread {
/**
* The associated UpdateManager.
*/
protected UpdateManager updateManager;
/**
* The expected time in ms between two repaints.
*/
protected long targetFrameTime = 50;
/**
* Creates a new repaint manager.
*/
public RepaintRateManager(UpdateManager um) {
updateManager = um;
setDaemon(true);
}
/**
* The main method of this thread. This needs to have a target
* frame rate, and it needs to ensure that it changes it target
* frame rate to ensure that it sleeps for at least a few 10s of
* millisecs per loop (it should also see if it can increase
* framerate because it's made the last few frames with the
* current frame-rate easily)
*/
public void run() {
long lastFrameTime, currentTime, tm, sleepTime;
try {
while (!Thread.currentThread().isInterrupted()) {
lastFrameTime = System.currentTimeMillis();
updateManager.getRepaintManager().repaint(true);
currentTime = System.currentTimeMillis();
tm = currentTime - lastFrameTime;
sleepTime = targetFrameTime-tm;
if (sleepTime > 0)
sleep(sleepTime);
}
} catch (InterruptedException e) {
}
}
}
1.1
xml-batik/sources/org/apache/batik/bridge/ScriptingEnvironment.java
Index: ScriptingEnvironment.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;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.batik.script.Interpreter;
import org.apache.batik.script.InterpreterException;
import org.apache.batik.script.InterpreterPool;
import org.apache.batik.util.Lock;
import org.apache.batik.util.RunnableQueue;
import org.w3c.dom.Document;
import org.w3c.dom.events.Event;
/**
* 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 $
*/
public class ScriptingEnvironment {
private final static String EVENT_NAME = "evt";
/**
* The scripting lock.
*/
protected Lock scriptingLock;
/**
* The update manager.
*/
protected UpdateManager updateManager;
/**
* The repaint manager.
*/
protected RepaintManager repaintManager;
/**
* The update runnable queue.
*/
protected RunnableQueue updateRunnableQueue;
/**
* The active scripting threads.
*/
protected List scripts = Collections.synchronizedList(new LinkedList());
/**
* Whether the scripts must be suspended.
*/
protected volatile boolean suspended;
/**
* The suspend lock.
*/
protected Object suspendLock = new Object();
/**
* Creates a new ScriptingEnvironment.
* @param um The update manager.
*/
public ScriptingEnvironment(UpdateManager um) {
scriptingLock = new Lock();
updateManager = um;
repaintManager = um.getRepaintManager();
updateRunnableQueue = um.getUpdateRunnableQueue();
}
/**
* Runs a script.
*/
public void runScript(String script, String lang, Event evt) {
new ScriptingThread(script, lang, evt).start();
}
/**
* Suspends the scripts.
*/
public void suspendScripts() {
suspended = true;
}
/**
* Resumes the scripts.
*/
public void resumeScripts() {
synchronized (suspendLock) {
suspended = false;
suspendLock.notify();
}
}
/**
* Begins a script evaluation section.
*/
public void beginScript() {
try {
scriptingLock.lock();
} catch (InterruptedException e) {
throw new StopScriptException();
}
synchronized (suspendLock) {
if (suspended) {
try {
suspendLock.wait();
} catch (InterruptedException e) {
}
}
}
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) {
}
}
}
repaintManager.enable();
if (updateRunnableQueue.getThread() == null) {
scriptingLock.unlock();
throw new StopScriptException();
}
updateRunnableQueue.resumeExecution();
repaintManager.repaint(true);
scriptingLock.unlock();
}
/**
* Pauses the current script for the given amount of time.
*/
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();
}
}
/**
* To run a script.
*/
protected class ScriptingThread extends Thread {
protected String script;
protected Event event;
protected UserAgent userAgent;
protected Interpreter interpreter;
public ScriptingThread(String script, String lang, Event evt) {
this.script = script;
event = evt;
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));
}
}
}
public void run() {
if (interpreter != null) {
beginScript();
scripts.add(this);
if (event != null) {
interpreter.bindObject(EVENT_NAME, event);
}
try {
interpreter.evaluate(script);
} catch (InterpreterException ie) {
Exception ex = ie.getException();
if (ex instanceof StopScriptException) {
scripts.remove(this);
return;
}
if (userAgent != null) {
userAgent.displayError((ex != null) ? ex : ie);
}
}
scripts.remove(this);
endScript();
}
}
}
protected static class StopScriptException
extends RuntimeException {
public StopScriptException() {
}
}
}
1.6 +2 -2 xml-batik/sources/org/apache/batik/gvt/UpdateTracker.java
Index: UpdateTracker.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/UpdateTracker.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- UpdateTracker.java 31 Jan 2002 21:57:35 -0000 1.5
+++ UpdateTracker.java 11 Feb 2002 13:14:29 -0000 1.6
@@ -28,8 +28,8 @@
/**
* This class tracks the changes on a GVT tree
*
- * @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: UpdateTracker.java,v 1.5 2002/01/31 21:57:35 deweese Exp $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Thomas DeWeese</a>
+ * @version $Id: UpdateTracker.java,v 1.6 2002/02/11 13:14:29 hillion Exp $
*/
public class UpdateTracker extends GraphicsNodeChangeAdapter {
1.10 +15 -17
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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- RhinoInterpreter.java 30 Jan 2002 17:44:20 -0000 1.9
+++ RhinoInterpreter.java 11 Feb 2002 13:14:29 -0000 1.10
@@ -30,12 +30,13 @@
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.WrappedException;
+import org.mozilla.javascript.WrapHandler;
/**
* 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.9 2002/01/30 17:44:20 cjolif Exp $
+ * @version $Id: RhinoInterpreter.java,v 1.10 2002/02/11 13:14:29 hillion Exp $
*/
public class RhinoInterpreter implements Interpreter {
private static String[] TO_BE_IMPORTED = {
@@ -61,9 +62,10 @@
// store last 32 precompiled objects.
private static final int MAX_CACHED_SCRIPTS = 32;
- private Context context = null;
private ScriptableObject globalObject = null;
private LinkedList compiledScripts = new LinkedList();
+ private WrapHandler wrapHandler =
+ new EventTargetWrapHandler(this);
/**
* Build a <code>Interpreter</code> for ECMAScript using Rhino.
@@ -72,20 +74,20 @@
*/
public RhinoInterpreter() {
// entering a context
- context = Context.enter();
+ Context ctx = Context.enter();
try {
// init std object with an importer
// building the importer automatically initialize the
// context with it since Rhino1.5R3
- ImporterTopLevel importer = new ImporterTopLevel(context);
+ ImporterTopLevel importer = new ImporterTopLevel(ctx);
globalObject = importer;
// import Java lang package & DOM Level 2 & SVG DOM packages
NativeJavaPackage[] p= new NativeJavaPackage[TO_BE_IMPORTED.length];
for (int i = 0; i < TO_BE_IMPORTED.length; i++) {
p[i] = new NativeJavaPackage(TO_BE_IMPORTED[i]);
}
- importer.importPackage(context, globalObject, p, null);
- context.setWrapHandler(new EventTargetWrapHandler(this));
+ importer.importPackage(ctx, globalObject, p, null);
+ ctx.setWrapHandler(wrapHandler = new EventTargetWrapHandler(this));
} finally {
Context.exit();
}
@@ -98,14 +100,6 @@
return globalObject;
}
- /**
- * This method returns the default context in which the interpreter runs.
- */
- protected Context getContext() {
- return context;
- }
-
-
// org.apache.batik.script.Intepreter implementation
/**
@@ -117,7 +111,8 @@
public Object evaluate(Reader scriptreader)
throws InterpreterException, IOException {
Object rv = null;
- Context ctx = Context.enter(context);
+ Context ctx = Context.enter();
+ ctx.setWrapHandler(wrapHandler);
try {
rv = ctx.evaluateReader(globalObject,
scriptreader,
@@ -156,7 +151,8 @@
*/
public Object evaluate(String scriptstr)
throws InterpreterException {
- Context ctx = Context.enter(context);
+ Context ctx = Context.enter();
+ ctx.setWrapHandler(wrapHandler);
Script script = null;
Entry et = null;
Iterator it = compiledScripts.iterator();
@@ -172,6 +168,7 @@
break;
}
}
+
if (script == null) {
// this script has not been compiled yet or has been fogotten
// since the compilation:
@@ -244,7 +241,8 @@
void callHandler(Function handler,
Object arg)
throws JavaScriptException {
- Context ctx = Context.enter(context);
+ Context ctx = Context.enter();
+ ctx.setWrapHandler(wrapHandler);
try {
arg = Context.toObject(arg, globalObject);
Object[] args = {arg};
1.37 +1 -4 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.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- JSVGComponent.java 23 Jan 2002 14:14:09 -0000 1.36
+++ JSVGComponent.java 11 Feb 2002 13:14:29 -0000 1.37
@@ -157,7 +157,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.36 2002/01/23 14:14:09 deweese Exp $
+ * @version $Id: JSVGComponent.java,v 1.37 2002/02/11 13:14:29 hillion Exp $
*/
public class JSVGComponent extends JGVTComponent {
@@ -298,9 +298,6 @@
} else if (gvtTreeBuilder != null) {
gvtTreeBuilder.interrupt();
} else if (updateManager != null) {
- if (!updateManager.isRunning()) {
- updateManager.resume();
- }
updateManager.dispatchSVGUnLoad();
updateManager = null;
updateManagerStopped = true;
1.19 +2 -1 xml-batik/sources/org/apache/batik/util/CSSConstants.java
Index: CSSConstants.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/CSSConstants.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- CSSConstants.java 7 Feb 2002 13:15:54 -0000 1.18
+++ CSSConstants.java 11 Feb 2002 13:14:30 -0000 1.19
@@ -13,7 +13,7 @@
* Important: Constants must not contain uppercase characters.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: CSSConstants.java,v 1.18 2002/02/07 13:15:54 hillion Exp $
+ * @version $Id: CSSConstants.java,v 1.19 2002/02/11 13:14:30 hillion Exp $
*/
public interface CSSConstants {
@@ -57,6 +57,7 @@
String CSS_GLYPH_ORIENTATION_HORIZONTAL_PROPERTY =
"glyph-orientation-horizontal";
String CSS_GLYPH_ORIENTATION_VERTICAL_PROPERTY = "glyph-orientation-vertical";
String CSS_IMAGE_RENDERING_PROPERTY = "image-rendering";
+ String CSS_KERNING_PROPERTY = "kerning";
String CSS_LETTER_SPACING_PROPERTY = "letter-spacing";
String CSS_LIGHTING_COLOR_PROPERTY = "lighting-color";
String CSS_MARKER_PROPERTY = "marker";
1.7 +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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- RunnableQueue.java 21 Dec 2001 14:40:32 -0000 1.6
+++ RunnableQueue.java 11 Feb 2002 13:14:30 -0000 1.7
@@ -16,7 +16,7 @@
* invocation in a single thread.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: RunnableQueue.java,v 1.6 2001/12/21 14:40:32 hillion Exp $
+ * @version $Id: RunnableQueue.java,v 1.7 2002/02/11 13:14:30 hillion Exp $
*/
public class RunnableQueue implements Runnable {
@@ -116,7 +116,7 @@
Runnable rable;
try {
while (!Thread.currentThread().isInterrupted()) {
-
+
// Mutex for suspention work.
synchronized (stateLock) {
if (state != RUNNING) {
@@ -148,6 +148,7 @@
rable = l.runnable;
}
+
rable.run();
l.unlock();
runnableInvoked(rable);
1.61 +2 -2 xml-batik/sources/org/apache/batik/util/SVGConstants.java
Index: SVGConstants.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/util/SVGConstants.java,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- SVGConstants.java 4 Nov 2001 17:57:06 -0000 1.60
+++ SVGConstants.java 11 Feb 2002 13:14:30 -0000 1.61
@@ -14,7 +14,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a>
* @author <a href="[EMAIL PROTECTED]">Vincent Hardy</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
- * @version $Id: SVGConstants.java,v 1.60 2001/11/04 17:57:06 tkormann Exp $
+ * @version $Id: SVGConstants.java,v 1.61 2002/02/11 13:14:30 hillion Exp $
*/
public interface SVGConstants extends CSSConstants {
@@ -205,7 +205,7 @@
String SVG_KERNEL_UNIT_LENGTH_ATTRIBUTE = "kernelUnitLength";
String SVG_KERNEL_UNIT_LENGTH_X_ATTRIBUTE = "kernelUnitLengthX";
String SVG_KERNEL_UNIT_LENGTH_Y_ATTRIBUTE = "kernelUnitLengthY";
- String SVG_KERNING_ATTRIBUTE = "kerning";
+ String SVG_KERNING_ATTRIBUTE = CSS_KERNING_PROPERTY;
String SVG_LANG_ATTRIBUTE = "lang";
String SVG_LENGTH_ADJUST_ATTRIBUTE = "lengthAdjust";
String SVG_LIGHT_COLOR_ATTRIBUTE = "lightColor";
1.1 xml-batik/sources/org/apache/batik/util/Lock.java
Index: Lock.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.util;
/**
* This class represents a binary semaphore.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephane Hillion</a>
* @version $Id: Lock.java,v 1.1 2002/02/11 13:14:30 hillion Exp $
*/
public class Lock {
/**
* Whether the lock is locked.
*/
protected boolean locked;
/**
* Takes the lock.
*/
public synchronized void lock() throws InterruptedException {
while (locked) {
wait();
}
locked = true;
}
/**
* Releases the lock.
*/
public synchronized void unlock() {
locked = false;
notify();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]