/* * (c) Copyright Ascensio System SIA 2010-2015 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; function ChartPreviewManager() { this.previewGroups = []; this.chartsByTypes = []; this.CHART_PREVIEW_WIDTH_PIX = 50; this.CHART_PREVIEW_HEIGHT_PIX = 50; this._canvas_charts = null; } ChartPreviewManager.prototype.getAscChartSeriesDefault = function (type) { function createItem(value) { return { numFormatStr: "General", isDateTimeFormat: false, val: value, isHidden: false }; } var series = [], ser; switch (type) { case c_oAscChartTypeSettings.lineNormal: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2), createItem(3), createItem(2), createItem(3)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1), createItem(2), createItem(3), createItem(2)]; series.push(ser); break; case c_oAscChartTypeSettings.lineStacked: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1), createItem(6), createItem(2), createItem(8)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4), createItem(4), createItem(4), createItem(5)]; series.push(ser); break; case c_oAscChartTypeSettings.lineStackedPer: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2), createItem(4), createItem(2), createItem(4)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2), createItem(2), createItem(2), createItem(2)]; series.push(ser); break; case c_oAscChartTypeSettings.hBarNormal: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(3)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1)]; series.push(ser); break; case c_oAscChartTypeSettings.hBarStacked: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4), createItem(3), createItem(2), createItem(1)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(5), createItem(4), createItem(3), createItem(2)]; series.push(ser); break; case c_oAscChartTypeSettings.hBarStackedPer: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(7), createItem(5), createItem(3), createItem(1)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(7), createItem(6), createItem(5), createItem(4)]; series.push(ser); break; case c_oAscChartTypeSettings.barNormal: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(3)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4)]; series.push(ser); break; case c_oAscChartTypeSettings.barStacked: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1), createItem(2), createItem(3), createItem(4)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2), createItem(3), createItem(4), createItem(5)]; series.push(ser); break; case c_oAscChartTypeSettings.barStackedPer: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1), createItem(3), createItem(5), createItem(7)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4), createItem(5), createItem(6), createItem(7)]; series.push(ser); break; case c_oAscChartTypeSettings.pie: case c_oAscChartTypeSettings.doughnut: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(3), createItem(1)]; series.push(ser); break; case c_oAscChartTypeSettings.areaNormal: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(0), createItem(8), createItem(5), createItem(6)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(0), createItem(4), createItem(2), createItem(9)]; series.push(ser); break; case c_oAscChartTypeSettings.areaStacked: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(0), createItem(8), createItem(5), createItem(11)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4), createItem(4), createItem(4), createItem(4)]; series.push(ser); break; case c_oAscChartTypeSettings.areaStackedPer: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(0), createItem(4), createItem(1), createItem(16)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(4), createItem(4), createItem(4), createItem(4)]; series.push(ser); break; case c_oAscChartTypeSettings.scatter: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1), createItem(5)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(2), createItem(6)]; series.push(ser); break; default: ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(3), createItem(5), createItem(7)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(10), createItem(12), createItem(14)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(1), createItem(3), createItem(5)]; series.push(ser); ser = new asc_CChartSeria(); ser.Val.NumCache = [createItem(8), createItem(10), createItem(12)]; series.push(ser); break; } return series; }; ChartPreviewManager.prototype.getChartByType = function (type) { return ExecuteNoHistory(function () { var settings = new asc_ChartSettings(); settings.type = type; var chartSeries = { series: this.getAscChartSeriesDefault(type), parsedHeaders: { bLeft: true, bTop: true } }; var chart_space = DrawingObjectsController.prototype._getChartSpace(chartSeries, settings, true); chart_space.bPreview = true; if (window["Asc"]["editor"]) { var api_sheet = window["Asc"]["editor"]; chart_space.setWorksheet(api_sheet.wb.getWorksheet().model); } else { if (editor && editor.WordControl && editor.WordControl.m_oLogicDocument.Slides && editor.WordControl.m_oLogicDocument.Slides[editor.WordControl.m_oLogicDocument.CurPage]) { chart_space.setParent(editor.WordControl.m_oLogicDocument.Slides[editor.WordControl.m_oLogicDocument.CurPage]); } } CheckSpPrXfrm(chart_space); chart_space.spPr.xfrm.setOffX(0); chart_space.spPr.xfrm.setOffY(0); chart_space.spPr.xfrm.setExtX(50); chart_space.spPr.xfrm.setExtY(50); settings.putTitle(c_oAscChartTitleShowSettings.none); settings.putHorAxisLabel(c_oAscChartTitleShowSettings.none); settings.putVertAxisLabel(c_oAscChartTitleShowSettings.none); settings.putLegendPos(c_oAscChartLegendShowSettings.none); settings.putHorGridLines(c_oAscGridLinesSettings.none); settings.putVertGridLines(c_oAscGridLinesSettings.none); var val_ax_props = new asc_ValAxisSettings(); val_ax_props.putMinValRule(c_oAscValAxisRule.auto); val_ax_props.putMaxValRule(c_oAscValAxisRule.auto); val_ax_props.putTickLabelsPos(c_oAscTickLabelsPos.TICK_LABEL_POSITION_NONE); val_ax_props.putInvertValOrder(false); val_ax_props.putDispUnitsRule(c_oAscValAxUnits.none); val_ax_props.putMajorTickMark(c_oAscTickMark.TICK_MARK_NONE); val_ax_props.putMinorTickMark(c_oAscTickMark.TICK_MARK_NONE); val_ax_props.putCrossesRule(c_oAscCrossesRule.auto); var cat_ax_props = new asc_CatAxisSettings(); cat_ax_props.putIntervalBetweenLabelsRule(c_oAscBetweenLabelsRule.auto); cat_ax_props.putLabelsPosition(c_oAscLabelsPosition.betweenDivisions); cat_ax_props.putTickLabelsPos(c_oAscTickLabelsPos.TICK_LABEL_POSITION_NONE); cat_ax_props.putLabelsAxisDistance(100); cat_ax_props.putMajorTickMark(c_oAscTickMark.TICK_MARK_NONE); cat_ax_props.putMinorTickMark(c_oAscTickMark.TICK_MARK_NONE); cat_ax_props.putIntervalBetweenTick(1); cat_ax_props.putCrossesRule(c_oAscCrossesRule.auto); var vert_axis_settings, hor_axis_settings, isScatter; switch (type) { case c_oAscChartTypeSettings.hBarNormal: case c_oAscChartTypeSettings.hBarStacked: case c_oAscChartTypeSettings.hBarStackedPer: vert_axis_settings = cat_ax_props; hor_axis_settings = val_ax_props; break; case c_oAscChartTypeSettings.scatter: case c_oAscChartTypeSettings.scatterLine: case c_oAscChartTypeSettings.scatterLineMarker: case c_oAscChartTypeSettings.scatterMarker: case c_oAscChartTypeSettings.scatterNone: case c_oAscChartTypeSettings.scatterSmooth: case c_oAscChartTypeSettings.scatterSmoothMarker: vert_axis_settings = val_ax_props; hor_axis_settings = val_ax_props; isScatter = true; settings.showMarker = true; settings.smooth = false; settings.bLine = false; break; case c_oAscChartTypeSettings.areaNormal: case c_oAscChartTypeSettings.areaStacked: case c_oAscChartTypeSettings.areaStackedPer: cat_ax_props.putLabelsPosition(CROSS_BETWEEN_BETWEEN); vert_axis_settings = val_ax_props; hor_axis_settings = cat_ax_props; break; default: vert_axis_settings = val_ax_props; hor_axis_settings = cat_ax_props; break; } settings.putVertAxisProps(vert_axis_settings); settings.putHorAxisProps(hor_axis_settings); DrawingObjectsController.prototype.applyPropsToChartSpace(settings, chart_space); chart_space.setBDeleted(false); chart_space.updateLinks(); if (! (isScatter || type === c_oAscChartTypeSettings.stock)) { if (chart_space.chart.plotArea.valAx) { chart_space.chart.plotArea.valAx.setDelete(true); } if (chart_space.chart.plotArea.catAx) { chart_space.chart.plotArea.catAx.setDelete(true); } } else { if (chart_space.chart.plotArea.valAx) { chart_space.chart.plotArea.valAx.setTickLblPos(TICK_LABEL_POSITION_NONE); chart_space.chart.plotArea.valAx.setMajorTickMark(TICK_MARK_NONE); chart_space.chart.plotArea.valAx.setMinorTickMark(TICK_MARK_NONE); } if (chart_space.chart.plotArea.catAx) { chart_space.chart.plotArea.catAx.setTickLblPos(TICK_LABEL_POSITION_NONE); chart_space.chart.plotArea.catAx.setMajorTickMark(TICK_MARK_NONE); chart_space.chart.plotArea.catAx.setMinorTickMark(TICK_MARK_NONE); } } if (!chart_space.spPr) { chart_space.setSpPr(new CSpPr()); } var new_line = new CLn(); new_line.setFill(new CUniFill()); new_line.Fill.setFill(new CNoFill()); chart_space.spPr.setLn(new_line); chart_space.recalcInfo.recalculateReferences = false; chart_space.recalculate(); return chart_space; }, this, []); }; ChartPreviewManager.prototype.clearPreviews = function () { this.previewGroups.length = 0; }; ChartPreviewManager.prototype.createChartPreview = function (type, styleIndex) { return ExecuteNoHistory(function () { if (!this.chartsByTypes[type]) { this.chartsByTypes[type] = this.getChartByType(type); } var chart_space = this.chartsByTypes[type]; if (chart_space.style !== styleIndex) { chart_space.style = styleIndex; chart_space.recalculateMarkers(); chart_space.recalculateSeriesColors(); chart_space.recalculatePlotAreaChartBrush(); chart_space.recalculatePlotAreaChartPen(); chart_space.recalculateChartBrush(); chart_space.recalculateChartPen(); chart_space.recalculateUpDownBars(); } chart_space.recalculatePenBrush(); if (null === this._canvas_charts) { this._canvas_charts = document.createElement("canvas"); this._canvas_charts.width = this.CHART_PREVIEW_WIDTH_PIX; this._canvas_charts.height = this.CHART_PREVIEW_HEIGHT_PIX; if (AscBrowser.isRetina) { this._canvas_charts.width <<= 1; this._canvas_charts.height <<= 1; } } var _canvas = this._canvas_charts; var ctx = _canvas.getContext("2d"); var graphics = new CGraphics(); graphics.init(ctx, _canvas.width, _canvas.height, 50, 50); graphics.m_oFontManager = g_fontManager; graphics.transform(1, 0, 0, 1, 0, 0); chart_space.draw(graphics); return _canvas.toDataURL("image/png"); }, this, []); }; ChartPreviewManager.prototype.getChartPreviews = function (chartType) { if (isRealNumber(chartType)) { if (!this.previewGroups.hasOwnProperty(chartType)) { this.previewGroups[chartType] = []; var arr = this.previewGroups[chartType]; for (var i = 1; i < 49; ++i) { arr.push(this.createChartPreview(chartType, i)); } } var group = this.previewGroups[chartType]; var objectGroup = []; for (var style = 0; style < group.length; ++style) { var chartStyle = new asc_CChartStyle(); chartStyle.asc_setStyle(style + 1); chartStyle.asc_setImageUrl(group[style]); objectGroup.push(chartStyle); } return objectGroup; } else { return null; } }; function arrReverse(arr) { if (!arr || !arr.length) { return; } var newarr = []; for (var i = 0; i < arr[0].length; ++i) { newarr[i] = []; for (var j = 0; j < arr.length; ++j) { newarr[i][j] = arr[j][i]; } } return newarr; }