4311 lines
131 KiB
JavaScript
4311 lines
131 KiB
JavaScript
/*
|
||
* (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);
|