/* * * * (c) 2010-2019 Torstein Honsi * * License: www.highcharts.com/license * * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!! * * */ 'use strict'; var _Globals = require('./Globals.js'); var _Globals2 = _interopRequireDefault(_Globals); var _Utilities = require('./Utilities.js'); var _Utilities2 = _interopRequireDefault(_Utilities); require('./Pointer.js'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var objectEach = _Utilities2.default.objectEach; /* globals MSPointerEvent, PointerEvent */ var addEvent = _Globals2.default.addEvent, charts = _Globals2.default.charts, css = _Globals2.default.css, doc = _Globals2.default.doc, extend = _Globals2.default.extend, hasTouch = _Globals2.default.hasTouch, noop = _Globals2.default.noop, Pointer = _Globals2.default.Pointer, removeEvent = _Globals2.default.removeEvent, win = _Globals2.default.win, wrap = _Globals2.default.wrap; if (!hasTouch && (win.PointerEvent || win.MSPointerEvent)) { // The touches object keeps track of the points being touched at all times var touches = {}, hasPointerEvent = !!win.PointerEvent, getWebkitTouches = function getWebkitTouches() { var fake = []; fake.item = function (i) { return this[i]; }; objectEach(touches, function (touch) { fake.push({ pageX: touch.pageX, pageY: touch.pageY, target: touch.target }); }); return fake; }, translateMSPointer = function translateMSPointer(e, method, wktype, func) { var p; if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[_Globals2.default.hoverChartIndex]) { func(e); p = charts[_Globals2.default.hoverChartIndex].pointer; p[method]({ type: wktype, target: e.currentTarget, preventDefault: noop, touches: getWebkitTouches() }); } }; /* eslint-disable no-invalid-this, valid-jsdoc */ // Extend the Pointer prototype with methods for each event handler and more extend(Pointer.prototype, /** @lends Pointer.prototype */{ /** * @private * @function Highcharts.Pointer#onContainerPointerDown * * @param {Highcharts.PointerEventObject} e * * @return {void} */ onContainerPointerDown: function onContainerPointerDown(e) { translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) { touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY, target: e.currentTarget }; }); }, /** * @private * @function Highcharts.Pointer#onContainerPointerMove * * @param {Highcharts.PointerEventObject} e * * @return {void} */ onContainerPointerMove: function onContainerPointerMove(e) { translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) { touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY }; if (!touches[e.pointerId].target) { touches[e.pointerId].target = e.currentTarget; } }); }, /** * @private * @function Highcharts.Pointer#onDocumentPointerUp * * @param {Highcharts.PointerEventObject} e * * @return {void} */ onDocumentPointerUp: function onDocumentPointerUp(e) { translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function (e) { delete touches[e.pointerId]; }); }, /** * Add or remove the MS Pointer specific events * * @private * @function Highcharts.Pointer#batchMSEvents * * @param {Function} fn * * @return {void} */ batchMSEvents: function batchMSEvents(fn) { fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown); fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove); fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp); } }); // Disable default IE actions for pinch and such on chart element wrap(Pointer.prototype, 'init', function (proceed, chart, options) { proceed.call(this, chart, options); if (this.hasZoom) { // #4014 css(chart.container, { '-ms-touch-action': 'none', 'touch-action': 'none' }); } }); // Add IE specific touch events to chart wrap(Pointer.prototype, 'setDOMEvents', function (proceed) { proceed.apply(this); if (this.hasZoom || this.followTouchMove) { this.batchMSEvents(addEvent); } }); // Destroy MS events also wrap(Pointer.prototype, 'destroy', function (proceed) { this.batchMSEvents(removeEvent); proceed.call(this); }); }