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]