/* * (c) Copyright Ascensio System SIA 2010-2024 * * 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 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * 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"; ( /** * @param {Window} window * @param {undefined} undefined */ function (window, undefined) { // Import var gc_nMaxRow0 = AscCommon.gc_nMaxRow0; var gc_nMaxCol0 = AscCommon.gc_nMaxCol0; var g_oCellAddressUtils = AscCommon.g_oCellAddressUtils; var AscBrowser = AscCommon.AscBrowser; var c_oAscSelectionType = Asc.c_oAscSelectionType; /** @const */ var kLeftLim1 = .999999999999999; var MAX_EXCEL_INT = 1e308; var MIN_EXCEL_INT = -MAX_EXCEL_INT; var c_sPerDay = 86400; var c_msPerDay = c_sPerDay * 1000; /** @const */ var kUndefinedL = "undefined"; /** @const */ var kNullL = "null"; /** @const */ var kObjectL = "object"; /** @const */ var kFunctionL = "function"; /** @const */ var kNumberL = "number"; /** @const */ var kArrayL = "array"; var recalcType = { recalc: 0, // без пересчета full: 1, // пересчитываем все newLines: 2 // пересчитываем новые строки }; var sizePxinPt = 72 / 96; function applyFunction(callback) { if (kFunctionL === typeof callback) { callback.apply(null, Array.prototype.slice.call(arguments, 1)); } } function typeOf(obj) { if (obj === undefined) { return kUndefinedL; } if (obj === null) { return kNullL; } return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase(); } function lastIndexOf(s, regExp, fromIndex) { var end = fromIndex >= 0 && fromIndex <= s.length ? fromIndex : s.length; for (var i = end - 1; i >= 0; --i) { var j = s.slice(i, end).search(regExp); if (j >= 0) { return i + j; } } return -1; } function search(arr, fn) { for (var i = 0; i < arr.length; ++i) { if (fn(arr[i])) { return i; } } return -1; } function getUniqueRangeColor(arrRanges, curElem, tmpColors) { var colorIndex, j, range = arrRanges[curElem]; for (j = 0; j < curElem; ++j) { if (range.isEqual(arrRanges[j])) { colorIndex = tmpColors[j]; break; } } return colorIndex; } function getMinValueOrNull(val1, val2) { return null === val2 ? val1 : (null === val1 ? val2 : Math.min(val1, val2)); } function round(x) { var y = x + (x >= 0 ? .5 : -.5); return y | y; //return Math.round(x); } function floor(x) { var y = x | x; y -= x < 0 && y > x ? 1 : 0; return y + (x - y > kLeftLim1 ? 1 : 0); // to fix float number precision caused by binary presentation //return Math.floor(x); } function ceil(x) { var y = x | x; y += x > 0 && y < x ? 1 : 0; return y - (y - x > kLeftLim1 ? 1 : 0); // to fix float number precision caused by binary presentation //return Math.ceil(x); } function incDecFonSize(bIncrease, oValue) { // Закон изменения размеров : // Результатом должно быть ближайшее из отрезка [8,72] по следующим числам 8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72 // Если значение меньше или равно 8 и мы уменьшаем, то ничего не меняется // Если значение больше или равно 72 и мы увеличиваем, то ничего не меняется var aSizes = [8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72]; var nLength = aSizes.length; var i; if (true === bIncrease) { if (oValue >= aSizes[nLength - 1]) return null; for (i = 0; i < nLength; ++i) if (aSizes[i] > oValue) break; } else { if (oValue <= aSizes[0]) return null; for (i = nLength - 1; i >= 0; --i) if (aSizes[i] < oValue) break; } return aSizes[i]; } function calcDecades(num) { return Math.abs(num) < 10 ? 1 : 1 + calcDecades(floor(num * 0.1)); } function convertPtToPx(value) { value = value / sizePxinPt; value = (value * AscBrowser.retinaPixelRatio) >> 0; return value; } function convertPxToPt(value) { value = value * sizePxinPt; //пункты округляем до сотых value = Asc.ceil(value / AscBrowser.retinaPixelRatio * 100) / 100; return value; } // Определяет времени работы функции function profileTime(fn/*[, arguments]*/) { var start, end, arg = [], i; if (arguments.length) { if (arguments.length > 1) { for (i = 1; i < arguments.length; ++i) arg.push(arguments[i]); start = new Date(); fn.apply(window, arg); end = new Date(); } else { start = new Date(); fn(); end = new Date(); } return end.getTime() - start.getTime(); } return undefined; } function getMatchingBorder(border1, border2) { // ECMA-376 Part 1 17.4.67 tcBorders (Table Cell Borders) if (!border1) { return border2; } if (!border2) { return border1; } if (border1.w > border2.w) { return border1; } else if (border1.w < border2.w) { return border2; } var bc1 = border1.getColorOrDefault(); var bc2 = border2.getColorOrDefault(); var r1 = bc1.getR(), g1 = bc1.getG(), b1 = bc1.getB(); var r2 = bc2.getR(), g2 = bc2.getG(), b2 = bc2.getB(); var Brightness_1_1 = r1 + b1 + 2 * g1; var Brightness_1_2 = r2 + b2 + 2 * g2; if (Brightness_1_1 < Brightness_1_2) { return border1; } else if (Brightness_1_1 > Brightness_1_2) { return border2; } var Brightness_2_1 = Brightness_1_1 - r1; var Brightness_2_2 = Brightness_1_2 - r2; if (Brightness_2_1 < Brightness_2_2) { return border1; } else if (Brightness_2_1 > Brightness_2_2) { return border2; } var Brightness_3_1 = g1; var Brightness_3_2 = g2; if (Brightness_3_1 < Brightness_3_2) { return border1; } else if (Brightness_3_1 > Brightness_3_2) { return border2; } // borders equal return border1; } function WordSplitting(str) { var trueLetter = false; var index = 0; var wordsArray = []; var wordsIndexArray = []; for (var i = 0; i < str.length; i++) { var nCharCode = str.charCodeAt(i); if (AscCommon.g_aPunctuation[nCharCode] !== undefined || nCharCode === 32 || nCharCode === 10) { if (trueLetter) { trueLetter = false; index++; } } else { if (trueLetter === false) { wordsIndexArray.push(i); } trueLetter = true; wordsArray[index] = wordsArray[index] || ""; wordsArray[index] = wordsArray[index] + str[i]; } } return { wordsArray: wordsArray, wordsIndex: wordsIndexArray }; } function replaceSpellCheckWords(cellValue, options) { // ToDo replace one command if (1 === options.indexInArray && options.replaceWith) { cellValue = options.replaceWith; } else { for (var i = 0; i < options.replaceWords.length; ++i) { cellValue = cellValue.replace(options.replaceWords[i][0], function () { return options.replaceWords[i][1]; }); } } return cellValue; } function getFindRegExp(value, options, checkEmptyVal) { var findFlags = "g"; // Заменяем все вхождения // Не чувствителен к регистру if (true !== options.isMatchCase) { findFlags += "i"; } if (value === "" && checkEmptyVal) { value = /^$/; } else { value = value .replace(/(\\)/g, "\\\\").replace(/(\^)/g, "\\^") .replace(/(\()/g, "\\(").replace(/(\))/g, "\\)") .replace(/(\+)/g, "\\+").replace(/(\[)/g, "\\[") .replace(/(\])/g, "\\]").replace(/(\{)/g, "\\{") .replace(/(\})/g, "\\}").replace(/(\$)/g, "\\$") .replace(/(\.)/g, "\\.") .replace(/(~)?\*/g, function ($0, $1) { return $1 ? $0 : '(.*)'; }) .replace(/(~)?\?/g, function ($0, $1) { return $1 ? $0 : '.'; }) .replace(/(~\*)/g, "\\*").replace(/(~\?)/g, "\\?"); } if (options.isWholeWord) value = '\\b' + value + '\\b'; return new RegExp(value, findFlags); } function convertFillToUnifill(fill) { var oUniFill = null; if (!fill) { return AscFormat.CreateNoFillUniFill(); } var oSF = fill.getSolidFill(); if (oSF) { oUniFill = new AscFormat.CreateSolidFillRGBA(oSF.getR(), oSF.getG(), oSF.getB(), Math.min(255, 255 * oSF.getA() + 0.5 >> 0)); } else if (fill.patternFill) { oUniFill = new AscFormat.CUniFill(); oUniFill.fill = new AscFormat.CPattFill(); oUniFill.fill.ftype = fill.patternFill.getHatchOffset(); oUniFill.fill.fgClr = AscFormat.CreateUniColorRGB2(fill.patternFill.fgColor || AscCommonExcel.createRgbColor(0, 0, 0)); oUniFill.fill.bgClr = AscFormat.CreateUniColorRGB2(fill.patternFill.bgColor || AscCommonExcel.createRgbColor(255, 255, 255)); } else if (fill.gradientFill) { oUniFill = new AscFormat.CUniFill(); oUniFill.fill = new AscFormat.CGradFill(); if (fill.gradientFill.type === Asc.c_oAscFillGradType.GRAD_LINEAR) { oUniFill.fill.lin = new AscFormat.GradLin(); oUniFill.fill.lin.angle = fill.gradientFill.degree * 60000; } else { oUniFill.fill.path = new AscFormat.GradPath(); } for (var i = 0; i < fill.gradientFill.stop.length; ++i) { var oGradStop = new AscFormat.CGs(); oGradStop.pos = fill.gradientFill.stop[i].position * 100000; oGradStop.color = AscFormat.CreateUniColorRGB2(fill.gradientFill.stop[i].color || AscCommonExcel.createRgbColor(255, 255, 255)); oUniFill.fill.addColor(oGradStop); } } return oUniFill; } function getFullHyperlinkLength(str) { var res = 0; if (!str) { return res; } var validStr = "ABCDEFabcdef0123456789"; //new RegExp('/^[xX]?[0-9a-fA-F]{6}$/', 'g') var checkHex = function (_val) { if (_val !== undefined && validStr.indexOf(_val) !== -1) { return true; } return false; }; for (var i = 0; i < str.length; i++) { if (str[i] === "%") { if (checkHex(str[i + 1]) && checkHex(str[i + 2])) { res++; } else { res += 3; } } else { res++; } } return res; } var referenceType = { A: 0, // Absolute ARRC: 1, // Absolute row; relative column RRAC: 2, // Relative row; absolute column R: 3 // Relative }; /** * Rectangle region of cells * @constructor * @memberOf Asc * @param c1 {Number} Left side of range. * @param r1 {Number} Top side of range. * @param c2 {Number} Right side of range (inclusively). * @param r2 {Number} Bottom side of range (inclusively). * @param normalize {Boolean=} Optional. If true, range will be converted to form (left,top) - (right,bottom). * @return {Range} */ function Range(c1, r1, c2, r2, normalize) { if (!(this instanceof Range)) { return new Range(c1, r1, c2, r2, normalize); } /** @type Number */ this.c1 = c1; /** @type Number */ this.r1 = r1; /** @type Number */ this.c2 = c2; /** @type Number */ this.r2 = r2; this.refType1 = referenceType.R; this.refType2 = referenceType.R; return normalize ? this.normalize() : this; } Range.prototype.compareCell = function (c1, r1, c2, r2) { var dif = r1 - r2; return 0 !== dif ? dif : c1 - c2; }; Range.prototype.compareByLeftTop = function (a, b) { return Range.prototype.compareCell(a.c1, a.r1, b.c1, b.r1); }; Range.prototype.compareByRightTop = function (a, b) { return Range.prototype.compareCell(a.c2, a.r1, b.c2, b.r1); }; Range.prototype.compareByLeftBottom = function (a, b) { return Range.prototype.compareCell(a.c1, a.r2, b.c1, b.r2); }; Range.prototype.compareByRightBottom = function (a, b) { return Range.prototype.compareCell(a.c2, a.r2, b.c2, b.r2); }; Range.prototype.assign = function (c1, r1, c2, r2, normalize) { this.c1 = c1; this.r1 = r1; this.c2 = c2; this.r2 = r2; return normalize ? this.normalize() : this; }; Range.prototype.assign2 = function (range) { this.refType1 = range.refType1; this.refType2 = range.refType2; return this.assign(range.c1, range.r1, range.c2, range.r2); }; Range.prototype.clone = function (normalize) { var oRes = new Range(this.c1, this.r1, this.c2, this.r2, normalize); oRes.refType1 = this.refType1; oRes.refType2 = this.refType2; return oRes; }; Range.prototype.normalize = function () { var tmp; if (this.c1 > this.c2) { tmp = this.c1; this.c1 = this.c2; this.c2 = tmp; } if (this.r1 > this.r2) { tmp = this.r1; this.r1 = this.r2; this.r2 = tmp; } return this; }; Range.prototype.isEqual = function (range) { return range && this.c1 === range.c1 && this.r1 === range.r1 && this.c2 === range.c2 && this.r2 === range.r2; }; Range.prototype.isEqualCols = function (range) { return range && this.c1 === range.c1 && this.c2 === range.c2; }; Range.prototype.isEqualRows = function (range) { return range && this.r1 === range.r1 && this.r2 === range.r2; }; Range.prototype.isNeighbor = function (range) { if (this.isEqualCols(range)) { if (this.r2 === range.r1 - 1 || range.r2 === this.r1 - 1) { return true; } } else if (this.isEqualRows(range)) { if (this.c2 === range.c1 - 1 || range.c2 === this.c1 - 1) { return true; } } return false; }; Range.prototype.isEqualAll = function (range) { return this.isEqual(range) && this.refType1 === range.refType1 && this.refType2 === range.refType2; }; Range.prototype.isEqualWithOffsetRow = function (range, offsetRow) { return this.c1 === range.c1 && this.c2 === range.c2 && this.isAbsC1() === range.isAbsC1() && this.isAbsC2() === range.isAbsC2() && this.isAbsR1() === range.isAbsR1() && this.isAbsR2() === range.isAbsR2() && (((this.isAbsR1() ? this.r1 === range.r1 : this.r1 + offsetRow === range.r1) && (this.isAbsR2() ? this.r2 === range.r2 : this.r2 + offsetRow === range.r2)) || (this.r1 === 0 && this.r2 === gc_nMaxRow0 && this.r1 === range.r1 && this.r2 === range.r2)); }; Range.prototype.contains = function (c, r) { return this.c1 <= c && c <= this.c2 && this.r1 <= r && r <= this.r2; }; Range.prototype.contains2 = function (cell) { return this.contains(cell.col, cell.row); }; Range.prototype.containsCol = function (c) { return this.c1 <= c && c <= this.c2; }; Range.prototype.containsRow = function (r) { return this.r1 <= r && r <= this.r2; }; Range.prototype.containsRange = function (range) { return this.contains(range.c1, range.r1) && this.contains(range.c2, range.r2); }; Range.prototype.containsRanges = function (ranges) { if (ranges && ranges.length) { for (var i = 0; i < ranges.length; i++) { if (!this.containsRange(ranges[i])) { return false; } } return true; } return false; }; Range.prototype.containsFirstLineRange = function (range) { return this.contains(range.c1, range.r1) && this.contains(range.c2, range.r1); }; Range.prototype.intersection = function (range) { var s1 = this.clone(true), s2 = range instanceof Range ? range.clone(true) : new Range(range.c1, range.r1, range.c2, range.r2, true); if (s2.c1 > s1.c2 || s2.c2 < s1.c1 || s2.r1 > s1.r2 || s2.r2 < s1.r1) { return null; } return new Range(s2.c1 >= s1.c1 && s2.c1 <= s1.c2 ? s2.c1 : s1.c1, s2.r1 >= s1.r1 && s2.r1 <= s1.r2 ? s2.r1 : s1.r1, Math.min(s1.c2, s2.c2), Math.min(s1.r2, s2.r2)); }; Range.prototype.intersectionSimple = function (range) { var oRes = null; var r1 = Math.max(this.r1, range.r1); var c1 = Math.max(this.c1, range.c1); var r2 = Math.min(this.r2, range.r2); var c2 = Math.min(this.c2, range.c2); if (r1 <= r2 && c1 <= c2) { oRes = new Range(c1, r1, c2, r2); } return oRes; }; Range.prototype.isIntersect = function (range) { var bRes = true; if (range.r2 < this.r1 || this.r2 < range.r1) { bRes = false; } else if (range.c2 < this.c1 || this.c2 < range.c1) { bRes = false; } return bRes; }; Range.prototype.isIntersectForInsertColRow = function (range, isInsertCol) { var bRes = true; if (range.r2 < this.r1 || this.r2 < range.r1) bRes = false; else if (range.c2 < this.c1 || this.c2 < range.c1) bRes = false; else if (isInsertCol && (this.c1 >= range.c1)) bRes = false; else if (!isInsertCol && (this.r1 >= range.r1)) bRes = false; return bRes; }; Range.prototype.isIntersectWithRanges = function (ranges, exceptionIndex) { if (ranges) { for (var i = 0; i < ranges.length; i++) { if ((null == exceptionIndex || (null != exceptionIndex && i !== exceptionIndex)) && this.isIntersect(ranges[i])) { return true; } } } return false; }; Range.prototype.isIntersectForShift = function (range, offset) { var isHor = offset && offset.col; var isDelete = offset && (offset.col < 0 || offset.row < 0); if (isHor) { if (this.r1 <= range.r1 && range.r2 <= this.r2 && this.c1 <= range.c2) { return true; } else if (isDelete && this.c1 <= range.c1 && range.c2 <= this.c2) { var topIn = this.r1 <= range.r1 && range.r1 <= this.r2; var bottomIn = this.r1 <= range.r2 && range.r2 <= this.r2; return topIn || bottomIn; } } else { if (this.c1 <= range.c1 && range.c2 <= this.c2 && this.r1 <= range.r2) { return true; } else if (isDelete && this.r1 <= range.r1 && range.r2 <= this.r2) { var leftIn = this.c1 <= range.c1 && range.c1 <= this.c2; var rightIn = this.c1 <= range.c2 && range.c2 <= this.c2; return leftIn || rightIn; } } return false; }; Range.prototype.difference = function (range) { var res = []; var intersect; if (this.r1 > 0) { intersect = new Range(0, 0, gc_nMaxCol0, this.r1 - 1).intersectionSimple(range); if (intersect) { res.push(intersect); } } if (this.c1 > 0) { intersect = new Range(0, this.r1, this.c1 - 1, this.r2).intersectionSimple(range); if (intersect) { res.push(intersect); } } if (this.c2 < gc_nMaxCol0) { intersect = new Range(this.c2 + 1, this.r1, gc_nMaxCol0, this.r2).intersectionSimple(range); if (intersect) { res.push(intersect); } } if (this.r2 < gc_nMaxRow0) { intersect = new Range(0, this.r2 + 1, gc_nMaxCol0, gc_nMaxRow0).intersectionSimple(range); if (intersect) { res.push(intersect); } } return res; }; Range.prototype.isIntersectForShiftCell = function (col, row, offset) { var isHor = offset && 0 != offset.col; if (isHor) { return this.r1 <= row && row <= this.r2 && this.c1 <= col; } else { return this.c1 <= col && col <= this.c2 && this.r1 <= row; } }; Range.prototype.forShift = function (bbox, offset, bUndo) { var isNoDelete = true; var isHor = 0 != offset.col; var toDelete = offset.col < 0 || offset.row < 0; var isLastRow = this.r2 === gc_nMaxRow0; var isLastCol = this.c2 === gc_nMaxCol0; if (isHor) { if (toDelete) { if (this.c1 < bbox.c1) { if (this.c2 <= bbox.c2) { this.setOffsetLast(new AscCommon.CellBase(0, -(this.c2 - bbox.c1 + 1))); } else { this.setOffsetLast(offset); } } else if (this.c1 <= bbox.c2) { if (this.c2 <= bbox.c2) { if (!bUndo) { var topIn = bbox.r1 <= this.r1 && this.r1 <= bbox.r2; var bottomIn = bbox.r1 <= this.r2 && this.r2 <= bbox.r2; if (topIn && bottomIn) { isNoDelete = false; } else if (topIn) { this.setOffsetFirst(new AscCommon.CellBase(bbox.r2 - this.r1 + 1, 0)); } else if (bottomIn) { this.setOffsetLast(new AscCommon.CellBase(bbox.r1 - this.r2 - 1, 0)); } } } else { this.setOffsetFirst(new AscCommon.CellBase(0, bbox.c1 - this.c1)); this.setOffsetLast(offset); } } else { this.setOffset(offset); } } else { if (this.c1 < bbox.c1) { this.setOffsetLast(offset); } else { if (this.c1 + offset.col <= gc_nMaxCol0) { this.setOffset(offset); } else { isNoDelete = false; } } } } else { if (toDelete) { if (this.r1 < bbox.r1) { if (this.r2 <= bbox.r2) { this.setOffsetLast(new AscCommon.CellBase(-(this.r2 - bbox.r1 + 1), 0)); } else { this.setOffsetLast(offset); } } else if (this.r1 <= bbox.r2) { if (this.r2 <= bbox.r2) { if (!bUndo) { var leftIn = bbox.c1 <= this.c1 && this.c1 <= bbox.c2; var rightIn = bbox.c1 <= this.c2 && this.c2 <= bbox.c2; if (leftIn && rightIn) { isNoDelete = false; } else if (leftIn) { this.setOffsetFirst(new AscCommon.CellBase(0, bbox.c2 - this.c1 + 1)); } else if (rightIn) { this.setOffsetLast(new AscCommon.CellBase(0, bbox.c1 - this.c2 - 1)); } } } else { this.setOffsetFirst(new AscCommon.CellBase(bbox.r1 - this.r1, 0)); this.setOffsetLast(offset); } } else { this.setOffset(offset); } } else { if (this.r1 < bbox.r1) { this.setOffsetLast(offset); } else { if (this.r1 + offset.row <= gc_nMaxRow0) { this.setOffset(offset); } else { isNoDelete = false; } } } } //range sticks to the gc_nMaxRow0/gc_nMaxCol0(but not to 0) and cannot be shifted if (isLastRow) { this.r2 = gc_nMaxRow0; } if (isLastCol) { this.c2 = gc_nMaxCol0; } return isNoDelete; }; Range.prototype.isOneCell = function () { return this.r1 === this.r2 && this.c1 === this.c2; }; Range.prototype.isOneCol = function () { return this.c1 === this.c2; }; Range.prototype.isOneRow = function () { return this.r1 === this.r2; }; Range.prototype.isOnTheEdge = function (c, r) { return this.r1 === r || this.r2 === r || this.c1 === c || this.c2 === c; }; Range.prototype.union = function (range) { var s1 = this.clone(true), s2 = range instanceof Range ? range.clone(true) : new Range(range.c1, range.r1, range.c2, range.r2, true); return new Range(Math.min(s1.c1, s2.c1), Math.min(s1.r1, s2.r1), Math.max(s1.c2, s2.c2), Math.max(s1.r2, s2.r2)); }; Range.prototype.union2 = function (range) { this.c1 = Math.min(this.c1, range.c1); this.c2 = Math.max(this.c2, range.c2); this.r1 = Math.min(this.r1, range.r1); this.r2 = Math.max(this.r2, range.r2); }; Range.prototype.union3 = function (c, r) { this.c1 = Math.min(this.c1, c); this.c2 = Math.max(this.c2, c); this.r1 = Math.min(this.r1, r); this.r2 = Math.max(this.r2, r); }; Range.prototype.setOffsetWithAbs = function (offset, opt_canResize, opt_circle) { var temp; var row = offset.row; var col = offset.col; //todo offset A1048576:A1 (row = 1 -> A1:A2; row = -1 -> A1048575:A1048576) if (0 === this.r1 && gc_nMaxRow0 === this.r2) { //full sheet is 1:1048576 but row is valid for it row = 0; } else if (0 === this.c1 && gc_nMaxCol0 === this.c2) { col = 0; } var isAbsRow1 = this.isAbsRow(this.refType1); var isAbsCol1 = this.isAbsCol(this.refType1); var isAbsRow2 = this.isAbsRow(this.refType2); var isAbsCol2 = this.isAbsCol(this.refType2); if (!isAbsRow1) { this.r1 += row; if (this.r1 < 0) { if (opt_circle) { this.r1 += gc_nMaxRow0 + 1; } else { this.r1 = 0; if (!opt_canResize) { return false; } } } if (this.r1 > gc_nMaxRow0) { if (opt_circle) { this.r1 -= gc_nMaxRow0 + 1; } else { this.r1 = gc_nMaxRow0; return false; } } } if (!isAbsCol1) { this.c1 += col; if (this.c1 < 0) { if (opt_circle) { this.c1 += gc_nMaxCol0 + 1; } else { this.c1 = 0; if (!opt_canResize) { return false; } } } if (this.c1 > gc_nMaxCol0) { if (opt_circle) { this.c1 -= gc_nMaxCol0 + 1; } else { this.c1 = gc_nMaxCol0; return false; } } } if (!isAbsRow2) { this.r2 += row; if (this.r2 < 0) { if (opt_circle) { this.r2 += gc_nMaxRow0 + 1; } else { this.r2 = 0; return false; } } if (this.r2 > gc_nMaxRow0) { if (opt_circle) { this.r2 -= gc_nMaxRow0 + 1; } else { this.r2 = gc_nMaxRow0; if (!opt_canResize) { return false; } } } } if (!isAbsCol2) { this.c2 += col; if (this.c2 < 0) { if (opt_circle) { this.c2 += gc_nMaxCol0 + 1; } else { this.c2 = 0; return false; } } if (this.c2 > gc_nMaxCol0) { if (opt_circle) { this.c2 -= gc_nMaxCol0 + 1; } else { this.c2 = gc_nMaxCol0; if (!opt_canResize) { return false; } } } } //switch abs flag if (this.r1 > this.r2) { temp = this.r1; this.r1 = this.r2; this.r2 = temp; if (!isAbsRow1 && isAbsRow2) { isAbsRow1 = !isAbsRow1; isAbsRow2 = !isAbsRow2; this.setAbs(isAbsRow1, isAbsCol1, isAbsRow2, isAbsCol2); } } if (this.c1 > this.c2) { temp = this.c1; this.c1 = this.c2; this.c2 = temp; if (!isAbsCol1 && isAbsCol2) { isAbsCol1 = !isAbsCol1; isAbsCol2 = !isAbsCol2; this.setAbs(isAbsRow1, isAbsCol1, isAbsRow2, isAbsCol2); } } return true; }; Range.prototype.setOffset = function (offset) { if (this.r1 == 0 && this.r2 == gc_nMaxRow0 && offset.row != 0 || this.c1 == 0 && this.c2 == gc_nMaxCol0 && offset.col != 0) { return; } this.setOffsetFirst(offset); this.setOffsetLast(offset); }; Range.prototype.setOffsetFirst = function (offset) { this.c1 += offset.col; if (this.c1 < 0) { this.c1 = 0; } if (this.c1 > gc_nMaxCol0) { this.c1 = gc_nMaxCol0; } this.r1 += offset.row; if (this.r1 < 0) { this.r1 = 0; } if (this.r1 > gc_nMaxRow0) { this.r1 = gc_nMaxRow0; } }; Range.prototype.setOffsetLast = function (offset) { this.c2 += offset.col; if (this.c2 < 0) { this.c2 = 0; } if (this.c2 > gc_nMaxCol0) { this.c2 = gc_nMaxCol0; } this.r2 += offset.row; if (this.r2 < 0) { this.r2 = 0; } if (this.r2 > gc_nMaxRow0) { this.r2 = gc_nMaxRow0; } }; Range.prototype._getName = function (val, isCol, abs) { var isR1C1Mode = AscCommonExcel.g_R1C1Mode; val += 1; if (isCol && !isR1C1Mode) { val = g_oCellAddressUtils.colnumToColstr(val); } return (isR1C1Mode ? (isCol ? 'C' : 'R') : '') + (abs ? (isR1C1Mode ? val : '$' + val) : (isR1C1Mode ? ((0 !== (val = (val - (isCol ? AscCommonExcel.g_ActiveCell.c1 : AscCommonExcel.g_ActiveCell.r1) - 1))) ? '[' + val + ']' : '') : val)); }; Range.prototype.getName = function (refType) { var isR1C1Mode = AscCommonExcel.g_R1C1Mode; var c, r, type = this.getType(); var sRes = ""; var c1Abs, c2Abs, r1Abs, r2Abs; if (referenceType.A === refType) { c1Abs = c2Abs = r1Abs = r2Abs = true; } else if (referenceType.R === refType) { c1Abs = c2Abs = r1Abs = r2Abs = false; } else { c1Abs = this.isAbsCol(this.refType1); c2Abs = this.isAbsCol(this.refType2); r1Abs = this.isAbsRow(this.refType1); r2Abs = this.isAbsRow(this.refType2); } if ((c_oAscSelectionType.RangeMax === type || c_oAscSelectionType.RangeRow === type) && c1Abs === c2Abs) { sRes = this._getName(this.r1, false, r1Abs); if (this.r1 !== this.r2 || r1Abs !== r2Abs || !isR1C1Mode) { sRes += ':' + this._getName(this.r2, false, r2Abs); } } else if ((c_oAscSelectionType.RangeMax === type || c_oAscSelectionType.RangeCol === type) && r1Abs === r2Abs) { sRes = this._getName(this.c1, true, c1Abs); if (this.c1 !== this.c2 || c1Abs !== c2Abs || !isR1C1Mode) { sRes += ':' + this._getName(this.c2, true, c2Abs); } } else { r = this._getName(this.r1, false, r1Abs); c = this._getName(this.c1, true, c1Abs); sRes = isR1C1Mode ? r + c : c + r; if (!this.isOneCell() || r1Abs !== r2Abs || c1Abs !== c2Abs) { r = this._getName(this.r2, false, r2Abs); c = this._getName(this.c2, true, c2Abs); sRes += ':' + (isR1C1Mode ? r + c : c + r); } } return sRes; }; Range.prototype.getAbsName = function () { return this.getName(referenceType.A); }; Range.prototype.getType = function () { var bRow = 0 === this.c1 && gc_nMaxCol0 === this.c2; var bCol = 0 === this.r1 && gc_nMaxRow0 === this.r2; var res; if (bCol && bRow) { res = c_oAscSelectionType.RangeMax; } else if (bCol) { res = c_oAscSelectionType.RangeCol; } else if (bRow) { res = c_oAscSelectionType.RangeRow; } else { res = c_oAscSelectionType.RangeCells; } return res; }; Range.prototype.getSharedRange = function (sharedRef, c, r) { var isAbsR1 = this.isAbsR1(); var isAbsC1 = this.isAbsC1(); var isAbsR2 = this.isAbsR2(); var isAbsC2 = this.isAbsC2(); if (this.r1 === 0 && this.r2 === gc_nMaxRow0) { isAbsR1 = isAbsR2 = true; } if (this.c1 === 0 && this.c2 === gc_nMaxCol0) { isAbsC1 = isAbsC2 = true; } var r1 = isAbsR2 ? sharedRef.r1 : Math.max(sharedRef.r2 + (r - this.r2), sharedRef.r1); var c1 = isAbsC2 ? sharedRef.c1 : Math.max(sharedRef.c2 + (c - this.c2), sharedRef.c1); var r2 = isAbsR1 ? sharedRef.r2 : Math.min(sharedRef.r1 + (r - this.r1), sharedRef.r2); var c2 = isAbsC1 ? sharedRef.c2 : Math.min(sharedRef.c1 + (c - this.c1), sharedRef.c2); return new Range(c1, r1, c2, r2); }; Range.prototype.getSharedRangeBbox = function (ref, base) { var res = this.clone(); var shiftBase; var offset = new AscCommon.CellBase(ref.r1 - base.nRow, ref.c1 - base.nCol); if (!offset.isEmpty()) { shiftBase = this.clone(); shiftBase.setOffsetWithAbs(offset, false, false); } offset.row = ref.r2 - base.nRow; offset.col = ref.c2 - base.nCol; res.setOffsetWithAbs(offset, false, false); res.union2(shiftBase ? shiftBase : this); return res; }; Range.prototype.getSharedIntersect = function (sharedRef, bbox) { var leftTop = this.getSharedRange(sharedRef, bbox.c1, bbox.r1); var rightBottom = this.getSharedRange(sharedRef, bbox.c2, bbox.r2); return leftTop.union(rightBottom); }; Range.prototype.setAbs = function (absRow1, absCol1, absRow2, absCol2) { this.refType1 = (absRow1 ? 0 : 2) + (absCol1 ? 0 : 1); this.refType2 = (absRow2 ? 0 : 2) + (absCol2 ? 0 : 1); }; Range.prototype.isAbsCol = function (refType) { return (refType === referenceType.A || refType === referenceType.RRAC); }; Range.prototype.isAbsRow = function (refType) { return (refType === referenceType.A || refType === referenceType.ARRC); }; Range.prototype.isAbsR1 = function () { return this.isAbsRow(this.refType1); }; Range.prototype.isAbsC1 = function () { return this.isAbsCol(this.refType1); }; Range.prototype.isAbsR2 = function () { return this.isAbsRow(this.refType2); }; Range.prototype.isAbsC2 = function () { return this.isAbsCol(this.refType2); }; Range.prototype.isAbsAll = function () { return this.isAbsR1() && this.isAbsC1() && this.isAbsR2() && this.isAbsC2(); }; Range.prototype.switchReference = function () { this.refType1 = (this.refType1 + 1) % 4; this.refType2 = (this.refType2 + 1) % 4; }; Range.prototype.getWidth = function () { return this.c2 - this.c1 + 1; }; Range.prototype.getHeight = function () { return this.r2 - this.r1 + 1; }; Range.prototype.transpose = function (startCol, startRow) { if (startCol === undefined) { startCol = this.c1; } if (startRow === undefined) { startRow = this.r1; } var row0 = this.c1 - startCol + startRow; var col0 = this.r1 - startRow + startCol; return new Range(col0, row0, col0 + (this.r2 - this.r1), row0 + (this.c2 - this.c1)); }; Range.prototype.sliceAfter = function (col, row) { let res = null; if (col !== this.c2) { if (!res) { res = []; } res.push(new Range(col + 1, row, this.c2, row)); } if (row !== this.r2) { if (!res) { res = []; } res.push(new Range(this.c1, row + 1, this.c2, this.r2)); } return res; }; /** * Adjusts range coordinates based on removed rows or columns * @param {Range} deleteRange Range being deleted * @param {Boolean} isRow True if deleting rows, false if deleting columns * @returns {Range|null} Adjusted range or null if range should be deleted */ Range.prototype.adjustRange = function(deleteRange, isRow) { if (!deleteRange) { return null; } // Clone range to avoid modifying original let newRange = this.clone(); if (isRow) { // Handle row deletion let deleteCount = deleteRange.r2 - deleteRange.r1 + 1; // Range is fully within deleted rows - return null if (this.r1 >= deleteRange.r1 && this.r2 <= deleteRange.r2) { return null; } // Adjust range start row if after deleted section if (this.r1 > deleteRange.r2) { newRange.r1 = Math.max(0, this.r1 - deleteCount); newRange.r2 = Math.max(0, this.r2 - deleteCount); } // Adjust range end row if crosses deleted section else if (this.r2 > deleteRange.r2) { newRange.r2 = Math.max(0, this.r2 - deleteCount); } // Adjust range end row if includes deleted section else if (this.r2 >= deleteRange.r1) { newRange.r2 = deleteRange.r1 - 1; } } else { // Handle column deletion let deleteCount = deleteRange.c2 - deleteRange.c1 + 1; // Range is fully within deleted columns - return null if (this.c1 >= deleteRange.c1 && this.c2 <= deleteRange.c2) { return null; } // Adjust range start column if after deleted section if (this.c1 > deleteRange.c2) { newRange.c1 = Math.max(0, this.c1 - deleteCount); newRange.c2 = Math.max(0, this.c2 - deleteCount); } // Adjust range end column if crosses deleted section else if (this.c2 > deleteRange.c2) { newRange.c2 = Math.max(0, this.c2 - deleteCount); } // Adjust range end column if includes deleted section else if (this.c2 >= deleteRange.c1) { newRange.c2 = deleteRange.c1 - 1; } } return newRange; }; /** * * @constructor * @extends {Range} */ function Range3D() { this.sheet = ''; this.sheet2 = ''; if (3 == arguments.length) { var range = arguments[0]; Range.call(this, range.c1, range.r1, range.c2, range.r2); // ToDo стоит пересмотреть конструкторы. this.refType1 = range.refType1; this.refType2 = range.refType2; this.sheet = arguments[1]; this.sheet2 = arguments[2]; } else if (arguments.length > 1) { Range.apply(this, arguments); } else { Range.call(this, 0, 0, 0, 0); } } Range3D.prototype = Object.create(Range.prototype); Range3D.prototype.constructor = Range3D; Range3D.prototype.isIntersect = function () { var oRes = true; if (2 == arguments.length) { oRes = this.sheet === arguments[1]; } return oRes && Range.prototype.isIntersect.apply(this, arguments); }; Range3D.prototype.clone = function () { return new Range3D(Range.prototype.clone.apply(this, arguments), this.sheet, this.sheet2); }; Range3D.prototype.setSheet = function (sheet, sheet2) { this.sheet = sheet; this.sheet2 = sheet2 ? sheet2 : sheet; }; Range3D.prototype.getName = function () { return AscCommon.parserHelp.get3DRef(this.sheet, Range.prototype.getName.apply(this)); }; /** * @constructor */ function SelectionRange(ws) { this.ranges = [new Range(0, 0, 0, 0)]; this.activeCell = new AscCommon.CellBase(0, 0); // Active cell this.activeCellId = 0; this.worksheet = ws; } SelectionRange.prototype.clean = function () { this.ranges = [new Range(0, 0, 0, 0)]; this.activeCellId = 0; this.activeCell.clean(); }; SelectionRange.prototype.contains = function (c, r) { return this.ranges.some(function (item) { return item.contains(c, r); }); }; SelectionRange.prototype.contains2 = function (cell) { return this.contains(cell.col, cell.row); }; SelectionRange.prototype.containsCol = function (c) { return this.ranges.some(function (item) { return item.containsCol(c); }); }; SelectionRange.prototype.containsRow = function (r) { return this.ranges.some(function (item) { return item.containsRow(r); }); }; SelectionRange.prototype.inContains = function (ranges) { return this.ranges.every(function (item1) { return ranges.some(function (item2) { return item2.containsRange(item1); }); }); }; SelectionRange.prototype.containsRange = function (range) { return this.ranges.some(function (item) { return item.containsRange(range); }); }; SelectionRange.prototype.clone = function (worksheet) { var res = new this.constructor(); res.ranges = this.ranges.map(function (range) { return range.clone(); }); res.activeCell = this.activeCell.clone(); res.activeCellId = this.activeCellId; res.worksheet = worksheet || this.worksheet; return res; }; SelectionRange.prototype.isEqual = function (range) { if (this.activeCellId !== range.activeCellId || !this.activeCell.isEqual(range.activeCell) || this.ranges.length !== range.ranges.length) { return false; } for (var i = 0; i < this.ranges.length; ++i) { if (!this.ranges[i].isEqual(range.ranges[i])) { return false; } } return true; }; SelectionRange.prototype.addRange = function () { this.activeCellId = this.ranges.push(new Range(0, 0, 0, 0)) - 1; this.activeCell.clean(); }; SelectionRange.prototype.assign2 = function (range) { this.clean(); this.getLast().assign2(range); this.update(); }; SelectionRange.prototype.union = function (range) { var res = this.ranges.some(function (item) { var success = false; if (item.c1 === range.c1 && item.c2 === range.c2) { if (range.r1 === item.r2 + 1) { item.r2 = range.r2; success = true; } else if (range.r2 === item.r1 - 1) { item.r1 = range.r1; success = true; } } else if (item.r1 === range.r1 && item.r2 === range.r2) { if (range.c1 === item.c2 + 1) { item.c2 = range.c2; success = true; } else if (range.c2 === item.c1 - 1) { item.c1 = range.c1; success = true; } } return success; }); if (!res) { this.addRange(); this.getLast().assign2(range); } }; SelectionRange.prototype.getUnion = function () { var result = new this.constructor(this.worksheet); var unionRanges = function (ranges, res) { for (var i = 0; i < ranges.length; ++i) { if (0 === i) { res.assign2(ranges[i]); } else { res.union(ranges[i]); } } }; unionRanges(this.ranges, result); var isUnion = true, resultTmp; while (isUnion && !result.isSingleRange()) { resultTmp = new this.constructor(this.worksheet); unionRanges(result.ranges, resultTmp); isUnion = result.ranges.length !== resultTmp.ranges.length; result = resultTmp; } return result; }; SelectionRange.prototype.offsetCell = function (dr, dc, changeRange, fCheckSize) { var done, curRange, mc, incompleate; // Check one cell if (1 === this.ranges.length) { curRange = this.ranges[this.activeCellId]; if (curRange.isOneCell()) { return 0; } else { mc = this.worksheet.getMergedByCell(this.activeCell.row, this.activeCell.col); if (mc && curRange.isEqual(mc)) { return 0; } } } var lastRow = this.activeCell.row; var lastCol = this.activeCell.col; this.activeCell.row += dr; this.activeCell.col += dc; while (!done) { done = true; curRange = this.ranges[this.activeCellId]; if (!curRange.contains2(this.activeCell)) { if (dr) { if (0 < dr) { this.activeCell.row = curRange.r1; this.activeCell.col += 1; } else { this.activeCell.row = curRange.r2; this.activeCell.col -= 1; } } else { if (0 < dc) { this.activeCell.row += 1; this.activeCell.col = curRange.c1; } else { this.activeCell.row -= 1; this.activeCell.col = curRange.c2; } } if (!curRange.contains2(this.activeCell)) { if (!changeRange) { this.activeCell.row = lastRow; this.activeCell.col = lastCol; return -1; } if (0 < dc || 0 < dr) { this.activeCellId += 1; this.activeCellId = (this.ranges.length > this.activeCellId) ? this.activeCellId : 0; curRange = this.ranges[this.activeCellId]; this.activeCell.row = curRange.r1; this.activeCell.col = curRange.c1; } else { this.activeCellId -= 1; this.activeCellId = (0 <= this.activeCellId) ? this.activeCellId : this.ranges.length - 1; curRange = this.ranges[this.activeCellId]; this.activeCell.row = curRange.r2; this.activeCell.col = curRange.c2; } } } mc = this.worksheet.getMergedByCell(this.activeCell.row, this.activeCell.col); if (mc) { incompleate = !curRange.containsRange(mc); if (dc > 0 && (incompleate || this.activeCell.col > mc.c1 || this.activeCell.row !== mc.r1)) { // Движение слева направо this.activeCell.col = mc.c2 + 1; done = false; } else if (dc < 0 && (incompleate || this.activeCell.col < mc.c2 || this.activeCell.row !== mc.r1)) { // Движение справа налево this.activeCell.col = mc.c1 - 1; done = false; } if (dr > 0 && (incompleate || this.activeCell.row > mc.r1 || this.activeCell.col !== mc.c1)) { // Движение сверху вниз this.activeCell.row = mc.r2 + 1; done = false; } else if (dr < 0 && (incompleate || this.activeCell.row < mc.r2 || this.activeCell.col !== mc.c1)) { // Движение снизу вверх this.activeCell.row = mc.r1 - 1; done = false; } } if (!done) { continue; } while (this.activeCell.col >= curRange.c1 && this.activeCell.col <= curRange.c2 && fCheckSize(-1, this.activeCell.col)) { this.activeCell.col += dc || (dr > 0 ? +1 : -1); done = false; } if (!done) { continue; } while (this.activeCell.row >= curRange.r1 && this.activeCell.row <= curRange.r2 && fCheckSize(this.activeCell.row, -1)) { this.activeCell.row += dr || (dc > 0 ? +1 : -1); done = false; } if (!done) { continue; } break; } return (lastRow !== this.activeCell.row || lastCol !== this.activeCell.col) ? 1 : -1; }; SelectionRange.prototype.setActiveCell = function (r, c) { this.activeCell.row = r; this.activeCell.col = c; this.update(); }; SelectionRange.prototype.validActiveCell = function () { var res = true; // Check active cell in merge cell for selection row or column (bug 36708) var mc = this.worksheet.getMergedByCell(this.activeCell.row, this.activeCell.col); if (mc) { var curRange = this.ranges[this.activeCellId]; if (!curRange.containsRange(mc)) { if (-1 === this.offsetCell(1, 0, false, function () { return false; })) { res = false; this.activeCell.row = mc.r1; this.activeCell.col = mc.c1; } } } return res; }; SelectionRange.prototype.getLast = function () { return this.ranges[this.ranges.length - 1]; }; SelectionRange.prototype.isSingleRange = function () { return 1 === this.ranges.length; }; SelectionRange.prototype.update = function () { //меняем выделеную ячейку, если она не входит в диапазон //возможно, в будующем придется пределать логику, пока нет примеров, когда это работает плохо var range = this.ranges[this.activeCellId]; if (!range || !range.contains(this.activeCell.col, this.activeCell.row)) { range = this.getLast(); this.activeCell.col = range.c1; this.activeCell.row = range.r1; this.activeCellId = this.ranges.length - 1; } }; SelectionRange.prototype.WriteToBinary = function (w) { w.WriteLong(this.ranges.length); for (var i = 0; i < this.ranges.length; ++i) { var range = this.ranges[i]; w.WriteLong(range.c1); w.WriteLong(range.r1); w.WriteLong(range.c2); w.WriteLong(range.r2); } w.WriteLong(this.activeCell.row); w.WriteLong(this.activeCell.col); w.WriteLong(this.activeCellId); }; SelectionRange.prototype.ReadFromBinary = function (r) { this.clean(); var count = r.GetLong(); var rangesNew = []; for (var i = 0; i < count; ++i) { var range = new Asc.Range(r.GetLong(), r.GetLong(), r.GetLong(), r.GetLong()); rangesNew.push(range); } if (rangesNew.length > 0) { this.ranges = rangesNew; } this.activeCell.row = r.GetLong(); this.activeCell.col = r.GetLong(); this.activeCellId = r.GetLong(); this.update(); }; SelectionRange.prototype.Select = function (doNotUpdate) { this.worksheet.selectionRange = this.clone(); !doNotUpdate && this.worksheet.workbook.handlers.trigger('updateSelection'); }; SelectionRange.prototype.isContainsOnlyFullRowOrCol = function (byCol) { var res = true; for (var i = 0; i < this.ranges.length; ++i) { var range = this.ranges[i]; var type = range.getType(); if (byCol && c_oAscSelectionType.RangeCol !== type) { res = false; break; } if (!byCol && c_oAscSelectionType.RangeRow !== type) { res = false; break; } } return res; }; SelectionRange.prototype.getSize = function () { let res = 0; this.ranges.forEach(function (item) { res += (item.r2 - item.r1 + 1) * (item.c2 - item.c1 + 1); }); return res; }; /** * * @constructor * @extends {Range} */ function ActiveRange() { if (1 == arguments.length) { var range = arguments[0]; Range.call(this, range.c1, range.r1, range.c2, range.r2); // ToDo стоит пересмотреть конструкторы. this.refType1 = range.refType1; this.refType2 = range.refType2; } else if (arguments.length > 1) Range.apply(this, arguments); else Range.call(this, 0, 0, 0, 0); this.startCol = 0; // Активная ячейка в выделении this.startRow = 0; // Активная ячейка в выделении this._updateAdditionalData(); } ActiveRange.prototype = Object.create(Range.prototype); ActiveRange.prototype.constructor = ActiveRange; ActiveRange.prototype.assign = function () { Range.prototype.assign.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype.assign2 = function () { Range.prototype.assign2.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype.clone = function () { var oRes = new ActiveRange(Range.prototype.clone.apply(this, arguments)); oRes.startCol = this.startCol; oRes.startRow = this.startRow; return oRes; }; ActiveRange.prototype.normalize = function () { Range.prototype.normalize.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype.isEqualAll = function () { var bRes = Range.prototype.isEqual.apply(this, arguments); if (bRes && arguments.length > 0) { var range = arguments[0]; bRes = this.startCol == range.startCol && this.startRow == range.startRow; } return bRes; }; ActiveRange.prototype.contains = function () { return Range.prototype.contains.apply(this, arguments); }; ActiveRange.prototype.containsRange = function () { return Range.prototype.containsRange.apply(this, arguments); }; ActiveRange.prototype.containsFirstLineRange = function () { return Range.prototype.containsFirstLineRange.apply(this, arguments); }; ActiveRange.prototype.intersection = function () { var oRes = Range.prototype.intersection.apply(this, arguments); if (null != oRes) { oRes = new ActiveRange(oRes); oRes._updateAdditionalData(); } return oRes; }; ActiveRange.prototype.intersectionSimple = function () { var oRes = Range.prototype.intersectionSimple.apply(this, arguments); if (null != oRes) { oRes = new ActiveRange(oRes); oRes._updateAdditionalData(); } return oRes; }; ActiveRange.prototype.union = function () { var oRes = new ActiveRange(Range.prototype.union.apply(this, arguments)); oRes._updateAdditionalData(); return oRes; }; ActiveRange.prototype.union2 = function () { Range.prototype.union2.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype.union3 = function () { Range.prototype.union3.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype.setOffset = function (offset) { this.setOffsetFirst(offset); this.setOffsetLast(offset); }; ActiveRange.prototype.setOffsetFirst = function (offset) { Range.prototype.setOffsetFirst.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype.setOffsetLast = function (offset) { Range.prototype.setOffsetLast.apply(this, arguments); this._updateAdditionalData(); return this; }; ActiveRange.prototype._updateAdditionalData = function () { //меняем выделеную ячейку, если она не входит в диапазон //возможно, в будующем придется пределать логику, пока нет примеров, когда это работает плохо if (!this.contains(this.startCol, this.startRow)) { this.startCol = this.c1; this.startRow = this.r1; } }; /** * * @constructor * @extends {Range} */ function FormulaRange() { if (1 == arguments.length) { var range = arguments[0]; Range.call(this, range.c1, range.r1, range.c2, range.r2); } else if (arguments.length > 1) Range.apply(this, arguments); else Range.call(this, 0, 0, 0, 0); this.refType1 = referenceType.R; this.refType2 = referenceType.R; } FormulaRange.prototype = Object.create(Range.prototype); FormulaRange.prototype.constructor = FormulaRange; FormulaRange.prototype.clone = function () { var oRes = new FormulaRange(Range.prototype.clone.apply(this, arguments)); oRes.refType1 = this.refType1; oRes.refType2 = this.refType2; return oRes; }; FormulaRange.prototype.intersection = function () { var oRes = Range.prototype.intersection.apply(this, arguments); if (null != oRes) oRes = new FormulaRange(oRes); return oRes; }; FormulaRange.prototype.intersectionSimple = function () { var oRes = Range.prototype.intersectionSimple.apply(this, arguments); if (null != oRes) oRes = new FormulaRange(oRes); return oRes; }; FormulaRange.prototype.union = function () { return new FormulaRange(Range.prototype.union.apply(this, arguments)); }; FormulaRange.prototype.getName = function () { var sRes = ""; var c1Abs = this.isAbsCol(this.refType1), c2Abs = this.isAbsCol(this.refType2); var r1Abs = this.isAbsRow(this.refType1), r2Abs = this.isAbsRow(this.refType2); if (0 == this.c1 && gc_nMaxCol0 == this.c2) { if (r1Abs) sRes += "$"; sRes += (this.r1 + 1) + ":"; if (r2Abs) sRes += "$"; sRes += (this.r2 + 1); } else if (0 == this.r1 && gc_nMaxRow0 == this.r2) { if (c1Abs) sRes += "$"; sRes += g_oCellAddressUtils.colnumToColstr(this.c1 + 1) + ":"; if (c2Abs) sRes += "$"; sRes += g_oCellAddressUtils.colnumToColstr(this.c2 + 1); } else { if (c1Abs) sRes += "$"; sRes += g_oCellAddressUtils.colnumToColstr(this.c1 + 1); if (r1Abs) sRes += "$"; sRes += (this.r1 + 1); if (!this.isOneCell()) { sRes += ":"; if (c2Abs) sRes += "$"; sRes += g_oCellAddressUtils.colnumToColstr(this.c2 + 1); if (r2Abs) sRes += "$"; sRes += (this.r2 + 1); } } return sRes; }; function MultiplyRange(ranges) { this.ranges = ranges; } MultiplyRange.prototype.clone = function () { return new MultiplyRange(this.ranges.slice()); }; MultiplyRange.prototype.union2 = function (multiplyRange) { if (!multiplyRange || !multiplyRange.ranges) { return; } for (var i = 0; i < multiplyRange.ranges.length; i++) { this.ranges.push(multiplyRange.ranges[i]); } }; MultiplyRange.prototype.isIntersect = function (range) { for (var i = 0; i < this.ranges.length; ++i) { if (range.isIntersect(this.ranges[i])) { return true; } } return false; }; MultiplyRange.prototype.contains = function (c, r) { for (var i = 0; i < this.ranges.length; ++i) { if (this.ranges[i].contains(c, r)) { return true; } } return false; }; MultiplyRange.prototype.getUnionRange = function () { if (0 === this.ranges.length) { return null; } var res = this.ranges[0].clone(); for (var i = 1; i < this.ranges.length; ++i) { res.union2(this.ranges[i]); } return res; }; MultiplyRange.prototype.unionByRowCol = function (_bCol) { if (0 === this.ranges.length) { return null; } if (1 === this.ranges.length) { return this.ranges; } var _ranges = this.ranges; var map = {}; var res = []; for (var i = 0; i < _ranges.length; i++) { for (var j = (_bCol ? _ranges[i].c1 : _ranges[i].r1); j <= (_bCol ? _ranges[i].c2 : _ranges[i].r2); j++) { if (!map[j]) { res.push(j); map[j] = 1; } } } res = res.sort(function (a, b) { return a - b; }); //объединяем var unionRanges = []; var start = null; var end = null; for (var n = 0; n < res.length; n++) { if (start === null) { start = res[n]; end = res[n]; } else if (res[n - 1] === res[n] - 1) { end++; } else { unionRanges.push(Asc.Range(_bCol ? start : 0, !_bCol ? start : 0, _bCol ? end : gc_nMaxCol0, !_bCol ? end : gc_nMaxRow0)); start = res[n]; end = res[n]; } if (n === res.length - 1) { unionRanges.push(Asc.Range(_bCol ? start : 0, !_bCol ? start : 0, _bCol ? end : gc_nMaxCol0, !_bCol ? end : gc_nMaxRow0)); } } return unionRanges.sort(function (a, b) { return _bCol ? b.c1 - a.c2 : b.r1 - a.r2; }); }; MultiplyRange.prototype.getUnionRanges = function() { let ranges = this.ranges; if (!ranges || ranges.length === 0) { return []; } if (ranges.length === 1) { return [ranges[0].clone()]; } const rangesByRow = new Array(ranges.length); for (let i = 0; i < ranges.length; i++) { rangesByRow[i] = ranges[i].clone(true); } // First sorting - by row starting position rangesByRow.sort(function(a, b) { return a.r1 - b.r1; }); // First merging pass - combine vertically aligned ranges const result = [rangesByRow[0]]; let currentRange = result[0]; for (let i = 1; i < rangesByRow.length; i++) { const range = rangesByRow[i]; // Check if ranges have same columns and are adjacent or overlapping rows if (range.c1 === currentRange.c1 && range.c2 === currentRange.c2 && range.r1 <= currentRange.r2 + 1) { // Extend current range down currentRange.r2 = Math.max(currentRange.r2, range.r2); } else { // Start new range if can't merge result.push(range); currentRange = range; } } // Second sorting - by column starting position result.sort(function(a, b) { return a.c1 - b.c1; }); // Second merging pass - combine horizontally aligned ranges const finalResult = [result[0]]; let currentHorRange = finalResult[0]; for (let i = 1; i < result.length; i++) { const range = result[i]; // Check if ranges have same rows and are adjacent or overlapping columns if (range.r1 === currentHorRange.r1 && range.r2 === currentHorRange.r2 && range.c1 <= currentHorRange.c2 + 1) { // Extend current range horizontally currentHorRange.c2 = Math.max(currentHorRange.c2, range.c2); } else { // Start new range if can't merge finalResult.push(range); currentHorRange = range; } } // Final merging pass - handle more complex overlapping cases let changed = true; let iterationRanges = finalResult.slice(); // Limit iterations to avoid excessive processing for (let iteration = 0; iteration < 3 && changed && iterationRanges.length > 1; iteration++) { changed = false; const tempRanges = []; for (let i = 0; i < iterationRanges.length; i++) { const currentRange = iterationRanges[i]; let merged = false; // Try to merge with ranges already in result for (let j = 0; j < tempRanges.length; j++) { const tempRange = tempRanges[j]; // Check for possible merging cases (same columns or same rows with adjacency) if ((tempRange.c1 === currentRange.c1 && tempRange.c2 === currentRange.c2 && (tempRange.r2 + 1 === currentRange.r1 || currentRange.r2 + 1 === tempRange.r1)) || (tempRange.r1 === currentRange.r1 && tempRange.r2 === currentRange.r2 && (tempRange.c2 + 1 === currentRange.c1 || currentRange.c2 + 1 === tempRange.c1))) { // Merge ranges by taking the outer boundaries tempRange.c1 = Math.min(tempRange.c1, currentRange.c1); tempRange.r1 = Math.min(tempRange.r1, currentRange.r1); tempRange.c2 = Math.max(tempRange.c2, currentRange.c2); tempRange.r2 = Math.max(tempRange.r2, currentRange.r2); merged = true; changed = true; break; // Exit inner loop once merged } } // Add to result if couldn't merge if (!merged) { tempRanges.push(currentRange); } } // Update working set for next iteration iterationRanges = tempRanges; } return iterationRanges; }; MultiplyRange.prototype.isNull = function () { if (!this.ranges || 0 === this.ranges.length || (1 === this.ranges.length && this.ranges[0] == null)) { return true; } return false; }; function VisibleRange(visibleRange, offsetX, offsetY) { this.visibleRange = visibleRange; this.offsetX = offsetX; this.offsetY = offsetY; } function RangeCache() { this.oCache = {}; } RangeCache.prototype.getAscRange = function (sRange) { return this._getRange(sRange, 1); }; RangeCache.prototype.getRange3D = function (sRange) { var res = AscCommon.parserHelp.parse3DRef(sRange); if (!res) { return null; } var range = this._getRange(res.range.toUpperCase(), 1); return range ? new Range3D(range, res.sheet, res.sheet2) : null; }; RangeCache.prototype.getActiveRange = function (sRange) { return this._getRange(sRange, 2); }; RangeCache.prototype.getRangesFromSqRef = function (sqRef) { var res = []; var refs = sqRef.split(' '); for (var i = 0; i < refs.length; ++i) { var ref = AscCommonExcel.g_oRangeCache.getAscRange(refs[i]); if (ref) { res.push(ref.clone()); } } return res; }; RangeCache.prototype.getFormulaRange = function (sRange) { return this._getRange(sRange, 3); }; RangeCache.prototype._getRange = function (sRange, type) { if (AscCommonExcel.g_R1C1Mode) { var o = { Formula: sRange, pCurrPos: 0 }; if (AscCommon.parserHelp.isArea.call(o, o.Formula, o.pCurrPos)) { sRange = o.real_str; } else if (AscCommon.parserHelp.isRef.call(o, o.Formula, o.pCurrPos)) { sRange = o.real_str; } } var oRes = null; var oCacheVal = this.oCache[sRange]; if (null == oCacheVal) { var oFirstAddr, oLastAddr; var bIsSingle = true; var nIndex = sRange.indexOf(":"); if (-1 != nIndex) { bIsSingle = false; oFirstAddr = g_oCellAddressUtils.getCellAddress(sRange.substring(0, nIndex)); oLastAddr = g_oCellAddressUtils.getCellAddress(sRange.substring(nIndex + 1)); } else { oFirstAddr = oLastAddr = g_oCellAddressUtils.getCellAddress(sRange); } oCacheVal = {first: null, last: null, ascRange: null, formulaRange: null, activeRange: null}; //последнее условие, чтобы не распознавалось "A", "1"(должно быть "A:A", "1:1") if (oFirstAddr.isValid() && oLastAddr.isValid() && (!bIsSingle || (!oFirstAddr.getIsRow() && !oFirstAddr.getIsCol()))) { oCacheVal.first = oFirstAddr; oCacheVal.last = oLastAddr; } this.oCache[sRange] = oCacheVal; } if (1 == type) { oRes = oCacheVal.ascRange; } else if (2 == type) { oRes = oCacheVal.activeRange; } else { oRes = oCacheVal.formulaRange; } if (null == oRes && null != oCacheVal.first && null != oCacheVal.last) { var r1 = oCacheVal.first.getRow0(), r2 = oCacheVal.last.getRow0(), c1 = oCacheVal.first.getCol0(), c2 = oCacheVal.last.getCol0(); var r1Abs = oCacheVal.first.getRowAbs(), r2Abs = oCacheVal.last.getRowAbs(), c1Abs = oCacheVal.first.getColAbs(), c2Abs = oCacheVal.last.getColAbs(); if (oCacheVal.first.getIsRow() && oCacheVal.last.getIsRow()) { c1 = 0; c2 = gc_nMaxCol0; } if (oCacheVal.first.getIsCol() && oCacheVal.last.getIsCol()) { r1 = 0; r2 = gc_nMaxRow0; } if (r1 > r2) { var temp = r1; r1 = r2; r2 = temp; temp = r1Abs; r1Abs = r2Abs; r2Abs = temp; } if (c1 > c2) { var temp = c1; c1 = c2; c2 = temp; temp = c1Abs; c1Abs = c2Abs; c2Abs = temp; } if (1 == type) { if (null == oCacheVal.ascRange) { var oAscRange = new Range(c1, r1, c2, r2); oAscRange.setAbs(r1Abs, c1Abs, r2Abs, c2Abs); oCacheVal.ascRange = oAscRange; } oRes = oCacheVal.ascRange; } else if (2 == type) { if (null == oCacheVal.activeRange) { var oActiveRange = new ActiveRange(c1, r1, c2, r2); oActiveRange.setAbs(r1Abs, c1Abs, r2Abs, c2Abs); oActiveRange.startCol = oActiveRange.c1; oActiveRange.startRow = oActiveRange.r1; oCacheVal.activeRange = oActiveRange; } oRes = oCacheVal.activeRange; } else { if (null == oCacheVal.formulaRange) { var oFormulaRange = new FormulaRange(c1, r1, c2, r2); oFormulaRange.setAbs(r1Abs, c1Abs, r2Abs, c2Abs); oCacheVal.formulaRange = oFormulaRange; } oRes = oCacheVal.formulaRange; } } return oRes; }; var g_oRangeCache = new RangeCache(); /** * @constructor * @memberOf Asc */ function HandlersList(handlers) { if (!(this instanceof HandlersList)) { return new HandlersList(handlers); } this.handlers = handlers || {}; return this; } HandlersList.prototype = { constructor: HandlersList, trigger: function (eventName) { var h = this.handlers[eventName], t = typeOf(h), a = Array.prototype.slice.call(arguments, 1), i; if (t === kFunctionL) { return h.apply(this, a); } if (t === kArrayL) { for (i = 0; i < h.length; i += 1) { if (typeOf(h[i]) === kFunctionL) { h[i].apply(this, a); } } return true; } return false; }, add: function (eventName, eventHandler, replaceOldHandler) { var th = this.handlers, h, old, t; if (replaceOldHandler || !th.hasOwnProperty(eventName)) { th[eventName] = eventHandler; } else { old = h = th[eventName]; t = typeOf(old); if (t !== kArrayL) { h = th[eventName] = []; if (t === kFunctionL) { h.push(old); } } h.push(eventHandler); } }, remove: function (eventName, eventHandler) { var th = this.handlers, h = th[eventName], i; if (th.hasOwnProperty(eventName)) { if (typeOf(h) !== kArrayL || typeOf(eventHandler) !== kFunctionL) { delete th[eventName]; return true; } for (i = h.length - 1; i >= 0; i -= 1) { if (h[i] === eventHandler) { delete h[i]; return true; } } } return false; } }; function outputDebugStr(channel) { var c = window.console; if (Asc.g_debug_mode && c && c[channel] && c[channel].apply) { c[channel].apply(this, Array.prototype.slice.call(arguments, 1)); } } function trim(val) { if (String.prototype.trim) return val.trim(); else return val.replace(/^\s+|\s+$/g, ''); } function isNumberInfinity(val) { var valTrim = trim(val); var valInt = valTrim - 0; return valInt == valTrim && valTrim.length > 0 && MIN_EXCEL_INT < valInt && valInt < MAX_EXCEL_INT;// } function arrayToLowerCase(array) { var result = []; for (var i = 0, length = array.length; i < length; ++i) result.push(array[i].toLowerCase()); return result; } function isFixedWidthCell(frag) { for (var i = 0; i < frag.length; ++i) { var f = frag[i].format; if (f && f.getRepeat()) { return true; } } return false; } function dropDecimalAutofit(f) { var s = getFragmentsText(f); // Проверка scientific format if (s.search(/E/i) >= 0) { return f; } // Поиск десятичной точки var pos = s.indexOf(AscCommon.g_oDefaultCultureInfo.NumberDecimalSeparator); if (-1 !== pos) { f = [f[0].clone()]; f[0].setFragmentText(s.slice(0, pos)); } return f; } function getFragmentsText(f) { if (!f) { return ""; } return f.reduce(function (pv, cv) { if (null === cv.getFragmentText()) { cv.initText(); } return pv + cv.getFragmentText(); }, ""); } function getFragmentsLength(f) { if (!f) { return; } return f.length > 0 ? f.reduce(function (pv, cv) { if (null === cv.getFragmentText()) { cv.initText(); } return pv + cv.getFragmentText().length; }, 0) : 0; } function getFragmentsCharCodes(f) { if (!f) { return; } return f.reduce(function (pv, cv) { return pv.concat(cv.getCharCodes()); }, []); } function getFragmentsCharCodesLength(f) { if (!f) { return 0; } return f.length > 0 ? f.reduce(function (pv, cv) { return pv + cv.getCharCodes().length; }, 0) : 0; } function getFragmentsTextFromCode(f) { if (!f) { return ""; } return f.reduce(function (pv, cv) { if (null === cv.getFragmentText()) { cv.initText(); } return pv + cv.getFragmentText(); }, ""); } function convertUnicodeToSimpleString(sUnicode) { var sUTF16 = ""; var nLength = sUnicode.length; for (var nPos = 0; nPos < nLength; nPos++) { sUTF16 += String.fromCharCode(sUnicode[nPos]); } return sUTF16; } function executeInR1C1Mode(mode, runFunction) { var oldMode = AscCommonExcel.g_R1C1Mode; AscCommonExcel.g_R1C1Mode = mode; runFunction(); AscCommonExcel.g_R1C1Mode = oldMode; } function lockCustomFunctionRecalculate(mode, runFunction) { var oldMode = AscCommonExcel.g_LockCustomFunctionRecalculate; AscCommonExcel.g_LockCustomFunctionRecalculate = mode; runFunction(); AscCommonExcel.g_LockCustomFunctionRecalculate = oldMode; } function checkFilteringMode(f, oThis, args) { if (!window['AscCommonExcel'].filteringMode) { AscCommon.History.LocalChange = true; } var ret = f.apply(oThis, args); if (!window['AscCommonExcel'].filteringMode) { AscCommon.History.LocalChange = false; } return ret; } function getEndValueRange(dx, v1, v2, coord1, coord2) { var leftDir = {x1: v2, x2: v1}, rightDir = {x1: v1, x2: v2}, res; if (0 !== dx) { if (coord1 > v1 && coord2 < v2) { if (0 > dx) { res = coord1 === coord2 ? leftDir : rightDir; } else { res = coord1 === coord2 ? rightDir : leftDir; } } else if (coord1 === v1 && coord2 === v2) { if (0 > dx) { res = leftDir; } else { res = rightDir; } } else if (coord1 > v1 && coord2 === v2) { res = leftDir; } else if (coord1 === v1 && coord2 < v2) { res = rightDir; } else { res = rightDir; } } else { res = rightDir; } return res; } function checkStylesNames(cellStyles) { var oStyle, i; for (i = 0; i < cellStyles.DefaultStyles.length; ++i) { oStyle = cellStyles.DefaultStyles[i]; AscFonts.FontPickerByCharacter.getFontsByString(oStyle.Name); AscFonts.FontPickerByCharacter.getFontsByString(AscCommon.translateManager.getValue(oStyle.Name)); } for (i = 0; i < cellStyles.CustomStyles.length; ++i) { oStyle = cellStyles.CustomStyles[i]; AscFonts.FontPickerByCharacter.getFontsByString(oStyle.Name); } } function getContext(w, h, wb) { var oCanvas = document.createElement('canvas'); oCanvas.width = w; oCanvas.height = h; return new Asc.DrawingContext( {canvas: oCanvas, units: 0/*px*/, fmgrGraphics: wb.fmgrGraphics, font: wb.m_oFont}); } function getGraphics(ctx) { var graphics = new AscCommon.CGraphics(); graphics.init(ctx.ctx, ctx.getWidth(0), ctx.getHeight(0), ctx.getWidth(3), ctx.getHeight(3)); graphics.m_oFontManager = AscCommon.g_fontManager; return graphics; } function generateCellStyles(w, h, wb) { var result = []; var widthWithRetina = AscCommon.AscBrowser.convertToRetinaValue(w, true); var heightWithRetina = AscCommon.AscBrowser.convertToRetinaValue(h, true); var ctx = getContext(widthWithRetina, heightWithRetina, wb); var oCanvas = ctx.getCanvas(); var graphics = getGraphics(ctx); function addStyles(styles, type) { var oStyle, name, displayName; for (var i = 0; i < styles.length && i < 1000; ++i) { oStyle = styles[i]; if (oStyle.Hidden) { continue; } name = displayName = oStyle.Name; if (type === AscCommon.c_oAscStyleImage.Default) { // ToDo Возможно стоит переписать немного, чтобы не пробегать каждый раз по массиву custom-стилей (нужно генерировать AllStyles) oStyle = cellStyles.getCustomStyleByBuiltinId(oStyle.BuiltinId) || oStyle; displayName = AscCommon.translateManager.getValue(name); } else if (null !== oStyle.BuiltinId) { continue; } if (window["IS_NATIVE_EDITOR"]) { window["native"]["BeginDrawStyle"](type, name); } drawStyle(ctx, graphics, wb.stringRender, oStyle, displayName, widthWithRetina, heightWithRetina); if (window["IS_NATIVE_EDITOR"]) { window["native"]["EndDrawStyle"](); } else { result.push(new AscCommon.CStyleImage(name, type, oCanvas.toDataURL("image/png"))); } } } var cellStyles = wb.model.CellStyles; addStyles(cellStyles.CustomStyles, AscCommon.c_oAscStyleImage.Document); addStyles(cellStyles.DefaultStyles, AscCommon.c_oAscStyleImage.Default); return result; } function drawStyle(ctx, graphics, sr, oStyle, sStyleName, width, height, opt_cf_preview) { var bc = null, bs = Asc.c_oAscBorderStyles.None, isNotFirst = false; // cached border color ctx.clear(); // Fill cell if (oStyle.ApplyFill) { var fill = oStyle.getFill(); if (null !== fill) { AscCommonExcel.drawFillCell(ctx, graphics, fill, new AscCommon.asc_CRect(0, 0, width, height)); } } function drawBorder(type, b, x1, y1, x2, y2) { if (b && b.w > 0) { var isStroke = false; var isNewColor = !AscCommonExcel.g_oColorManager.isEqual(bc, b.getColorOrDefault()); var isNewStyle = bs !== b.s; if (isNotFirst && (isNewColor || isNewStyle)) { ctx.stroke(); isStroke = true; } if (isNewColor) { bc = b.getColorOrDefault(); ctx.setStrokeStyle(bc); } if (isNewStyle) { bs = b.s; ctx.setLineWidth(b.w); ctx.setLineDash(b.getDashSegments()); } if (isStroke || false === isNotFirst) { isNotFirst = true; ctx.beginPath(); } switch (type) { case AscCommon.c_oAscBorderType.Hor: ctx.lineHor(x1, y1, x2); break; case AscCommon.c_oAscBorderType.Ver: ctx.lineVer(x1, y1, y2); break; case AscCommon.c_oAscBorderType.Diag: ctx.lineDiag(x1, y1, x2, y2); break; } } } // Draw text var format = oStyle.getFont().clone(); // Для размера шрифта делаем ограничение для превью в 16pt (у Excel 18pt, но и высота превью больше 22px) var nSize = format.getSize(); if (16 < format.getSize()) { nSize = 16; } // рисуем в пикселях if (window["IS_NATIVE_EDITOR"]) { nSize *= AscCommon.AscBrowser.retinaPixelRatio; } format.setSize(nSize); var tm; var cellFlags = new AscCommonExcel.CellFlags(); cellFlags.textAlign = oStyle.xfs.align && oStyle.xfs.align.hor; var fragments = []; var tempFragment = new AscCommonExcel.Fragment(); tempFragment.setFragmentText(sStyleName); tempFragment.format = format; fragments.push(tempFragment); tm = sr.measureString(fragments, cellFlags, width); let textAlign = sr.getEffectiveAlign(); let width_padding = 4; if (textAlign === AscCommon.align_Center) { width_padding = Asc.round(0.5 * (width - tm.width)); } else if(textAlign === AscCommon.align_Right) { width_padding = Asc.round(width - tm.width - width_padding); } // Текст будем рисовать по центру (в Excel чуть по другому реализовано, у них постоянный отступ снизу) var textY = Asc.round(0.5 * (height - tm.height)); if (!opt_cf_preview) { let oldCtx = sr.drawingCtx; sr.drawingCtx = ctx; sr.render(ctx, width_padding, textY, tm.width, oStyle.getFontColor() || new AscCommon.CColor(0, 0, 0)); sr.drawingCtx = oldCtx; } else { sr.render(ctx, width_padding, textY, tm.width, oStyle.getFontColor() || new AscCommon.CColor(0, 0, 0)); } if (oStyle.ApplyBorder) { // borders var oBorders = oStyle.getBorder(); drawBorder(AscCommon.c_oAscBorderType.Ver, oBorders.l, 0, 0, 0, height); drawBorder(AscCommon.c_oAscBorderType.Hor, oBorders.b, 0, height - 1, width, height - 1); drawBorder(AscCommon.c_oAscBorderType.Ver, oBorders.r, width - 1, height, width - 1, 0); drawBorder(AscCommon.c_oAscBorderType.Hor, oBorders.t, width, 0, 0, 0); if (isNotFirst) { ctx.stroke(); } } } function drawFillCell(ctx, graphics, fill, rect) { if (!fill.hasFill()) { return; } var solid = fill.getSolidFill(); if (solid) { ctx.setFillStyle(solid).fillRect(rect._x, rect._y, rect._width, rect._height); return; } var vector_koef = AscCommonExcel.vector_koef / ctx.getZoom(); if (AscCommon.AscBrowser.isCustomScaling()) { vector_koef /= AscCommon.AscBrowser.retinaPixelRatio; } rect._x *= vector_koef; rect._y *= vector_koef; rect._width *= vector_koef; rect._height *= vector_koef; AscFormat.ExecuteNoHistory( function () { var geometry = new AscFormat.CreateGeometry("rect"); geometry.Recalculate(rect._width, rect._height, true); var oUniFill = AscCommonExcel.convertFillToUnifill(fill); if (ctx instanceof AscCommonExcel.CPdfPrinter) { graphics.SaveGrState(); var _baseTransform; if (!ctx.Transform) { _baseTransform = new AscCommon.CMatrix(); } else { _baseTransform = ctx.Transform; } graphics.SetBaseTransform(_baseTransform); } graphics.SaveGrState(); var oMatrix = new AscCommon.CMatrix(); oMatrix.tx = rect._x; oMatrix.ty = rect._y; //TODO !!!rtl print let api = window.Asc.editor; let wb = api && api.wb; let ws = wb.getWorksheet(); /*if (ws && ws.getRightToLeft()) { oMatrix.sx = -1; oMatrix.tx = (ws.getCtxWidth() * vector_koef) - oMatrix.tx; }*/ graphics.transform3(oMatrix); var shapeDrawer = new AscCommon.CShapeDrawer(); shapeDrawer.Graphics = graphics; shapeDrawer.fromShape2(new AscFormat.CColorObj(null, oUniFill, geometry), graphics, geometry); shapeDrawer.draw(geometry); graphics.RestoreGrState(); if (ctx instanceof AscCommonExcel.CPdfPrinter) { graphics.SetBaseTransform(null); graphics.RestoreGrState(); } }, this, [] ); } function generateSlicerStyles(w, h, wb) { var result = []; w = AscCommon.AscBrowser.convertToRetinaValue(w, true); h = AscCommon.AscBrowser.convertToRetinaValue(h, true); var ctx = getContext(w, h, wb); var oCanvas = ctx.getCanvas(); var graphics = getGraphics(ctx); function addStyles(styles, type) { for (var sStyleName in styles) { if (styles.hasOwnProperty(sStyleName)) { var oSlicerStyle = styles[sStyleName]; var oTableStyle = oAllTableStyles[sStyleName]; if (oSlicerStyle && oTableStyle) { drawSlicerStyle(ctx, graphics, oSlicerStyle, oTableStyle, w, h); result.push(new AscCommon.CStyleImage(sStyleName, type, oCanvas.toDataURL("image/png"))); } } } } var oAllTableStyles = wb.model.TableStyles.AllStyles; addStyles(wb.model.SlicerStyles.CustomStyles, AscCommon.c_oAscStyleImage.Document); addStyles(wb.model.SlicerStyles.DefaultStyles, AscCommon.c_oAscStyleImage.Default); return result; } function drawSlicerStyle(ctx, graphics, oSlicerStyle, oTableStyle, width, height) { ctx.clear(); var dxf, dxfWhole; var nBH = (height / 6) >> 0; var nIns = (height / 6 / 5) >> 0; var nHIns = (height / 6 / 5 + 0.5) >> 0; //whole dxfWhole = oTableStyle.wholeTable && oTableStyle.wholeTable.dxf; var oOldFill; if (dxfWhole) { oOldFill = dxfWhole.getFill(); if (!oOldFill) { var oFill = new AscCommonExcel.Fill(); oFill.fromColor(new AscCommonExcel.RgbColor(0xFFFFFF)); dxfWhole.setFill(oFill); } } drawSlicerPreviewElement(dxfWhole, null, ctx, graphics, 0, 0, width, height); if (dxfWhole) { dxfWhole.setFill(oOldFill); } dxfWhole = dxfWhole || true; //header dxf = oTableStyle.headerRow && oTableStyle.headerRow.dxf; drawSlicerPreviewElement(dxf, dxfWhole, ctx, graphics, 0, 0, width, nBH); var nPos = nBH + nIns; var aBT = [ Asc.ST_slicerStyleType.selectedItemWithData, Asc.ST_slicerStyleType.unselectedItemWithData, Asc.ST_slicerStyleType.selectedItemWithNoData, Asc.ST_slicerStyleType.unselectedItemWithNoData ]; for (var nType = 0; nType < aBT.length; ++nType) { dxf = oSlicerStyle[aBT[nType]]; drawSlicerPreviewElement(dxf, dxfWhole, ctx, graphics, nHIns, nPos, width - nHIns, nPos + nBH); nPos += (nBH + nIns); } } function drawSlicerPreviewElement(dxf, dxfWhole, ctx, graphics, x0, y0, x1, y1) { var oFill = dxf && dxf.getFill(); if (oFill) { AscCommonExcel.drawFillCell(ctx, graphics, oFill, new AscCommon.asc_CRect(x0, y0, x1 - x0, y1 - y0)); } var oBorder = dxf && dxf.getBorder(); if (oBorder) { var oS = oBorder.l; if (oS && !oS.isEmpty()) { ctx.setStrokeStyle(oS.getColorOrDefault()).setLineWidth(1).setLineDash(oS.getDashSegments()).beginPath(); ctx.lineVer(x0, y0, y1); ctx.stroke(); } oS = oBorder.t; if (oS && !oS.isEmpty()) { ctx.setStrokeStyle(oS.getColorOrDefault()).setLineWidth(1).setLineDash(oS.getDashSegments()).beginPath(); ctx.lineHor(x0 + 1, y0, x1 - 1); ctx.stroke(); } oS = oBorder.r; if (oS && !oS.isEmpty()) { ctx.setStrokeStyle(oS.getColorOrDefault()).setLineWidth(1).setLineDash(oS.getDashSegments()).beginPath(); ctx.lineVer(x1 - 1, y0, y1); ctx.stroke(); } oS = oBorder.b; if (oS && !oS.isEmpty()) { ctx.setStrokeStyle(oS.getColorOrDefault()).setLineWidth(1).setLineDash(oS.getDashSegments()).beginPath(); ctx.lineHor(x0 + 1, y1 - 1, x1 - 1); ctx.stroke(); } } if (dxfWhole) { var nTIns = 5; var nTW = 8; nTIns = AscCommon.AscBrowser.convertToRetinaValue(nTIns, true); nTW = AscCommon.AscBrowser.convertToRetinaValue(nTW, true); var oFont = dxf && dxf.getFont() || dxfWhole && dxfWhole.getFont && dxfWhole.getFont(); var oColor = oFont ? oFont.getColor() : new AscCommon.CColor(0, 0, 0); ctx.setStrokeStyle(oColor); ctx.setLineWidth(1); ctx.setLineDash([]); ctx.beginPath(); ctx.lineHor(nTIns, (y0 + (y1 - y0) / 2.0 + 0.5) >> 0, nTIns + nTW); ctx.stroke(); } } function generateXfsStyle(w, h, wb, xfs, text) { if (AscCommon.AscBrowser.isRetina) { w = AscCommon.AscBrowser.convertToRetinaValue(w, true); h = AscCommon.AscBrowser.convertToRetinaValue(h, true); } var ctx = getContext(w, h, wb); var oCanvas = ctx.getCanvas(); var graphics = getGraphics(ctx); var oStyle = new AscCommonExcel.CCellStyle(); oStyle.xfs = xfs; drawStyle(ctx, graphics, wb.stringRender, oStyle, text, w, h); return new AscCommon.CStyleImage(text, null, oCanvas.toDataURL("image/png")); } function createAndPutCanvas(id) { var parent = document.getElementById(id); if (!parent) return; var w = parent.clientWidth; var h = parent.clientHeight; if (!w || !h) { return; } var canvas = parent.firstChild; if (!canvas) { canvas = document.createElement('canvas'); canvas.style.cssText = "pointer-events: none;padding:0;margin:0;user-select:none;"; canvas.style.width = w + "px"; canvas.style.height = h + "px"; parent.appendChild(canvas); } canvas.width = AscCommon.AscBrowser.convertToRetinaValue(w, true); canvas.height = AscCommon.AscBrowser.convertToRetinaValue(h, true); return canvas; } //TODO рассмотреть объединение с generateXfsStyle function generateXfsStyle2(id, wb, xfs, text) { var canvas = createAndPutCanvas(id); if (!canvas) { return; } var w = canvas.width; var h = canvas.height; var ctx = new Asc.DrawingContext({ canvas: canvas, units: 0/*px*/, fmgrGraphics: wb.fmgrGraphics, font: wb.m_oFont }); var graphics = getGraphics(ctx); var oStyle = new AscCommonExcel.CCellStyle(); oStyle.xfs = xfs; drawStyle(ctx, graphics, wb.stringRender, oStyle, text, w, h, true); } function drawGradientPreview(id, wb, colors, _colorBorderOut, _colorBorderIn, _realPercentWidth, _indent) { if (!colors || !colors.length) { return null; } var canvas = createAndPutCanvas(id); if (!canvas) { return; } var w = canvas.width; var h = canvas.height; var ctx = new Asc.DrawingContext({ canvas: canvas, units: 0/*px*/, fmgrGraphics: wb.fmgrGraphics, font: wb.m_oFont }); var graphics = getGraphics(ctx); var fill = new AscCommonExcel.Fill(); if (colors.length === 1) { fill.fromColor(colors[0]); } else { fill.gradientFill = new AscCommonExcel.GradientFill(); var arrColors = []; for (var i = 0; i < colors.length; i++) { var _stop = new AscCommonExcel.GradientStop(); _stop.position = i / (colors.length - 1); _stop.color = colors[i]; arrColors.push(_stop); } fill.gradientFill.asc_putGradientStops(arrColors); } if (!_indent) { _indent = 0; } var rectX = _indent; var rectY = _indent; var rectW = w - _indent * 2; var rectH = h - _indent * 2; if (_realPercentWidth) { if (_realPercentWidth > 0) { rectW = rectW * _realPercentWidth; } else { rectX = rectW - rectW * Math.abs(_realPercentWidth) + 1; rectW = rectW * Math.abs(_realPercentWidth) + 1; } } AscCommonExcel.drawFillCell(ctx, graphics, fill, new AscCommon.asc_CRect(rectX, rectY, rectW, rectH)); if (_colorBorderIn) { ctx.setLineWidth(1).setStrokeStyle(_colorBorderIn).strokeRect(rectX, rectY, rectW - 1, rectH - 1); } if (_colorBorderOut) { ctx.setLineWidth(1).setStrokeStyle(_colorBorderOut).strokeRect(0, 0, w - 1, h - 1); } } function drawIconSetPreview(id, wb, iconImgs) { if (!iconImgs || !iconImgs.length) { return null; } var canvas = createAndPutCanvas(id); if (!canvas) { return; } var ctx = new Asc.DrawingContext({ canvas: canvas, units: 0/*px*/, fmgrGraphics: wb.fmgrGraphics, font: wb.m_oFont }); var graphics = getGraphics(ctx); var shapeDrawer = new AscCommon.CShapeDrawer(); shapeDrawer.Graphics = graphics; AscFormat.ExecuteNoHistory( function () { for (var i = 0; i < iconImgs.length; i++) { var img = iconImgs[i]; if (!img) { continue; } var geometry = new AscFormat.CreateGeometry("rect"); geometry.Recalculate(5, 5, true); var oUniFill = new AscFormat.builder_CreateBlipFill(img, "stretch"); graphics.save(); var oMatrix = new AscCommon.CMatrix(); oMatrix.tx = i * 5; oMatrix.ty = 0; graphics.transform3(oMatrix); shapeDrawer.fromShape2(new AscFormat.CColorObj(null, oUniFill, geometry), graphics, geometry); shapeDrawer.draw(geometry); graphics.restore(); } }, this, [] ); } //----------------------------------------------------------------- // События движения мыши //----------------------------------------------------------------- /** @constructor */ function asc_CMouseMoveData(obj) { if (!(this instanceof asc_CMouseMoveData)) { return new asc_CMouseMoveData(obj); } if (obj) { this.type = obj.type; this.x = obj.x; this.reverseX = obj.reverseX; // Отображать комментарий слева от ячейки this.y = obj.y; this.hyperlink = obj.hyperlink; this.aCommentIndexes = obj.aCommentIndexes; this.userId = obj.userId; this.lockedObjectType = obj.lockedObjectType; // Для resize this.sizeCCOrPt = obj.sizeCCOrPt; this.sizePx = obj.sizePx; //Filter this.filter = obj.filter; //Tooltip this.tooltip = obj.tooltip; this.color = obj.color; this.placeholderType = obj.placeholderType; } return this; } asc_CMouseMoveData.prototype = { constructor: asc_CMouseMoveData, asc_getType: function () { return this.type; }, asc_getX: function () { return this.x; }, asc_getReverseX: function () { return this.reverseX; }, asc_getY: function () { return this.y; }, asc_getHyperlink: function () { return this.hyperlink; }, asc_getCommentIndexes: function () { return this.aCommentIndexes; }, asc_getUserId: function () { return this.userId; }, asc_getLockedObjectType: function () { return this.lockedObjectType; }, asc_getSizeCCOrPt: function () { return this.sizeCCOrPt; }, asc_getSizePx: function () { return this.sizePx; }, asc_getFilter: function () { return this.filter; }, asc_getTooltip: function () { return this.tooltip; }, asc_getColor: function () { return this.color; }, asc_getPlaceholderType: function () { return this.placeholderType; } }; // Гиперссылка /** @constructor */ function asc_CHyperlink(obj) { // Класс Hyperlink из модели this.hyperlinkModel = null != obj ? obj : new AscCommonExcel.Hyperlink(); // Используется только для выдачи наружу и выставлении обратно this.text = null; return this; } asc_CHyperlink.prototype.clone = function () { let res = new asc_CHyperlink(); res.hyperlinkModel = this.hyperlinkModel && this.hyperlinkModel.clone(); res.text = this.text; return res; }; asc_CHyperlink.prototype.calculateProps = function () { let type = this.asc_getType(); let api = window.Asc.editor; let fileName = api && api.DocInfo && api.DocInfo.Title; if (type === Asc.c_oAscHyperlinkType.WebLink && this.hyperlinkModel.getHyperlinkFunction()) { let res = null; let sHyperlink = this.hyperlinkModel.Hyperlink; let ph = {operand_str: null, pCurrPos: 0}; let _3dRef = AscCommon.parserHelp.is3DRef.call(ph, sHyperlink, 0); if (_3dRef && _3dRef[0] && _3dRef[3] && _3dRef[1]) { let ref; if (AscCommon.parserHelp.isArea.call(ph, sHyperlink, ph.pCurrPos) || AscCommon.parserHelp.isRef.call(ph, sHyperlink, ph.pCurrPos)) { ref = ph.real_str ? ph.real_str.toUpperCase() : ph.operand_str.toUpperCase() } if (ref) { if (AscCommon.rx_allowedProtocols.test(_3dRef[3])) { //https://test.com/test1/testFile.xlsx#TestSheet!F10 sHyperlink = _3dRef[3] + "#" + _3dRef[1] + "!" + ref; res = this.clone(); res.asc_setHyperlinkUrl(sHyperlink); } else { //check [test.xlsx]Sheet2!A1 //while check link on this file //TODO need calculate links on other files if (_3dRef[3] === fileName) { type = Asc.c_oAscHyperlinkType.RangeLink; res = this.clone(); res.asc_setHyperlinkUrl(null); res.asc_setSheet(_3dRef[1]); res.asc_setRange(ref); res.hyperlinkModel._updateLocation(); } else { //TODO } } } } else if (_3dRef[3]) { //check [test.xlsx]A14 let external = _3dRef[3]; if (external === fileName) { ph.pCurrPos += _3dRef[4]; let ref; if (AscCommon.parserHelp.isArea.call(ph, sHyperlink, ph.pCurrPos) || AscCommon.parserHelp.isRef.call(ph, sHyperlink, ph.pCurrPos)) { ref = ph.real_str ? ph.real_str.toUpperCase() : ph.operand_str.toUpperCase() } if (ref) { res = this.clone(); res.asc_setHyperlinkUrl(null); let sCurSheetName = api.wbModel.getActiveWs().sName; res.asc_setSheet(sCurSheetName); res.asc_setRange(ref); res.hyperlinkModel._updateLocation(); } else { //TODO } } } if (res) { return res; } } return null; }; asc_CHyperlink.prototype.asc_getType = function () { return this.hyperlinkModel.getHyperlinkType(); }; asc_CHyperlink.prototype.asc_getHyperlinkUrl = function () { return this.hyperlinkModel.Hyperlink; }; asc_CHyperlink.prototype.asc_getTooltip = function () { return this.hyperlinkModel.Tooltip; }; asc_CHyperlink.prototype.asc_getLocation = function () { return this.hyperlinkModel.getLocation(); }; asc_CHyperlink.prototype.asc_getSheet = function () { return this.hyperlinkModel.LocationSheet; }; asc_CHyperlink.prototype.asc_getRange = function () { return this.hyperlinkModel.getLocationRange(); }; asc_CHyperlink.prototype.asc_getText = function () { return this.text; }; asc_CHyperlink.prototype.asc_setType = function (val) { // В принципе эта функция избыточна switch (val) { case Asc.c_oAscHyperlinkType.WebLink: this.hyperlinkModel.setLocation(null); break; case Asc.c_oAscHyperlinkType.RangeLink: this.hyperlinkModel.Hyperlink = null; break; } }; asc_CHyperlink.prototype.asc_setHyperlinkUrl = function (val) { this.hyperlinkModel.Hyperlink = val; }; asc_CHyperlink.prototype.asc_setTooltip = function (val) { this.hyperlinkModel.Tooltip = val ? val.slice(0, Asc.c_oAscMaxTooltipLength) : val; }; asc_CHyperlink.prototype.asc_setLocation = function (val) { this.hyperlinkModel.setLocation(val); }; asc_CHyperlink.prototype.asc_setSheet = function (val) { this.hyperlinkModel.setLocationSheet(val); }; asc_CHyperlink.prototype.asc_setRange = function (val) { this.hyperlinkModel.setLocationRange(val); }; asc_CHyperlink.prototype.asc_setText = function (val) { this.text = val; }; function CPagePrint() { this.pageWidth = 0; this.pageHeight = 0; this.pageClipRectLeft = 0; this.pageClipRectTop = 0; this.pageClipRectWidth = 0; this.pageClipRectHeight = 0; this.pageRange = null; this.leftFieldInPx = 0; this.topFieldInPx = 0; this.pageGridLines = false; this.pageHeadings = false; this.indexWorksheet = -1; this.startOffset = 0; this.startOffsetPx = 0; this.scale = null; this.titleRowRange = null; this.titleColRange = null; this.titleWidth = 0; this.titleHeight = 0; return this; } CPagePrint.prototype.clone = function () { let res = new CPagePrint(); res.pageWidth = this.pageWidth; res.pageHeight = this.pageHeight; res.pageClipRectLeft = this.pageClipRectLeft; res.pageClipRectTop = this.pageClipRectTop; res.pageClipRectWidth = this.pageClipRectWidth; res.pageClipRectHeight = this.pageClipRectHeight; res.pageRange = this.pageRange ? this.pageRange.clone() : null; res.leftFieldInPx = this.leftFieldInPx; res.topFieldInPx = this.topFieldInPx; res.pageGridLines = this.pageGridLines; res.pageHeadings = this.pageHeadings; res.indexWorksheet = this.indexWorksheet; res.startOffset = this.startOffset; res.startOffsetPx = this.startOffsetPx; res.scale = this.scale; res.titleRowRange = this.titleRowRange; res.titleColRange = this.titleColRange; res.titleWidth = this.titleWidth; res.titleHeight = this.titleHeight; return res; }; CPagePrint.prototype.recalculate = function (pageOptions) { const horizontalCentered = pageOptions && pageOptions.asc_getHorizontalCentered(); const verticalCentered = pageOptions && pageOptions.asc_getVerticalCentered(); if (horizontalCentered) { let widthOffset = this.pageWidth - (this.pageClipRectLeft + this.pageClipRectRight); this.pageClipRectLeft = this.pageClipRectWidth } }; function CPrintPagesData() { this.arrPages = []; this.currentIndex = 0; return this; } /** @constructor */ function asc_CAdjustPrint() { // Вид печати this.printType = Asc.c_oAscPrintType.ActiveSheets; this.pageOptionsMap = null; this.ignorePrintArea = null; this.isOnlyFirstPage = null; this.nativeOptions = undefined; this.activeSheetsArray = null;//массив с индексами листов, которые необходимо напечатать this.startPageIndex = null; this.endPageIndex = null; return this; } asc_CAdjustPrint.prototype.asc_getPrintType = function () { return this.printType; }; asc_CAdjustPrint.prototype.asc_setPrintType = function (val) { this.printType = val; }; asc_CAdjustPrint.prototype.asc_getPageOptionsMap = function () { return this.pageOptionsMap; }; asc_CAdjustPrint.prototype.asc_setPageOptionsMap = function (val) { this.pageOptionsMap = val; }; asc_CAdjustPrint.prototype.asc_getIgnorePrintArea = function () { return this.ignorePrintArea; }; asc_CAdjustPrint.prototype.asc_setIgnorePrintArea = function (val) { this.ignorePrintArea = val; }; asc_CAdjustPrint.prototype.asc_getNativeOptions = function () { return this.nativeOptions; }; asc_CAdjustPrint.prototype.asc_setNativeOptions = function (val) { this.nativeOptions = val; }; asc_CAdjustPrint.prototype.asc_getActiveSheetsArray = function () { return this.activeSheetsArray; }; asc_CAdjustPrint.prototype.asc_setActiveSheetsArray = function (val) { this.activeSheetsArray = val; }; asc_CAdjustPrint.prototype.asc_getStartPageIndex = function () { return this.startPageIndex; }; asc_CAdjustPrint.prototype.asc_setStartPageIndex = function (val) { this.startPageIndex = val; }; asc_CAdjustPrint.prototype.asc_getEndPageIndex = function () { return this.endPageIndex; }; asc_CAdjustPrint.prototype.asc_setEndPageIndex = function (val) { this.endPageIndex = val; }; /** @constructor */ function asc_CLockInfo() { this["sheetId"] = null; this["type"] = null; this["subType"] = null; this["guid"] = null; this["rangeOrObjectId"] = null; } /** @constructor */ function asc_CCollaborativeRange(c1, r1, c2, r2) { this["c1"] = c1; this["r1"] = r1; this["c2"] = c2; this["r2"] = r2; } /** @constructor */ function asc_CSheetViewSettings() { // Показывать ли сетку this.showGridLines = null; // Показывать обозначения строк и столбцов this.showRowColHeaders = null; // Закрепление области this.pane = null; //current view zoom this.zoomScale = 100; this.showZeros = null; this.rightToLeft = null; this.showFormulas = null; this.topLeftCell = null; this.view = null; this.tabSelected = null; return this; } asc_CSheetViewSettings.prototype = { constructor: asc_CSheetViewSettings, clone: function () { var result = new asc_CSheetViewSettings(); result.showGridLines = this.showGridLines; result.showRowColHeaders = this.showRowColHeaders; result.zoom = this.zoom; if (this.pane) { result.pane = this.pane.clone(); } result.showZeros = this.showZeros; result.topLeftCell = this.topLeftCell; result.rightToLeft = this.rightToLeft; result.showFormulas = this.showFormulas; return result; }, isEqual: function (settings) { //TODO showzeros? return this.asc_getShowGridLines() === settings.asc_getShowGridLines() && this.asc_getShowRowColHeaders() === settings.asc_getShowRowColHeaders(); }, asc_getShowGridLines: function () { return false !== this.showGridLines; }, asc_getShowRowColHeaders: function () { return false !== this.showRowColHeaders; }, asc_getZoomScale: function () { return this.zoomScale; }, asc_getIsFreezePane: function () { return null !== this.pane && this.pane.isInit(); }, asc_getShowZeros: function () { return false !== this.showZeros; }, asc_getShowFormulas: function () { return false !== this.showFormulas; }, asc_getRightToLeft: function () { return this.rightToLeft; }, asc_setShowGridLines: function (val) { this.showGridLines = val; }, asc_setShowRowColHeaders: function (val) { this.showRowColHeaders = val; }, asc_setZoomScale: function (val) { this.zoomScale = val; }, asc_setShowZeros: function (val) { this.showZeros = val; }, asc_setShowFormulas: function (val) { this.showFormulas = val; }, asc_setRightToLeft: function (val) { this.rightToLeft = val; } }; /** @constructor */ function asc_CPane() { this.state = null; this.topLeftCell = null; this.xSplit = 0; this.ySplit = 0; // CellAddress для удобства this.topLeftFrozenCell = null; return this; } asc_CPane.prototype.isInit = function () { return null !== this.topLeftFrozenCell; }; asc_CPane.prototype.clone = function () { var res = new asc_CPane(); res.state = this.state; res.topLeftCell = this.topLeftCell; res.xSplit = this.xSplit; res.ySplit = this.ySplit; res.topLeftFrozenCell = this.topLeftFrozenCell ? new AscCommon.CellAddress(this.topLeftFrozenCell.row, this.topLeftFrozenCell.col) : null; return res; }; asc_CPane.prototype.init = function () { // ToDo Обрабатываем пока только frozen и frozenSplit if ((AscCommonExcel.c_oAscPaneState.Frozen === this.state || AscCommonExcel.c_oAscPaneState.FrozenSplit === this.state) && (0 < this.xSplit || 0 < this.ySplit)) { this.topLeftFrozenCell = new AscCommon.CellAddress(this.ySplit, this.xSplit, 0); if (!this.topLeftFrozenCell.isValid()) this.topLeftFrozenCell = null; } }; function RedoObjectParam() { this.bIsOn = false; this.oChangeWorksheetUpdate = {}; this.bUpdateWorksheetByModel = false; this.bOnSheetsChanged = false; this.oOnUpdateTabColor = {}; this.oOnUpdateSheetViewSettings = {}; this.bAddRemoveRowCol = false; this.bChangeColorScheme = false; this.bChangeActive = false; this.activeSheet = null; this.onSlicer = {}; this.onSlicerCache = {}; this.UpdateRigions = {}; this.snapshot = null; } /** @constructor */ function asc_CSheetPr() { if (!(this instanceof asc_CSheetPr)) { return new asc_CSheetPr(); } this.CodeName = null; this.EnableFormatConditionsCalculation = null; this.FilterMode = null; this.Published = null; this.SyncHorizontal = null; this.SyncRef = null; this.SyncVertical = null; this.TransitionEntry = null; this.TransitionEvaluation = null; this.TabColor = null; this.AutoPageBreaks = true; this.FitToPage = false; this.ApplyStyles = false; this.ShowOutlineSymbols = true; this.SummaryBelow = true; this.SummaryRight = true; return this; } asc_CSheetPr.prototype.clone = function () { var res = new asc_CSheetPr(); res.CodeName = this.CodeName; res.EnableFormatConditionsCalculation = this.EnableFormatConditionsCalculation; res.FilterMode = this.FilterMode; res.Published = this.Published; res.SyncHorizontal = this.SyncHorizontal; res.SyncRef = this.SyncRef; res.SyncVertical = this.SyncVertical; res.TransitionEntry = this.TransitionEntry; res.TransitionEvaluation = this.TransitionEvaluation; if (this.TabColor) res.TabColor = this.TabColor.clone(); res.FitToPage = this.FitToPage; res.SummaryBelow = this.SummaryBelow; res.SummaryRight = this.SummaryRight; return res; }; // Математическая информация о выделении /** @constructor */ function asc_CSelectionMathInfo() { this.count = 0; this.countNumbers = 0; this.sum = null; this.average = null; this.min = null; this.max = null; } asc_CSelectionMathInfo.prototype = { constructor: asc_CSelectionMathInfo, asc_getCount: function () { return this.count; }, asc_getCountNumbers: function () { return this.countNumbers; }, asc_getSum: function () { return this.sum; }, asc_getAverage: function () { return this.average; }, asc_getMin: function () { return this.min; }, asc_getMax: function () { return this.max; } }; /** @constructor */ function asc_CFindOptions() { this.findWhat = ""; // текст, который ищем this.wordsIndex = 0; // индекс текущего слова this.scanByRows = true; // просмотр по строкам/столбцам this.scanForward = true; // поиск вперед/назад this.isMatchCase = false; // учитывать регистр this.isWholeCell = false; this.isWholeWord = false; this.isSpellCheck = false; // изменение вызванное в проверке орфографии this.scanOnOnlySheet = Asc.c_oAscSearchBy.Sheet; // искать только на листе/в книге c_oAscSearchBy this.lookIn = Asc.c_oAscFindLookIn.Formulas; // искать в формулах/значениях/примечаниях this.findRegExp = null; this.replaceWith = ""; // текст, на который заменяем (если у нас замена) this.isReplaceAll = false; // заменить все (если у нас замена) // внутренние переменные this.findInSelection = false; this.selectionRange = null; this.findRange = null; this.findResults = null; this.indexInArray = 0; this.countFind = 0; this.countReplace = 0; this.countFindAll = 0; this.countReplaceAll = 0; this.sheetIndex = -1; this.error = false; this.isNeedRecalc = null; this.specificRange = null; this.isForMacros = null; this.activeCell = null; //если запускаем новый поиск из-за измененного документа, то присылаем последний элемент, на который //кликнул пользователь и далее пытаемся найти следующий/предыдущий this.lastSearchElem = null; this.isNotSearchEmptyCells = null; } asc_CFindOptions.prototype.clone = function () { var result = new asc_CFindOptions(); result.wordsIndex = this.wordsIndex; result.findWhat = this.findWhat; result.scanByRows = this.scanByRows; result.scanForward = this.scanForward; result.isMatchCase = this.isMatchCase; result.isWholeCell = this.isWholeCell; result.isWholeWord = this.isWholeWord; result.isSpellCheck = this.isSpellCheck; result.scanOnOnlySheet = this.scanOnOnlySheet; result.lookIn = this.lookIn; result.replaceWith = this.replaceWith; result.isReplaceAll = this.isReplaceAll; result.findInSelection = this.findInSelection; result.selectionRange = this.selectionRange ? this.selectionRange.clone() : null; result.findRange = this.findRange ? this.findRange.clone() : null; result.indexInArray = this.indexInArray; result.countFind = this.countFind; result.countReplace = this.countReplace; result.countFindAll = this.countFindAll; result.countReplaceAll = this.countReplaceAll; result.sheetIndex = this.sheetIndex; result.error = this.error; result.specificRange = this.specificRange; result.lastSearchElem = this.lastSearchElem; result.isNotSearchEmptyCells = this.isNotSearchEmptyCells; result.activeCell = this.activeCell; return result; }; asc_CFindOptions.prototype.isEqual = function (obj) { return obj && this.isEqual2(obj) && this.scanForward === obj.scanForward && this.scanOnOnlySheet === obj.scanOnOnlySheet; }; asc_CFindOptions.prototype.isEqual2 = function (obj) { return obj && this.findWhat === obj.findWhat && this.scanByRows === obj.scanByRows && this.isMatchCase === obj.isMatchCase && this.isWholeCell === obj.isWholeCell && this.lookIn === obj.lookIn && this.specificRange == obj.specificRange && this.isNotSearchEmptyCells == obj.isNotSearchEmptyCells && this.activeCell == obj.activeCell; }; asc_CFindOptions.prototype.clearFindAll = function () { this.countFindAll = 0; this.countReplaceAll = 0; this.error = false; }; asc_CFindOptions.prototype.updateFindAll = function () { this.countFindAll += this.countFind; this.countReplaceAll += this.countReplace; }; asc_CFindOptions.prototype.GetText = function () { return this.findWhat; }; asc_CFindOptions.prototype.IsMatchCase = function () { return this.isMatchCase; }; asc_CFindOptions.prototype.IsWholeWords = function () { return this.isWholeWord; }; asc_CFindOptions.prototype.IsWholeWords = function () { return this.isWholeWord; }; asc_CFindOptions.prototype.asc_setFindWhat = function (val) { this.findWhat = val; }; asc_CFindOptions.prototype.asc_setScanByRows = function (val) { this.scanByRows = val; }; asc_CFindOptions.prototype.asc_setScanForward = function (val) { this.scanForward = val; }; asc_CFindOptions.prototype.asc_setIsMatchCase = function (val) { this.isMatchCase = val; }; asc_CFindOptions.prototype.asc_setIsWholeCell = function (val) { this.isWholeCell = val; }; asc_CFindOptions.prototype.asc_setIsWholeWord = function (val) { this.isWholeWord = val; }; asc_CFindOptions.prototype.asc_changeSingleWord = function (val) { this.isChangeSingleWord = val; }; asc_CFindOptions.prototype.asc_setScanOnOnlySheet = function (val) { //TODO не стал менять native.js, поставил условие для scanOnOnlySheet if (val === true) { this.scanOnOnlySheet = Asc.c_oAscSearchBy.Sheet; } else if (val === false) { this.scanOnOnlySheet = Asc.c_oAscSearchBy.Workbook; } else { this.scanOnOnlySheet = val; } }; asc_CFindOptions.prototype.asc_setLookIn = function (val) { this.lookIn = val; }; asc_CFindOptions.prototype.asc_setReplaceWith = function (val) { this.replaceWith = val; }; asc_CFindOptions.prototype.asc_setIsReplaceAll = function (val) { this.isReplaceAll = val; }; asc_CFindOptions.prototype.asc_setSpecificRange = function (val) { this.specificRange = val; }; asc_CFindOptions.prototype.asc_setNeedRecalc = function (val) { this.isNeedRecalc = val; }; asc_CFindOptions.prototype.asc_setLastSearchElem = function (val) { this.lastSearchElem = val; }; asc_CFindOptions.prototype.asc_getLastSearchElem = function (bGetFromSearchEngine) { if (bGetFromSearchEngine) { let api = window.Asc.editor; let wb = api && api.wb; if (wb) { let searchEngine = wb.SearchEngine; if (searchEngine && searchEngine.Elements && searchEngine.Id && searchEngine.Elements[searchEngine.Id - 1]) { let element = searchEngine.Elements[searchEngine.Id - 1]; return [searchEngine.Id - 1, element.sheet, element.name, element.cell, element.text, element.formula]; } } } return this.lastSearchElem; }; asc_CFindOptions.prototype.asc_setNotSearchEmptyCells = function (val) { this.isNotSearchEmptyCells = val; }; asc_CFindOptions.prototype.asc_setActiveCell = function (val) { this.activeCell = val; }; asc_CFindOptions.prototype.asc_setIsForMacros = function (val) { this.isForMacros = val; }; /** @constructor */ function findResults() { this.values = {}; this.currentKey1 = -1; this.currentKey2 = -1; this.currentKeys1 = null; this.currentKeys2 = null; } findResults.prototype.isNotEmpty = function () { return 0 !== Object.keys(this.values).length; }; findResults.prototype.contains = function (key1, key2) { return this.values[key1] && this.values[key1][key2]; }; findResults.prototype.add = function (key1, key2, cell) { if (!this.values[key1]) { this.values[key1] = {}; } this.values[key1][key2] = cell; }; findResults.prototype._init = function (key1, key2) { this.currentKey1 = key1; this.currentKey2 = key2; this.currentKeyIndex1 = -1; this.currentKeyIndex2 = -1; this.currentKeys2 = null; this.currentKeys1 = Object.keys(this.values).sort(AscCommon.fSortAscending); this.currentKeyIndex1 = this._findKey(this.currentKey1, this.currentKeys1); if (0 === this.currentKeys1[this.currentKeyIndex1] - this.currentKey1) { this.currentKeys2 = Object.keys(this.values[this.currentKey1]).sort(AscCommon.fSortAscending); this.currentKeyIndex2 = this._findKey(this.currentKey2, this.currentKeys2); } }; findResults.prototype.find = function (key1, key2, forward) { this.forward = forward; if (this.currentKey1 !== key1 || this.currentKey2 !== key2) { this._init(key1, key2); } if (0 === this.currentKeys1.length) { return false; } var step = this.forward ? +1 : -1; this.currentKeyIndex2 += step; if (!this.currentKeys2 || !this.currentKeys2[this.currentKeyIndex2]) { this.currentKeyIndex1 += step; if (!this.currentKeys1[this.currentKeyIndex1]) { this.currentKeyIndex1 = this.forward ? 0 : this.currentKeys1.length - 1; } this.currentKey1 = this.currentKeys1[this.currentKeyIndex1] >> 0; this.currentKeys2 = Object.keys(this.values[this.currentKey1]).sort(AscCommon.fSortAscending); this.currentKeyIndex2 = this.forward ? 0 : this.currentKeys2.length - 1; } this.currentKey2 = this.currentKeys2[this.currentKeyIndex2] >> 0; return true; }; findResults.prototype._findKey = function (key, arrayKeys) { var i = this.forward ? 0 : arrayKeys.length - 1; var step = this.forward ? +1 : -1; var _key; while (_key = arrayKeys[i]) { _key = step * ((_key >> 0) - key); if (_key >= 0) { return 0 === _key ? i : (i - step); } i += step; } return -2; }; function CSpellcheckState() { this.lastSpellInfo = null; this.lastIndex = 0; this.lockSpell = false; this.startCell = null; this.currentCell = null; this.iteration = false; this.ignoreWords = {}; this.changeWords = {}; this.cellsChange = []; this.newWord = null; this.cellText = null; this.newCellText = null; this.isStart = false; this.afterReplace = false; this.isIgnoreUppercase = false; this.isIgnoreNumbers = false; } CSpellcheckState.prototype.clean = function () { this.isStart = false; this.lastSpellInfo = null; this.lastIndex = 0; this.lockSpell = false; this.startCell = null; this.currentCell = null; this.iteration = false; this.ignoreWords = {}; this.changeWords = {}; this.cellsChange = []; this.newWord = null; this.cellText = null; this.newCellText = null; this.afterReplace = false; }; CSpellcheckState.prototype.nextRow = function () { this.lastSpellInfo = null; this.lastIndex = 0; this.currentCell.row += 1; this.currentCell.col = 0; }; /** @constructor */ function asc_CCompleteMenu(name, type, desc) { this.name = name; this.type = type; } asc_CCompleteMenu.prototype.asc_getName = function () { return this.name; }; asc_CCompleteMenu.prototype.asc_getType = function () { return this.type; }; function CCacheMeasureEmpty2() { this.cache = {}; } CCacheMeasureEmpty2.prototype.getKey = function (elem) { return elem.getName() + (elem.getBold() ? 'B' : 'N') + (elem.getItalic() ? 'I' : 'N'); }; CCacheMeasureEmpty2.prototype.add = function (elem, val) { this.cache[this.getKey(elem)] = val; }; CCacheMeasureEmpty2.prototype.get = function (elem) { return this.cache[this.getKey(elem)]; }; var g_oCacheMeasureEmpty2 = new CCacheMeasureEmpty2(); function CCacheMeasureEmpty() { this.cache = {}; } CCacheMeasureEmpty.prototype.add = function (elem, val) { var fn = elem.getName(); var font = (this.cache[fn] || (this.cache[fn] = {})); font[elem.getSize()] = val; }; CCacheMeasureEmpty.prototype.get = function (elem) { var font = this.cache[elem.getName()]; return font ? font[elem.getSize()] : null; }; var g_oCacheMeasureEmpty = new CCacheMeasureEmpty(); /** * передаём в меню для того, чтобы показать иконку опций авторавертывания таблиц * @constructor */ function asc_CAutoCorrectOptions() { this.type = null; this.options = []; this.cellCoord = null; } asc_CAutoCorrectOptions.prototype.asc_setType = function (val) { this.type = val; }; asc_CAutoCorrectOptions.prototype.asc_setOptions = function (val) { this.options = val; }; asc_CAutoCorrectOptions.prototype.asc_setCellCoord = function (val) { this.cellCoord = val; }; asc_CAutoCorrectOptions.prototype.asc_getType = function () { return this.type; }; asc_CAutoCorrectOptions.prototype.asc_getOptions = function () { return this.options; }; asc_CAutoCorrectOptions.prototype.asc_getCellCoord = function () { return this.cellCoord; }; function CEditorEnterOptions() { this.cursorPos = null; this.eventPos = null; this.focus = false; this.newText = null; this.hideCursor = false; this.quickInput = false; } /** @constructor */ function cDate() { var bind = Function.bind; var unbind = bind.bind(bind); var date = new (unbind(Date, null).apply(null, arguments)); date.__proto__ = cDate.prototype; return date; } cDate.prototype = Object.create(Date.prototype); cDate.prototype.constructor = cDate; cDate.prototype.excelNullDate1900 = Date.UTC(1899, 11, 30, 0, 0, 0); cDate.prototype.excelNullDate1904 = Date.UTC(1904, 0, 1, 0, 0, 0); cDate.prototype.getExcelNullDate = function () { return AscCommon.bDate1904 ? cDate.prototype.excelNullDate1904 : cDate.prototype.excelNullDate1900; }; cDate.prototype.isLeapYear = function () { var y = this.getUTCFullYear(); return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0; }; cDate.prototype.isLeapYear1900 = function () { var y = this.getUTCFullYear(); return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0 || 1900 === y; }; cDate.prototype.getDaysInMonth = function () { // return arguments.callee[this.isLeapYear() ? 'L' : 'R'][this.getMonth()]; return this.isLeapYear() ? this.getDaysInMonth.L[this.getUTCMonth()] : this.getDaysInMonth.R[this.getUTCMonth()]; }; cDate.prototype.getLocalDaysInMonth = function () { return this.isLeapYear() ? this.getDaysInMonth.L[this.getMonth()] : this.getDaysInMonth.R[this.getMonth()]; } // durations of months for the regular year cDate.prototype.getDaysInMonth.R = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // durations of months for the leap year cDate.prototype.getDaysInMonth.L = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; cDate.prototype.getDayOfYear = function () { let year = Date.prototype.getUTCFullYear.call(this); let month = Date.prototype.getUTCMonth.call(this); let date = Date.prototype.getUTCDate.call(this); if (1899 === year && 11 === month && 30 === date) { return 0; } else if (1899 === year && 11 === month && 31 === date) { return 1; } let dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; let dayOfYear = dayCount[month] + date; if (month > 1 && this.isLeapYear1900()) dayOfYear++; if (1900 === year && month <= 1) { dayOfYear++; } return dayOfYear; }; cDate.prototype.truncate = function () { this.setUTCHours(0, 0, 0, 0); return this; }; cDate.prototype.getExcelDate = function (bLocal) { return Math.floor(this.getExcelDateWithTime(bLocal)); }; cDate.prototype.getExcelDateWithTime = function (bLocal) { var year = this.getUTCFullYear(), month = this.getUTCMonth(), date = this.getUTCDate(), res; var timeZoneOffset = bLocal ? this.getTimezoneOffset() * 60 * 1000 : 0; if (1900 === year && 0 === month && 0 === date) { res = 0; } else if (1900 < year || (1900 === year && 1 < month)) { res = (Date.UTC(year, month, date, this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()) - this.getExcelNullDate() - timeZoneOffset) / c_msPerDay; } else if (1900 === year && 1 === month && 29 === date) { res = 60; } else { res = (Date.UTC(year, month, date, this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()) - this.getExcelNullDate() - timeZoneOffset) / c_msPerDay - 1; } return res; }; cDate.prototype.getExcelDateWithTime2 = function () { var year = Date.prototype.getUTCFullYear.call(this); var month = Date.prototype.getUTCMonth.call(this); var date = Date.prototype.getUTCDate.call(this); return (Date.UTC(year, month, date, this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()) - this.getExcelNullDate()) / c_msPerDay; }; cDate.prototype.getDateFromExcel = function (val) { val = Math.floor(val); return this.getDateFromExcelWithTime(val); }; cDate.prototype.getDateFromExcelWithTime = function (val) { if (AscCommon.bDate1904) { return new cDate(val * c_msPerDay + this.getExcelNullDate()); } else { if (val < 60) { return new cDate(val * c_msPerDay + this.getExcelNullDate()); } else if (val === 60) { return new cDate(Date.UTC(1900, 1, 29)); } else { return new cDate(val * c_msPerDay + this.getExcelNullDate()); } } }; cDate.prototype.getDateFromExcelWithTime2 = function (val) { let value = val * c_msPerDay + this.getExcelNullDate(); //double value is truncated in cDate constructor so use round return new cDate(Math.round(value)); }; cDate.prototype.addYears = function (counts) { this.setUTCFullYear(this.getUTCFullYear() + Math.floor(counts)); }; cDate.prototype.addMonths = function (counts) { if (this.lastDayOfMonth()) { this.setUTCDate(1); this.setUTCMonth(this.getUTCMonth() + Math.floor(counts)); this.setUTCDate(this.getDaysInMonth()); } else { this.setUTCMonth(this.getUTCMonth() + Math.floor(counts)); } }; cDate.prototype.addDays = function (counts) { this.setUTCDate(this.getUTCDate() + Math.floor(counts)); }; cDate.prototype.addDays2 = function (counts) { Date.prototype.setUTCDate.call(this, Date.prototype.getUTCDate.call(this) + Math.floor(counts)); }; cDate.prototype.lastDayOfMonth = function () { return this.getDaysInMonth() == this.getUTCDate(); }; cDate.prototype.getUTCDate = function () { var year = Date.prototype.getUTCFullYear.call(this); var month = Date.prototype.getUTCMonth.call(this); var date = Date.prototype.getUTCDate.call(this); if (1899 == year && 11 == month && 31 == date) { return 0; } else { return date; } }; cDate.prototype.getUTCMonth = function () { var year = Date.prototype.getUTCFullYear.call(this); var month = Date.prototype.getUTCMonth.call(this); var date = Date.prototype.getUTCDate.call(this); if (1899 == year && 11 == month && (30 === date || 31 === date)) { return 0; } else { return month; } }; cDate.prototype.getUTCFullYear = function () { var year = Date.prototype.getUTCFullYear.call(this); var month = Date.prototype.getUTCMonth.call(this); var date = Date.prototype.getUTCDate.call(this); if (1899 == year && 11 == month && (30 === date || 31 === date)) { return 1900; } else { return year; } }; cDate.prototype.getDateString = function (api, bLocal) { return api.asc_getLocaleExample(AscCommon.getShortDateFormat(), this.getExcelDate(bLocal)); }; cDate.prototype.getTimeString = function (api) { return api.asc_getLocaleExample(AscCommon.getShortTimeFormat(), this.getExcelDateWithTime() - this.getTimezoneOffset() / (60 * 24)); }; cDate.prototype.fromISO8601 = function (dateStr) { let date; if (dateStr.endsWith("Z")) { date = new cDate(dateStr); } else { date = new cDate(dateStr + "Z"); } if (isNaN(date)) { date = null; } return date; }; cDate.prototype.getCurrentDate = function () { return this; } function getIconsForLoad() { return AscCommonExcel.getCFIconsForLoad().concat(AscCommonExcel.getSlicerIconsForLoad()).concat(AscCommonExcel.getPivotButtonsForLoad()); } /* * Export * ----------------------------------------------------------------------------- */ var prot; window['Asc'] = window['Asc'] || {}; window['AscCommonExcel'] = window['AscCommonExcel'] || {}; window['AscCommonExcel'].g_ActiveCell = null; // Active Cell for calculate (in R1C1 mode for relative cell) window['AscCommonExcel'].g_R1C1Mode = false; // No calculate in R1C1 mode window['AscCommonExcel'].g_LockCustomFunctionRecalculate = false; window["AscCommonExcel"].recalcType = recalcType; window["AscCommonExcel"].sizePxinPt = sizePxinPt; window['AscCommonExcel'].c_sPerDay = c_sPerDay; window['AscCommonExcel'].c_msPerDay = c_msPerDay; window["AscCommonExcel"].applyFunction = applyFunction; window['AscCommonExcel'].g_IncludeNewRowColInTable = true; window['AscCommonExcel'].g_AutoCorrectHyperlinks = true; window["Asc"]["cDate"] = window["Asc"].cDate = window['AscCommonExcel'].cDate = cDate; prot = cDate.prototype; prot["getExcelDateWithTime"] = prot.getExcelDateWithTime; window["Asc"].typeOf = typeOf; window["Asc"].lastIndexOf = lastIndexOf; window["Asc"].search = search; window["Asc"].getUniqueRangeColor = getUniqueRangeColor; window["Asc"].getMinValueOrNull = getMinValueOrNull; window["Asc"].round = round; window["Asc"].floor = floor; window["Asc"].ceil = ceil; window["Asc"].incDecFonSize = incDecFonSize; window["AscCommonExcel"].calcDecades = calcDecades; window["AscCommonExcel"].convertPtToPx = convertPtToPx; window["AscCommonExcel"].convertPxToPt = convertPxToPt; window["Asc"].profileTime = profileTime; window["AscCommonExcel"].getMatchingBorder = getMatchingBorder; window["AscCommonExcel"].WordSplitting = WordSplitting; window["AscCommonExcel"].getFindRegExp = getFindRegExp; window["AscCommonExcel"].convertFillToUnifill = convertFillToUnifill; window["AscCommonExcel"].replaceSpellCheckWords = replaceSpellCheckWords; window["AscCommonExcel"].getFullHyperlinkLength = getFullHyperlinkLength; window["Asc"].outputDebugStr = outputDebugStr; window["Asc"].isNumberInfinity = isNumberInfinity; window["Asc"].trim = trim; window["Asc"].arrayToLowerCase = arrayToLowerCase; window["Asc"].isFixedWidthCell = isFixedWidthCell; window["AscCommonExcel"].dropDecimalAutofit = dropDecimalAutofit; window["AscCommonExcel"].getFragmentsText = getFragmentsText; window['AscCommonExcel'].getFragmentsLength = getFragmentsLength; window["AscCommonExcel"].getFragmentsCharCodes = getFragmentsCharCodes; window["AscCommonExcel"].getFragmentsCharCodesLength = getFragmentsCharCodesLength; window["AscCommonExcel"].convertUnicodeToSimpleString = convertUnicodeToSimpleString; window['AscCommonExcel'].executeInR1C1Mode = executeInR1C1Mode; window['AscCommonExcel'].checkFilteringMode = checkFilteringMode; window['AscCommonExcel'].lockCustomFunctionRecalculate = lockCustomFunctionRecalculate; window["Asc"].getEndValueRange = getEndValueRange; window["AscCommonExcel"].checkStylesNames = checkStylesNames; window["AscCommonExcel"].generateCellStyles = generateCellStyles; window["AscCommonExcel"].generateSlicerStyles = generateSlicerStyles; window["AscCommonExcel"].generateXfsStyle = generateXfsStyle; window["AscCommonExcel"].generateXfsStyle2 = generateXfsStyle2; window["AscCommonExcel"].getIconsForLoad = getIconsForLoad; window["AscCommonExcel"].drawGradientPreview = drawGradientPreview; window["AscCommonExcel"].drawIconSetPreview = drawIconSetPreview; window["Asc"]["referenceType"] = window["AscCommonExcel"].referenceType = referenceType; prot = referenceType; prot['A'] = prot.A; prot['ARRC'] = prot.ARRC; prot['RRAC'] = prot.RRAC; prot['R'] = prot.R; window["Asc"].Range = Range; window["AscCommonExcel"].Range3D = Range3D; window["AscCommonExcel"].SelectionRange = SelectionRange; window["AscCommonExcel"].ActiveRange = ActiveRange; window["AscCommonExcel"].FormulaRange = FormulaRange; window["AscCommonExcel"].MultiplyRange = MultiplyRange; window["AscCommonExcel"].VisibleRange = VisibleRange; window["AscCommonExcel"].g_oRangeCache = g_oRangeCache; window["AscCommonExcel"].HandlersList = HandlersList; window["AscCommonExcel"].RedoObjectParam = RedoObjectParam; window["AscCommonExcel"].asc_CMouseMoveData = asc_CMouseMoveData; prot = asc_CMouseMoveData.prototype; prot["asc_getType"] = prot.asc_getType; prot["asc_getX"] = prot.asc_getX; prot["asc_getReverseX"] = prot.asc_getReverseX; prot["asc_getY"] = prot.asc_getY; prot["asc_getHyperlink"] = prot.asc_getHyperlink; prot["asc_getCommentIndexes"] = prot.asc_getCommentIndexes; prot["asc_getUserId"] = prot.asc_getUserId; prot["asc_getLockedObjectType"] = prot.asc_getLockedObjectType; prot["asc_getSizeCCOrPt"] = prot.asc_getSizeCCOrPt; prot["asc_getSizePx"] = prot.asc_getSizePx; prot["asc_getFilter"] = prot.asc_getFilter; prot["asc_getTooltip"] = prot.asc_getTooltip; prot["asc_getColor"] = prot.asc_getColor; prot["asc_getPlaceholderType"] = prot.asc_getPlaceholderType; window["Asc"]["asc_CHyperlink"] = window["Asc"].asc_CHyperlink = asc_CHyperlink; prot = asc_CHyperlink.prototype; prot["asc_getType"] = prot.asc_getType; prot["asc_getHyperlinkUrl"] = prot.asc_getHyperlinkUrl; prot["asc_getTooltip"] = prot.asc_getTooltip; prot["asc_getLocation"] = prot.asc_getLocation; prot["asc_getSheet"] = prot.asc_getSheet; prot["asc_getRange"] = prot.asc_getRange; prot["asc_getText"] = prot.asc_getText; prot["asc_setType"] = prot.asc_setType; prot["asc_setHyperlinkUrl"] = prot.asc_setHyperlinkUrl; prot["asc_setTooltip"] = prot.asc_setTooltip; prot["asc_setLocation"] = prot.asc_setLocation; prot["asc_setSheet"] = prot.asc_setSheet; prot["asc_setRange"] = prot.asc_setRange; prot["asc_setText"] = prot.asc_setText; window["AscCommonExcel"].CPagePrint = CPagePrint; window["AscCommonExcel"].CPrintPagesData = CPrintPagesData; window["Asc"]["asc_CAdjustPrint"] = window["Asc"].asc_CAdjustPrint = asc_CAdjustPrint; prot = asc_CAdjustPrint.prototype; prot["asc_getPrintType"] = prot.asc_getPrintType; prot["asc_setPrintType"] = prot.asc_setPrintType; prot["asc_getPageOptionsMap"] = prot.asc_getPageOptionsMap; prot["asc_setPageOptionsMap"] = prot.asc_setPageOptionsMap; prot["asc_getIgnorePrintArea"] = prot.asc_getIgnorePrintArea; prot["asc_setIgnorePrintArea"] = prot.asc_setIgnorePrintArea; prot["asc_getNativeOptions"] = prot.asc_getNativeOptions; prot["asc_setNativeOptions"] = prot.asc_setNativeOptions; prot["asc_getActiveSheetsArray"] = prot.asc_getActiveSheetsArray; prot["asc_setActiveSheetsArray"] = prot.asc_setActiveSheetsArray; prot["asc_getStartPageIndex"] = prot.asc_getStartPageIndex; prot["asc_setStartPageIndex"] = prot.asc_setStartPageIndex; prot["asc_getEndPageIndex"] = prot.asc_getEndPageIndex; prot["asc_setEndPageIndex"] = prot.asc_setEndPageIndex; window["AscCommonExcel"].asc_CLockInfo = asc_CLockInfo; window["AscCommonExcel"].asc_CCollaborativeRange = asc_CCollaborativeRange; window["AscCommonExcel"].asc_CSheetViewSettings = asc_CSheetViewSettings; prot = asc_CSheetViewSettings.prototype; prot["asc_getShowGridLines"] = prot.asc_getShowGridLines; prot["asc_getShowRowColHeaders"] = prot.asc_getShowRowColHeaders; prot["asc_getIsFreezePane"] = prot.asc_getIsFreezePane; prot["asc_getShowZeros"] = prot.asc_getShowZeros; prot["asc_getShowFormulas"] = prot.asc_getShowFormulas; prot["asc_setShowGridLines"] = prot.asc_setShowGridLines; prot["asc_setShowRowColHeaders"] = prot.asc_setShowRowColHeaders; prot["asc_setShowZeros"] = prot.asc_setShowZeros; prot["asc_setShowFormulas"] = prot.asc_setShowFormulas; prot["asc_setRightToLeft"] = prot.asc_setRightToLeft; prot["asc_getRightToLeft"] = prot.asc_getRightToLeft; window["AscCommonExcel"].asc_CPane = asc_CPane; window["AscCommonExcel"].asc_CSheetPr = asc_CSheetPr; window["AscCommonExcel"].asc_CSelectionMathInfo = asc_CSelectionMathInfo; prot = asc_CSelectionMathInfo.prototype; prot["asc_getCount"] = prot.asc_getCount; prot["asc_getCountNumbers"] = prot.asc_getCountNumbers; prot["asc_getSum"] = prot.asc_getSum; prot["asc_getAverage"] = prot.asc_getAverage; prot["asc_getMin"] = prot.asc_getMin; prot["asc_getMax"] = prot.asc_getMax; window["Asc"]["asc_CFindOptions"] = window["Asc"].asc_CFindOptions = asc_CFindOptions; prot = asc_CFindOptions.prototype; prot["asc_setFindWhat"] = prot.asc_setFindWhat; prot["asc_setScanByRows"] = prot.asc_setScanByRows; prot["asc_setScanForward"] = prot.asc_setScanForward; prot["asc_setIsMatchCase"] = prot.asc_setIsMatchCase; prot["asc_setIsWholeCell"] = prot.asc_setIsWholeCell; prot["asc_setScanOnOnlySheet"] = prot.asc_setScanOnOnlySheet; prot["asc_setLookIn"] = prot.asc_setLookIn; prot["asc_setReplaceWith"] = prot.asc_setReplaceWith; prot["asc_setIsReplaceAll"] = prot.asc_setIsReplaceAll; prot["asc_setSpecificRange"] = prot.asc_setSpecificRange; prot["asc_setNeedRecalc"] = prot.asc_setNeedRecalc; prot["asc_setLastSearchElem"] = prot.asc_setLastSearchElem; prot["asc_getLastSearchElem"] = prot.asc_getLastSearchElem; prot["asc_setNotSearchEmptyCells"] = prot.asc_setNotSearchEmptyCells; prot["asc_setActiveCell"] = prot.asc_setActiveCell; prot["asc_setIsForMacros"] = prot.asc_setIsForMacros; window["AscCommonExcel"].findResults = findResults; window["AscCommonExcel"].CSpellcheckState = CSpellcheckState; window["AscCommonExcel"].asc_CCompleteMenu = asc_CCompleteMenu; prot = asc_CCompleteMenu.prototype; prot["asc_getName"] = prot.asc_getName; prot["asc_getType"] = prot.asc_getType; window["AscCommonExcel"].g_oCacheMeasureEmpty = g_oCacheMeasureEmpty; window["AscCommonExcel"].g_oCacheMeasureEmpty2 = g_oCacheMeasureEmpty2; window["Asc"]["asc_CAutoCorrectOptions"] = window["Asc"].asc_CAutoCorrectOptions = asc_CAutoCorrectOptions; prot = asc_CAutoCorrectOptions.prototype; prot["asc_getType"] = prot.asc_getType; prot["asc_getOptions"] = prot.asc_getOptions; prot["asc_getCellCoord"] = prot.asc_getCellCoord; window['AscCommonExcel'].CEditorEnterOptions = CEditorEnterOptions; window['AscCommonExcel'].drawFillCell = drawFillCell; window['AscCommonExcel'].getContext = getContext; window['AscCommonExcel'].getGraphics = getGraphics; })(window);