Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / third_party / tvcm / src / tvcm / ui / mouse_tracker.js
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 'use strict';
6
7 /**
8  * @fileoverview A Mouse-event abtraction that waits for
9  *   mousedown, then watches for subsequent mousemove events
10  *   until the next mouseup event, then waits again.
11  *   State changes are signaled with
12  *      'mouse-tracker-start' : mousedown and tracking
13  *      'mouse-tracker-move' : mouse move
14  *      'mouse-tracker-end' : mouseup and not tracking.
15  */
16
17 tvcm.exportTo('tvcm.ui', function() {
18
19   /**
20    * @constructor
21    * @param {HTMLElement} targetElement will recv events 'mouse-tracker-start',
22    *     'mouse-tracker-move', 'mouse-tracker-end'.
23    */
24   function MouseTracker(opt_targetElement) {
25     this.onMouseDown_ = this.onMouseDown_.bind(this);
26     this.onMouseMove_ = this.onMouseMove_.bind(this);
27     this.onMouseUp_ = this.onMouseUp_.bind(this);
28
29     this.targetElement = opt_targetElement;
30   }
31
32   MouseTracker.prototype = {
33
34     get targetElement() {
35       return this.targetElement_;
36     },
37
38     set targetElement(targetElement) {
39       if (this.targetElement_)
40         this.targetElement_.removeEventListener('mousedown', this.onMouseDown_);
41       this.targetElement_ = targetElement;
42       if (this.targetElement_)
43         this.targetElement_.addEventListener('mousedown', this.onMouseDown_);
44     },
45
46     onMouseDown_: function(e) {
47       if (e.button !== 0)
48         return true;
49
50       e = this.remakeEvent_(e, 'mouse-tracker-start');
51       this.targetElement_.dispatchEvent(e);
52       document.addEventListener('mousemove', this.onMouseMove_);
53       document.addEventListener('mouseup', this.onMouseUp_);
54       this.targetElement_.addEventListener('blur', this.onMouseUp_);
55       this.savePreviousUserSelect_ = document.body.style['-webkit-user-select'];
56       document.body.style['-webkit-user-select'] = 'none';
57       e.preventDefault();
58       return true;
59     },
60
61     onMouseMove_: function(e) {
62       e = this.remakeEvent_(e, 'mouse-tracker-move');
63       this.targetElement_.dispatchEvent(e);
64     },
65
66     onMouseUp_: function(e) {
67       document.removeEventListener('mousemove', this.onMouseMove_);
68       document.removeEventListener('mouseup', this.onMouseUp_);
69       this.targetElement_.removeEventListener('blur', this.onMouseUp_);
70       document.body.style['-webkit-user-select'] =
71           this.savePreviousUserSelect_;
72       e = this.remakeEvent_(e, 'mouse-tracker-end');
73       this.targetElement_.dispatchEvent(e);
74     },
75
76     remakeEvent_: function(e, newType) {
77       var remade = new tvcm.Event(newType, true, true);
78       remade.x = e.x;
79       remade.y = e.y;
80       remade.offsetX = e.offsetX;
81       remade.offsetY = e.offsetY;
82       remade.clientX = e.clientX;
83       remade.clientY = e.clientY;
84       return remade;
85     }
86
87   };
88
89   function trackMouseMovesUntilMouseUp(mouseMoveHandler, opt_mouseUpHandler) {
90     function cleanupAndDispatchToMouseUp(e) {
91       document.removeEventListener('mousemove', mouseMoveHandler);
92       document.removeEventListener('mouseup', cleanupAndDispatchToMouseUp);
93       if (opt_mouseUpHandler)
94         opt_mouseUpHandler(e);
95     }
96     document.addEventListener('mousemove', mouseMoveHandler);
97     document.addEventListener('mouseup', cleanupAndDispatchToMouseUp);
98   }
99
100   return {
101     MouseTracker: MouseTracker,
102     trackMouseMovesUntilMouseUp: trackMouseMovesUntilMouseUp
103   };
104 });