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.
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.
17 tvcm.exportTo('tvcm.ui', function() {
21 * @param {HTMLElement} targetElement will recv events 'mouse-tracker-start',
22 * 'mouse-tracker-move', 'mouse-tracker-end'.
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);
29 this.targetElement = opt_targetElement;
32 MouseTracker.prototype = {
35 return this.targetElement_;
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_);
46 onMouseDown_: function(e) {
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';
61 onMouseMove_: function(e) {
62 e = this.remakeEvent_(e, 'mouse-tracker-move');
63 this.targetElement_.dispatchEvent(e);
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);
76 remakeEvent_: function(e, newType) {
77 var remade = new tvcm.Event(newType, true, true);
80 remade.offsetX = e.offsetX;
81 remade.offsetY = e.offsetY;
82 remade.clientX = e.clientX;
83 remade.clientY = e.clientY;
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);
96 document.addEventListener('mousemove', mouseMoveHandler);
97 document.addEventListener('mouseup', cleanupAndDispatchToMouseUp);
101 MouseTracker: MouseTracker,
102 trackMouseMovesUntilMouseUp: trackMouseMovesUntilMouseUp