deweese 2003/11/21 05:36:25 Modified: sources/org/apache/batik/script/rhino EventTargetWrapper.java sources/org/apache/batik/swing/gvt JGVTComponent.java Log: 1) Memory leak with addEventListener and objects which have a reference to the event target is fixed. 2) Click events in the document now allow for a small amount of movement between mouse down/up (From Zach Del's improved JSVGCanvas - working on incorporating his XJSVGScroller into Batik!). Revision Changes Path 1.14 +13 -8 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.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- EventTargetWrapper.java 14 Aug 2003 09:32:29 -0000 1.13 +++ EventTargetWrapper.java 21 Nov 2003 13:36:25 -0000 1.14 @@ -50,6 +50,7 @@ package org.apache.batik.script.rhino; +import java.lang.ref.SoftReference; import java.lang.reflect.Method; import java.util.Map; import java.util.HashMap; @@ -236,7 +237,7 @@ EventListener evtListener = new FunctionEventListener ((Function)args[1], ((RhinoInterpreter.ExtendedContext)ctx).getInterpreter()); - listenerMap.put(args[1], evtListener); + listenerMap.put(args[1], new SoftReference(evtListener)); // we need to marshall args Class[] paramTypes = { String.class, Function.class, Boolean.TYPE }; @@ -252,7 +253,7 @@ new HandleEventListener((Scriptable)args[1], ((RhinoInterpreter.ExtendedContext) ctx).getInterpreter()); - listenerMap.put(args[1], evtListener); + listenerMap.put(args[1], new SoftReference(evtListener)); // we need to marshall args Class[] paramTypes = { String.class, Scriptable.class, Boolean.TYPE }; @@ -280,8 +281,10 @@ throws JavaScriptException { NativeJavaObject njo = (NativeJavaObject)thisObj; if (args[1] instanceof Function) { - EventListener el; - el = (EventListener)listenerMap.remove(args[1]); + SoftReference sr = (SoftReference)listenerMap.remove(args[1]); + if (sr == null) + return Undefined.instance; + EventListener el = (EventListener)sr.get(); if (el == null) return Undefined.instance; // we need to marshall args @@ -294,8 +297,10 @@ return Undefined.instance; } if (args[1] instanceof NativeObject) { - EventListener el; - el = (EventListener)listenerMap.remove(args[1]); + SoftReference sr = (SoftReference)listenerMap.remove(args[1]); + if (sr == null) + return Undefined.instance; + EventListener el = (EventListener)sr.get(); if (el == null) return Undefined.instance; // we need to marshall args @@ -356,7 +361,7 @@ if (mapOfListenerMap == null) mapOfListenerMap = new WeakHashMap(10); if ((map = (Map)mapOfListenerMap.get(unwrap())) == null) { - mapOfListenerMap.put(unwrap(), map = new HashMap(2)); + mapOfListenerMap.put(unwrap(), map = new WeakHashMap(2)); } return map; } 1.43 +43 -2 xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java Index: JGVTComponent.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- JGVTComponent.java 16 Sep 2003 01:12:52 -0000 1.42 +++ JGVTComponent.java 21 Nov 2003 13:36:25 -0000 1.43 @@ -773,6 +773,12 @@ KeyListener, MouseListener, MouseMotionListener { + boolean checkClick = false; + boolean hadDrag = false; + int startX, startY; + long startTime; + int MAX_DISP = 4*4; + long CLICK_TIME = 200; /** * Creates a new Listener. @@ -983,6 +989,11 @@ * Invoked when a mouse button has been pressed on a component. */ public void mousePressed(MouseEvent e) { + startX = e.getX(); + startY = e.getY(); + startTime = System.currentTimeMillis(); + checkClick = true; + selectInteractor(e); if (interactor != null) { interactor.mousePressed(e); @@ -1002,7 +1013,31 @@ /** * Invoked when a mouse button has been released on a component. */ - public void mouseReleased(MouseEvent e) { + public void mouseReleased(java.awt.event.MouseEvent e) { + if ((checkClick) && hadDrag) { + int dx = startX-e.getX(); + int dy = startY-e.getY(); + long cTime = System.currentTimeMillis(); + if ((dx*dx+dy*dy < MAX_DISP) && + (cTime-startTime) < CLICK_TIME) { + // our drag was short! dispatch a CLICK event. + // + MouseEvent click = new MouseEvent + (e.getComponent(), + MouseEvent.MOUSE_CLICKED, + e.getWhen(), + e.getModifiers(), // modifiers + e.getX(), + e.getY(), + e.getClickCount(), + e.isPopupTrigger()); + + mouseClicked(click); + } + } + checkClick = false; + hadDrag = false; + selectInteractor(e); if (interactor != null) { interactor.mouseReleased(e); @@ -1070,6 +1105,12 @@ * bounds of the component). */ public void mouseDragged(MouseEvent e) { + hadDrag = true; + int dx = startX-e.getX(); + int dy = startY-e.getY(); + if (dx*dx+dy*dy > MAX_DISP) + checkClick = false; + selectInteractor(e); if (interactor != null) { interactor.mouseDragged(e);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]