[Laszlo-checkins] r13809 - in openlaszlo/trunk: WEB-INF/lps/lfc/kernel/swf9 lps/components/extensions lps/includes/source test/extensions

max@openlaszlo.org max at openlaszlo.org
Tue May 5 13:26:37 PDT 2009


Author: max
Date: 2009-05-05 13:26:35 -0700 (Tue, 05 May 2009)
New Revision: 13809

Modified:
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzMouseKernel.as
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzSprite.as
   openlaszlo/trunk/lps/components/extensions/html.lzx
   openlaszlo/trunk/lps/includes/source/embednew.js
   openlaszlo/trunk/lps/includes/source/iframemanager.js
   openlaszlo/trunk/test/extensions/html.lzx
Log:
Change 20090501-maxcarlson-y by maxcarlson at Bank on 2009-05-01 20:16:08 PDT
    in /Users/maxcarlson/openlaszlo/trunk-clean
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: Add mouse events to the html tag

Bugs Fixed: LPP-8034 - Mouse clicks in the HTML component do not trigger an onclick event on the HTML instance or in LzGlobalMouse

Technical Reviewer: andre.bargull at udo.edu
QA Reviewer: hminsky

Details: test/extensions/html - Override mouseevent to show mouse events in the debugger.

LzMouseKernel, LzSprite - Rename LzMouseKernel.__sendEvent() -> handleMouseEvent() to be consistent with swf8

lps/components/extensions/html - Add swf callback method for __gotMouseEvent().  

embednew - attachEventHandler() supports an optional 'closure' value which will be returned as an extra argument to the callback.

iframemanager - After the iframe finishes loading, attempt to listen for global mouse events on the window object.  Remove listeners when the iframe is destroyed.  Add __mouseEvent() callback which processes mouse events and delegates to the appropriate swf or dhtml APIs.

Tests: test/extensions/html.lzx?debug=true shows mouse events being sent from the iframe.



Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzMouseKernel.as
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzMouseKernel.as	2009-05-05 16:39:33 UTC (rev 13808)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzMouseKernel.as	2009-05-05 20:26:35 UTC (rev 13809)
@@ -25,7 +25,7 @@
     //////////////////
 
     // sends mouse events to the callback
-    static function __sendEvent (view:*, eventname:String) :void {
+    static function handleMouseEvent (view:*, eventname:String) :void {
         if (__callback) __scope[__callback](eventname, view);
         //Debug.write('LzMouseKernel event', eventname);
     }
@@ -82,9 +82,9 @@
                 LFCApplication.stage.focus = null;
 
                 // generate a 'onmouseenter' event
-                __sendEvent(null, 'onmouseenter');
+                handleMouseEvent(null, 'onmouseenter');
             }
-            __sendEvent(null, eventname);
+            handleMouseEvent(null, eventname);
         }
     }
 
@@ -101,7 +101,7 @@
     // handles MOUSE_LEAVE event
     static function __mouseLeaveHandler (event:Event = null) :void {
         __mouseLeft = true;
-        __sendEvent(null, 'onmouseleave');
+        handleMouseEvent(null, 'onmouseleave');
     }
 
     static function __mouseWheelHandler (event:MouseEvent) :void {

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzSprite.as
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzSprite.as	2009-05-05 16:39:33 UTC (rev 13808)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzSprite.as	2009-05-05 20:26:35 UTC (rev 13809)
@@ -662,7 +662,7 @@
       }
 
       public function handleMouse_DOUBLE_CLICK (event:MouseEvent) :void {
-          LzMouseKernel.__sendEvent( owner, 'ondblclick');
+          LzMouseKernel.handleMouseEvent( owner, 'ondblclick');
           event.stopPropagation();
       }
 
@@ -678,7 +678,7 @@
               this.__mouseEvent(new MouseEvent('mouseupoutside'));
               if (mouseOverSprite != null) {
                   // send after onmouseup(outside) (LPP-7335)
-                  LzMouseKernel.__sendEvent(mouseOverSprite.owner, 'onmouseover');
+                  LzMouseKernel.handleMouseEvent(mouseOverSprite.owner, 'onmouseover');
               }
           }
           LzMouseKernel.__lastMouseDown = null;
@@ -727,10 +727,10 @@
                 (eventname == 'onmouseover' || eventname == 'onmouseout')) {
                     // only send mouseover/out/dragin/dragout if the mouse went down on this sprite (LPP-6677, LPP-7335)
                     if (LzMouseKernel.__lastMouseDown === this) {
-                        LzMouseKernel.__sendEvent(this.owner, eventname);
+                        LzMouseKernel.handleMouseEvent(this.owner, eventname);
 
                         var dragname:String = eventname == 'onmouseover' ? 'onmousedragin' : 'onmousedragout';
-                        LzMouseKernel.__sendEvent(this.owner, dragname);
+                        LzMouseKernel.handleMouseEvent(this.owner, dragname);
                     } else {
                         // defer mouse-events until mouse is released (LPP-7300, LPP-7335)
                         if (eventname == 'onmouseover') {
@@ -740,7 +740,7 @@
                         }
                     }
             } else {
-                LzMouseKernel.__sendEvent(this.owner, eventname);
+                LzMouseKernel.handleMouseEvent(this.owner, eventname);
             }
 
             // If this.showhandcursor is null, inherit value from LzMouseKernel.showhandcursor

Modified: openlaszlo/trunk/lps/components/extensions/html.lzx
===================================================================
--- openlaszlo/trunk/lps/components/extensions/html.lzx	2009-05-05 16:39:33 UTC (rev 13808)
+++ openlaszlo/trunk/lps/components/extensions/html.lzx	2009-05-05 20:26:35 UTC (rev 13809)
@@ -38,8 +38,13 @@
     lz.Browser.callJS('lz.embed.iframemanager.scrollBy', null, id, x, y);
 }
 lz.embed.iframemanager.__gotload = function(id) {
-    if (lz.embed.iframemanager.owners[id]) lz.embed.iframemanager.owners[id].__gotload();
+    var view = lz.embed.iframemanager.owners[id];
+    if (view) view.__gotload();
 }
+lz.embed.iframemanager.__gotMouseEvent = function(id, eventname) {
+    var view = lz.embed.iframemanager.owners[id];
+    if (view) LzMouseKernel.handleMouseEvent(view, eventname);
+}
 lz.embed.iframemanager.__destroy = function(id) {
     lz.Browser.callJS('lz.embed.iframemanager.__destroy', null, id);
 }

Modified: openlaszlo/trunk/lps/includes/source/embednew.js
===================================================================
--- openlaszlo/trunk/lps/includes/source/embednew.js	2009-05-05 16:39:33 UTC (rev 13808)
+++ openlaszlo/trunk/lps/includes/source/embednew.js	2009-05-05 20:26:35 UTC (rev 13809)
@@ -672,7 +672,7 @@
      * @param callbackscope:Object Scope to receive the callback
      * @param callbackname:String Method name to receive callback in callbackscope
      */
-    attachEventHandler: function(eventscope, eventname, callbackscope, callbackname) {
+    attachEventHandler: function(eventscope, eventname, callbackscope, callbackname, closure) {
         if (! (callbackscope && callbackname
                 && typeof callbackscope[callbackname] == 'function')) {
             return;
@@ -695,7 +695,8 @@
             }
         }
         var handler = function() {
-            var a = window.event ? [window.event] : arguments;
+            var a = window.event ? [window.event] : [].slice.call(arguments, 0);;
+            if (closure) a.push(closure);
             callbackscope[callbackname].apply(callbackscope, a);
         }
         handler.$e = eventscope;

Modified: openlaszlo/trunk/lps/includes/source/iframemanager.js
===================================================================
--- openlaszlo/trunk/lps/includes/source/iframemanager.js	2009-05-05 16:39:33 UTC (rev 13808)
+++ openlaszlo/trunk/lps/includes/source/iframemanager.js	2009-05-05 20:26:35 UTC (rev 13809)
@@ -230,6 +230,21 @@
             lz.embed[iframe.owner].callMethod('lz.embed.iframemanager.__gotload(\'' + id + '\')');
         }
         this.__loading[id] = false;
+        var iframe = lz.embed.iframemanager.getFrameWindow(id);
+        // bind into global events.
+        try {
+            lz.embed.attachEventHandler(iframe.document, 'mousedown', lz.embed.iframemanager, '__mouseEvent', id);
+            lz.embed.attachEventHandler(iframe.document, 'mouseup', lz.embed.iframemanager, '__mouseEvent', id);
+            //lz.embed.attachEventHandler(iframe.document, 'mousemove', lz.embed.iframemanager, '__mouseEvent', id);
+            if (lz.embed.browser.isIE) {
+                lz.embed.attachEventHandler(iframe.document, 'mouseenter', lz.embed.iframemanager, '__mouseEvent', id);
+                lz.embed.attachEventHandler(iframe.document, 'mouseleave', lz.embed.iframemanager, '__mouseEvent', id);
+            } else {
+                lz.embed.attachEventHandler(iframe.document, 'mouseover', lz.embed.iframemanager, '__mouseEvent', id);
+                lz.embed.attachEventHandler(iframe.document, 'mouseout', lz.embed.iframemanager, '__mouseEvent', id);
+            }
+        } catch(e) {
+        }
         if (this.__calljsqueue[id]) {
             this.__playQueue(this.__calljsqueue[id]);
             delete this.__calljsqueue[id];
@@ -273,6 +288,20 @@
         }
         var iframe = lz.embed.iframemanager.__frames[id];
         if (iframe) {
+            // remove event listeners
+            try {
+                lz.embed.removeEventHandler(iframe.document, 'mousedown', lz.embed.iframemanager, '__mouseEvent');
+                lz.embed.removeEventHandler(iframe.document, 'mouseup', lz.embed.iframemanager, '__mouseEvent');
+                //lz.embed.removeEventHandler(iframe.document, 'mousemove', lz.embed.iframemanager, '__mouseEvent');
+                if (lz.embed.browser.isIE) {
+                    lz.embed.removeEventHandler(iframe.document, 'mouseenter', lz.embed.iframemanager, '__mouseEvent');
+                    lz.embed.removeEventHandler(iframe.document, 'mouseleave', lz.embed.iframemanager, '__mouseEvent');
+                } else {
+                    lz.embed.removeEventHandler(iframe.document, 'mouseover', lz.embed.iframemanager, '__mouseEvent');
+                    lz.embed.removeEventHandler(iframe.document, 'mouseout', lz.embed.iframemanager, '__mouseEvent');
+                }
+            } catch(e) {
+            }
             iframe.owner = null;
             iframe.appcontainer = null;
             LzSprite.prototype.__discardElement(iframe);
@@ -306,4 +335,27 @@
         } catch (e) {
         }
     }
+    ,__mouseEvent: function(e, id) {
+        var iframe = lz.embed.iframemanager.getFrame(id);
+        //console.log('__gotload', iframe;
+        if (! iframe) return;
+
+        if (!e) {
+            e = window.event;
+        }
+
+        if (iframe.owner && iframe.owner.sprite && iframe.owner.sprite.__mouseEvent) {
+            // dhtml
+            iframe.owner.sprite.__mouseEvent(e);
+        } else {
+            var eventname = 'on' + e.type;
+            // deal with IE event names
+            if (eventname == 'onmouseleave') {
+                eventname = 'onmouseout';
+            } else if (eventname == 'onmouseenter') {
+                eventname = 'onmouseover';
+            }
+            lz.embed[iframe.owner].callMethod('lz.embed.iframemanager.__gotMouseEvent(\'' + id + '\',\'' + eventname + '\')');
+        }
+    }
 }

Modified: openlaszlo/trunk/test/extensions/html.lzx
===================================================================
--- openlaszlo/trunk/test/extensions/html.lzx	2009-05-05 16:39:33 UTC (rev 13808)
+++ openlaszlo/trunk/test/extensions/html.lzx	2009-05-05 20:26:35 UTC (rev 13809)
@@ -78,6 +78,10 @@
             <handler name="onload">
                 Debug.write('onload');
             </handler>
+            <method name="mouseevent" args="ename">
+                super.mouseevent(ename);
+                Debug.warn('mouseevent', ename);
+            </method>
         </html>
     </class>
 



More information about the Laszlo-checkins mailing list