diff options
author | Pierre Frisch | 2011-12-22 07:25:50 -0800 |
---|---|---|
committer | Valerio Virgillito | 2012-01-27 11:18:17 -0800 |
commit | b89a7ee8b956c96a1dcee995ea840feddc5d4b27 (patch) | |
tree | 0f3136ab0ecdbbbed6a83576581af0a53124d6f1 /node_modules/montage/core/event/event-manager.js | |
parent | 2401f05d1f4b94d45e4568b81fc73e67b969d980 (diff) | |
download | ninja-b89a7ee8b956c96a1dcee995ea840feddc5d4b27.tar.gz |
First commit of Ninja to ninja-internal
Signed-off-by: Valerio Virgillito <rmwh84@motorola.com>
Diffstat (limited to 'node_modules/montage/core/event/event-manager.js')
-rwxr-xr-x | node_modules/montage/core/event/event-manager.js | 2075 |
1 files changed, 2075 insertions, 0 deletions
diff --git a/node_modules/montage/core/event/event-manager.js b/node_modules/montage/core/event/event-manager.js new file mode 100755 index 00000000..abc441c8 --- /dev/null +++ b/node_modules/montage/core/event/event-manager.js | |||
@@ -0,0 +1,2075 @@ | |||
1 | /* <copyright> | ||
2 | This file contains proprietary software owned by Motorola Mobility, Inc.<br/> | ||
3 | No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/> | ||
4 | (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. | ||
5 | </copyright> */ | ||
6 | /** | ||
7 | * | ||
8 | * @author: Lea Verou | ||
9 | * @license: Licensed under The MIT License. See license.txt and http://www.opensource.org/licenses/mit-license.php. | ||
10 | * @website: http://leaverou.github.com/chainvas/ | ||
11 | */ | ||
12 | |||
13 | /** | ||
14 | @module montage/core/event/event-manager | ||
15 | @requires montage/core/core | ||
16 | @requires montage/core/event/mutable-event | ||
17 | @requires montage/core/event/action-event-listener | ||
18 | */ | ||
19 | |||
20 | var Montage = require("montage").Montage, | ||
21 | MutableEvent = require("core/event/mutable-event").MutableEvent, | ||
22 | ActionEventListener = require("core/event/action-event-listener").ActionEventListener, | ||
23 | Serializer = require("core/serializer").Serializer, | ||
24 | Deserializer = require("core/deserializer").Deserializer, | ||
25 | defaultEventManager; | ||
26 | |||
27 | /* This is to handle browsers that have TouchEvents but don't have the global constructor function Touch */ | ||
28 | //if(TouchEvent && typeof window.Touch === "undefined") { | ||
29 | // HACK: The commented expression fails because Chrome on the desktop also has TouchEvent and in the code we're either registering touch events OR mouse events on most components. | ||
30 | if (typeof window.Touch === "undefined" && /Xoom|TouchPad/.test(navigator.userAgent)) { | ||
31 | window.Touch = function() { | ||
32 | }; | ||
33 | (function() { | ||
34 | var onFirstTouchstart; | ||
35 | |||
36 | document.addEventListener("touchstart", onFirstTouchstart = function (event) { | ||
37 | window.Touch = event.touches[0].constructor; | ||
38 | if (document.nativeRemoveEventListener) { | ||
39 | document.nativeRemoveEventListener("touchstart", onFirstTouchstart, true); | ||
40 | } else { | ||
41 | document.removeEventListener("touchstart", onFirstTouchstart, true); | ||
42 | } | ||
43 | if (defaultEventManager && defaultEventManager.isStoringPointerEvents) { | ||
44 | defaultEventManager.isStoringPointerEvents = false; | ||
45 | defaultEventManager.isStoringPointerEvents = true; | ||
46 | } | ||
47 | }, true); | ||
48 | })(); | ||
49 | } | ||
50 | |||
51 | /** | ||
52 | @external Element | ||
53 | */ | ||
54 | |||
55 | /** | ||
56 | HTML element event handler UUID | ||
57 | @member external:Element#eventHandlerUUID | ||
58 | */ | ||
59 | Montage.defineProperty(Element.prototype, "eventHandlerUUID", /** @lends module:montage/core/event/event-manager.defineProperty */ { | ||
60 | value: undefined, | ||
61 | enumerable: false | ||
62 | }); | ||
63 | |||
64 | |||
65 | /** | ||
66 | The controller (Montage component) for the element. | ||
67 | @member external:Element#controller | ||
68 | */ | ||
69 | Montage.defineProperty(Element.prototype, "controller", { | ||
70 | get: function() { | ||
71 | return defaultEventManager._elementEventHandlerByUUID[this.eventHandlerUUID]; | ||
72 | }, | ||
73 | enumerable: false | ||
74 | }); | ||
75 | |||
76 | |||
77 | /** | ||
78 | @function external:Object#dispatchEvent | ||
79 | */ | ||
80 | Montage.defineProperty(Object.prototype, "dispatchEvent", { | ||
81 | value: function(event) { | ||
82 | var targettedEvent = MutableEvent.fromEvent(event); | ||
83 | targettedEvent.target = this; | ||
84 | defaultEventManager.handleEvent(targettedEvent); | ||
85 | }, | ||
86 | enumerable: false | ||
87 | }); | ||
88 | |||
89 | var EventListenerDescriptor = Montage.create(Montage, { | ||
90 | type: { | ||
91 | serializable: true, | ||
92 | value: null | ||
93 | }, | ||
94 | |||
95 | listener: { | ||
96 | serializable: "reference", | ||
97 | value: null | ||
98 | }, | ||
99 | |||
100 | capture: { | ||
101 | serializable: true, | ||
102 | value: null | ||
103 | } | ||
104 | }); | ||
105 | |||
106 | Serializer.defineSerializationUnit("listeners", function(object) { | ||
107 | var eventManager = defaultEventManager, | ||
108 | uuid = object.uuid, | ||
109 | eventListenerDescriptors = [], | ||
110 | descriptors, | ||
111 | descriptor, | ||
112 | listenerDescriptor, | ||
113 | listener; | ||
114 | |||
115 | for (var type in eventManager.registeredEventListeners) { | ||
116 | descriptors = eventManager.registeredEventListeners[type]; | ||
117 | descriptor = descriptors && descriptors[uuid]; | ||
118 | if (descriptor) { | ||
119 | for (var listenerUuid in descriptor.listeners) { | ||
120 | listener = descriptor.listeners[listenerUuid]; | ||
121 | |||
122 | eventListenerDescriptor = EventListenerDescriptor.create(); | ||
123 | eventListenerDescriptor.type = type; | ||
124 | eventListenerDescriptor.listener = listener.listener; | ||
125 | eventListenerDescriptor.capture = listener.capture; | ||
126 | |||
127 | eventListenerDescriptors.push(eventListenerDescriptor); | ||
128 | } | ||
129 | } | ||
130 | } | ||
131 | |||
132 | if (eventListenerDescriptors.length > 0) { | ||
133 | return eventListenerDescriptors; | ||
134 | } | ||
135 | }); | ||
136 | |||
137 | Deserializer.defineDeserializationUnit("listeners", function(object, listeners) { | ||
138 | for (var i = 0, listener; (listener = listeners[i]); i++) { | ||
139 | object.addEventListener(listener.type, listener.listener, listener.capture); | ||
140 | } | ||
141 | }); | ||
142 | |||
143 | var CAPTURING_PHASE = 1, | ||
144 | AT_TARGET = 2, | ||
145 | BUBBLING_PHASE = 3; | ||
146 | |||
147 | /** | ||
148 | @class module:montage/core/event/event-manager.EventManager | ||
149 | */ | ||
150 | var EventManager = exports.EventManager = Montage.create(Montage,/** @lends module:montage/core/event/event-manager.EventManager# */ { | ||
151 | |||
152 | // Utility | ||
153 | eventDefinitions: { | ||
154 | value: { | ||
155 | "mousedown": { | ||
156 | bubbles: true, | ||
157 | type: "MouseEvents" | ||
158 | }, | ||
159 | "mouseup": { | ||
160 | bubbles: true, | ||
161 | type: "MouseEvents" | ||
162 | }, | ||
163 | "mousemove": { | ||
164 | bubbles: true, | ||
165 | type: "MouseEvents" | ||
166 | }, | ||
167 | "click": { | ||
168 | bubbles: true, | ||
169 | type: "MouseEvents" | ||
170 | }, | ||
171 | "dblclick": { | ||
172 | bubbles: true, | ||
173 | type: "MouseEvents" | ||
174 | }, | ||
175 | "mouseover": { | ||
176 | bubbles: true, | ||
177 | type: "MouseEvents" | ||
178 | }, | ||
179 | "mouseout": { | ||
180 | bubbles: true, | ||
181 | type: "MouseEvents" | ||
182 | }, | ||
183 | |||
184 | "contextmenu": { | ||
185 | bubbles: true | ||
186 | }, | ||
187 | |||
188 | "touchstart": { | ||
189 | bubbles: true, | ||
190 | type: "TouchEvents" | ||
191 | }, | ||
192 | "touchend": { | ||
193 | bubbles: true, | ||
194 | type: "TouchEvents" | ||
195 | }, | ||
196 | "touchmove": { | ||
197 | bubbles: true, | ||
198 | type: "TouchEvents" | ||
199 | }, | ||
200 | "touchcancel": { | ||
201 | bubbles: true, | ||
202 | type: "TouchEvents" | ||
203 | }, | ||
204 | |||
205 | "copy": { | ||
206 | bubbles: true | ||
207 | }, | ||
208 | "cut": { | ||
209 | bubbles: true | ||
210 | }, | ||
211 | "paste": { | ||
212 | bubbles: true | ||
213 | }, | ||
214 | |||
215 | "keyup": { | ||
216 | bubbles: true, | ||
217 | type: "KeyEvents" | ||
218 | }, | ||
219 | "keydown": { | ||