DocumentServer/OfficeWeb/sdk/Excel/model/CollaborativeEditing.js
nikolay ivanov a8be6b9e72 init repo
2014-07-05 18:22:49 +00:00

920 lines
41 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2014
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
(function ($, window, undefined) {
var asc = window["Asc"];
var asc_lockInfo = asc.asc_CLockInfo;
var asc_Range = asc.Range;
function CCollaborativeEditing(handlers, isViewerMode) {
if (! (this instanceof CCollaborativeEditing)) {
return new CCollaborativeEditing();
}
this.handlers = new asc.asc_CHandlersList(handlers);
this.m_bIsViewerMode = !!isViewerMode;
this.m_bIsCollaborative = false;
this.m_bGlobalLock = false;
this.m_bGlobalLockEditCell = false;
this.m_arrCheckLocks = [];
this.m_arrNeedUnlock = [];
this.m_arrNeedUnlock2 = [];
this.m_arrChanges = [];
this.m_oRecalcIndexColumns = {};
this.m_oRecalcIndexRows = {};
this.m_oInsertColumns = {};
this.m_oInsertRows = {};
this.init();
return this;
}
CCollaborativeEditing.prototype = {
constructor: CCollaborativeEditing,
init: function () {},
clearRecalcIndex: function () {
delete this.m_oRecalcIndexColumns;
delete this.m_oRecalcIndexRows;
this.m_oRecalcIndexColumns = {};
this.m_oRecalcIndexRows = {};
},
isCoAuthoringExcellEnable: function () {
return ASC_SPREADSHEET_API_CO_AUTHORING_ENABLE;
},
startCollaborationEditing: function () {
this.m_bIsCollaborative = true;
},
setViewerMode: function (isViewerMode) {
this.m_bIsViewerMode = isViewerMode;
},
getCollaborativeEditing: function () {
if (true !== this.isCoAuthoringExcellEnable() || this.m_bIsViewerMode) {
return false;
}
return this.m_bIsCollaborative;
},
getGlobalLock: function () {
return this.m_bGlobalLock;
},
getGlobalLockEditCell: function () {
return this.m_bGlobalLockEditCell;
},
onStartEditCell: function () {
if (this.getCollaborativeEditing()) {
this.m_bGlobalLockEditCell = true;
}
},
onStopEditCell: function () {
this.m_bGlobalLockEditCell = false;
},
onStartCheckLock: function () {
this.m_arrCheckLocks.length = 0;
},
addCheckLock: function (oItem) {
this.m_arrCheckLocks.push(oItem);
},
onEndCheckLock: function (callback) {
var t = this;
if (this.m_arrCheckLocks.length > 0) {
this.handlers.trigger("askLock", this.m_arrCheckLocks, function (result) {
t.onCallbackAskLock(result, callback);
});
if (undefined !== callback) {
this.m_bGlobalLock = true;
}
} else {
if ($.isFunction(callback)) {
callback(true);
}
this.m_bGlobalLockEditCell = false;
}
},
onCallbackAskLock: function (result, callback) {
this.m_bGlobalLock = false;
this.m_bGlobalLockEditCell = false;
if (result["lock"]) {
var count = this.m_arrCheckLocks.length;
for (var i = 0; i < count; ++i) {
var oItem = this.m_arrCheckLocks[i];
if (true !== oItem && false !== oItem) {
var oNewLock = new asc.CLock(oItem);
oNewLock.setType(c_oAscLockTypes.kLockTypeMine);
this.addUnlock2(oNewLock);
}
}
if ($.isFunction(callback)) {
callback(true);
}
} else {
if (result["error"]) {
if ($.isFunction(callback)) {
callback(false);
}
}
}
},
addUnlock: function (LockClass) {
this.m_arrNeedUnlock.push(LockClass);
},
addUnlock2: function (Lock) {
this.m_arrNeedUnlock2.push(Lock);
},
removeUnlock: function (Lock) {
for (var i = 0; i < this.m_arrNeedUnlock.length; ++i) {
if (Lock.Element["guid"] === this.m_arrNeedUnlock[i].Element["guid"]) {
this.m_arrNeedUnlock.splice(i, 1);
return true;
}
}
return false;
},
addChanges: function (oChanges) {
this.m_arrChanges.push(oChanges);
},
applyChanges: function () {
if (!this.isCoAuthoringExcellEnable()) {
return true;
}
var t = this;
var length = this.m_arrChanges.length;
if (0 < length) {
this.handlers.trigger("applyChanges", this.m_arrChanges, function () {
t.m_arrChanges.splice(0, length);
t.handlers.trigger("updateAfterApplyChanges");
});
return false;
}
return true;
},
sendChanges: function () {
if (!this.isCoAuthoringExcellEnable()) {
return;
}
var bCheckRedraw = false;
var bRedrawGraphicObjects = false;
if (0 < this.m_arrNeedUnlock.length || 0 < this.m_arrNeedUnlock2.length) {
bCheckRedraw = true;
this.handlers.trigger("cleanSelection");
}
var oLock = null;
while (0 < this.m_arrNeedUnlock2.length) {
oLock = this.m_arrNeedUnlock2.shift();
oLock.setType(c_oAscLockTypes.kLockTypeNone, false);
if (oLock.Element["type"] == c_oAscLockTypeElem.Object) {
if (this.handlers.trigger("tryResetLockedGraphicObject", oLock.Element["rangeOrObjectId"])) {
bRedrawGraphicObjects = true;
}
}
this.handlers.trigger("releaseLocks", oLock.Element["guid"]);
}
var nIndex = 0;
var nCount = this.m_arrNeedUnlock.length;
for (; nIndex < nCount; ++nIndex) {
oLock = this.m_arrNeedUnlock[nIndex];
if (c_oAscLockTypes.kLockTypeOther2 === oLock.getType()) {
if (oLock.Element["type"] == c_oAscLockTypeElem.Object) {
if (this.handlers.trigger("tryResetLockedGraphicObject", oLock.Element["rangeOrObjectId"])) {
bRedrawGraphicObjects = true;
}
}
this.m_arrNeedUnlock.splice(nIndex, 1);
--nIndex;
--nCount;
}
}
this.handlers.trigger("sendChanges", this.getRecalcIndexSave(this.m_oRecalcIndexColumns), this.getRecalcIndexSave(this.m_oRecalcIndexRows));
this._recalcLockArrayOthers();
delete this.m_oInsertColumns;
delete this.m_oInsertRows;
this.m_oInsertColumns = {};
this.m_oInsertRows = {};
this.clearRecalcIndex();
History.Clear();
if (bCheckRedraw) {
this.handlers.trigger("drawSelection");
this.handlers.trigger("updateAllSheetsLock");
this.handlers.trigger("unlockComments");
this.handlers.trigger("showComments");
}
if (bCheckRedraw || bRedrawGraphicObjects) {
this.handlers.trigger("showDrawingObjects");
}
},
getRecalcIndexSave: function (oRecalcIndex) {
var result = {};
var element = null;
for (var sheetId in oRecalcIndex) {
if (!oRecalcIndex.hasOwnProperty(sheetId)) {
continue;
}
result[sheetId] = {
"_arrElements": []
};
for (var i = 0, length = oRecalcIndex[sheetId]._arrElements.length; i < length; ++i) {
element = oRecalcIndex[sheetId]._arrElements[i];
result[sheetId]["_arrElements"].push({
"_recalcType": element._recalcType,
"_position": element._position,
"_count": element._count,
"m_bIsSaveIndex": element.m_bIsSaveIndex
});
}
}
return result;
},
S4: function () {
return (((1 + Math.random()) * 65536) | 0).toString(16).substring(1);
},
createGUID: function () {
return (this.S4() + this.S4() + "-" + this.S4() + "-" + this.S4() + "-" + this.S4() + "-" + this.S4() + this.S4() + this.S4());
},
getLockInfo: function (typeElem, subType, sheetId, info) {
var oLockInfo = new asc_lockInfo();
oLockInfo["sheetId"] = sheetId;
oLockInfo["type"] = typeElem;
oLockInfo["subType"] = subType;
oLockInfo["guid"] = this.createGUID();
oLockInfo["rangeOrObjectId"] = info;
return oLockInfo;
},
getLockByElem: function (element, type) {
var arrayElements = (c_oAscLockTypes.kLockTypeMine === type) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
for (var i = 0; i < arrayElements.length; ++i) {
if (element["guid"] === arrayElements[i].Element["guid"]) {
return arrayElements[i];
}
}
return null;
},
getLockIntersection: function (element, type, bCheckOnlyLockAll) {
var arrayElements = (c_oAscLockTypes.kLockTypeMine === type) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
var oUnlockElement = null,
rangeTmp1, rangeTmp2;
for (var i = 0; i < arrayElements.length; ++i) {
oUnlockElement = arrayElements[i].Element;
if (c_oAscLockTypeElem.Sheet === element["type"] && element["type"] === oUnlockElement["type"]) {
if ((c_oAscLockTypes.kLockTypeMine !== type && false === bCheckOnlyLockAll) || element["sheetId"] === oUnlockElement["sheetId"]) {
return arrayElements[i];
}
}
if (element["sheetId"] !== oUnlockElement["sheetId"]) {
continue;
}
if (null !== element["subType"] && null !== oUnlockElement["subType"]) {
return arrayElements[i];
}
if (true === bCheckOnlyLockAll || (c_oAscLockTypeElemSubType.ChangeProperties === oUnlockElement["subType"] && c_oAscLockTypeElem.Sheet !== element["type"])) {
continue;
}
if (element["type"] === oUnlockElement["type"]) {
if (element["type"] === c_oAscLockTypeElem.Object) {
if (element["rangeOrObjectId"] === oUnlockElement["rangeOrObjectId"]) {
return arrayElements[i];
}
} else {
if (element["type"] === c_oAscLockTypeElem.Range) {
if (c_oAscLockTypeElemSubType.InsertRows === oUnlockElement["subType"] || c_oAscLockTypeElemSubType.InsertColumns === oUnlockElement["subType"]) {
continue;
}
rangeTmp1 = oUnlockElement["rangeOrObjectId"];
rangeTmp2 = element["rangeOrObjectId"];
if (rangeTmp2["c1"] > rangeTmp1["c2"] || rangeTmp2["c2"] < rangeTmp1["c1"] || rangeTmp2["r1"] > rangeTmp1["r2"] || rangeTmp2["r2"] < rangeTmp1["r1"]) {
continue;
}
return arrayElements[i];
}
}
} else {
if (oUnlockElement["type"] === c_oAscLockTypeElem.Sheet || (element["type"] === c_oAscLockTypeElem.Sheet && c_oAscLockTypes.kLockTypeMine !== type)) {
return arrayElements[i];
}
}
}
return false;
},
getLockElem: function (typeElem, type, sheetId) {
var arrayElements = (c_oAscLockTypes.kLockTypeMine === type) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
var count = arrayElements.length;
var element = null,
oRangeOrObjectId = null;
var result = [];
var c1, c2, r1, r2;
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexColumns[sheetId] = new CRecalcIndex();
}
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
}
for (var i = 0; i < count; ++i) {
element = arrayElements[i].Element;
if (element["sheetId"] !== sheetId || element["type"] !== typeElem) {
continue;
}
if (c_oAscLockTypes.kLockTypeMine === type && c_oAscLockTypeElem.Range === typeElem && (c_oAscLockTypeElemSubType.DeleteColumns === element["subType"] || c_oAscLockTypeElemSubType.DeleteRows === element["subType"])) {
continue;
}
if (c_oAscLockTypeElem.Range === typeElem && (c_oAscLockTypeElemSubType.InsertColumns === element["subType"] || c_oAscLockTypeElemSubType.InsertRows === element["subType"])) {
continue;
}
if (c_oAscLockTypeElemSubType.ChangeProperties === element["subType"]) {
continue;
}
oRangeOrObjectId = element["rangeOrObjectId"];
if (c_oAscLockTypeElem.Range === typeElem) {
if (c_oAscLockTypes.kLockTypeMine !== type && c_oAscLockTypeElem.Range === typeElem && (c_oAscLockTypeElemSubType.DeleteColumns === element["subType"] || c_oAscLockTypeElemSubType.DeleteRows === element["subType"])) {
c1 = oRangeOrObjectId["c1"];
c2 = oRangeOrObjectId["c2"];
r1 = oRangeOrObjectId["r1"];
r2 = oRangeOrObjectId["r2"];
} else {
c1 = this.m_oRecalcIndexColumns[sheetId].getLockOther(oRangeOrObjectId["c1"], type);
c2 = this.m_oRecalcIndexColumns[sheetId].getLockOther(oRangeOrObjectId["c2"], type);
r1 = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r1"], type);
r2 = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r2"], type);
}
if (null === c1 || null === c2 || null === r1 || null === r2) {
continue;
}
oRangeOrObjectId = new asc_Range(c1, r1, c2, r2);
}
result.push(oRangeOrObjectId);
}
return result;
},
getLockCellsMe: function (sheetId) {
return this.getLockElem(c_oAscLockTypeElem.Range, c_oAscLockTypes.kLockTypeMine, sheetId);
},
getLockCellsOther: function (sheetId) {
return this.getLockElem(c_oAscLockTypeElem.Range, c_oAscLockTypes.kLockTypeOther, sheetId);
},
getLockObjectsMe: function (sheetId) {
return this.getLockElem(c_oAscLockTypeElem.Object, c_oAscLockTypes.kLockTypeMine, sheetId);
},
getLockObjectsOther: function (sheetId) {
return this.getLockElem(c_oAscLockTypeElem.Object, c_oAscLockTypes.kLockTypeOther, sheetId);
},
isLockAllOther: function (sheetId) {
var arrayElements = this.m_arrNeedUnlock;
var count = arrayElements.length;
var element = null;
var oLockedObjectType = c_oAscMouseMoveLockedObjectType.None;
for (var i = 0; i < count; ++i) {
element = arrayElements[i].Element;
if (element["sheetId"] === sheetId) {
if (element["type"] === c_oAscLockTypeElem.Sheet) {
oLockedObjectType = c_oAscMouseMoveLockedObjectType.Sheet;
break;
} else {
if (element["type"] === c_oAscLockTypeElem.Range && null !== element["subType"]) {
oLockedObjectType = c_oAscMouseMoveLockedObjectType.TableProperties;
}
}
}
}
return oLockedObjectType;
},
_recalcLockArray: function (typeLock, oRecalcIndexColumns, oRecalcIndexRows) {
var arrayElements = (c_oAscLockTypes.kLockTypeMine === typeLock) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
var count = arrayElements.length;
var element = null,
oRangeOrObjectId = null;
var i;
var sheetId = -1;
for (i = 0; i < count; ++i) {
element = arrayElements[i].Element;
if (c_oAscLockTypeElem.Range !== element["type"] || c_oAscLockTypeElemSubType.InsertColumns === element["subType"] || c_oAscLockTypeElemSubType.InsertRows === element["subType"] || c_oAscLockTypeElemSubType.DeleteColumns === element["subType"] || c_oAscLockTypeElemSubType.DeleteRows === element["subType"]) {
continue;
}
sheetId = element["sheetId"];
oRangeOrObjectId = element["rangeOrObjectId"];
if (oRecalcIndexColumns.hasOwnProperty(sheetId)) {
oRangeOrObjectId["c1"] = oRecalcIndexColumns[sheetId].getLockMe(oRangeOrObjectId["c1"]);
oRangeOrObjectId["c2"] = oRecalcIndexColumns[sheetId].getLockMe(oRangeOrObjectId["c2"]);
}
if (oRecalcIndexRows.hasOwnProperty(sheetId)) {
oRangeOrObjectId["r1"] = oRecalcIndexRows[sheetId].getLockMe(oRangeOrObjectId["r1"]);
oRangeOrObjectId["r2"] = oRecalcIndexRows[sheetId].getLockMe(oRangeOrObjectId["r2"]);
}
}
},
_recalcLockArrayOthers: function () {
var typeLock = c_oAscLockTypes.kLockTypeOther;
var arrayElements = (c_oAscLockTypes.kLockTypeMine === typeLock) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
var count = arrayElements.length;
var element = null,
oRangeOrObjectId = null;
var i;
var sheetId = -1;
for (i = 0; i < count; ++i) {
element = arrayElements[i].Element;
if (c_oAscLockTypeElem.Range !== element["type"] || c_oAscLockTypeElemSubType.InsertColumns === element["subType"] || c_oAscLockTypeElemSubType.InsertRows === element["subType"]) {
continue;
}
sheetId = element["sheetId"];
oRangeOrObjectId = element["rangeOrObjectId"];
if (this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
oRangeOrObjectId["c1"] = this.m_oRecalcIndexColumns[sheetId].getLockOther(oRangeOrObjectId["c1"]);
oRangeOrObjectId["c2"] = this.m_oRecalcIndexColumns[sheetId].getLockOther(oRangeOrObjectId["c2"]);
}
if (this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
oRangeOrObjectId["r1"] = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r1"]);
oRangeOrObjectId["r2"] = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r2"]);
}
}
},
addRecalcIndex: function (type, oRecalcIndex) {
var nIndex = 0;
var nRecalcType = c_oAscRecalcIndexTypes.RecalcIndexAdd;
var oRecalcIndexElement = null;
var oRecalcIndexResult = {};
var oRecalcIndexTmp = ("0" === type) ? this.m_oRecalcIndexColumns : this.m_oRecalcIndexRows;
for (var sheetId in oRecalcIndex) {
if (oRecalcIndex.hasOwnProperty(sheetId)) {
if (!oRecalcIndexTmp.hasOwnProperty(sheetId)) {
oRecalcIndexTmp[sheetId] = new CRecalcIndex();
}
if (!oRecalcIndexResult.hasOwnProperty(sheetId)) {
oRecalcIndexResult[sheetId] = new CRecalcIndex();
}
for (; nIndex < oRecalcIndex[sheetId]["_arrElements"].length; ++nIndex) {
oRecalcIndexElement = oRecalcIndex[sheetId]["_arrElements"][nIndex];
if (true === oRecalcIndexElement["m_bIsSaveIndex"]) {
continue;
}
nRecalcType = (c_oAscRecalcIndexTypes.RecalcIndexAdd === oRecalcIndexElement["_recalcType"]) ? c_oAscRecalcIndexTypes.RecalcIndexRemove : c_oAscRecalcIndexTypes.RecalcIndexAdd;
oRecalcIndexTmp[sheetId].add(nRecalcType, oRecalcIndexElement["_position"], oRecalcIndexElement["_count"], true);
oRecalcIndexResult[sheetId].add(nRecalcType, oRecalcIndexElement["_position"], oRecalcIndexElement["_count"], true);
}
}
}
return oRecalcIndexResult;
},
undoCols: function (sheetId, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
return;
}
this.m_oRecalcIndexColumns[sheetId].remove(count);
}
},
undoRows: function (sheetId, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
return;
}
this.m_oRecalcIndexRows[sheetId].remove(count);
}
},
removeCols: function (sheetId, position, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexColumns[sheetId] = new CRecalcIndex();
}
this.m_oRecalcIndexColumns[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexRemove, position, count, false);
}
},
addCols: function (sheetId, position, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexColumns[sheetId] = new CRecalcIndex();
}
this.m_oRecalcIndexColumns[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexAdd, position, count, false);
}
},
removeRows: function (sheetId, position, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
}
this.m_oRecalcIndexRows[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexRemove, position, count, false);
}
},
addRows: function (sheetId, position, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
}
this.m_oRecalcIndexRows[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexAdd, position, count, false);
}
},
addColsRange: function (sheetId, range) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) {
this.m_oInsertColumns[sheetId] = [];
}
var arrInsertColumns = this.m_oInsertColumns[sheetId];
var countCols = range.c2 - range.c1 + 1;
var isAddNewRange = true;
for (var i = 0; i < arrInsertColumns.length; ++i) {
if (arrInsertColumns[i].c1 > range.c1) {
arrInsertColumns[i].c1 += countCols;
arrInsertColumns[i].c2 += countCols;
} else {
if (arrInsertColumns[i].c1 <= range.c1 && arrInsertColumns[i].c2 >= range.c1) {
arrInsertColumns[i].c2 += countCols;
isAddNewRange = false;
}
}
}
if (isAddNewRange) {
arrInsertColumns.push(range);
}
},
addRowsRange: function (sheetId, range) {
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) {
this.m_oInsertRows[sheetId] = [];
}
var arrInsertRows = this.m_oInsertRows[sheetId];
var countRows = range.r2 - range.r1 + 1;
var isAddNewRange = true;
for (var i = 0; i < arrInsertRows.length; ++i) {
if (arrInsertRows[i].r1 > range.r1) {
arrInsertRows[i].r1 += countRows;
arrInsertRows[i].r2 += countRows;
} else {
if (arrInsertRows[i].r1 <= range.r1 && arrInsertRows[i].r2 >= range.r1) {
arrInsertRows[i].r2 += countRows;
isAddNewRange = false;
}
}
}
if (isAddNewRange) {
arrInsertRows.push(range);
}
},
removeColsRange: function (sheetId, range) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) {
return;
}
var arrInsertColumns = this.m_oInsertColumns[sheetId];
var countCols = range.c2 - range.c1 + 1;
for (var i = 0; i < arrInsertColumns.length; ++i) {
if (arrInsertColumns[i].c1 > range.c2) {
arrInsertColumns[i].c1 -= countCols;
arrInsertColumns[i].c2 -= countCols;
} else {
if (arrInsertColumns[i].c1 >= range.c1 && arrInsertColumns[i].c2 <= range.c2) {
arrInsertColumns.splice(i, 1);
i -= 1;
} else {
if (arrInsertColumns[i].c1 >= range.c1 && arrInsertColumns[i].c1 <= range.c2 && arrInsertColumns[i].c2 > range.c2) {
arrInsertColumns[i].c1 = range.c2 + 1;
arrInsertColumns[i].c1 -= countCols;
arrInsertColumns[i].c2 -= countCols;
} else {
if (arrInsertColumns[i].c1 < range.c1 && arrInsertColumns[i].c2 >= range.c1 && arrInsertColumns[i].c2 <= range.c2) {
arrInsertColumns[i].c2 = range.c1 - 1;
} else {
if (arrInsertColumns[i].c1 < range.c1 && arrInsertColumns[i].c2 > range.c2) {
arrInsertColumns[i].c2 -= countCols;
}
}
}
}
}
}
},
removeRowsRange: function (sheetId, range) {
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) {
return;
}
var arrInsertRows = this.m_oInsertRows[sheetId];
var countRows = range.r2 - range.r1 + 1;
for (var i = 0; i < arrInsertRows.length; ++i) {
if (arrInsertRows[i].r1 > range.r2) {
arrInsertRows[i].r1 -= countRows;
arrInsertRows[i].r2 -= countRows;
} else {
if (arrInsertRows[i].r1 >= range.r1 && arrInsertRows[i].r2 <= range.r2) {
arrInsertRows.splice(i, 1);
i -= 1;
} else {
if (arrInsertRows[i].r1 >= range.r1 && arrInsertRows[i].r1 <= range.r2 && arrInsertRows[i].r2 > range.r2) {
arrInsertRows[i].r1 = range.r2 + 1;
arrInsertRows[i].r1 -= countRows;
arrInsertRows[i].r2 -= countRows;
} else {
if (arrInsertRows[i].r1 < range.r1 && arrInsertRows[i].r2 >= range.r1 && arrInsertRows[i].r2 <= range.r2) {
arrInsertRows[i].r2 = range.r1 - 1;
} else {
if (arrInsertRows[i].r1 < range.r1 && arrInsertRows[i].r2 > range.r2) {
arrInsertRows[i].r2 -= countRows;
}
}
}
}
}
}
},
isIntersectionInCols: function (sheetId, col) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) {
return false;
}
var arrInsertColumns = this.m_oInsertColumns[sheetId];
for (var i = 0; i < arrInsertColumns.length; ++i) {
if (arrInsertColumns[i].c1 <= col && col <= arrInsertColumns[i].c2) {
return true;
}
}
return false;
},
isIntersectionInRows: function (sheetId, row) {
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) {
return false;
}
var arrInsertRows = this.m_oInsertRows[sheetId];
for (var i = 0; i < arrInsertRows.length; ++i) {
if (arrInsertRows[i].r1 <= row && row <= arrInsertRows[i].r2) {
return true;
}
}
return false;
},
getArrayInsertColumnsBySheetId: function (sheetId) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) {
return [];
}
return this.m_oInsertColumns[sheetId];
},
getArrayInsertRowsBySheetId: function (sheetId) {
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) {
return [];
}
return this.m_oInsertRows[sheetId];
},
getLockMeColumn: function (sheetId, col) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
return col;
}
return this.m_oRecalcIndexColumns[sheetId].getLockMe(col);
},
getLockMeRow: function (sheetId, row) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
return row;
}
return this.m_oRecalcIndexRows[sheetId].getLockMe(row);
},
getLockMeColumn2: function (sheetId, col) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
return col;
}
return this.m_oRecalcIndexColumns[sheetId].getLockMe2(col);
},
getLockMeRow2: function (sheetId, row) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
return row;
}
return this.m_oRecalcIndexRows[sheetId].getLockMe2(row);
},
getLockOtherColumn2: function (sheetId, col) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
return col;
}
return this.m_oRecalcIndexColumns[sheetId].getLockSaveOther(col);
},
getLockOtherRow2: function (sheetId, row) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
return row;
}
return this.m_oRecalcIndexRows[sheetId].getLockSaveOther(row);
}
};
function CLock(element) {
if (! (this instanceof CLock)) {
return new CLock(element);
}
this.Type = c_oAscLockTypes.kLockTypeNone;
this.UserId = null;
this.Element = element;
this.init();
return this;
}
CLock.prototype = {
constructor: CLock,
init: function () {},
getType: function () {
return this.Type;
},
setType: function (newType) {
if (newType === c_oAscLockTypes.kLockTypeNone) {
this.UserId = null;
}
this.Type = newType;
},
Lock: function (bMine) {
if (c_oAscLockTypes.kLockTypeNone === this.Type) {
if (true === bMine) {
this.Type = c_oAscLockTypes.kLockTypeMine;
} else {
this.Type = c_oAscLockTypes.kLockTypeOther;
}
}
},
setUserId: function (UserId) {
this.UserId = UserId;
},
getUserId: function () {
return this.UserId;
}
};
function CRecalcIndexElement(recalcType, position, bIsSaveIndex) {
if (! (this instanceof CRecalcIndexElement)) {
return new CRecalcIndexElement(recalcType, position, bIsSaveIndex);
}
this._recalcType = recalcType;
this._position = position;
this._count = 1;
this.m_bIsSaveIndex = !!bIsSaveIndex;
return this;
}
CRecalcIndexElement.prototype = {
constructor: CRecalcIndexElement,
getLockOther: function (position, type) {
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? +1 : -1;
if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType && true === this.m_bIsSaveIndex) {
return null;
} else {
if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType && c_oAscLockTypes.kLockTypeMine === type && false === this.m_bIsSaveIndex) {
return null;
} else {
if (position < this._position) {
return position;
} else {
return (position + inc);
}
}
}
},
getLockSaveOther: function (position, type) {
if (this.m_bIsSaveIndex) {
return position;
}
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? +1 : -1;
if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType && true === this.m_bIsSaveIndex) {
return null;
} else {
if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType && c_oAscLockTypes.kLockTypeMine === type && false === this.m_bIsSaveIndex) {
return null;
} else {
if (position < this._position) {
return position;
} else {
return (position + inc);
}
}
}
},
getLockMe: function (position) {
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? -1 : +1;
if (position < this._position) {
return position;
} else {
return (position + inc);
}
},
getLockMe2: function (position) {
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? -1 : +1;
if (true !== this.m_bIsSaveIndex || position < this._position) {
return position;
} else {
return (position + inc);
}
}
};
function CRecalcIndex() {
if (! (this instanceof CRecalcIndex)) {
return new CRecalcIndex();
}
this._arrElements = [];
return this;
}
CRecalcIndex.prototype = {
constructor: CRecalcIndex,
add: function (recalcType, position, count, bIsSaveIndex) {
for (var i = 0; i < count; ++i) {
this._arrElements.push(new CRecalcIndexElement(recalcType, position, bIsSaveIndex));
}
},
remove: function (count) {
for (var i = 0; i < count; ++i) {
this._arrElements.pop();
}
},
clear: function () {
this._arrElements.length = 0;
},
getLockOther: function (position, type) {
var newPosition = position;
var count = this._arrElements.length;
if (0 >= count) {
return newPosition;
}
var bIsDirect = !this._arrElements[0].m_bIsSaveIndex;
var i;
if (bIsDirect) {
for (i = 0; i < count; ++i) {
newPosition = this._arrElements[i].getLockOther(newPosition, type);
if (null === newPosition) {
break;
}
}
} else {
for (i = count - 1; i >= 0; --i) {
newPosition = this._arrElements[i].getLockOther(newPosition, type);
if (null === newPosition) {
break;
}
}
}
return newPosition;
},
getLockSaveOther: function (position, type) {
var newPosition = position;
var count = this._arrElements.length;
for (var i = 0; i < count; ++i) {
newPosition = this._arrElements[i].getLockSaveOther(newPosition, type);
if (null === newPosition) {
break;
}
}
return newPosition;
},
getLockMe: function (position) {
var newPosition = position;
var count = this._arrElements.length;
if (0 >= count) {
return newPosition;
}
var bIsDirect = this._arrElements[0].m_bIsSaveIndex;
var i;
if (bIsDirect) {
for (i = 0; i < count; ++i) {
newPosition = this._arrElements[i].getLockMe(newPosition);
if (null === newPosition) {
break;
}
}
} else {
for (i = count - 1; i >= 0; --i) {
newPosition = this._arrElements[i].getLockMe(newPosition);
if (null === newPosition) {
break;
}
}
}
return newPosition;
},
getLockMe2: function (position) {
var newPosition = position;
var count = this._arrElements.length;
if (0 >= count) {
return newPosition;
}
var bIsDirect = this._arrElements[0].m_bIsSaveIndex;
var i;
if (bIsDirect) {
for (i = 0; i < count; ++i) {
newPosition = this._arrElements[i].getLockMe2(newPosition);
if (null === newPosition) {
break;
}
}
} else {
for (i = count - 1; i >= 0; --i) {
newPosition = this._arrElements[i].getLockMe2(newPosition);
if (null === newPosition) {
break;
}
}
}
return newPosition;
}
};
asc.CCollaborativeEditing = CCollaborativeEditing;
asc.CLock = CLock;
asc.CRecalcIndexElement = CRecalcIndexElement;
asc.CRecalcIndex = CRecalcIndex;
})(jQuery, window);