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);
|