aboutsummaryrefslogtreecommitdiff
path: root/node_modules/montage/core/event/event-manager.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/montage/core/event/event-manager.js')
-rwxr-xr-xnode_modules/montage/core/event/event-manager.js2075
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
20var 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.
30if (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 */
59Montage.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 */
69Montage.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 */
80Montage.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
89var 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
106Serializer.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
137Deserializer.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
143var CAPTURING_PHASE = 1,
144 AT_TARGET = 2,
145 BUBBLING_PHASE = 3;
146
147/**
148 @class module:montage/core/event/event-manager.EventManager
149 */
150var 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": {
220 bubbles: true,
221 type: "KeyEvents"
222 },
223 "keypress": {
224 bubbles: true,
225 type: "KeyEvents"
226 },