/* *
|
*
|
* (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);
|
});
|
}
|