init repo
This commit is contained in:
920
OfficeWeb/sdk/Excel/model/CollaborativeEditing.js
Normal file
920
OfficeWeb/sdk/Excel/model/CollaborativeEditing.js
Normal file
@@ -0,0 +1,920 @@
|
||||
/*
|
||||
* (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);
|
||||
Reference in New Issue
Block a user