cjolif 2002/06/27 01:12:06 Modified: sources/org/apache/batik/script/rhino EventTargetWrapHandler.java EventTargetWrapper.java Log: implements RFE 9149 Revision Changes Path 1.5 +1 -3 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.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- EventTargetWrapHandler.java 25 Feb 2002 15:05:33 -0000 1.4 +++ EventTargetWrapHandler.java 27 Jun 2002 08:12:06 -0000 1.5 @@ -13,8 +13,6 @@ 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 1.6 +71 -6 xml-batik/sources/org/apache/batik/script/rhino/EventTargetWrapper.java Index: EventTargetWrapper.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/script/rhino/EventTargetWrapper.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- EventTargetWrapper.java 8 Oct 2001 15:04:39 -0000 1.5 +++ EventTargetWrapper.java 27 Jun 2002 08:12:06 -0000 1.6 @@ -14,6 +14,7 @@ import org.mozilla.javascript.NativeJavaObject; import org.mozilla.javascript.NativeJavaMethod; import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.Undefined; import org.mozilla.javascript.WrappedException; @@ -33,6 +34,9 @@ * with a Rhino function as parameter should redirect the call to * <code>addEventListener</code> with a Java function object calling * the Rhino function. + * This class also allows to pass an ECMAScript (Rhino) object as + * a parameter instead of a function provided the fact that this object + * has a <code>handleEvent</code> method. * @author <a href="mailto:[EMAIL PROTECTED]">Christophe Jolif</a> * @version $Id$ */ @@ -41,10 +45,10 @@ /** * The Java function object calling the Rhino function. */ - class RhinoEventListener implements EventListener { + class FunctionEventListener implements EventListener { private Function function; - RhinoEventListener(Function f) { + FunctionEventListener(Function f) { function = f; } public void handleEvent(Event evt) { @@ -52,8 +56,31 @@ interpreter.callHandler(function, evt); } catch (JavaScriptException e) { // the only simple solution is to forward it as a - // RuntimeException to be catch by event dispatching - // in BridgetEventSupport.java + // RuntimeException to be catched by event dispatching + // in BridgeEventSupport.java + // another solution will to give UserAgent to interpreters + throw new WrappedException(e); + } + } + } + + class HandleEventListener implements EventListener { + private final static String HANDLE_EVENT = "handleEvent"; + + private Scriptable scriptable; + private Object[] array = new Object[1]; + + HandleEventListener(Scriptable s) { + scriptable = s; + } + public void handleEvent(Event evt) { + try { + array[0] = evt; + ScriptableObject.callMethod(scriptable, HANDLE_EVENT, array); + } catch (JavaScriptException e) { + // the only simple solution is to forward it as a + // RuntimeException to be catched by event dispatching + // in BridgeEventSupport.java // another solution will to give UserAgent to interpreters throw new WrappedException(e); } @@ -70,7 +97,7 @@ if (args[1] instanceof Function) { if (this.get(NAME, this).equals(ADD_NAME)) { EventListener evtListener = - new RhinoEventListener((Function)args[1]); + new FunctionEventListener((Function)args[1]); if (listenerMap == null) listenerMap = new HashMap(2); listenerMap.put(args[1], evtListener); @@ -102,6 +129,44 @@ booleanValue()); } return Undefined.instance; + } + } else { + if (args[1] instanceof org.mozilla.javascript.NativeObject) { + if (this.get(NAME, this).equals(ADD_NAME)) { + EventListener evtListener = + new HandleEventListener((Scriptable)args[1]); + if (listenerMap == null) + listenerMap = new HashMap(2); + listenerMap.put(args[1], evtListener); + // we need to marshall args + Class[] paramTypes = { String.class, Scriptable.class, + Boolean.TYPE }; + for (int i = 0; i < args.length; i++) + args[i] = NativeJavaObject.coerceType(paramTypes[i], + args[i]); + ((EventTarget)unwrap()). + addEventListener((String)args[0], + evtListener, + ((Boolean)args[2]).booleanValue()); + return Undefined.instance; + } else { + if (listenerMap != null) { + // we need to marshall args + Class[] paramTypes = { String.class, Scriptable.class, + Boolean.TYPE }; + for (int i = 0; i < args.length; i++) + args[i] = + NativeJavaObject.coerceType(paramTypes[i], + args[i]); + ((EventTarget)unwrap()). + removeEventListener((String)args[0], + (EventListener)listenerMap. + remove(args[1]), + ((Boolean)args[2]). + booleanValue()); + } + return Undefined.instance; + } } } return super.call(ctx, scope, thisObj, args);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]