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]

Reply via email to