UNPKG

scichart

Version:

Fast WebGL JavaScript Charting Library and Framework

343 lines (342 loc) 20.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LayoutManager = void 0; var classFactory_1 = require("../../Builder/classFactory"); var Rect_1 = require("../../Core/Rect"); var AxisAlignment_1 = require("../../types/AxisAlignment"); var BaseType_1 = require("../../types/BaseType"); var LayoutMangerType_1 = require("../../types/LayoutMangerType"); var LayoutStrategyType_1 = require("../../types/LayoutStrategyType"); var BottomAlignedInnerAxisLayoutStrategy_1 = require("./BottomAlignedInnerAxisLayoutStrategy"); var BottomAlignedOuterAxisLayoutStrategy_1 = require("./BottomAlignedOuterAxisLayoutStrategy"); var ChartLayoutState_1 = require("./ChartLayoutState"); var LayoutStrategyAxes_1 = require("./LayoutStrategyAxes"); var LeftAlignedInnerAxisLayoutStrategy_1 = require("./LeftAlignedInnerAxisLayoutStrategy"); var LeftAlignedOuterAxisLayoutStrategy_1 = require("./LeftAlignedOuterAxisLayoutStrategy"); var RightAlignedInnerAxisLayoutStrategy_1 = require("./RightAlignedInnerAxisLayoutStrategy"); var RightAlignedOuterAxisLayoutStrategy_1 = require("./RightAlignedOuterAxisLayoutStrategy"); var TopAlignedInnerAxisLayoutStrategy_1 = require("./TopAlignedInnerAxisLayoutStrategy"); var TopAlignedOuterAxisLayoutStrategy_1 = require("./TopAlignedOuterAxisLayoutStrategy"); var MIN_SERIES_AREA_SIZE = 10; /** * The job of the ILayoutManager is to calculate the size and location of the axes and the resulting size of the seriesViewRect - the area where series will be drawn. * This is done by deferring to the LayoutStrategy for each area which could house axes. */ var LayoutManager = /** @class */ (function () { // tslint:disable: max-line-length function LayoutManager(options) { this.type = LayoutMangerType_1.ELayoutManagerType.Default; /** * Layout strategy for layout of left aligned axis outside */ this.leftOuterAxesLayoutStrategyProperty = new LeftAlignedOuterAxisLayoutStrategy_1.LeftAlignedOuterAxisLayoutStrategy(); /** * Layout strategy for layout of right aligned axis outside */ this.rightOuterAxesLayoutStrategyProperty = new RightAlignedOuterAxisLayoutStrategy_1.RightAlignedOuterAxisLayoutStrategy(); /** * Layout strategy for layout of top aligned axis outside */ this.topOuterAxesLayoutStrategyProperty = new TopAlignedOuterAxisLayoutStrategy_1.TopAlignedOuterAxisLayoutStrategy(); /** * Layout strategy for layout of bottom aligned axis outside */ this.bottomOuterAxesLayoutStrategyProperty = new BottomAlignedOuterAxisLayoutStrategy_1.BottomAlignedOuterAxisLayoutStrategy(); /** * Layout strategy for layout of left aligned inner axis */ this.leftInnerAxesLayoutStrategy = new LeftAlignedInnerAxisLayoutStrategy_1.LeftAlignedInnerAxisLayoutStrategy(); /** * Layout strategy for layout of right aligned inner axis */ this.rightInnerAxesLayoutStrategy = new RightAlignedInnerAxisLayoutStrategy_1.RightAlignedInnerAxisLayoutStrategy(); /** * Layout strategy for layout of top aligned inner axis */ this.topInnerAxesLayoutStrategy = new TopAlignedInnerAxisLayoutStrategy_1.TopAlignedInnerAxisLayoutStrategy(); /** * Layout strategy for layout of bottom aligned inner axis */ this.bottomInnerAxesLayoutStrategy = new BottomAlignedInnerAxisLayoutStrategy_1.BottomAlignedInnerAxisLayoutStrategy(); this.chartLayoutState = new ChartLayoutState_1.ChartLayoutState(); this.axesGroupedByLayoutStrategy = new LayoutStrategyAxes_1.LayoutStrategyAxes(); this.leftOuterAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.LeftOuter, this.leftOuterAxesLayoutStrategy); this.rightOuterAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.RightOuter, this.rightOuterAxesLayoutStrategy); this.topOuterAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.TopOuter, this.topOuterAxesLayoutStrategy); this.bottomOuterAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.BottomOuter, this.bottomOuterAxesLayoutStrategy); this.leftInnerAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.LeftInner, this.leftInnerAxesLayoutStrategy); this.rightInnerAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.RightInner, this.rightInnerAxesLayoutStrategy); this.topInnerAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.TopInner, this.topInnerAxesLayoutStrategy); this.bottomInnerAxesLayoutStrategy = this.createStrategy(options === null || options === void 0 ? void 0 : options.BottomInner, this.bottomInnerAxesLayoutStrategy); } Object.defineProperty(LayoutManager.prototype, "leftOuterAxesLayoutStrategy", { get: function () { return this.leftOuterAxesLayoutStrategyProperty; }, set: function (value) { var _a; var currentValue = this.leftOuterAxesLayoutStrategyProperty; if (currentValue !== value) { this.leftOuterAxesLayoutStrategyProperty = value; if (currentValue.isStacked && !value.isStacked) { this.groupAxesByLayoutStrategy(); resetAxes(this.axesGroupedByLayoutStrategy.leftOuterAxes); } (_a = this.sciChartSurface) === null || _a === void 0 ? void 0 : _a.invalidateElement(); } }, enumerable: false, configurable: true }); Object.defineProperty(LayoutManager.prototype, "rightOuterAxesLayoutStrategy", { get: function () { return this.rightOuterAxesLayoutStrategyProperty; }, set: function (value) { var _a; var currentValue = this.rightOuterAxesLayoutStrategyProperty; if (currentValue !== value) { this.rightOuterAxesLayoutStrategyProperty = value; if (currentValue.isStacked && !value.isStacked) { this.groupAxesByLayoutStrategy(); resetAxes(this.axesGroupedByLayoutStrategy.rightOuterAxes); } (_a = this.sciChartSurface) === null || _a === void 0 ? void 0 : _a.invalidateElement(); } }, enumerable: false, configurable: true }); Object.defineProperty(LayoutManager.prototype, "topOuterAxesLayoutStrategy", { get: function () { return this.topOuterAxesLayoutStrategyProperty; }, set: function (value) { var _a; var currentValue = this.topOuterAxesLayoutStrategyProperty; if (currentValue !== value) { this.topOuterAxesLayoutStrategyProperty = value; if (currentValue.isStacked && !value.isStacked) { this.groupAxesByLayoutStrategy(); resetAxes(this.axesGroupedByLayoutStrategy.topOuterAxes); } (_a = this.sciChartSurface) === null || _a === void 0 ? void 0 : _a.invalidateElement(); } }, enumerable: false, configurable: true }); Object.defineProperty(LayoutManager.prototype, "bottomOuterAxesLayoutStrategy", { get: function () { return this.bottomOuterAxesLayoutStrategyProperty; }, set: function (value) { var _a; var currentValue = this.bottomOuterAxesLayoutStrategyProperty; if (currentValue !== value) { this.bottomOuterAxesLayoutStrategyProperty = value; if (currentValue.isStacked && !value.isStacked) { this.groupAxesByLayoutStrategy(); resetAxes(this.axesGroupedByLayoutStrategy.bottomOuterAxes); } (_a = this.sciChartSurface) === null || _a === void 0 ? void 0 : _a.invalidateElement(); } }, enumerable: false, configurable: true }); LayoutManager.prototype.getAxisLayoutStrategy = function (axisAlignment, isInnerAxis) { switch (axisAlignment) { case AxisAlignment_1.EAxisAlignment.Left: { return isInnerAxis ? this.leftInnerAxesLayoutStrategy : this.leftOuterAxesLayoutStrategy; } case AxisAlignment_1.EAxisAlignment.Right: { return isInnerAxis ? this.rightInnerAxesLayoutStrategy : this.rightOuterAxesLayoutStrategy; } case AxisAlignment_1.EAxisAlignment.Top: { return isInnerAxis ? this.topInnerAxesLayoutStrategy : this.topOuterAxesLayoutStrategy; } case AxisAlignment_1.EAxisAlignment.Bottom: { return isInnerAxis ? this.bottomInnerAxesLayoutStrategy : this.bottomOuterAxesLayoutStrategy; } default: { return (0, AxisAlignment_1.handleInvalidAxisAlignment)(axisAlignment); } } }; LayoutManager.prototype.layoutChart = function (viewportSize, padding) { var _a, _b, _c, _d; this.groupAxesByLayoutStrategy(); // Padding are hardcoded for now var paddingRight = (_a = padding === null || padding === void 0 ? void 0 : padding.right) !== null && _a !== void 0 ? _a : 0; var paddingLeft = (_b = padding === null || padding === void 0 ? void 0 : padding.left) !== null && _b !== void 0 ? _b : 0; var paddingTop = (_c = padding === null || padding === void 0 ? void 0 : padding.top) !== null && _c !== void 0 ? _c : 0; var paddingBottom = (_d = padding === null || padding === void 0 ? void 0 : padding.bottom) !== null && _d !== void 0 ? _d : 0; var availableWidth = viewportSize.width - paddingLeft - paddingRight; var availableHeight = viewportSize.height - paddingTop - paddingBottom; try { // measure outer axes areas this.measureTopOuterAxes(); this.measureBottomOuterAxes(); this.measureLeftOuterAxes(); this.measureRightOuterAxes(); // measure inner axes areas this.measureTopInnerAxes(); this.measureBottomInnerAxes(); this.measureLeftInnerAxes(); this.measureRightInnerAxes(); var remainingWidth = availableWidth - this.chartLayoutState.leftOuterAreaSize - this.chartLayoutState.rightOuterAreaSize; var remainingHeight = availableHeight - this.chartLayoutState.topOuterAreaSize - this.chartLayoutState.bottomOuterAreaSize; var leftStart = paddingLeft; var leftEnd = leftStart + this.chartLayoutState.leftOuterAreaSize; var rightStart = leftEnd + (remainingWidth < MIN_SERIES_AREA_SIZE ? MIN_SERIES_AREA_SIZE : remainingWidth); var rightEnd = rightStart + this.chartLayoutState.rightOuterAreaSize; var topStart = paddingTop; var topEnd = topStart + this.chartLayoutState.topOuterAreaSize; var bottomStart = topEnd + (remainingHeight < MIN_SERIES_AREA_SIZE ? MIN_SERIES_AREA_SIZE : remainingHeight); var bottomEnd = bottomStart + this.chartLayoutState.bottomOuterAreaSize; // layout center parts if (this.sciChartSurface.drawSeriesBehindAxis) { this.layoutChartCenter(leftStart, topStart, rightEnd, bottomEnd); } else { this.layoutChartCenter(leftEnd, topEnd, rightStart, bottomStart); } // layout outer axes this.leftOuterAxesLayoutStrategy.layoutAxes(leftStart, topEnd, leftEnd - this.sciChartSurface.leftViewportBorder, bottomStart, this.axesGroupedByLayoutStrategy.leftOuterAxes); this.rightOuterAxesLayoutStrategy.layoutAxes(rightStart + this.sciChartSurface.rightViewportBorder, topEnd, rightEnd, bottomStart, this.axesGroupedByLayoutStrategy.rightOuterAxes); this.topOuterAxesLayoutStrategy.layoutAxes(leftEnd, topStart, rightStart, topEnd - this.sciChartSurface.topViewportBorder, this.axesGroupedByLayoutStrategy.topOuterAxes); this.bottomOuterAxesLayoutStrategy.layoutAxes(leftEnd, bottomStart + this.sciChartSurface.bottomViewportBorder, rightStart, bottomEnd, this.axesGroupedByLayoutStrategy.bottomOuterAxes); var innerLeftEnd = leftEnd + this.chartLayoutState.leftInnerAreaSize; var innerRightStart = rightStart - this.chartLayoutState.rightInnerAreaSize; var innerTopEnd = topEnd + this.chartLayoutState.topInnerAreaSize; var innerBottomStart = bottomStart - this.chartLayoutState.bottomInnerAreaSize; // layout inner axes this.leftInnerAxesLayoutStrategy.layoutAxes(leftEnd, topEnd, innerLeftEnd, bottomStart, this.axesGroupedByLayoutStrategy.leftInnerAxes); this.rightInnerAxesLayoutStrategy.layoutAxes(innerRightStart, topEnd, rightStart, bottomStart, this.axesGroupedByLayoutStrategy.rightInnerAxes); this.topInnerAxesLayoutStrategy.layoutAxes(leftEnd, topEnd, rightStart, innerTopEnd, this.axesGroupedByLayoutStrategy.topInnerAxes); this.bottomInnerAxesLayoutStrategy.layoutAxes(leftEnd, innerBottomStart, rightStart, bottomStart, this.axesGroupedByLayoutStrategy.bottomInnerAxes); return this.sciChartSurface.seriesViewRect; } finally { this.chartLayoutState.clear(); } return undefined; }; LayoutManager.prototype.toJSON = function () { var options = { BottomInner: this.bottomInnerAxesLayoutStrategy.toJSON(), BottomOuter: this.bottomOuterAxesLayoutStrategy.toJSON(), LeftInner: this.leftInnerAxesLayoutStrategy.toJSON(), LeftOuter: this.leftOuterAxesLayoutStrategy.toJSON(), RightInner: this.rightInnerAxesLayoutStrategy.toJSON(), RightOuter: this.rightOuterAxesLayoutStrategy.toJSON(), TopInner: this.topInnerAxesLayoutStrategy.toJSON(), TopOuter: this.topOuterAxesLayoutStrategy.toJSON() }; return { type: this.type, options: options }; }; LayoutManager.prototype.measureLeftOuterAxes = function () { this.leftOuterAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.leftOuterAxes); }; LayoutManager.prototype.measureRightOuterAxes = function () { this.rightOuterAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.rightOuterAxes); }; LayoutManager.prototype.measureTopOuterAxes = function () { this.topOuterAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.topOuterAxes); }; LayoutManager.prototype.measureBottomOuterAxes = function () { this.bottomOuterAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.bottomOuterAxes); }; LayoutManager.prototype.measureLeftInnerAxes = function () { this.leftInnerAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.leftInnerAxes); }; LayoutManager.prototype.measureRightInnerAxes = function () { this.rightInnerAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.rightInnerAxes); }; LayoutManager.prototype.measureTopInnerAxes = function () { this.topInnerAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.topInnerAxes); }; LayoutManager.prototype.measureBottomInnerAxes = function () { this.bottomInnerAxesLayoutStrategy.measureAxes(this.sciChartSurface, this.chartLayoutState, this.axesGroupedByLayoutStrategy.bottomInnerAxes); }; LayoutManager.prototype.groupAxesByLayoutStrategy = function () { this.axesGroupedByLayoutStrategy.clear(); var _a = this.axesGroupedByLayoutStrategy, topInnerAxes = _a.topInnerAxes, bottomInnerAxes = _a.bottomInnerAxes, leftInnerAxes = _a.leftInnerAxes, rightInnerAxes = _a.rightInnerAxes, topOuterAxes = _a.topOuterAxes, bottomOuterAxes = _a.bottomOuterAxes, leftOuterAxes = _a.leftOuterAxes, rightOuterAxes = _a.rightOuterAxes; var groupAxes = function (axes) { axes.forEach(function (axis) { var axisAlignment = axis.axisAlignment, isInnerAxis = axis.isInnerAxis, isVisible = axis.isVisible; if (isInnerAxis) { switch (axisAlignment) { case AxisAlignment_1.EAxisAlignment.Top: topInnerAxes.push(axis); break; case AxisAlignment_1.EAxisAlignment.Bottom: bottomInnerAxes.push(axis); break; case AxisAlignment_1.EAxisAlignment.Left: leftInnerAxes.push(axis); break; case AxisAlignment_1.EAxisAlignment.Right: rightInnerAxes.push(axis); break; } } else { switch (axisAlignment) { case AxisAlignment_1.EAxisAlignment.Top: topOuterAxes.push(axis); break; case AxisAlignment_1.EAxisAlignment.Bottom: bottomOuterAxes.push(axis); break; case AxisAlignment_1.EAxisAlignment.Left: leftOuterAxes.push(axis); break; case AxisAlignment_1.EAxisAlignment.Right: rightOuterAxes.push(axis); break; } } }); }; groupAxes(this.sciChartSurface.xAxes.asArray()); groupAxes(this.sciChartSurface.yAxes.asArray()); }; LayoutManager.prototype.layoutChartCenter = function (left, top, right, bottom) { this.setSeriesViewRect(left, top, right, bottom); this.sciChartSurface.annotationUnderlaySurfaceViewRect = Rect_1.Rect.createWithCoords(left, top, right, bottom); this.sciChartSurface.annotationOverlaySurfaceViewRect = Rect_1.Rect.createWithCoords(left, top, right, bottom); this.sciChartSurface.chartModifierSurfaceViewRect = Rect_1.Rect.createWithCoords(left, top, right, bottom); }; LayoutManager.prototype.setSeriesViewRect = function (left, top, right, bottom) { var seriesViewRect = this.sciChartSurface.seriesViewRect; var newRect = Rect_1.Rect.createWithCoords(left, top, right, bottom); if (!seriesViewRect || !Rect_1.Rect.isEqual(seriesViewRect, newRect)) { this.sciChartSurface.setSeriesViewRect(newRect); } }; LayoutManager.prototype.createStrategy = function (option, strategy) { if (option && option.type !== strategy.type) { if ("measureAxes" in option) { return option; } if (option.type === LayoutStrategyType_1.ELayoutStrategyType.Custom) { return (0, classFactory_1.createType)(BaseType_1.EBaseType.LayoutStrategy, option.customType, undefined, option.options); } else { return (0, classFactory_1.createType)(BaseType_1.EBaseType.LayoutStrategy, option.type, undefined, option.options); } } else { return strategy; } }; return LayoutManager; }()); exports.LayoutManager = LayoutManager; var resetAxes = function (axes) { if (axes.length > 0) { axes[0].isPrimaryAxis = true; } };