Index: third_party/google_input_tools/src/chrome/os/inputview/handler/pointerhandler.js |
diff --git a/third_party/google_input_tools/src/chrome/os/inputview/handler/pointerhandler.js b/third_party/google_input_tools/src/chrome/os/inputview/handler/pointerhandler.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e7be7132d0f099562139448882e6cd17d80632b |
--- /dev/null |
+++ b/third_party/google_input_tools/src/chrome/os/inputview/handler/pointerhandler.js |
@@ -0,0 +1,184 @@ |
+// Copyright 2014 The ChromeOS IME Authors. All Rights Reserved. |
+// limitations under the License. |
+// See the License for the specific language governing permissions and |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// distributed under the License is distributed on an "AS-IS" BASIS, |
+// Unless required by applicable law or agreed to in writing, software |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// You may obtain a copy of the License at |
+// you may not use this file except in compliance with the License. |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// |
+goog.provide('i18n.input.chrome.inputview.handler.PointerHandler'); |
+ |
+goog.require('goog.Timer'); |
+goog.require('goog.events.EventHandler'); |
+goog.require('goog.events.EventTarget'); |
+goog.require('goog.events.EventType'); |
+goog.require('goog.math.Coordinate'); |
+goog.require('i18n.input.chrome.inputview.handler.PointerActionBundle'); |
+ |
+goog.scope(function() { |
+ |
+ |
+ |
+/** |
+ * The pointer controller. |
+ * |
+ * @param {!Element=} opt_target . |
+ * @constructor |
+ * @extends {goog.events.EventTarget} |
+ */ |
+i18n.input.chrome.inputview.handler.PointerHandler = function(opt_target) { |
+ goog.base(this); |
+ |
+ /** |
+ * The pointer handlers. |
+ * |
+ * @type {!Object.<number, !i18n.input.chrome.inputview.handler.PointerActionBundle>} |
+ * @private |
+ */ |
+ this.pointerActionBundles_ = {}; |
+ |
+ /** |
+ * The event handler. |
+ * |
+ * @type {!goog.events.EventHandler} |
+ * @private |
+ */ |
+ this.eventHandler_ = new goog.events.EventHandler(this); |
+ |
+ var target = opt_target || document; |
+ this.eventHandler_. |
+ listen(target, [goog.events.EventType.MOUSEDOWN, |
+ goog.events.EventType.TOUCHSTART], this.onPointerDown_, true). |
+ listen(target, [goog.events.EventType.MOUSEUP, |
+ goog.events.EventType.TOUCHEND], this.onPointerUp_, true). |
+ listen(target, goog.events.EventType.TOUCHMOVE, this.onTouchMove_, |
+ true); |
+}; |
+goog.inherits(i18n.input.chrome.inputview.handler.PointerHandler, |
+ goog.events.EventTarget); |
+var PointerHandler = i18n.input.chrome.inputview.handler.PointerHandler; |
+ |
+ |
+/** |
+ * The canvas class name. |
+ * @const {string} |
+ * @private |
+ */ |
+PointerHandler.CANVAS_CLASS_NAME_ = 'ita-hwt-canvas'; |
+ |
+ |
+/** |
+ * Mouse down tick, which is for delayed pointer up for tap action on touchpad. |
+ * |
+ * @private {Date} |
+ */ |
+PointerHandler.prototype.mouseDownTick_ = null; |
+ |
+ |
+/** |
+ * Event handler for previous mousedown or touchstart target. |
+ * |
+ * @private {i18n.input.chrome.inputview.handler.PointerActionBundle} |
+ */ |
+PointerHandler.prototype.previousPointerActionBundle_ = null; |
+ |
+ |
+/** |
+ * Creates a new pointer handler. |
+ * |
+ * @param {!Node} target . |
+ * @return {!i18n.input.chrome.inputview.handler.PointerActionBundle} . |
+ * @private |
+ */ |
+PointerHandler.prototype.createPointerActionBundle_ = function(target) { |
+ var uid = goog.getUid(target); |
+ if (!this.pointerActionBundles_[uid]) { |
+ this.pointerActionBundles_[uid] = new i18n.input.chrome.inputview.handler. |
+ PointerActionBundle(target, this); |
+ } |
+ return this.pointerActionBundles_[uid]; |
+}; |
+ |
+ |
+/** |
+ * Callback for mouse/touch down on the target. |
+ * |
+ * @param {!goog.events.BrowserEvent} e The event. |
+ * @private |
+ */ |
+PointerHandler.prototype.onPointerDown_ = function(e) { |
+ var pointerActionBundle = this.createPointerActionBundle_( |
+ /** @type {!Node} */ (e.target)); |
+ if (this.previousPointerActionBundle_ && |
+ this.previousPointerActionBundle_ != pointerActionBundle) { |
+ this.previousPointerActionBundle_.cancelDoubleClick(); |
+ } |
+ this.previousPointerActionBundle_ = pointerActionBundle; |
+ pointerActionBundle.handlePointerDown(e); |
+ if (e.type == goog.events.EventType.MOUSEDOWN) { |
+ this.mouseDownTick_ = new Date(); |
+ } |
+}; |
+ |
+ |
+/** |
+ * Callback for pointer out. |
+ * |
+ * @param {!goog.events.BrowserEvent} e The event. |
+ * @private |
+ */ |
+PointerHandler.prototype.onPointerUp_ = function(e) { |
+ if (e.type == goog.events.EventType.MOUSEUP) { |
+ // If mouseup happens too fast after mousedown, it may be a tap action on |
+ // touchpad, so delay the pointer up action so user can see the visual |
+ // flash. |
+ if (this.mouseDownTick_ && new Date() - this.mouseDownTick_ < 10) { |
+ goog.Timer.callOnce(this.onPointerUp_.bind(this, e), 50); |
+ return; |
+ } |
+ } |
+ var uid = goog.getUid(e.target); |
+ var pointerActionBundle = this.pointerActionBundles_[uid]; |
+ if (pointerActionBundle) { |
+ pointerActionBundle.handlePointerUp(e); |
+ } |
+}; |
+ |
+ |
+/** |
+ * Callback for touchmove. |
+ * |
+ * @param {!goog.events.BrowserEvent} e The event. |
+ * @private |
+ */ |
+PointerHandler.prototype.onTouchMove_ = function(e) { |
+ var touches = e.getBrowserEvent()['touches']; |
+ if (!touches || touches.length == 0) { |
+ return; |
+ } |
+ for (var i = 0; i < touches.length; i++) { |
+ var uid = goog.getUid(touches[i].target); |
+ var pointerActionBundle = this.pointerActionBundles_[uid]; |
+ if (pointerActionBundle) { |
+ pointerActionBundle.handleTouchMove(touches[i]); |
+ } |
+ } |
+}; |
+ |
+ |
+/** @override */ |
+PointerHandler.prototype.disposeInternal = function() { |
+ for (var bundle in this.pointerActionBundles_) { |
+ goog.dispose(bundle); |
+ } |
+ goog.dispose(this.eventHandler_); |
+ |
+ goog.base(this, 'disposeInternal'); |
+}; |
+ |
+}); // goog.scope |