| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 | 
							- import H from '../parts/Globals.js';
 
- import '../parts/Utilities.js';
 
- /**
 
-  * It provides methods for:
 
-  * - adding and handling DOM events and a drag event,
 
-  * - mapping a mouse move event to the distance between two following events.
 
-  *   The units of the distance are specific to a transformation,
 
-  *   e.g. for rotation they are radians, for scaling they are scale factors.
 
-  *
 
-  * @mixin
 
-  * @memberOf Annotation
 
-  */
 
- var eventEmitterMixin = {
 
-     /**
 
-      * Add emitter events.
 
-      */
 
-     addEvents: function () {
 
-         var emitter = this;
 
-         H.addEvent(
 
-             emitter.graphic.element,
 
-             'mousedown',
 
-             function (e) {
 
-                 emitter.onMouseDown(e);
 
-             }
 
-         );
 
-         H.objectEach(emitter.options.events, function (event, type) {
 
-             var eventHandler = function (e) {
 
-                 if (type !== 'click' || !emitter.cancelClick) {
 
-                     event.call(
 
-                         emitter,
 
-                         emitter.chart.pointer.normalize(e),
 
-                         emitter.target
 
-                     );
 
-                 }
 
-             };
 
-             if (type !== 'drag') {
 
-                 emitter.graphic.on(type, eventHandler);
 
-             } else {
 
-                 H.addEvent(emitter, 'drag', eventHandler);
 
-             }
 
-         });
 
-         if (emitter.options.draggable) {
 
-             H.addEvent(emitter, 'drag', emitter.onDrag);
 
-             if (!emitter.graphic.renderer.styledMode) {
 
-                 emitter.graphic.css({
 
-                     cursor: {
 
-                         x: 'ew-resize',
 
-                         y: 'ns-resize',
 
-                         xy: 'move'
 
-                     }[emitter.options.draggable]
 
-                 });
 
-             }
 
-         }
 
-     },
 
-     /**
 
-      * Remove emitter document events.
 
-      */
 
-     removeDocEvents: function () {
 
-         if (this.removeDrag) {
 
-             this.removeDrag = this.removeDrag();
 
-         }
 
-         if (this.removeMouseUp) {
 
-             this.removeMouseUp = this.removeMouseUp();
 
-         }
 
-     },
 
-     /**
 
-      * Mouse down handler.
 
-      *
 
-      * @param {Object} e event
 
-      */
 
-     onMouseDown: function (e) {
 
-         var emitter = this,
 
-             pointer = emitter.chart.pointer,
 
-             prevChartX,
 
-             prevChartY;
 
-         // On right click, do nothing:
 
-         if (e.button === 2) {
 
-             return;
 
-         }
 
-         e.stopPropagation();
 
-         e = pointer.normalize(e);
 
-         prevChartX = e.chartX;
 
-         prevChartY = e.chartY;
 
-         emitter.cancelClick = false;
 
-         emitter.removeDrag = H.addEvent(
 
-             H.doc,
 
-             'mousemove',
 
-             function (e) {
 
-                 emitter.hasDragged = true;
 
-                 e = pointer.normalize(e);
 
-                 e.prevChartX = prevChartX;
 
-                 e.prevChartY = prevChartY;
 
-                 H.fireEvent(emitter, 'drag', e);
 
-                 prevChartX = e.chartX;
 
-                 prevChartY = e.chartY;
 
-             }
 
-         );
 
-         emitter.removeMouseUp = H.addEvent(
 
-             H.doc,
 
-             'mouseup',
 
-             function (e) {
 
-                 emitter.cancelClick = emitter.hasDragged;
 
-                 emitter.hasDragged = false;
 
-                 emitter.onMouseUp(e);
 
-             }
 
-         );
 
-     },
 
-     /**
 
-      * Mouse up handler.
 
-      *
 
-      * @param {Object} e event
 
-      */
 
-     onMouseUp: function () {
 
-         var chart = this.chart,
 
-             annotation = this.target || this,
 
-             annotationsOptions = chart.options.annotations,
 
-             index = chart.annotations.indexOf(annotation);
 
-         this.removeDocEvents();
 
-         annotationsOptions[index] = annotation.options;
 
-     },
 
-     /**
 
-      * Drag and drop event. All basic annotations should share this
 
-      * capability as well as the extended ones.
 
-      *
 
-      * @param {Object} e event
 
-      */
 
-     onDrag: function (e) {
 
-         if (
 
-             this.chart.isInsidePlot(
 
-                 e.chartX - this.chart.plotLeft,
 
-                 e.chartY - this.chart.plotTop
 
-             )
 
-         ) {
 
-             var translation = this.mouseMoveToTranslation(e);
 
-             if (this.options.draggable === 'x') {
 
-                 translation.y = 0;
 
-             }
 
-             if (this.options.draggable === 'y') {
 
-                 translation.x = 0;
 
-             }
 
-             if (this.points.length) {
 
-                 this.translate(translation.x, translation.y);
 
-             } else {
 
-                 this.shapes.forEach(function (shape) {
 
-                     shape.translate(translation.x, translation.y);
 
-                 });
 
-                 this.labels.forEach(function (label) {
 
-                     label.translate(translation.x, translation.y);
 
-                 });
 
-             }
 
-             this.redraw(false);
 
-         }
 
-     },
 
-     /**
 
-      * Map mouse move event to the radians.
 
-      *
 
-      * @param {Object} e event
 
-      * @param {number} cx center x
 
-      * @param {number} cy center y
 
-      */
 
-     mouseMoveToRadians: function (e, cx, cy) {
 
-         var prevDy = e.prevChartY - cy,
 
-             prevDx = e.prevChartX - cx,
 
-             dy = e.chartY - cy,
 
-             dx = e.chartX - cx,
 
-             temp;
 
-         if (this.chart.inverted) {
 
-             temp = prevDx;
 
-             prevDx = prevDy;
 
-             prevDy = temp;
 
-             temp = dx;
 
-             dx = dy;
 
-             dy = temp;
 
-         }
 
-         return Math.atan2(dy, dx) - Math.atan2(prevDy, prevDx);
 
-     },
 
-     /**
 
-      * Map mouse move event to the distance between two following events.
 
-      *
 
-      * @param {Object} e event
 
-      */
 
-     mouseMoveToTranslation: function (e) {
 
-         var dx = e.chartX - e.prevChartX,
 
-             dy = e.chartY - e.prevChartY,
 
-             temp;
 
-         if (this.chart.inverted) {
 
-             temp = dy;
 
-             dy = dx;
 
-             dx = temp;
 
-         }
 
-         return {
 
-             x: dx,
 
-             y: dy
 
-         };
 
-     },
 
-     /**
 
-      * Map mouse move to the scale factors.
 
-      *
 
-      * @param {Object} e event
 
-      * @param {number} cx center x
 
-      * @param {number} cy center y
 
-      **/
 
-     mouseMoveToScale: function (e, cx, cy) {
 
-         var prevDx = e.prevChartX - cx,
 
-             prevDy = e.prevChartY - cy,
 
-             dx = e.chartX - cx,
 
-             dy = e.chartY - cy,
 
-             sx = (dx || 1) / (prevDx || 1),
 
-             sy = (dy || 1) / (prevDy || 1),
 
-             temp;
 
-         if (this.chart.inverted) {
 
-             temp = sy;
 
-             sy = sx;
 
-             sx = temp;
 
-         }
 
-         return {
 
-             x: sx,
 
-             y: sy
 
-         };
 
-     },
 
-     /**
 
-      * Destroy the event emitter.
 
-      */
 
-     destroy: function () {
 
-         this.removeDocEvents();
 
-         H.removeEvent(this);
 
-         this.hcEvents = null;
 
-     }
 
- };
 
- export default eventEmitterMixin;
 
 
  |