rsence-pre 3.0.0.3 → 3.0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,1270 +0,0 @@
1
-
2
- /*** = Description
3
- ** Mid-level event abstraction manager.
4
- **
5
- ** This engine serves the HControl classes, so usually the existence of it
6
- ** is not obvious. The main interface to use it is the methods in HControl.
7
- ***/
8
- var//RSence.Foundation
9
- EVENT = {
10
-
11
- // Default options for focus (all false)
12
- _defaultFocusOptions: {
13
- mouseMove: false,
14
- mouseDown: false,
15
- click: false,
16
- mouseUp: false,
17
- draggable: false,
18
- droppable: false,
19
- keyDown: false,
20
- keyUp: false,
21
- mouseWheel: false,
22
- resize: false,
23
- textEnter: false,
24
- doubleClick: false,
25
- contextMenu: false
26
- },
27
-
28
- /** = Description
29
- * Array that keeps the last known global event status type.
30
- *
31
- * The format is an array with an index per "interesting" event value.
32
- *
33
- * = Indexes
34
- * +EVENT.status[ EVENT.button1 ]+:: The state of the left mouse button.
35
- * false when not pressed
36
- * true when pressed.
37
- *
38
- * +EVENT.status[ EVENT.button2 ]+:: The state of the right mouse button.
39
- * false when not pressed
40
- * true when pressed.
41
- *
42
- * +EVENT.status[ EVENT.crsrX ]+:: The x-coordinate of the mouse cursor.
43
- *
44
- * +EVENT.status[ EVENT.crsrY ]+:: The y-coordinate of the mouse cursor.
45
- *
46
- * +EVENT.status[ EVENT.keysDown ]+:: A list of keycodes of all the keys
47
- * currently held down in the order of
48
- * occurrence (first pressed comes first,
49
- * last pressed last).
50
- *
51
- * +EVENT.status[ EVENT.altKeyDown ]+:: The boolean status of the Alt
52
- * modifier key being held down.
53
- *
54
- * +EVENT.status[ EVENT.ctrlKeyDown ]+:: The boolean status of the Ctrl
55
- * modifier key being held down.
56
- *
57
- * +EVENT.status[ EVENT.shiftKeyDown ]+:: The boolean status of the Shift
58
- * modifier key being held down.
59
- *
60
- * +EVENT.status[ EVENT.metaKeyDown ]+:: The boolean status of the Meta
61
- * modifier key being held down.
62
- *
63
- * +EVENT.status[ EVENT.cmdKeyDown ]+:: The boolean status of any of the system-specific
64
- * Command, Menu or Start modifier keys being held down.
65
- *
66
- **/
67
- status: [false, false, -1, -1, [], false, false, false, false, false],
68
-
69
- /** The index in the status array for the left mouse button.
70
- **/
71
- button1: 0,
72
-
73
- /** The index in the status array for the right mouse button.
74
- **/
75
- button2: 1,
76
-
77
- /** The index in the status array for the mouse cursor x coordinate.
78
- **/
79
- crsrX: 2,
80
-
81
- /** The index in the status array for the mouse cursor y coordinate.
82
- **/
83
- crsrY: 3,
84
-
85
- /** The index in the status array for the list of keycodes of all the
86
- * keys currently held down in the order of occurrence (first pressed
87
- * comes first, last pressed last).
88
- *
89
- **/
90
- keysDown: 4,
91
-
92
- /** The index in the status array for the state of the Alt modifier key.
93
- **/
94
- altKeyDown: 5,
95
-
96
- /** The index in the status array for the state of the Ctrl modifier key.
97
- **/
98
- ctrlKeyDown: 6,
99
-
100
- /** The index in the status array for the state of the Shift modifier key.
101
- **/
102
- shiftKeyDown: 7,
103
-
104
- /** The index in the status array for the state of the Meta modifier key.
105
- **/
106
- metaKeyDown: 8,
107
-
108
- /** The index in the status array for the state of the Command modifier key.
109
- **/
110
- cmdKeyDown: 9,
111
-
112
- /** A flag to disable, if your applications don't need drop events.
113
- * Setting this to false when not needed improves overall performance,
114
- * because the drop events need constant calculation of the mouse cursor
115
- * location against all possible drop targets.
116
- *
117
- **/
118
- enableDroppableChecks: true,
119
-
120
- /** Initializes the members used by the drop -related events.
121
- * This method is called from within EVENT and is never called,
122
- * if enableDroppableChecks is false.
123
- **/
124
- startDroppable: function() {
125
- var _this = EVENT;
126
- _this.hovered = [];
127
- // items currently under the mouse cursor
128
- _this.hoverInterval = 200;
129
- // 50 means send hover events at most with 50ms intervals
130
- _this.hoverTimer = new Date().getTime();
131
- // Time since last hover event triggered
132
- },
133
-
134
-
135
- // cleans up events that would be lost when browser window is blurred
136
- _domWindowBlur: function(){
137
- // console.log('window blurred');
138
- var
139
- _this = EVENT,
140
- _status = _this.status;
141
- // _status[_this.button1] = false;
142
- // _status[_this.button2] = false;
143
- // _status[_this.crsrX] = -1;
144
- // _status[_this.crsrY] = -1;
145
- _status[_this.keysDown] = [];
146
- _status[_this.altKeyDown] = false;
147
- _status[_this.ctrlKeyDown] = false;
148
- _status[_this.shiftKeyDown] = false;
149
- _status[_this.metaKeyDown] = false;
150
- _status[_this.cmdKeyDown] = false;
151
- _this.enableDroppableChecks = false;
152
- if( HSystem.defaultInterval !== HSystem._blurredInterval ){
153
- _this._sysDefaultInterval = HSystem.defaultInterval;
154
- COMM.Queue.push( function(){
155
- HSystem.defaultInterval = HSystem._blurredInterval;
156
- } );
157
- }
158
- },
159
- _domWindowFocus: function(){
160
- var
161
- _this = EVENT;
162
- _this.enableDroppableChecks = _this._origDroppableChecks;
163
- if( HSystem.defaultInterval === HSystem._blurredInterval && _this._sysDefaultInterval ){
164
- COMM.Queue.push( function(){
165
- HSystem.defaultInterval = _this._sysDefaultInterval;
166
- } );
167
- }
168
- // console.log('window focused');
169
- },
170
-
171
- /** Starts event listening.
172
- **/
173
- start: function() {
174
- var _globalEventTargetElement = (BROWSER_TYPE.ie && !BROWSER_TYPE.ie9)?document:window,
175
- _this = EVENT;
176
- Event.observe( _globalEventTargetElement, 'mousemove', _this.mouseMove );
177
- Event.observe( _globalEventTargetElement, 'mouseup', _this.mouseUp );
178
- Event.observe( _globalEventTargetElement, 'mousedown', _this.mouseDown );
179
- Event.observe( _globalEventTargetElement, 'click', _this.click );
180
- Event.observe( _globalEventTargetElement, 'keyup', _this.keyUp );
181
- Event.observe( _globalEventTargetElement, 'keydown', _this.keyDown );
182
- if( !BROWSER_TYPE.safari && !BROWSER_TYPE.ie){
183
- Event.observe( _globalEventTargetElement, 'keypress', _this.keyPress );
184
- }
185
- Event.observe( _globalEventTargetElement, 'contextmenu', _this.contextMenu );
186
- Event.observe( _globalEventTargetElement, 'resize', _this.resize );
187
- Event.observe( _globalEventTargetElement, 'mousewheel', _this.mouseWheel );
188
- Event.observe( _globalEventTargetElement, 'dblclick', _this.doubleClick );
189
- if (window.addEventListener) {
190
- window.addEventListener('DOMMouseScroll', EVENT.mouseWheel, false);
191
- window.addEventListener('resize', EVENT.resize, false);
192
- }
193
- _this._origDroppableChecks = _this.enableDroppableChecks;
194
- Event.observe( window, 'blur', _this._domWindowBlur );
195
- Event.observe( window, 'focus', _this._domWindowFocus );
196
- _this.listeners = [];
197
- // keep elemId buffer of all listeners
198
- _this.focused = [];
199
- // keep elemId buffer of all focused listeners
200
- _this.resizeListeners = [];
201
- // list of resize-event listeners
202
- _this.coordListeners = [];
203
- // global mouse movement listeners
204
- _this.focusOptions = {};
205
- // keep property lists by elemId
206
- _this.dragItems = [];
207
- // elemId of currently dragged items
208
- if (_this.enableDroppableChecks) {
209
- _this.startDroppable();
210
- }
211
-
212
- _this.topmostDroppable = null;
213
- // the currently hovered element accepting droppable items
214
- _this.textEnterCtrls = [];
215
- // ID of controls with textfields
216
- // position caching benefits performance, see coordCacheFlush
217
- _this._coordCache = [];
218
- _this._coordCacheFlag = true;
219
- _this._lastCoordFlushTimeout = null;
220
-
221
- _this.activeControl = null;
222
- // control that currently has the focus
223
- _this._lastKeyDown = null;
224
- // the most recent keypress
225
- },
226
-
227
- /** Flushes the position cache by elemId, if no elemId is specified,
228
- * everything is flushed.
229
- **/
230
- coordCacheFlush: function(_elemId) {
231
- if (_elemId) {
232
- EVENT._coordCache[_elemId] = null;
233
- }
234
- else {
235
- EVENT._coordCache = [];
236
- }
237
- },
238
-
239
- /** Registers the _ctrl object by event listener flags in _focusOptions.
240
- **/
241
- reg: function(_ctrl, _focusOptions) {
242
- var
243
- // Binds the class to the element (so it can be called on the event)
244
- _elemId = _ctrl.elemId,
245
- _elem = ELEM.get(_elemId),
246
- _this = EVENT,
247
- _propIn,
248
- _init = ( _this.listeners[_elemId] === undefined || _this.listeners[_elemId] === false );
249
- if (BROWSER_TYPE.ie && !BROWSER_TYPE.ie9) {
250
- _elem.setAttribute('ctrl', _ctrl);
251
- }
252
- else {
253
- _elem.ctrl = _ctrl;
254
- }
255
- if(_init){
256
- _this.listeners[_elemId] = true;
257
- _this.focused[_elemId] = false;
258
- }
259
- for (_propIn in _this._defaultFocusOptions) {
260
- if (_focusOptions[_propIn] === undefined) {
261
- _focusOptions[_propIn] = _defaultFocusOptions[_propIn];
262
- }
263
- }
264
- _this.focusOptions[_elemId] = _focusOptions;
265
- var _coordListenIdx = _this.coordListeners.indexOf(_elemId);
266
- if (_focusOptions.mouseMove) {
267
- if (_coordListenIdx === -1) {
268
- _this.coordListeners.push(_elemId);
269
- }
270
- }
271
- else if (_coordListenIdx !== -1) {
272
- _this.coordListeners.splice(_coordListenIdx, 1);
273
- }
274
- //console.log('focusOptions:',_focusOptions);
275
- //console.log('focusOptions.textEnter: ',_focusOptions.textEnter);
276
- if (_focusOptions.textEnter) {
277
- if (_this.textEnterCtrls.indexOf(_ctrl.viewId) === -1) {
278
- _this.textEnterCtrls.push(_ctrl.viewId);
279
- }
280
- }
281
- else {
282
- var _textEnterIndex = _this.textEnterCtrls.indexOf(_ctrl.viewId);
283
- if (_textEnterIndex !== -1) {
284
- _this.textEnterCtrls.splice(_textEnterIndex,1);
285
- }
286
- }
287
- if (_focusOptions.resize) {
288
- if (_this.resizeListeners.indexOf(_ctrl.viewId) === -1) {
289
- _this.resizeListeners.push(_ctrl.viewId);
290
- }
291
- }
292
- else {
293
- var _resizeIndex = _this.resizeListeners.indexOf(_ctrl.viewId);
294
- if (_resizeIndex !== -1) {
295
- _this.resizeListeners.splice(_resizeIndex,1);
296
- }
297
- }
298
- if(_init){
299
- Event.observe(_elem, 'mouseover', _this._mouseOver);
300
- }
301
- if(_ctrl.drawn){
302
- _this._updateHoverItems();
303
- if (_this.hovered.length !== 0 && _this.hovered.indexOf(_ctrl.elemId) === _this.hovered.length-1){
304
- _this.focus(_ctrl);
305
- }
306
- }
307
- },
308
-
309
- /** Unregisters the _ctrl object event listeners
310
- **/
311
- unreg: function(_ctrl) {
312
- var
313
- _this = EVENT,
314
- _elemId,
315
- _elem;
316
- if (_ctrl === this.activeControl) {
317
- _this.changeActiveControl(null);
318
- }
319
- _elemId = _ctrl.elemId;
320
- if (_this.focused[_elemId]){
321
- _this.blur(_ctrl);
322
- }
323
- _elem = ELEM.get(_elemId);
324
-
325
- _this._coordCache[_elemId] = null;
326
-
327
- _this.listeners[_elemId] = false;
328
- _this.focused[_elemId] = false;
329
- _this.focusOptions[_elemId] = { ctrl: _ctrl };
330
- var _coordListenIdx = _this.coordListeners.indexOf(_elemId);
331
- if (_coordListenIdx !== -1) {
332
- _this.coordListeners.splice(_coordListenIdx, 1);
333
- }
334
-
335
- var _textEnterIndex = _this.textEnterCtrls.indexOf(_ctrl.viewId);
336
- if (_textEnterIndex !== -1) {
337
- _this.textEnterCtrls.splice(_textEnterIndex, 1);
338
- }
339
- var _resizeIndex = _this.resizeListeners.indexOf(_ctrl.viewId);
340
- if (_resizeIndex !== -1) {
341
- _this.resizeListeners.splice(_resizeIndex, 1);
342
- }
343
- if (_elem !== undefined) {
344
- Event.stopObserving(_elem, 'mouseover', _this._mouseOver);
345
- Event.stopObserving(_elem, 'mouseout', _this._mouseOut);
346
- }
347
- },
348
-
349
- /** Receiver of the onResize event.
350
- * Delegates calls to the high-level event receivers of all
351
- * controls registered for the event.
352
- **/
353
- resize: function(e) {
354
- var
355
- i = 0,
356
- _this = EVENT,
357
- _ctrlID,
358
- _ctrl;
359
- HSystem._updateFlexibleRects();
360
- for (; i < _this.resizeListeners.length; i++) {
361
- _ctrlID = _this.resizeListeners[i];
362
- _ctrl = HSystem.views[_ctrlID];
363
- if (_ctrl['resize']) {
364
- _ctrl.resize();
365
- }
366
- if (_ctrl['onResize']) {
367
- _ctrl.onResize();
368
- }
369
- }
370
- HSystem._updateFlexibleRects();
371
- },
372
-
373
- /* Element-specific mouse over/out event receiver. */
374
- _mouseOver: function(e) {
375
- if (!Event.element) {
376
- return;
377
- }
378
- var _that = Event.element(e);
379
- while (_that && _that.ctrl === undefined) {
380
- _that = _that.parentNode;
381
- }
382
- if (!_that) {
383
- return;
384
- }
385
- var _this = _that.ctrl;
386
- EVENT.focus(_this);
387
- Event.stop(e);
388
- },
389
-
390
- /* Element-specific mouse over/out event receiver. */
391
- _mouseOut: function(e) {
392
- if (!Event.element) {
393
- return;
394
- }
395
- var _that = Event.element(e);
396
- while (_that && _that.ctrl === undefined) {
397
- _that = _that.parentNode;
398
- }
399
- if (!_that) {
400
- return;
401
- }
402
- var _this = _that.ctrl;
403
- EVENT.blur(_this);
404
- Event.stop(e);
405
- },
406
-
407
- /** Mid-level focus manager.
408
- * Gets called on the onMouseOver event.
409
- * Starts listening for onMouseOut to blur.
410
- * Delegates focus calls to the high-level event receivers of all
411
- * enabled controls registered.
412
- **/
413
- focus: function(_ctrl) {
414
- var _this = EVENT,
415
- _elemId = _ctrl.elemId,
416
- _elem = ELEM.get(_elemId);
417
- if (_this.focused[_elemId] === false ){ // && _this.dragItems.indexOf(_elemId) === -1) {
418
- Event.stopObserving(_elem, 'mouseover', _this._mouseOver);
419
- Event.observe(_elem, 'mouseout', _this._mouseOut);
420
- _this.focused[_elemId] = true;
421
- if (_ctrl['focus']) {
422
- _ctrl.focus();
423
- }
424
- }
425
- },
426
-
427
- /** Mid-level blur (focus lost) manager.
428
- * Gets called on the onMouseOut event.
429
- * Starts listening for onMouseOver to (re)focus.
430
- * Delegates blur calls to the high-level event receivers of all
431
- * enabled controls registered.
432
- **/
433
- blur: function(_ctrl) {
434
- var _this = EVENT,
435
- _elemId = _ctrl.elemId,
436
- _elem = ELEM.get(_elemId);
437
- if (_this.focused[_elemId] === true ){ // && _this.dragItems.indexOf(_elemId) === -1) {
438
- Event.stopObserving(_elem, 'mouseout', _this._mouseOut);
439
- Event.observe(_elem, 'mouseover', _this._mouseOver);
440
- _this.focused[_elemId] = false;
441
- if (_ctrl['blur']) {
442
- _ctrl.blur();
443
- }
444
- }
445
- },
446
-
447
- /** Mid-level mouse movement manager.
448
- * Gets called on the onMouseMove event.
449
- * Delegates the following calls to the high-level event receivers of all
450
- * enabled controls registered, depending on the events they registered:
451
- * - drag
452
- * - mouseMove
453
- * - endHover
454
- * - startHover
455
- *
456
- **/
457
- mouseMove: function(e) {
458
- var _this = EVENT,
459
- _scrollPos = ELEM.getScrollPosition(0),
460
- x = Event.pointerX(e) - _scrollPos[0],
461
- y = Event.pointerY(e) - _scrollPos[1],
462
- _currentlyDragging = _this.flushMouseMove(x, y);
463
- _this.status[_this.crsrX] = x;
464
- _this.status[_this.crsrY] = y;
465
- _this._modifiers(e);
466
- // might work
467
- if (_currentlyDragging) {
468
- Event.stop(e);
469
- }
470
- // Only prevent default action when we are dragging something.
471
- },
472
-
473
- /** Processes dragging calculations, triggered by mouseMove.
474
- **/
475
- flushMouseMove: function(x, y) {
476
- var _this = EVENT,
477
- _currentlyDragging = false,
478
- i = 0,
479
- j,
480
- _elemId,
481
- _ctrl;
482
-
483
- clearTimeout(_this._lastCoordFlushTimeout);
484
-
485
- // send drag event to all drag-interested ctrls
486
- for (; i < _this.dragItems.length; i++) {
487
- _elemId = _this.dragItems[i];
488
- _this.focusOptions[_elemId].ctrl.drag(x, y);
489
- _this.coordCacheFlush(_elemId);
490
- _currentlyDragging = true;
491
- }
492
- if(!_currentlyDragging){
493
- if (new Date().getTime() > _this.hoverTimer + _this.hoverInterval) {
494
- // sends mouseMove pseudo-events to ctrls interested
495
- for (i = 0; i < _this.coordListeners.length; i++) {
496
- _elemId = _this.coordListeners[i];
497
- _ctrl = _this.focusOptions[_elemId].ctrl;
498
- _ctrl.mouseMove(x, y);
499
- }
500
- _this.hoverTimer = new Date().getTime();
501
- }
502
- else {
503
- _this._lastCoordFlushTimeout = setTimeout(
504
- function(){
505
- EVENT.flushMouseMove(x,y);
506
- }, _this.hoverInterval
507
- );
508
- }
509
- return false;
510
- }
511
-
512
- if (_this.enableDroppableChecks) {
513
- // Check which items are under the mouse coordinates now.
514
- if (new Date().getTime() > _this.hoverTimer + _this.hoverInterval) {
515
- // sends mouseMove pseudo-events to ctrls interested
516
- for (i = 0; i < _this.coordListeners.length; i++) {
517
- _elemId = _this.coordListeners[i];
518
- _ctrl = _this.focusOptions[_elemId].ctrl;
519
- _ctrl.mouseMove(x, y);
520
- }
521
- if (_this.enableDroppableChecks) {
522
- _this._updateHoverItems();
523
- }
524
- // sends drag&drop pseudo-events
525
- var _wasTopmostDroppable;
526
- for (i = 0; i < _this.dragItems.length; i++) {
527
- // Find the current droppable while dragging.
528
- _wasTopmostDroppable = _this.topmostDroppable;
529
- _this.topmostDroppable = null;
530
- _elemId = _this.dragItems[i];
531
- _ctrl = _this.focusOptions[_elemId].ctrl;
532
-
533
- // Check for a drop target from the currently hovered items
534
- var _hoverIndex,
535
- _dropCtrl;
536
- for (j = 0; j !== _this.hovered.length; j++) {
537
- _hoverIndex = _this.hovered[j];
538
- if (_hoverIndex !== _elemId && _this.focusOptions[_hoverIndex].ctrl) {
539
- _dropCtrl = _this.focusOptions[_hoverIndex].ctrl;
540
- if (
541
- // First time
542
- !_this.topmostDroppable ||
543
- // Z beaten
544
- _dropCtrl.zIndex() > _this.topmostDroppable.zIndex() ||
545
- // subview
546
- _dropCtrl.parent === _this.topmostDroppable
547
- ) {
548
- if (_this.focusOptions[_dropCtrl.elemId].droppable) {
549
- _this.topmostDroppable = _dropCtrl;
550
- // Finally, the item must accept drop events.
551
- }
552
- }
553
- }
554
- }
555
-
556
- // Topmost item has changed, send startHover or endHover to the droppable.
557
- if (_wasTopmostDroppable !== _this.topmostDroppable) {
558
- if (_wasTopmostDroppable) {
559
- _wasTopmostDroppable.endHover(_ctrl);
560
- }
561
- if (_this.topmostDroppable) {
562
- _this.topmostDroppable.startHover(_ctrl);
563
- }
564
- }
565
- }
566
- _this.hoverTimer = new Date().getTime();
567
- }
568
- else {
569
- _this._lastCoordFlushTimeout = setTimeout(
570
- function(){
571
- EVENT.flushMouseMove(x,y);
572
- }, _this.hoverInterval
573
- );
574
- }
575
- }
576
- return true;
577
- },
578
-
579
- // Loops through all registered items and store indices of elements
580
- // that are currenly under the mouse cursor in .hovered array. Uses
581
- // cached position and dimensions value when possible.
582
- _updateHoverItems: function() {
583
- var _this = EVENT,
584
- x = _this.status[_this.crsrX],
585
- y = _this.status[_this.crsrY],
586
- i = 0,
587
- _ctrl,
588
- _elem,
589
- _rect,
590
- _pos,
591
- _size,
592
- _coords,
593
- _hovered = [];
594
- for (; i < _this.listeners.length; i++) {
595
- if (!_this.listeners[i] || !_this.focusOptions[i].ctrl) {
596
- continue;
597
- }
598
- _ctrl = _this.focusOptions[i].ctrl;
599
- if(_ctrl.drawn){
600
- if(ELEM.getStyle(i,'visibility',true) === 'hidden'){
601
- continue;
602
- }
603
- _elem = ELEM.get(i);
604
- if (!_this._coordCacheFlag || !_this._coordCache[i]) {
605
- _rect = _ctrl.rect;
606
- _pos = [_ctrl.pageX(),_ctrl.pageY()];
607
- _size = [_rect.width,_rect.height];
608
- _this._coordCache[i] = [_pos[0], _pos[1], _size[0], _size[1]];
609
- }
610
- _coords = _this._coordCache[i];
611
-
612
- // Is the mouse pointer inside the element's rectangle?
613
- if (x >= _coords[0] && x <= _coords[0] + _coords[2] && y >= _coords[1] && y <= _coords[1] + _coords[3]) {
614
- _hovered.push(i);
615
- }
616
- }
617
- }
618
- _this.hovered = _hovered;
619
- },
620
-
621
- /** = Description
622
- * Starts dragging the control given.
623
- *
624
- * Call this method to start dragging another component.
625
- *
626
- * = Parameters
627
- * +_ctrl+:: An object that uses the HControl API, becomes new drag target.
628
- *
629
- **/
630
- startDragging: function(_ctrl, _isLeftButton) {
631
- // console.log('startDragging');
632
- var _this = EVENT;
633
- _this.dragItems = [_ctrl.elemId];
634
- _this.focus(_ctrl);
635
- _this.changeActiveControl(_ctrl);
636
- _ctrl.startDrag( _this.status[_this.crsrX], _this.status[_this.crsrY], _isLeftButton );
637
- },
638
-
639
- /** Mid-level mouse button press manager.
640
- * Gets called on the onMouseDown event.
641
- * Delegates the following calls to the high-level event receivers of all
642
- * enabled controls registered, depending on the events they registered:
643
- * - mouseDown
644
- * - startDrag
645
- *
646
- **/
647
- mouseDown: function(e, _isLeftButton) {
648
- // console.log('mouseDown');
649
- var
650
- _this = EVENT,
651
- _didStartDrag = false,
652
- x = _this.status[_this.crsrX],
653
- y = _this.status[_this.crsrY],
654
- i = 0,
655
-
656
- // Unset the active control when clicking on anything.
657
- _newActiveControl = null,
658
-
659
- // The startDrag and mouseDown event receivers are first collected into
660
- // these arrays and the events are sent after the active control status has
661
- // been changed.
662
- _startDragElementIds = [],
663
- _mouseDownElementIds = [];
664
-
665
- _this._modifiers(e);
666
- if (_isLeftButton === undefined) {
667
- _isLeftButton = Event.isLeftClick(e);
668
- }
669
- if (_isLeftButton) {
670
- _this.status[_this.button1] = true;
671
- }
672
- else {
673
- _this.status[_this.button2] = true;
674
- }
675
-
676
- for (; i < _this.focused.length; i++) {
677
- if (_this.focused[i] === true) {
678
- // Set the active control to the currently focused item.
679
- if (_this.focusOptions[i].ctrl.enabled) {
680
- _newActiveControl = _this.focusOptions[i].ctrl;
681
- }
682
- if ((_this.focusOptions[i].draggable === true) && _this.dragItems.indexOf(i) === -1) {
683
- _startDragElementIds.push(i);
684
- }
685
- if (_this.focusOptions[i].mouseDown === true) {
686
- _mouseDownElementIds.push(i);
687
- }
688
- }
689
- }
690
- // Handle the active control selection.
691
- if (_newActiveControl) {
692
- _this.changeActiveControl(_newActiveControl);
693
- }
694
- // Call the mouseDown and startDrag events after the active control change has been handled.
695
- for (i = 0; i < _startDragElementIds.length; i++) {
696
- _this.dragItems.push(_startDragElementIds[i]);
697
- _this.focusOptions[_startDragElementIds[i]].ctrl.startDrag(x, y, _isLeftButton);
698
- _didStartDrag = true;
699
- }
700
-
701
- var _stopEvent = _mouseDownElementIds.length;
702
- for (i = 0; i < _mouseDownElementIds.length; i++) {
703
- if (_this.focusOptions[_mouseDownElementIds[i]].ctrl.mouseDown(x, y, _isLeftButton)) {
704
- _stopEvent--;
705
- }
706
- }
707
- if (_didStartDrag) {
708
- // Remove possible selections.
709
- document.body.focus();
710
- // Prevent text selection in MSIE when dragging starts.
711
- _this._storedOnSelectStart = document.onselectstart;
712
- document.onselectstart = function() {
713
- return false;
714
- };
715
- Event.stop(e);
716
- }
717
- // Stop the event only when we are hovering over some control, allows normal DOM events to co-exist.
718
- if (_this.enableDroppableChecks) {
719
- // console.log('stopEvent:',_stopEvent,', hoverlen:',(_this.hovered.length !== 0),', newActive:',_newActiveControl);
720
- if ( (_mouseDownElementIds.length !== 0) && (_stopEvent === 0) && (_this.hovered.length !== 0) && _newActiveControl) {
721
- Event.stop(e);
722
- }
723
- }
724
- // else {
725
- // console.log('not enableDroppableChecks');
726
- // }
727
- return true;
728
- },
729
-
730
- /** Mid-level mouse click manager.
731
- * Gets called on the onClick event.
732
- * Delegates click calls to the high-level event receivers of all
733
- * controls registered for that event.
734
- *
735
- **/
736
- click: function(e, _isLeftButton) {
737
- // if( new Date().getTime() - EVENT.lastMouseUp < 10 ){
738
- // console.log('should prevent click?');
739
- // // return false; // prevent click and mousedown coexistence
740
- // }
741
- // else{
742
- // console.log('click');
743
- // }
744
- var _this = EVENT,
745
- x = _this.status[_this.crsrX],
746
- y = _this.status[_this.crsrY],
747
- i = 0,
748
- // Unset the active control when clicking on anything.
749
- _newActiveControl = null,
750
- // The startDrag and mouseDown event receivers are first collected into
751
- // these arrays and the events are sent after the active control status has
752
- // been changed.
753
- _clickElementIds = [];
754
- _this._modifiers(e);
755
- if (_isLeftButton === undefined) {
756
- _isLeftButton = Event.isLeftClick(e);
757
- }
758
- if (BROWSER_TYPE.ie && !BROWSER_TYPE.ie9) {
759
- _isLeftButton = true; // IE only supports click on left button
760
- }
761
- // Prevent right-click event from triggering click.
762
- // Only firefox seems to fire the click-event with the
763
- // right mouse button, so this prevents it from happening
764
- // in the name of uniform behavior.
765
- if(!_isLeftButton){
766
- return true;
767
- }
768
- var _fCount = 0;
769
- for (; i < _this.focused.length; i++) {
770
- if (_this.focused[i] === true) {
771
- _fCount+=1;
772
- // Set the active control to the currently focused item.
773
-
774
- if (_this.focusOptions[i].ctrl.enabled) {
775
- _newActiveControl = _this.focusOptions[i].ctrl;
776
- }
777
- if(_this.traceFocused){
778
- _newActiveControl.setStyle('border','2px solid #FF00FF');
779
- }
780
- if (_this.focusOptions[i].click === true) {
781
- _clickElementIds.push(i);
782
- }
783
- }
784
- }
785
- console.log('focused length:',_fCount);
786
- // Handle the active control selection.
787
- if (_newActiveControl) {
788
- // console.log('click new active control');
789
- _this.changeActiveControl(_newActiveControl);
790
- }
791
- var _stopEvent = _clickElementIds.length;
792
- for (i = 0; i < _clickElementIds.length; i++) {
793
- if (_this.focusOptions[_clickElementIds[i]].ctrl.click(x, y, _isLeftButton)) {
794
- _stopEvent--;
795
- }
796
- }
797
- if( _stopEvent === 0 ){
798
- Event.stop(e);
799
- }
800
- return true;
801
- },
802
-
803
- focusTrace: false,
804
- prevActiveCtrl: null,
805
-
806
- /** Changes active ctrl.
807
- * The previous active ctrl gets the _lostActiveStatus pseudo-event,
808
- * The new active ctrl gets the _gainedActiveStatus pseudo-event
809
- **/
810
- changeActiveControl: function(_ctrl) {
811
- var
812
- _this = EVENT,
813
- _disAllowLose = true,
814
- // Store the currently active control so we can inform it,
815
- // if it's no longer the active control.
816
- _prevActiveCtrl = _this.activeControl;
817
- // Did the active control change?
818
- if (_ctrl && (_ctrl !== _prevActiveCtrl) && (_ctrl._gainedActiveStatus || (_prevActiveCtrl && _prevActiveCtrl._lostActiveStatus))) {
819
- if (_prevActiveCtrl && _prevActiveCtrl._lostActiveStatus) {
820
- // Previously active control just lost the active status.
821
- if( _prevActiveCtrl ){
822
- _disAllowLose = _prevActiveCtrl._lostActiveStatus(_ctrl) === false;
823
- if( _disAllowLose ){
824
- // console.log('disallow losing focus: ',_prevActiveCtrl.componentName,' -> ',_ctrl.componentName);
825
- return;
826
- }
827
- // else{
828
- // console.log('allow losing focus: ',_prevActiveCtrl.componentName,' -> ',_ctrl.componentName);
829
- // }
830
- _this.blur(_prevActiveCtrl);
831
- _this.focus(_ctrl);
832
- _prevActiveCtrl.active = false;
833
- if(_this.focusTrace){
834
- _prevActiveCtrl.setStyle('border','2px solid green');
835
- if( _this.prevActiveCtrl ){
836
- _this.prevActiveCtrl.setStyle('border','2px solid blue');
837
- }
838
- }
839
- }
840
- _this.prevActiveCtrl = _prevActiveCtrl;
841
- }
842
- if (_ctrl && _ctrl._gainedActiveStatus) {
843
- // A new control gained the active status.
844
- _ctrl.active = true;
845
- _this.activeControl = _ctrl;
846
- _ctrl._gainedActiveStatus(_prevActiveCtrl);
847
- if(_this.focusTrace){
848
- _ctrl.setStyle('border','2px solid red');
849
- }
850
- }
851
- else {
852
- _this.activeControl = null;
853
- }
854
- }
855
-
856
- },
857
-
858
-
859
- /** Mid-level mouse button release manager.
860
- * Gets called on the onMouseUp event.
861
- * Delegates the following calls to the high-level event receivers of all
862
- * enabled controls registered, depending on the events they registered:
863
- * - mouseUp
864
- * - endHover
865
- * - drop
866
- * - endDrag
867
- *
868
- **/
869
- // lastMouseUp: 0,
870
- mouseUp: function(e) {
871
- // console.log('mouseUp',EVENT.dragItems.length);
872
- // EVENT.lastMouseUp = new Date().getTime();
873
- var
874
- _this = EVENT,
875
- _didEndDrag = false,
876
- _isLeftButton = Event.isLeftClick(e),
877
- x = _this.status[_this.crsrX],
878
- y = _this.status[_this.crsrY],
879
- _elemId,
880
- _ctrl,
881
- i = 0;
882
- _this._modifiers(e);
883
- // Send endDrag for the currently dragged items even when they don't have focus, and clear the drag item array.
884
- for (; i < _this.dragItems.length; i++) {
885
- _elemId = _this.dragItems[i];
886
- _ctrl = _this.focusOptions[_elemId].ctrl;
887
- _ctrl.endDrag(x, y, _isLeftButton);
888
- _didEndDrag = true;
889
- // If the mouse slipped off the dragged item before the mouse button was released, blur the item manually
890
- if (_this.enableDroppableChecks) {
891
- _this._updateHoverItems();
892
- if (_this.hovered.indexOf(_elemId) === -1) {
893
- _this.blur(_ctrl);
894
- }
895
- }
896
- // If there is a drop target in the currently hovered items, send drop to it.
897
- if (_this.topmostDroppable) {
898
- // Droppable found at the release point.
899
- _this.topmostDroppable.endHover(_ctrl);
900
- _this.topmostDroppable.drop(_ctrl);
901
- _this.topmostDroppable = null;
902
- }
903
- }
904
- _this.dragItems = [];
905
- // Restore MSIE's ability to select text after dragging has ended.
906
- if (_didEndDrag) {
907
- document.onselectstart = _this._storedOnSelectStart;
908
- }
909
- // Check for mouseUp listeners.
910
- for (i = 0; i < _this.focused.length; i++) {
911
- if (_this.focused[i] === true) {
912
- _ctrl = _this.focusOptions[i].ctrl;
913
- if (_this.focusOptions[i].mouseUp === true) {
914
- if( _ctrl.mouseUp(x, y, _isLeftButton) ){
915
- // Event.stop(e);
916
- }
917
- }
918
- }
919
- }
920
- if(_isLeftButton){
921
- _this.status[_this.button1] = false;
922
- }
923
- else {
924
- _this.status[_this.button2] = false;
925
- }
926
- return true;
927
- },
928
-
929
- /** Mid-level double-click manager.
930
- * Gets called on the onDoubleClick event.
931
- * Delegates the following call to the high-level event receivers of all
932
- * enabled controls registered, depending on the events they registered:
933
- * - doubleClick
934
- *
935
- **/
936
- doubleClick: function(e) {
937
- var _this = EVENT,
938
- x = _this.status[_this.crsrX],
939
- y = _this.status[_this.crsrY],
940
- _elemId,
941
- _ctrl,
942
- i = 0;
943
- _this._modifiers(e);
944
- // Check for doubleClick listeners.
945
- for (i = 0; i < _this.focused.length; i++) {
946
- if (_this.focused[i] === true) {
947
- if (_this.focusOptions[i].doubleClick === true) {
948
- if ( _this.focusOptions[i].ctrl.doubleClick(x, y, true) ){
949
- Event.stop(e);
950
- }
951
- }
952
- }
953
- }
954
- return true;
955
- },
956
-
957
-
958
- /** Mid-level mouse scroll wheel event manager.
959
- * Delegates mouseWheel calls to the high-level event receivers of all
960
- * controls registered for that event.
961
- **/
962
- mouseWheel: function(e) {
963
- var _this = EVENT,
964
- _delta = 0,
965
- i = 0;
966
- if (!e) {
967
- e = window.event;
968
- }
969
- if (e.wheelDelta) {
970
- _delta = 0 - (e.wheelDelta / 120);
971
- }
972
- else if (e.detail) {
973
- _delta = 0 - (e.detail / 3);
974
- }
975
- if (BROWSER_TYPE.opera || BROWSER_TYPE.safari || BROWSER_TYPE.ie) {
976
- _delta = 0 - _delta;
977
- }
978
- for (; i < _this.focused.length; i++) {
979
- if (_this.focused[i] === true) {
980
- if (_this.focusOptions[i].mouseWheel === true) {
981
- Event.stop(e);
982
- _this.focusOptions[i].ctrl.mouseWheel(_delta);
983
- }
984
- }
985
- }
986
- },
987
-
988
- /** Mid-level context menu manager.
989
- * Gets called on the onContextMenu event.
990
- * Delegates the following call to the high-level event receivers of all
991
- * enabled controls registered, depending on the events they registered:
992
- * - contextMenu
993
- *
994
- * Just make a component return true to allow the browser's default action.
995
- *
996
- **/
997
- contextMenu: function(e) {
998
- var _this = EVENT,
999
- x = _this.status[_this.crsrX],
1000
- y = _this.status[_this.crsrY],
1001
- _preventDefault = true,
1002
- _elemId,
1003
- _ctrl,
1004
- i = 0;
1005
- _this._modifiers(e);
1006
- // Check for contextMenu listeners.
1007
- for (i = 0; i < _this.focused.length; i++) {
1008
- if (_this.focused[i] === true) {
1009
- if (_this.focusOptions[i].contextMenu === true) {
1010
- if( _this.focusOptions[i].ctrl.contextMenu() ){
1011
- _preventDefault = false;
1012
- }
1013
- }
1014
- }
1015
- }
1016
- if( _preventDefault ){
1017
- Event.stop( e );
1018
- }
1019
- return true;
1020
- },
1021
-
1022
-
1023
- /** Mid-level key press manager.
1024
- * Gets called on the onKeyDown event.
1025
- * Delegates keyDown calls to the high-level event receivers of all
1026
- * controls registered for that event.
1027
- **/
1028
- keyDown: function(e) {
1029
- var
1030
- _this = EVENT,
1031
- _keyCode = _this.translateKeyCodes(e.keyCode),
1032
- _keyDownStateForActiveControl = _this.activeControl?(_this.focusOptions[_this.activeControl.elemId]?_this.focusOptions[_this.activeControl.elemId].keyDown:false):false,
1033
- _repeat = (_keyDownStateForActiveControl === 'repeat'),
1034
- _stopEvent = false;
1035
- _this._modifiers(e);
1036
- _this._lastKeyPressTime = new Date().getTime();
1037
- if(!_this.status[_this.cmdKeyDown] && _this._detectCmdKey(_keyCode)){
1038
- _this.status[_this.cmdKeyDown] = true;
1039
- }
1040
- if (_this.activeControl && _keyDownStateForActiveControl) {
1041
- if ((_this._lastKeyDown !== _keyCode) || _repeat) {
1042
- if(_this.activeControl.keyDown(_keyCode)){
1043
- _stopEvent = true;
1044
- }
1045
- }
1046
- }
1047
- // Insert key to the realtime array, remove in keyUp
1048
- if(!_this.isKeyDown(_keyCode)) {
1049
- _this.status[_this.keysDown].push(_keyCode);
1050
- }
1051
- if (!_this.status[_this.cmdKeyDown] && _stopEvent){
1052
- Event.stop(e);
1053
- }
1054
- _this._lastKeyDown = _keyCode;
1055
- },
1056
-
1057
-
1058
- /** Mid-level key release manager.
1059
- * Gets called on the onKeyUp event.
1060
- * Delegates keyUp calls to the high-level event receivers of all
1061
- * controls registered for that event.
1062
- * Also delegates the textEnter calls to all controls
1063
- * registered for that event.
1064
- **/
1065
- keyUp: function(e) {
1066
- var
1067
- _this = EVENT,
1068
- _keyCode = _this.translateKeyCodes(e.keyCode),
1069
- _keyCodeIndex,
1070
- i = 0,
1071
- _stopEvent = false,
1072
- _ctrlId,
1073
- _ctrl;
1074
- _this._modifiers(e);
1075
- _this._lastKeyDown = null;
1076
- if (_this.activeControl && _this.activeControl.elemId && _this.focusOptions[_this.activeControl.elemId].keyUp === true) {
1077
- if(_this.activeControl.keyUp(_keyCode)){
1078
- _stopEvent = true;
1079
- }
1080
- }
1081
- for (; i < _this.textEnterCtrls.length; i++) {
1082
- _ctrlId = _this.textEnterCtrls[i];
1083
- _ctrl = HSystem.views[_ctrlId];
1084
- if (_ctrl.textEnter) {
1085
- if(_ctrl.textEnter()){
1086
- _stopEvent = true;
1087
- }
1088
- }
1089
- }
1090
- if (!_this.status[_this.cmdKeyDown] && _stopEvent){
1091
- Event.stop(e);
1092
- }
1093
- if(_this.status[_this.cmdKeyDown] && _this._detectCmdKey(_keyCode)){
1094
- _this.status[_this.cmdKeyDown] = false;
1095
- }
1096
- // Remove the key from the realtime array, inserted in keyDown
1097
- if(_this.isKeyDown(_keyCode)){
1098
- _keyCodeIndex = _this.status[_this.keysDown].indexOf(_keyCode);
1099
- _this.status[_this.keysDown].splice(_keyCodeIndex, 1);
1100
- }
1101
- },
1102
-
1103
- isKeyDown: function(_keyCode){
1104
- return ( this.status[this.keysDown].indexOf(_keyCode) !== -1 );
1105
- },
1106
-
1107
- isKeyUp: function(_keyCode){
1108
- return !this.isKeyDown(_keyCode);
1109
- },
1110
-
1111
- isAltKeyDown: function(){
1112
- return this.status[this.altKeyDown];
1113
- },
1114
-
1115
- isCtrlKeyDown: function(){
1116
- return this.status[this.ctrlKeyDown];
1117
- },
1118
-
1119
- isShiftKeyDown: function(){
1120
- return this.status[this.shiftKeyDown];
1121
- },
1122
-
1123
- isMetaKeyDown: function(){
1124
- return this.status[this.metaKeyDown];
1125
- },
1126
-
1127
- /* The keyPress itself is ignored per se and used only as a repetition event for the last keyDown. */
1128
- keyPress: function(e) {
1129
- var
1130
- _this = EVENT,
1131
- _timeNow = new Date().getTime();
1132
- _this._modifiers(e);
1133
- // Prevent non-repeat behaviour by waiting at least 100ms before repeating
1134
- if(_this._lastKeyPressTime > (_timeNow-100)){
1135
- return;
1136
- }
1137
- if(_this._lastKeyDown !== null){
1138
- var
1139
- _keyCode = _this.translateKeyCodes(_this._lastKeyDown),
1140
- _keyDownStateForActiveControl = _this.activeControl?(_this.focusOptions[_this.activeControl.elemId]?_this.focusOptions[_this.activeControl.elemId].keyDown:false):false,
1141
- _repeat = (_keyDownStateForActiveControl === 'repeat'),
1142
- _stopEvent = false;
1143
- if (_this.activeControl && _keyDownStateForActiveControl && _repeat) {
1144
- if(_this.activeControl.keyDown(_keyCode)){
1145
- _stopEvent = true;
1146
- }
1147
- }
1148
- if(_stopEvent){
1149
- Event.stop(e);
1150
- }
1151
- }
1152
- },
1153
-
1154
-
1155
- // Normalization map of keyCodes for Opera specifically
1156
- _operaKeyCodeTranslations: {
1157
-
1158
- // Symbol keys:
1159
- 59: 186, // [;:]
1160
- 61: 187, // [=+]
1161
- 44: 188, // [,<]
1162
- 45: 189, // [-_]
1163
- 46: 190, // [.>]
1164
- 47: 191, // [/?]
1165
- 96: 192, // [`~]
1166
- 91: 219, // [[{]
1167
- 92: 220, // [\|]
1168
- 93: 221, // []}]
1169
- 39: 222, // ['"]
1170
-
1171
- // Numeric keypad keys can't be mapped on Opera, because Opera
1172
- // doesn't differentiate between the keys on the numeric keypad
1173
- // versus the functionally same keys elsewhere on the keyboard.
1174
-
1175
- // Branded keys:
1176
- // Apple Command keys are same as ctrl, but ctrl is 0; Can't be re-mapped reliably.
1177
- // The Windows Menu key also return 0, so it can't be re-mapped either.
1178
- 219: 91, // Left Windows key (Start)
1179
- 220: 92 // Right Windows key (Start)
1180
- },
1181
-
1182
- // Normalization map of keyCodes for Gecko (Mozilla) browsers specifically
1183
- _mozillaKeyCodeTranslations: {
1184
-
1185
- // Symbol keys:
1186
- 59: 186, // [;:]
1187
- 61: 187, // [=+]
1188
- 109: 189, // [-_]
1189
-
1190
- // Branded keys:
1191
- 224: 91 // Apple Command key to left windows key mapping
1192
-
1193
- },
1194
-
1195
- /** Translates keyCodes to the normalized pseudo-ascii used by IE and WebKit browsers.
1196
- * Opera and Mozilla browsers use different codes, so they'll need translations.
1197
- **/
1198
- translateKeyCodes: function(_keyCode){
1199
- var
1200
- _this = EVENT,
1201
- _transCode;
1202
-
1203
- // We use the WebKit and IE browsers as the normalization base, because
1204
- // there is no variance between in these. Returns the keyCode as-is for
1205
- // browsers in this category.
1206
- if(BROWSER_TYPE.safari || BROWSER_TYPE.ie){
1207
- return _keyCode;
1208
- }
1209
- // Opera has its own keyCodes, which are different from all others.
1210
- else if(BROWSER_TYPE.opera){
1211
- _transCode = _this._operaKeyCodeTranslations[_keyCode];
1212
- }
1213
- // The assumption is that the other browsers do what mozille does.
1214
- else {
1215
- _transCode = _this._mozillaKeyCodeTranslations[_keyCode];
1216
- }
1217
- if(_transCode === undefined || _transCode === null){
1218
- return _keyCode;
1219
- }
1220
- // else {
1221
- // console.log('key map from:',_keyCode,' to:',_transCode);
1222
- // }
1223
- return _transCode;
1224
- },
1225
-
1226
- _cmdKeys: [
1227
- 17, // Ctrl
1228
- 91, // Others (Left Start Key or Left Command Key)
1229
- 92, // Others (Right Start Key)
1230
- 93 // Others (Menu Key or Right Command Key)
1231
- ],
1232
- _detectCmdKey: function( _keyCode ) {
1233
-
1234
- // On Opera, return true on any of the keycodes
1235
- if(BROWSER_TYPE.opera){
1236
- return (EVENT._cmdKeys.indexOf(_keyCode) !== -1);
1237
- }
1238
- // Any mac browser (except opera, above) uses left or right windows key
1239
- // equivalent as the Command key.
1240
- else if(BROWSER_TYPE.mac){
1241
- return ((_keyCode === 91) || (_keyCode === 93));
1242
- }
1243
- // Other platforms use CTRL as the command key.
1244
- else {
1245
- return (_keyCode === 17);
1246
- }
1247
- },
1248
-
1249
- /* Handle the event modifiers. */
1250
- _modifiers: function(e) {
1251
- var _this = EVENT;
1252
- _this.status[_this.altKeyDown] = e.altKey;
1253
- _this.status[_this.ctrlKeyDown] = e.ctrlKey;
1254
- _this.status[_this.shiftKeyDown] = e.shiftKey;
1255
- _this.status[_this.metaKeyDown] = e.metaKey;
1256
- }
1257
-
1258
- };
1259
-
1260
- var//RSence.Foundation
1261
- EventManager = EVENT;
1262
-
1263
-
1264
- /** Starts the only instance
1265
- */
1266
- LOAD(
1267
- function() {
1268
- EVENT.start();
1269
- }
1270
- );