You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2015/12/01 10:14:23 UTC
[5/5] git commit: [flex-asjs] [refs/heads/core_js_to_as] - fix
rollovers and other mouseevents
fix rollovers and other mouseevents
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/eb92af67
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/eb92af67
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/eb92af67
Branch: refs/heads/core_js_to_as
Commit: eb92af6710fbe5782123335c9cb0a524176d1905
Parents: 872e685
Author: Alex Harui <ah...@apache.org>
Authored: Tue Dec 1 01:14:05 2015 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Dec 1 01:14:05 2015 -0800
----------------------------------------------------------------------
.../as/src/org/apache/flex/events/MouseEvent.as | 142 +++++++++++++++++--
1 file changed, 134 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/eb92af67/frameworks/projects/Core/as/src/org/apache/flex/events/MouseEvent.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/as/src/org/apache/flex/events/MouseEvent.as b/frameworks/projects/Core/as/src/org/apache/flex/events/MouseEvent.as
index a15971e..756438f 100644
--- a/frameworks/projects/Core/as/src/org/apache/flex/events/MouseEvent.as
+++ b/frameworks/projects/Core/as/src/org/apache/flex/events/MouseEvent.as
@@ -22,11 +22,16 @@ package org.apache.flex.events
{
import flash.events.MouseEvent;
}
+ COMPILE::JS
+ {
+ import window.MouseEvent;
+ }
import org.apache.flex.core.IUIBase;
import org.apache.flex.geom.Point;
import org.apache.flex.utils.PointUtils;
+
/**
* Mouse events
*
@@ -37,15 +42,27 @@ package org.apache.flex.events
*/
public class MouseEvent extends Event
{
- public static const MOUSE_DOWN:String = "mouseDown";
- public static const MOUSE_MOVE:String = "mouseMove";
- public static const MOUSE_UP:String = "mouseUp";
- public static const MOUSE_OUT:String = "mouseOut";
- public static const MOUSE_OVER:String = "mouseOver";
- public static const ROLL_OVER:String = "rollOver";
- public static const ROLL_OUT:String = "rollOut";
+ private static function platformConstant(s:String):String
+ {
+ COMPILE::AS3
+ {
+ return s;
+ }
+ COMPILE::JS
+ {
+ return s.toLowerCase();
+ }
+ }
+
+ public static const MOUSE_DOWN:String = platformConstant("mouseDown");
+ public static const MOUSE_MOVE:String = platformConstant("mouseMove");
+ public static const MOUSE_UP:String = platformConstant("mouseUp");
+ public static const MOUSE_OUT:String = platformConstant("mouseOut");
+ public static const MOUSE_OVER:String = platformConstant("mouseOver");
+ public static const ROLL_OVER:String = platformConstant("rollOver");
+ public static const ROLL_OUT:String = platformConstant("rollOut");
public static const CLICK:String = "click";
-
+
/**
* Constructor.
*
@@ -160,5 +177,114 @@ package org.apache.flex.events
}
return _stagePoint.y;
}
+
+ /**
+ * @private
+ */
+ COMPILE::JS
+ private static function installRollOverMixin():Boolean
+ {
+ window.addEventListener(MOUSE_OVER,
+ mouseOverHandler, false);
+ return true;
+ }
+
+
+ /**
+ * @param e The event.
+ * RollOver/RollOut is entirely implemented in mouseOver because
+ * when a parent and child share an edge, you only get a mouseout
+ * for the child and not the parent and you need to send rollout
+ * to both. A similar issue exists for rollover.
+ */
+ COMPILE::JS
+ private static function mouseOverHandler(e:MouseEvent):void
+ {
+ var j:int;
+ var m:int;
+ var outs:Array;
+ var me:window.MouseEvent;
+ var parent:Object;
+ var target:Object = e.target.flexjs_wrapper;
+ if (target == null)
+ return; // probably over the html tag
+ var targets:Array = MouseEvent.targets;
+ var index:int = targets.indexOf(target);
+ if (index != -1) {
+ // get all children
+ outs = targets.slice(index + 1);
+ m = outs.length;
+ for (j = 0; j < m; j++) {
+ me = makeMouseEvent(
+ ROLL_OUT, e);
+ outs[j].element.dispatchEvent(me);
+ }
+ MouseEvent.targets = targets.slice(0, index + 1);
+ }
+ else {
+ var newTargets:Array = [target];
+ if (!('parent' in target))
+ parent = null;
+ else
+ parent = target.parent;
+ while (parent) {
+ index = targets.indexOf(parent);
+ if (index == -1) {
+ newTargets.unshift(parent);
+ if (!('parent' in parent))
+ break;
+ parent = parent.parent;
+ }
+ else {
+ outs = targets.slice(index + 1);
+ m = outs.length;
+ for (j = 0; j < m; j++) {
+ me = makeMouseEvent(
+ ROLL_OUT, e);
+ outs[j].element.dispatchEvent(me);
+ }
+ targets = targets.slice(0, index + 1);
+ break;
+ }
+ }
+ var n:int = newTargets.length;
+ for (var i:int = 0; i < n; i++) {
+ me = makeMouseEvent(
+ ROLL_OVER, e);
+ newTargets[i].element.dispatchEvent(me);
+ }
+ MouseEvent.targets = targets.concat(newTargets);
+ }
+ }
+
+
+ /**
+ */
+ COMPILE::JS
+ private static var rollOverMixin:Boolean =
+ installRollOverMixin();
+
+
+ /**
+ */
+ COMPILE::JS
+ private static var targets:Array = [];
+
+ /**
+ * @param {string} type The event type.
+ * @param {Event} e The mouse event.
+ * @return {MouseEvent} The new event.
+ */
+ COMPILE::JS
+ private static function makeMouseEvent(type:String, e:window.MouseEvent):window.MouseEvent
+ {
+ var out:window.MouseEvent = new window.MouseEvent(type);
+ out.initMouseEvent(type, false, false,
+ e.view, e.detail, e.screenX, e.screenY,
+ e.clientX, e.clientY, e.ctrlKey, e.altKey,
+ e.shiftKey, e.metaKey, e.button, e.relatedTarget);
+ return out;
+ };
+
}
}