'use strict';
|
|
Object.defineProperty(exports, "__esModule", {
|
value: true
|
});
|
|
var _Globals = require('../../parts/Globals.js');
|
|
var _Globals2 = _interopRequireDefault(_Globals);
|
|
require('../../parts/Utilities.js');
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
var Annotation = _Globals2.default.Annotation,
|
CrookedLine = Annotation.types.crookedLine,
|
ControlPoint = Annotation.ControlPoint,
|
MockPoint = Annotation.MockPoint;
|
|
function getSecondCoordinate(p1, p2, x) {
|
return (p2.y - p1.y) / (p2.x - p1.x) * (x - p1.x) + p1.y;
|
}
|
|
/**
|
* @class
|
* @extends Annotation.CrookedLine
|
* @memberOf Annotation
|
**/
|
function Tunnel() {
|
CrookedLine.apply(this, arguments);
|
}
|
|
_Globals2.default.extendAnnotation(Tunnel, CrookedLine,
|
/** @lends Annotation.Tunnel# */
|
{
|
getPointsOptions: function getPointsOptions() {
|
var pointsOptions = CrookedLine.prototype.getPointsOptions.call(this);
|
|
pointsOptions[2] = this.heightPointOptions(pointsOptions[1]);
|
pointsOptions[3] = this.heightPointOptions(pointsOptions[0]);
|
|
return pointsOptions;
|
},
|
|
getControlPointsOptions: function getControlPointsOptions() {
|
return this.getPointsOptions().slice(0, 2);
|
},
|
|
heightPointOptions: function heightPointOptions(pointOptions) {
|
var heightPointOptions = _Globals2.default.merge(pointOptions);
|
|
heightPointOptions.y += this.options.typeOptions.height;
|
|
return heightPointOptions;
|
},
|
|
addControlPoints: function addControlPoints() {
|
CrookedLine.prototype.addControlPoints.call(this);
|
|
var options = this.options,
|
controlPoint = new ControlPoint(this.chart, this, _Globals2.default.merge(options.controlPointOptions, options.typeOptions.heightControlPoint), 2);
|
|
this.controlPoints.push(controlPoint);
|
|
options.typeOptions.heightControlPoint = controlPoint.options;
|
},
|
|
addShapes: function addShapes() {
|
this.addLine();
|
this.addBackground();
|
},
|
|
addLine: function addLine() {
|
var line = this.initShape(_Globals2.default.merge(this.options.typeOptions.line, {
|
type: 'path',
|
points: [this.points[0], this.points[1], function (target) {
|
var pointOptions = MockPoint.pointToOptions(target.annotation.points[2]);
|
|
pointOptions.command = 'M';
|
|
return pointOptions;
|
}, this.points[3]]
|
}), false);
|
|
this.options.typeOptions.line = line.options;
|
},
|
|
addBackground: function addBackground() {
|
var background = this.initShape(_Globals2.default.merge(this.options.typeOptions.background, {
|
type: 'path',
|
points: this.points.slice()
|
}));
|
|
this.options.typeOptions.background = background.options;
|
},
|
|
/**
|
* Translate start or end ("left" or "right") side of the tunnel.
|
*
|
* @param {number} dx - the amount of x translation
|
* @param {number} dy - the amount of y translation
|
* @param {boolean} [end] - whether to translate start or end side
|
*/
|
translateSide: function translateSide(dx, dy, end) {
|
var topIndex = Number(end),
|
bottomIndex = topIndex === 0 ? 3 : 2;
|
|
this.translatePoint(dx, dy, topIndex);
|
this.translatePoint(dx, dy, bottomIndex);
|
},
|
|
/**
|
* Translate height of the tunnel.
|
*
|
* @param {number} dh - the amount of height translation
|
*/
|
translateHeight: function translateHeight(dh) {
|
this.translatePoint(0, dh, 2);
|
this.translatePoint(0, dh, 3);
|
|
this.options.typeOptions.height = this.points[3].y - this.points[0].y;
|
}
|
},
|
|
/**
|
* A tunnel annotation.
|
*
|
* @extends annotations.crookedLine
|
* @sample highcharts/annotations-advanced/tunnel/
|
* Tunnel
|
* @product highstock
|
* @optionparent annotations.tunnel
|
*/
|
{
|
typeOptions: {
|
xAxis: 0,
|
yAxis: 0,
|
/**
|
* Background options.
|
*
|
* @type {Object}
|
* @excluding height, point, points, r, type, width, markerEnd,
|
* markerStart
|
*/
|
background: {
|
fill: 'rgba(130, 170, 255, 0.4)',
|
strokeWidth: 0
|
},
|
line: {
|
strokeWidth: 1
|
},
|
/**
|
* The height of the annotation in terms of yAxis.
|
*/
|
height: -2,
|
|
/**
|
* Options for the control point which controls
|
* the annotation's height.
|
*
|
* @extends annotations.crookedLine.controlPointOptions
|
* @excluding positioner, events
|
*/
|
heightControlPoint: {
|
positioner: function positioner(target) {
|
var startXY = MockPoint.pointToPixels(target.points[2]),
|
endXY = MockPoint.pointToPixels(target.points[3]),
|
x = (startXY.x + endXY.x) / 2;
|
|
return {
|
x: x - this.graphic.width / 2,
|
y: getSecondCoordinate(startXY, endXY, x) - this.graphic.height / 2
|
};
|
},
|
events: {
|
drag: function drag(e, target) {
|
if (target.chart.isInsidePlot(e.chartX - target.chart.plotLeft, e.chartY - target.chart.plotTop)) {
|
target.translateHeight(this.mouseMoveToTranslation(e).y);
|
|
target.redraw(false);
|
}
|
}
|
}
|
}
|
},
|
|
/**
|
* @extends annotations.crookedLine.controlPointOptions
|
* @excluding positioner, events
|
*/
|
controlPointOptions: {
|
events: {
|
drag: function drag(e, target) {
|
if (target.chart.isInsidePlot(e.chartX - target.chart.plotLeft, e.chartY - target.chart.plotTop)) {
|
var translation = this.mouseMoveToTranslation(e);
|
|
target.translateSide(translation.x, translation.y, this.index);
|
|
target.redraw(false);
|
}
|
}
|
}
|
}
|
});
|
|
Annotation.types.tunnel = Tunnel;
|
|
exports.default = Tunnel;
|