Commit 70f1594d authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

CCollaborativeEditing перевел на prototype

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@55435 954022d7-b5bf-4e40-9824-e11837661b57
parent 88cf1440
...@@ -964,7 +964,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS"; ...@@ -964,7 +964,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
}, },
_asc_sendTrack: function (callback, url, rdata) { _asc_sendTrack: function (callback, url, rdata) {
var oThis = this;
asc_ajax({ asc_ajax({
type: 'POST', type: 'POST',
url: url, url: url,
...@@ -1049,7 +1048,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS"; ...@@ -1049,7 +1048,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
var oAdditionalData = {}; var oAdditionalData = {};
oAdditionalData["c"] = "save"; oAdditionalData["c"] = "save";
oAdditionalData["id"] = this.documentId; oAdditionalData["id"] = this.documentId;
oAdditionalData["userid"] = this.documentUserId, oAdditionalData["userid"] = this.documentUserId;
oAdditionalData["vkey"] = this.documentVKey; oAdditionalData["vkey"] = this.documentVKey;
oAdditionalData["outputformat"] = this.documentFormatSave; oAdditionalData["outputformat"] = this.documentFormatSave;
if(c_oAscFileType.CSV == this.documentFormatSave) if(c_oAscFileType.CSV == this.documentFormatSave)
...@@ -1071,7 +1070,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS"; ...@@ -1071,7 +1070,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
var oAdditionalData = {}; var oAdditionalData = {};
oAdditionalData["c"] = "save"; oAdditionalData["c"] = "save";
oAdditionalData["id"] = this.documentId; oAdditionalData["id"] = this.documentId;
oAdditionalData["userid"] = this.documentUserId, oAdditionalData["userid"] = this.documentUserId;
oAdditionalData["vkey"] = this.documentVKey; oAdditionalData["vkey"] = this.documentVKey;
oAdditionalData["outputformat"] = sFormat; oAdditionalData["outputformat"] = sFormat;
if(null != sSaveKey) if(null != sSaveKey)
......
...@@ -55,733 +55,728 @@ ...@@ -55,733 +55,728 @@
return this; return this;
} }
CCollaborativeEditing.prototype = { CCollaborativeEditing.prototype.init = function () {
/** @type CCollaborativeEditing */ };
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;
},
// Выставление режима view
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 {
asc_applyFunction(callback, true);
// Снимаем глобальный лок (для редактирования ячейки) // Очищаем индексы пересчета (при открытии это необходимо)
this.m_bGlobalLockEditCell = false; CCollaborativeEditing.prototype.clearRecalcIndex = function () {
delete this.m_oRecalcIndexColumns;
delete this.m_oRecalcIndexRows;
this.m_oRecalcIndexColumns = {};
this.m_oRecalcIndexRows = {};
};
// Разрешено ли совместное редактирование
CCollaborativeEditing.prototype.isCoAuthoringExcellEnable = function() {
return ASC_SPREADSHEET_API_CO_AUTHORING_ENABLE;
};
// Начало совместного редактирования
CCollaborativeEditing.prototype.startCollaborationEditing = function() {
this.m_bIsCollaborative = true;
};
// Выставление режима view
CCollaborativeEditing.prototype.setViewerMode = function (isViewerMode) {
this.m_bIsViewerMode = isViewerMode;
};
CCollaborativeEditing.prototype.getCollaborativeEditing = function () {
if (true !== this.isCoAuthoringExcellEnable() || this.m_bIsViewerMode)
return false;
return this.m_bIsCollaborative;
};
//-----------------------------------------------------------------------------------
// Функции для проверки залоченности объектов
//-----------------------------------------------------------------------------------
CCollaborativeEditing.prototype.getGlobalLock = function () {
return this.m_bGlobalLock;
};
CCollaborativeEditing.prototype.getGlobalLockEditCell = function () {
return this.m_bGlobalLockEditCell;
};
CCollaborativeEditing.prototype.onStartEditCell = function () {
// Вызывать эту функцию только в случае редактирования ячейки и если мы не одни редактируем!!!
if (this.getCollaborativeEditing())
this.m_bGlobalLockEditCell = true;
};
CCollaborativeEditing.prototype.onStopEditCell = function () {
// Вызывать эту функцию только в случае окончания редактирования ячейки!!!
this.m_bGlobalLockEditCell = false;
};
CCollaborativeEditing.prototype.onStartCheckLock = function () {
this.m_arrCheckLocks.length = 0;
};
CCollaborativeEditing.prototype.addCheckLock = function (oItem) {
this.m_arrCheckLocks.push (oItem);
};
CCollaborativeEditing.prototype.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;
} }
}, }
onCallbackAskLock: function(result, callback) { else {
// Снимаем глобальный лок asc_applyFunction(callback, true);
this.m_bGlobalLock = false;
// Снимаем глобальный лок (для редактирования ячейки) // Снимаем глобальный лок (для редактирования ячейки)
this.m_bGlobalLockEditCell = false; this.m_bGlobalLockEditCell = false;
}
};
if (result["lock"]) { CCollaborativeEditing.prototype.onCallbackAskLock = function(result, callback) {
// Пробегаемся по массиву и проставляем, что залочено нами // Снимаем глобальный лок
var count = this.m_arrCheckLocks.length; this.m_bGlobalLock = false;
for (var i = 0; i < count; ++i) { // Снимаем глобальный лок (для редактирования ячейки)
var oItem = this.m_arrCheckLocks[i]; this.m_bGlobalLockEditCell = false;
if (true !== oItem && false !== oItem) // сравниваем по значению и типу обязательно
{
var oNewLock = new asc.CLock(oItem);
oNewLock.setType (c_oAscLockTypes.kLockTypeMine);
this.addUnlock2 (oNewLock);
}
}
asc_applyFunction(callback, true); if (result["lock"]) {
} else if (result["error"]) { // Пробегаемся по массиву и проставляем, что залочено нами
asc_applyFunction(callback, false); var count = this.m_arrCheckLocks.length;
} for (var i = 0; i < count; ++i) {
}, var oItem = this.m_arrCheckLocks[i];
addUnlock: function (LockClass) {
this.m_arrNeedUnlock.push (LockClass); if (true !== oItem && false !== oItem) // сравниваем по значению и типу обязательно
}, {
addUnlock2: function (Lock) { var oNewLock = new asc.CLock(oItem);
this.m_arrNeedUnlock2.push (Lock); oNewLock.setType (c_oAscLockTypes.kLockTypeMine);
}, this.addUnlock2 (oNewLock);
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) { asc_applyFunction(callback, true);
this.m_arrChanges.push (oChanges); } else if (result["error"]) {
}, asc_applyFunction(callback, false);
}
};
CCollaborativeEditing.prototype.addUnlock = function (LockClass) {
this.m_arrNeedUnlock.push (LockClass);
};
CCollaborativeEditing.prototype.addUnlock2 = function (Lock) {
this.m_arrNeedUnlock2.push (Lock);
};
// Возвращает - нужно ли отправлять end action CCollaborativeEditing.prototype.removeUnlock = function (Lock) {
applyChanges: function () { for (var i = 0; i < this.m_arrNeedUnlock.length; ++i)
if (!this.isCoAuthoringExcellEnable()) if (Lock.Element["guid"] === this.m_arrNeedUnlock[i].Element["guid"]) {
this.m_arrNeedUnlock.splice(i, 1);
return true; 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 false;
};
CCollaborativeEditing.prototype.addChanges = function (oChanges) {
this.m_arrChanges.push (oChanges);
};
// Возвращает - нужно ли отправлять end action
CCollaborativeEditing.prototype.applyChanges = function () {
if (!this.isCoAuthoringExcellEnable())
return true; return true;
},
sendChanges: function () { var t = this;
if (!this.isCoAuthoringExcellEnable()) var length = this.m_arrChanges.length;
return; // Принимаем изменения
if (0 < length) {
this.handlers.trigger("applyChanges", this.m_arrChanges, function () {
t.m_arrChanges.splice(0, length);
t.handlers.trigger("updateAfterApplyChanges");
});
// Когда не совместное редактирование чистить ничего не нужно, но отправлять нужно. return false;
var bIsCollaborative = this.getCollaborativeEditing(); }
var bCheckRedraw = false; return true;
var bRedrawGraphicObjects = false; };
if (bIsCollaborative && (0 < this.m_arrNeedUnlock.length ||
0 < this.m_arrNeedUnlock2.length)) { CCollaborativeEditing.prototype.sendChanges = function () {
bCheckRedraw = true; if (!this.isCoAuthoringExcellEnable())
this.handlers.trigger("cleanSelection"); return;
}
// Когда не совместное редактирование чистить ничего не нужно, но отправлять нужно.
var bIsCollaborative = this.getCollaborativeEditing();
var oLock = null; var bCheckRedraw = false;
// Очищаем свои изменения var bRedrawGraphicObjects = false;
while (bIsCollaborative && 0 < this.m_arrNeedUnlock2.length) { if (bIsCollaborative && (0 < this.m_arrNeedUnlock.length ||
oLock = this.m_arrNeedUnlock2.shift(); 0 < this.m_arrNeedUnlock2.length)) {
oLock.setType(c_oAscLockTypes.kLockTypeNone, false); bCheckRedraw = true;
this.handlers.trigger("cleanSelection");
}
var oLock = null;
// Очищаем свои изменения
while (bIsCollaborative && 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 (;bIsCollaborative && nIndex < nCount; ++nIndex) {
oLock = this.m_arrNeedUnlock[nIndex];
if (c_oAscLockTypes.kLockTypeOther2 === oLock.getType()) {
if (oLock.Element["type"] == c_oAscLockTypeElem.Object) { if (oLock.Element["type"] == c_oAscLockTypeElem.Object) {
if (this.handlers.trigger("tryResetLockedGraphicObject", oLock.Element["rangeOrObjectId"])) if (this.handlers.trigger("tryResetLockedGraphicObject", oLock.Element["rangeOrObjectId"]))
bRedrawGraphicObjects = true; bRedrawGraphicObjects = true;
} }
this.handlers.trigger("releaseLocks", oLock.Element["guid"]); this.m_arrNeedUnlock.splice(nIndex, 1);
--nIndex;
--nCount;
} }
// Очищаем примененные чужие изменения }
var nIndex = 0;
var nCount = this.m_arrNeedUnlock.length; // Отправляем на сервер изменения
for (;bIsCollaborative && nIndex < nCount; ++nIndex) { this.handlers.trigger("sendChanges", this.getRecalcIndexSave(this.m_oRecalcIndexColumns), this.getRecalcIndexSave(this.m_oRecalcIndexRows));
oLock = this.m_arrNeedUnlock[nIndex];
if (c_oAscLockTypes.kLockTypeOther2 === oLock.getType()) { if (bIsCollaborative) {
if (oLock.Element["type"] == c_oAscLockTypeElem.Object) { // Пересчитываем lock-и от чужих пользователей
if (this.handlers.trigger("tryResetLockedGraphicObject", oLock.Element["rangeOrObjectId"])) this._recalcLockArrayOthers();
bRedrawGraphicObjects = true;
} // Очищаем свои изменения (удаляем массив добавленных строк/столбцов)
this.m_arrNeedUnlock.splice(nIndex, 1); delete this.m_oInsertColumns;
--nIndex; delete this.m_oInsertRows;
--nCount; this.m_oInsertColumns = {};
} this.m_oInsertRows = {};
// Очищаем свои пересчетные индексы
this.clearRecalcIndex();
// Чистим Undo/Redo
History.Clear();
// Перерисовываем
if (bCheckRedraw) {
this.handlers.trigger("drawSelection");
this.handlers.trigger("drawFrozenPaneLines");
this.handlers.trigger("updateAllSheetsLock");
this.handlers.trigger("unlockComments");
this.handlers.trigger("showComments");
} }
// Отправляем на сервер изменения if (bCheckRedraw || bRedrawGraphicObjects)
this.handlers.trigger("sendChanges", this.getRecalcIndexSave(this.m_oRecalcIndexColumns), this.getRecalcIndexSave(this.m_oRecalcIndexRows)); this.handlers.trigger("showDrawingObjects");
}
if (bIsCollaborative) { };
// Пересчитываем lock-и от чужих пользователей
this._recalcLockArrayOthers();
// Очищаем свои изменения (удаляем массив добавленных строк/столбцов)
delete this.m_oInsertColumns;
delete this.m_oInsertRows;
this.m_oInsertColumns = {};
this.m_oInsertRows = {};
// Очищаем свои пересчетные индексы
this.clearRecalcIndex();
// Чистим Undo/Redo
History.Clear();
// Перерисовываем
if (bCheckRedraw) {
this.handlers.trigger("drawSelection");
this.handlers.trigger("drawFrozenPaneLines");
this.handlers.trigger("updateAllSheetsLock");
this.handlers.trigger("unlockComments");
this.handlers.trigger("showComments");
}
if (bCheckRedraw || bRedrawGraphicObjects) CCollaborativeEditing.prototype.getRecalcIndexSave = function (oRecalcIndex) {
this.handlers.trigger("showDrawingObjects"); 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});
} }
}, }
getRecalcIndexSave: function (oRecalcIndex) { return result;
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; CCollaborativeEditing.prototype.S4 = function () {
}, return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
S4: function () { CCollaborativeEditing.prototype.createGUID = function () {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); return (this.S4() + this.S4() + "-" + this.S4() + "-" + this.S4() + "-" + this.S4() + "-" + this.S4() + this.S4() + this.S4());
}, };
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;
},
/**
* Проверка lock для элемента
* @param {asc_CLockInfo} element элемент для проверки lock
* @param {c_oAscLockTypes} type сами(kLockTypeMine) или кто-то другой
* @param {Boolean} bCheckOnlyLockAll проверять только lock для свойств всего листа (либо только проверять удален ли лист, а не просто залочен)
*/
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"]) {
// Проверка только на удаление листа (если проверка для себя, то выходим не сразу, т.к. нужно проверить lock от других элементов)
if ((c_oAscLockTypes.kLockTypeMine !== type && false === bCheckOnlyLockAll) ||
element["sheetId"] === oUnlockElement["sheetId"]) {
// Если кто-то залочил sheet, то больше никто не может лочить sheet-ы (иначе можно удалить все листы)
return arrayElements[i];
}
}
if (element["sheetId"] !== oUnlockElement["sheetId"])
continue;
if (null !== element["subType"] && null !== oUnlockElement["subType"]) CCollaborativeEditing.prototype.getLockInfo = function (typeElem, subType, sheetId, info) {
return arrayElements[i]; var oLockInfo = new asc_lockInfo();
oLockInfo["sheetId"] = sheetId;
oLockInfo["type"] = typeElem;
oLockInfo["subType"] = subType;
oLockInfo["guid"] = this.createGUID();
oLockInfo["rangeOrObjectId"] = info;
return oLockInfo;
};
// Не учитываем lock от ChangeProperties (только если это не lock листа) CCollaborativeEditing.prototype.getLockByElem = function (element, type) {
if (true === bCheckOnlyLockAll || var arrayElements = (c_oAscLockTypes.kLockTypeMine === type) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
(c_oAscLockTypeElemSubType.ChangeProperties === oUnlockElement["subType"] for (var i = 0; i < arrayElements.length; ++i)
&& c_oAscLockTypeElem.Sheet !== element["type"])) if (element["guid"] === arrayElements[i].Element["guid"])
continue; return arrayElements[i];
return null;
};
if (element["type"] === oUnlockElement["type"]) { /**
if (element["type"] === c_oAscLockTypeElem.Object) { * Проверка lock для элемента
if (element["rangeOrObjectId"] === oUnlockElement["rangeOrObjectId"]) * @param {asc_CLockInfo} element элемент для проверки lock
return arrayElements[i]; * @param {c_oAscLockTypes} type сами(kLockTypeMine) или кто-то другой
} else if (element["type"] === c_oAscLockTypeElem.Range) { * @param {Boolean} bCheckOnlyLockAll проверять только lock для свойств всего листа (либо только проверять удален ли лист, а не просто залочен)
// Не учитываем lock от Insert */
if (c_oAscLockTypeElemSubType.InsertRows === oUnlockElement["subType"] || c_oAscLockTypeElemSubType.InsertColumns === oUnlockElement["subType"]) CCollaborativeEditing.prototype.getLockIntersection = function (element, type, bCheckOnlyLockAll) {
continue; var arrayElements = (c_oAscLockTypes.kLockTypeMine === type) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
rangeTmp1 = oUnlockElement["rangeOrObjectId"]; var oUnlockElement = null, rangeTmp1, rangeTmp2;
rangeTmp2 = element["rangeOrObjectId"]; for (var i = 0; i < arrayElements.length; ++i) {
if (rangeTmp2["c1"] > rangeTmp1["c2"] || rangeTmp2["c2"] < rangeTmp1["c1"] || rangeTmp2["r1"] > rangeTmp1["r2"] || rangeTmp2["r2"] < rangeTmp1["r1"]) oUnlockElement = arrayElements[i].Element;
continue; if (c_oAscLockTypeElem.Sheet === element["type"] && element["type"] === oUnlockElement["type"]) {
return arrayElements[i]; // Проверка только на удаление листа (если проверка для себя, то выходим не сразу, т.к. нужно проверить lock от других элементов)
} if ((c_oAscLockTypes.kLockTypeMine !== type && false === bCheckOnlyLockAll) ||
} else if (oUnlockElement["type"] === c_oAscLockTypeElem.Sheet || element["sheetId"] === oUnlockElement["sheetId"]) {
(element["type"] === c_oAscLockTypeElem.Sheet && c_oAscLockTypes.kLockTypeMine !== type)) { // Если кто-то залочил sheet, то больше никто не может лочить sheet-ы (иначе можно удалить все листы)
// Если кто-то уже залочил лист или мы пытаемся сами залочить и проверяем на чужие lock
return arrayElements[i]; return arrayElements[i];
} }
} }
return false; if (element["sheetId"] !== oUnlockElement["sheetId"])
}, continue;
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) { if (null !== element["subType"] && null !== oUnlockElement["subType"])
element = arrayElements[i].Element; return arrayElements[i];
if (element["sheetId"] !== sheetId || element["type"] !== typeElem)
continue;
// Отображать залоченность удаленных текущим пользователем строк/столбцов не нужно (уже нечего отображать) // Не учитываем lock от ChangeProperties (только если это не lock листа)
if (c_oAscLockTypes.kLockTypeMine === type && c_oAscLockTypeElem.Range === typeElem && if (true === bCheckOnlyLockAll ||
(c_oAscLockTypeElemSubType.DeleteColumns === element["subType"] || (c_oAscLockTypeElemSubType.ChangeProperties === oUnlockElement["subType"]
c_oAscLockTypeElemSubType.DeleteRows === element["subType"])) && c_oAscLockTypeElem.Sheet !== element["type"]))
continue; continue;
// Отображать залоченность добавленных другим пользователем строк/столбцов не нужно (еще нечего отображать)
if (c_oAscLockTypeElem.Range === typeElem &&
(c_oAscLockTypeElemSubType.InsertColumns === element["subType"] ||
c_oAscLockTypeElemSubType.InsertRows === element["subType"]))
continue;
// Отображать lock-диапазон для lockAll(всего листа) не нужно
if (c_oAscLockTypeElemSubType.ChangeProperties === element["subType"])
continue;
oRangeOrObjectId = element["rangeOrObjectId"]; if (element["type"] === oUnlockElement["type"]) {
// Для диапазона нужно сделать пересчет с учетом удаленных или добавленных строк/столбцов if (element["type"] === c_oAscLockTypeElem.Object) {
if (c_oAscLockTypeElem.Range === typeElem) { if (element["rangeOrObjectId"] === oUnlockElement["rangeOrObjectId"])
// Пересчитывать для удаленных строк/столбцов у другого пользователя не нужно return arrayElements[i];
if (c_oAscLockTypes.kLockTypeMine !== type && c_oAscLockTypeElem.Range === typeElem && } else if (element["type"] === c_oAscLockTypeElem.Range) {
(c_oAscLockTypeElemSubType.DeleteColumns === element["subType"] || // Не учитываем lock от Insert
c_oAscLockTypeElemSubType.DeleteRows === element["subType"])) { if (c_oAscLockTypeElemSubType.InsertRows === oUnlockElement["subType"] || c_oAscLockTypeElemSubType.InsertColumns === oUnlockElement["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; continue;
rangeTmp1 = oUnlockElement["rangeOrObjectId"];
oRangeOrObjectId = new asc_Range(c1, r1, c2, r2); 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 ||
result.push(oRangeOrObjectId); (element["type"] === c_oAscLockTypeElem.Sheet && c_oAscLockTypes.kLockTypeMine !== type)) {
// Если кто-то уже залочил лист или мы пытаемся сами залочить и проверяем на чужие lock
return arrayElements[i];
} }
}
return false;
};
return result; CCollaborativeEditing.prototype.getLockElem = function (typeElem, type, sheetId) {
}, var arrayElements = (c_oAscLockTypes.kLockTypeMine === type) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
var count = arrayElements.length;
getLockCellsMe: function (sheetId) { var element = null, oRangeOrObjectId = null;
return this.getLockElem(c_oAscLockTypeElem.Range, c_oAscLockTypes.kLockTypeMine, sheetId); var result = [];
}, var c1, c2, r1, r2;
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);
},
/**
* Проверка lock для всего листа
* @param {Number} sheetId элемент для проверки lock
* @return {c_oAscMouseMoveLockedObjectType} oLockedObjectType
*/
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) { if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
element = arrayElements[i].Element; this.m_oRecalcIndexColumns[sheetId] = new CRecalcIndex();
if (element["sheetId"] === sheetId) { }
if (element["type"] === c_oAscLockTypeElem.Sheet) { if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
oLockedObjectType = c_oAscMouseMoveLockedObjectType.Sheet; this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
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) { for (var i = 0; i < count; ++i) {
element = arrayElements[i].Element; element = arrayElements[i].Element;
// Для удаления пересчитывать индексы не нужно if (element["sheetId"] !== sheetId || element["type"] !== typeElem)
if (c_oAscLockTypeElem.Range !== element["type"] || continue;
c_oAscLockTypeElemSubType.InsertColumns === element["subType"] ||
c_oAscLockTypeElemSubType.InsertRows === element["subType"] || // Отображать залоченность удаленных текущим пользователем строк/столбцов не нужно (уже нечего отображать)
c_oAscLockTypeElemSubType.DeleteColumns === element["subType"] || if (c_oAscLockTypes.kLockTypeMine === type && c_oAscLockTypeElem.Range === typeElem &&
c_oAscLockTypeElemSubType.DeleteRows === element["subType"]) (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;
// Отображать lock-диапазон для lockAll(всего листа) не нужно
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; continue;
sheetId = element["sheetId"];
oRangeOrObjectId = element["rangeOrObjectId"];
if (oRecalcIndexColumns.hasOwnProperty(sheetId)) { oRangeOrObjectId = new asc_Range(c1, r1, c2, r2);
// Пересчет колонок
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"]);
}
} }
},
// Пересчет только для чужих Lock при сохранении на клиенте, который добавлял/удалял строки или столбцы
_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) { result.push(oRangeOrObjectId);
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"]; return result;
};
if (this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) { CCollaborativeEditing.prototype.getLockCellsMe = function (sheetId) {
// Пересчет колонок return this.getLockElem(c_oAscLockTypeElem.Range, c_oAscLockTypes.kLockTypeMine, sheetId);
oRangeOrObjectId["c1"] = this.m_oRecalcIndexColumns[sheetId].getLockOther(oRangeOrObjectId["c1"]); };
oRangeOrObjectId["c2"] = this.m_oRecalcIndexColumns[sheetId].getLockOther(oRangeOrObjectId["c2"]); CCollaborativeEditing.prototype.getLockCellsOther = function (sheetId) {
} return this.getLockElem(c_oAscLockTypeElem.Range, c_oAscLockTypes.kLockTypeOther, sheetId);
if (this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) { };
// Пересчет строк CCollaborativeEditing.prototype.getLockObjectsMe = function (sheetId) {
oRangeOrObjectId["r1"] = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r1"]); return this.getLockElem(c_oAscLockTypeElem.Object, c_oAscLockTypes.kLockTypeMine, sheetId);
oRangeOrObjectId["r2"] = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r2"]); };
} CCollaborativeEditing.prototype.getLockObjectsOther = function (sheetId) {
} return this.getLockElem(c_oAscLockTypeElem.Object, c_oAscLockTypes.kLockTypeOther, sheetId);
}, };
/**
addRecalcIndex: function (type, oRecalcIndex) { * Проверка lock для всего листа
var nIndex = 0; * @param {Number} sheetId элемент для проверки lock
var nRecalcType = c_oAscRecalcIndexTypes.RecalcIndexAdd; * @return {c_oAscMouseMoveLockedObjectType} oLockedObjectType
var oRecalcIndexElement = null; */
var oRecalcIndexResult = {}; CCollaborativeEditing.prototype.isLockAllOther = function (sheetId) {
var arrayElements = this.m_arrNeedUnlock;
var oRecalcIndexTmp = ("0" === type) ? this.m_oRecalcIndexColumns : this.m_oRecalcIndexRows; var count = arrayElements.length;
for (var sheetId in oRecalcIndex) { var element = null;
if (oRecalcIndex.hasOwnProperty(sheetId)) { var oLockedObjectType = c_oAscMouseMoveLockedObjectType.None;
if (!oRecalcIndexTmp.hasOwnProperty(sheetId)) {
oRecalcIndexTmp[sheetId] = new CRecalcIndex(); for (var i = 0; i < count; ++i) {
} element = arrayElements[i].Element;
if (!oRecalcIndexResult.hasOwnProperty(sheetId)) { if (element["sheetId"] === sheetId) {
oRecalcIndexResult[sheetId] = new CRecalcIndex(); if (element["type"] === c_oAscLockTypeElem.Sheet) {
} oLockedObjectType = c_oAscMouseMoveLockedObjectType.Sheet;
for (; nIndex < oRecalcIndex[sheetId]["_arrElements"].length; ++nIndex) { break;
oRecalcIndexElement = oRecalcIndex[sheetId]["_arrElements"][nIndex]; } else if (element["type"] === c_oAscLockTypeElem.Range && null !== element["subType"])
if (true === oRecalcIndexElement["m_bIsSaveIndex"]) oLockedObjectType = c_oAscMouseMoveLockedObjectType.TableProperties;
continue;
nRecalcType = (c_oAscRecalcIndexTypes.RecalcIndexAdd === oRecalcIndexElement["_recalcType"]) ?
c_oAscRecalcIndexTypes.RecalcIndexRemove : c_oAscRecalcIndexTypes.RecalcIndexAdd;
oRecalcIndexTmp[sheetId].add(nRecalcType, oRecalcIndexElement["_position"],
oRecalcIndexElement["_count"], /*bIsSaveIndex*/true);
// Дублируем для возврата результата (нам нужно пересчитать только по последнему индексу
oRecalcIndexResult[sheetId].add(nRecalcType, oRecalcIndexElement["_position"],
oRecalcIndexElement["_count"], /*bIsSaveIndex*/true);
}
}
} }
}
return oLockedObjectType;
};
return oRecalcIndexResult; CCollaborativeEditing.prototype._recalcLockArray = function (typeLock, oRecalcIndexColumns, oRecalcIndexRows) {
}, var arrayElements = (c_oAscLockTypes.kLockTypeMine === typeLock) ? this.m_arrNeedUnlock2 : this.m_arrNeedUnlock;
var count = arrayElements.length;
// Undo для добавления/удаления столбцов var element = null, oRangeOrObjectId = null;
undoCols: function (sheetId, count) { var i;
if (this.isCoAuthoringExcellEnable()) { var sheetId = -1;
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId))
return; for (i = 0; i < count; ++i) {
this.m_oRecalcIndexColumns[sheetId].remove(count); 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"]);
}
}
};
// Пересчет только для чужих Lock при сохранении на клиенте, который добавлял/удалял строки или столбцы
CCollaborativeEditing.prototype._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)) {
// Undo для добавления/удаления строк // Пересчет строк
undoRows: function (sheetId, count) { oRangeOrObjectId["r1"] = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r1"]);
if (this.isCoAuthoringExcellEnable()) { oRangeOrObjectId["r2"] = this.m_oRecalcIndexRows[sheetId].getLockOther(oRangeOrObjectId["r2"]);
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId))
return;
this.m_oRecalcIndexRows[sheetId].remove(count);
} }
}, }
};
removeCols: function (sheetId, position, count) { CCollaborativeEditing.prototype.addRecalcIndex = function (type, oRecalcIndex) {
if (this.isCoAuthoringExcellEnable()) { var nIndex = 0;
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) { var nRecalcType = c_oAscRecalcIndexTypes.RecalcIndexAdd;
this.m_oRecalcIndexColumns[sheetId] = new CRecalcIndex(); 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();
} }
this.m_oRecalcIndexColumns[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexRemove, position, if (!oRecalcIndexResult.hasOwnProperty(sheetId)) {
count, /*bIsSaveIndex*/false); oRecalcIndexResult[sheetId] = new CRecalcIndex();
}
},
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, for (; nIndex < oRecalcIndex[sheetId]["_arrElements"].length; ++nIndex) {
count, /*bIsSaveIndex*/false); oRecalcIndexElement = oRecalcIndex[sheetId]["_arrElements"][nIndex];
} if (true === oRecalcIndexElement["m_bIsSaveIndex"])
}, continue;
removeRows: function (sheetId, position, count) { nRecalcType = (c_oAscRecalcIndexTypes.RecalcIndexAdd === oRecalcIndexElement["_recalcType"]) ?
if (this.isCoAuthoringExcellEnable()) { c_oAscRecalcIndexTypes.RecalcIndexRemove : c_oAscRecalcIndexTypes.RecalcIndexAdd;
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) { oRecalcIndexTmp[sheetId].add(nRecalcType, oRecalcIndexElement["_position"],
this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex(); oRecalcIndexElement["_count"], /*bIsSaveIndex*/true);
// Дублируем для возврата результата (нам нужно пересчитать только по последнему индексу
oRecalcIndexResult[sheetId].add(nRecalcType, oRecalcIndexElement["_position"],
oRecalcIndexElement["_count"], /*bIsSaveIndex*/true);
} }
this.m_oRecalcIndexRows[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexRemove, position,
count, /*bIsSaveIndex*/false);
} }
}, }
addRows: function (sheetId, position, count) {
if (this.isCoAuthoringExcellEnable()) { return oRecalcIndexResult;
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) { };
this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
} // Undo для добавления/удаления столбцов
this.m_oRecalcIndexRows[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexAdd, position, CCollaborativeEditing.prototype.undoCols = function (sheetId, count) {
count, /*bIsSaveIndex*/false); if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId))
return;
this.m_oRecalcIndexColumns[sheetId].remove(count);
}
};
// Undo для добавления/удаления строк
CCollaborativeEditing.prototype.undoRows = function (sheetId, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId))
return;
this.m_oRecalcIndexRows[sheetId].remove(count);
}
};
CCollaborativeEditing.prototype.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,
addColsRange: function (sheetId, range) { count, /*bIsSaveIndex*/false);
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) { }
this.m_oInsertColumns[sheetId] = []; };
CCollaborativeEditing.prototype.addCols = function (sheetId, position, count) {
if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexColumns[sheetId] = new CRecalcIndex();
} }
var arrInsertColumns = this.m_oInsertColumns[sheetId]; this.m_oRecalcIndexColumns[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexAdd, position,
// Перед добавлением нужно передвинуть имеющиеся count, /*bIsSaveIndex*/false);
var countCols = range.c2 - range.c1 + 1; }
var isAddNewRange = true; };
for (var i = 0; i < arrInsertColumns.length; ++i) { CCollaborativeEditing.prototype.removeRows = function (sheetId, position, count) {
if (arrInsertColumns[i].c1 > range.c1) { if (this.isCoAuthoringExcellEnable()) {
arrInsertColumns[i].c1 += countCols; if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
arrInsertColumns[i].c2 += countCols; this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
} else if (arrInsertColumns[i].c1 <= range.c1 && arrInsertColumns[i].c2 >= range.c1) {
arrInsertColumns[i].c2 += countCols;
isAddNewRange = false;
}
} }
if (isAddNewRange) this.m_oRecalcIndexRows[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexRemove, position,
arrInsertColumns.push(range); count, /*bIsSaveIndex*/false);
}, }
addRowsRange: function (sheetId, range) { };
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) { CCollaborativeEditing.prototype.addRows = function (sheetId, position, count) {
this.m_oInsertRows[sheetId] = []; if (this.isCoAuthoringExcellEnable()) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId)) {
this.m_oRecalcIndexRows[sheetId] = new CRecalcIndex();
} }
var arrInsertRows = this.m_oInsertRows[sheetId]; this.m_oRecalcIndexRows[sheetId].add(c_oAscRecalcIndexTypes.RecalcIndexAdd, position,
// Перед добавлением нужно передвинуть имеющиеся count, /*bIsSaveIndex*/false);
var countRows = range.r2 - range.r1 + 1; }
var isAddNewRange = true; };
for (var i = 0; i < arrInsertRows.length; ++i) { CCollaborativeEditing.prototype.addColsRange = function (sheetId, range) {
if (arrInsertRows[i].r1 > range.r1) { if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) {
arrInsertRows[i].r1 += countRows; this.m_oInsertColumns[sheetId] = [];
arrInsertRows[i].r2 += countRows; }
} else if (arrInsertRows[i].r1 <= range.r1 && arrInsertRows[i].r2 >= range.r1) { var arrInsertColumns = this.m_oInsertColumns[sheetId];
arrInsertRows[i].r2 += countRows; // Перед добавлением нужно передвинуть имеющиеся
isAddNewRange = false; 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) }
arrInsertRows.push(range); if (isAddNewRange)
}, arrInsertColumns.push(range);
removeColsRange: function (sheetId, range) { };
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) CCollaborativeEditing.prototype.addRowsRange = function (sheetId, range) {
return; if (!this.m_oInsertRows.hasOwnProperty(sheetId)) {
var arrInsertColumns = this.m_oInsertColumns[sheetId]; this.m_oInsertRows[sheetId] = [];
// Нужно убрать те колонки, которые входят в диапазон }
var countCols = range.c2 - range.c1 + 1; var arrInsertRows = this.m_oInsertRows[sheetId];
for (var i = 0; i < arrInsertColumns.length; ++i) { // Перед добавлением нужно передвинуть имеющиеся
if (arrInsertColumns[i].c1 > range.c2) { var countRows = range.r2 - range.r1 + 1;
// Справа от удаляемого диапазона var isAddNewRange = true;
arrInsertColumns[i].c1 -= countCols; for (var i = 0; i < arrInsertRows.length; ++i) {
arrInsertColumns[i].c2 -= countCols; if (arrInsertRows[i].r1 > range.r1) {
} else if (arrInsertColumns[i].c1 >= range.c1 && arrInsertColumns[i].c2 <= range.c2) { arrInsertRows[i].r1 += countRows;
// Полностью включение в удаляемый диапазон arrInsertRows[i].r2 += countRows;
arrInsertColumns.splice(i, 1); } else if (arrInsertRows[i].r1 <= range.r1 && arrInsertRows[i].r2 >= range.r1) {
i -= 1; arrInsertRows[i].r2 += countRows;
} else if (arrInsertColumns[i].c1 >= range.c1 && arrInsertColumns[i].c1 <= range.c2 && arrInsertColumns[i].c2 > range.c2) { isAddNewRange = false;
// Частичное включение начала диапазона
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 (isAddNewRange)
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) arrInsertRows.push(range);
return; };
var arrInsertRows = this.m_oInsertRows[sheetId]; CCollaborativeEditing.prototype.removeColsRange = function (sheetId, range) {
// Нужно убрать те строки, которые входят в диапазон if (!this.m_oInsertColumns.hasOwnProperty(sheetId))
var countRows = range.r2 - range.r1 + 1; return;
for (var i = 0; i < arrInsertRows.length; ++i) { var arrInsertColumns = this.m_oInsertColumns[sheetId];
if (arrInsertRows[i].r1 > range.r2) { // Нужно убрать те колонки, которые входят в диапазон
// Снизу от удаляемого диапазона var countCols = range.c2 - range.c1 + 1;
arrInsertRows[i].r1 -= countRows; for (var i = 0; i < arrInsertColumns.length; ++i) {
arrInsertRows[i].r2 -= countRows; if (arrInsertColumns[i].c1 > range.c2) {
} else if (arrInsertRows[i].r1 >= range.r1 && arrInsertRows[i].r2 <= range.r2) { // Справа от удаляемого диапазона
// Полностью включение в удаляемый диапазон arrInsertColumns[i].c1 -= countCols;
arrInsertRows.splice(i, 1); arrInsertColumns[i].c2 -= countCols;
i -= 1; } else if (arrInsertColumns[i].c1 >= range.c1 && arrInsertColumns[i].c2 <= range.c2) {
} else if (arrInsertRows[i].r1 >= range.r1 && arrInsertRows[i].r1 <= range.r2 && arrInsertRows[i].r2 > range.r2) { // Полностью включение в удаляемый диапазон
// Частичное включение начала диапазона arrInsertColumns.splice(i, 1);
arrInsertRows[i].r1 = range.r2 + 1; i -= 1;
arrInsertRows[i].r1 -= countRows; } else if (arrInsertColumns[i].c1 >= range.c1 && arrInsertColumns[i].c1 <= range.c2 && arrInsertColumns[i].c2 > range.c2) {
arrInsertRows[i].r2 -= countRows; // Частичное включение начала диапазона
} else if (arrInsertRows[i].r1 < range.r1 && arrInsertRows[i].r2 >= range.r1 && arrInsertRows[i].r2 <= range.r2) { arrInsertColumns[i].c1 = range.c2 + 1;
// Частичное включение окончания диапазона arrInsertColumns[i].c1 -= countCols;
arrInsertRows[i].r2 = range.r1 - 1; arrInsertColumns[i].c2 -= countCols;
} else if (arrInsertRows[i].r1 < range.r1 && arrInsertRows[i].r2 > range.r2) { } else if (arrInsertColumns[i].c1 < range.c1 && arrInsertColumns[i].c2 >= range.c1 && arrInsertColumns[i].c2 <= range.c2) {
// Удаляемый диапазон внутри нашего диапазона // Частичное включение окончания диапазона
arrInsertRows[i].r2 -= countRows; arrInsertColumns[i].c2 = range.c1 - 1;
} } else if (arrInsertColumns[i].c1 < range.c1 && arrInsertColumns[i].c2 > range.c2) {
// Удаляемый диапазон внутри нашего диапазона
arrInsertColumns[i].c2 -= countCols;
} }
}, }
isIntersectionInCols: function (sheetId, col) { };
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) CCollaborativeEditing.prototype.removeRowsRange = function (sheetId, range) {
return false; if (!this.m_oInsertRows.hasOwnProperty(sheetId))
var arrInsertColumns = this.m_oInsertColumns[sheetId]; return;
for (var i = 0; i < arrInsertColumns.length; ++i) { var arrInsertRows = this.m_oInsertRows[sheetId];
if (arrInsertColumns[i].c1 <= col && col <= arrInsertColumns[i].c2) // Нужно убрать те строки, которые входят в диапазон
return true; 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;
} }
}
};
CCollaborativeEditing.prototype.isIntersectionInCols = function (sheetId, col) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId))
return false; return false;
}, var arrInsertColumns = this.m_oInsertColumns[sheetId];
isIntersectionInRows: function (sheetId, row) { for (var i = 0; i < arrInsertColumns.length; ++i) {
if (!this.m_oInsertRows.hasOwnProperty(sheetId)) if (arrInsertColumns[i].c1 <= col && col <= arrInsertColumns[i].c2)
return false; return true;
var arrInsertRows = this.m_oInsertRows[sheetId]; }
for (var i = 0; i < arrInsertRows.length; ++i) { return false;
if (arrInsertRows[i].r1 <= row && row <= arrInsertRows[i].r2) };
return true; CCollaborativeEditing.prototype.isIntersectionInRows = function (sheetId, row) {
} if (!this.m_oInsertRows.hasOwnProperty(sheetId))
return false; return false;
}, var arrInsertRows = this.m_oInsertRows[sheetId];
getArrayInsertColumnsBySheetId: function (sheetId) { for (var i = 0; i < arrInsertRows.length; ++i) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId)) if (arrInsertRows[i].r1 <= row && row <= arrInsertRows[i].r2)
return []; return true;
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);
} }
return false;
};
CCollaborativeEditing.prototype.getArrayInsertColumnsBySheetId = function (sheetId) {
if (!this.m_oInsertColumns.hasOwnProperty(sheetId))
return [];
return this.m_oInsertColumns[sheetId];
};
CCollaborativeEditing.prototype.getArrayInsertRowsBySheetId = function (sheetId) {
if (!this.m_oInsertRows.hasOwnProperty(sheetId))
return [];
return this.m_oInsertRows[sheetId];
};
CCollaborativeEditing.prototype.getLockMeColumn = function (sheetId, col) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId))
return col;
return this.m_oRecalcIndexColumns[sheetId].getLockMe(col);
};
CCollaborativeEditing.prototype.getLockMeRow = function (sheetId, row) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId))
return row;
return this.m_oRecalcIndexRows[sheetId].getLockMe(row);
};
// Только когда от других пользователей изменения колонок (для пересчета)
CCollaborativeEditing.prototype.getLockMeColumn2 = function (sheetId, col) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId))
return col;
return this.m_oRecalcIndexColumns[sheetId].getLockMe2(col);
};
// Только когда от других пользователей изменения строк (для пересчета)
CCollaborativeEditing.prototype.getLockMeRow2 = function (sheetId, row) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId))
return row;
return this.m_oRecalcIndexRows[sheetId].getLockMe2(row);
};
// Только для принятия изменений от других пользователей! (для пересчета только в сохранении)
CCollaborativeEditing.prototype.getLockOtherColumn2 = function (sheetId, col) {
if (!this.m_oRecalcIndexColumns.hasOwnProperty(sheetId))
return col;
return this.m_oRecalcIndexColumns[sheetId].getLockSaveOther(col);
};
// Только для принятия изменений от других пользователей! (для пересчета только в сохранении)
CCollaborativeEditing.prototype.getLockOtherRow2 = function (sheetId, row) {
if (!this.m_oRecalcIndexRows.hasOwnProperty(sheetId))
return row;
return this.m_oRecalcIndexRows[sheetId].getLockSaveOther(row);
}; };
/** /**
...@@ -805,43 +800,32 @@ ...@@ -805,43 +800,32 @@
return this; return this;
} }
CLock.prototype = { CLock.prototype.init = function () {
/** @type CLock */ };
constructor: CLock, CLock.prototype.getType = function () {
return this.Type;
init: function () { };
CLock.prototype.setType = function (newType) {
}, if (newType === c_oAscLockTypes.kLockTypeNone)
this.UserId = null;
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.Type = newType;
this.UserId = UserId; };
},
getUserId: function() { CLock.prototype.Lock = function(bMine) {
return this.UserId; if (c_oAscLockTypes.kLockTypeNone === this.Type)
{
if (true === bMine)
this.Type = c_oAscLockTypes.kLockTypeMine;
else
this.Type = c_oAscLockTypes.kLockTypeOther;
} }
}; };
CLock.prototype.setUserId = function(UserId) {
this.UserId = UserId;
};
function CRecalcIndexElement(recalcType, position, bIsSaveIndex) { function CRecalcIndexElement(recalcType, position, bIsSaveIndex) {
if ( !(this instanceof CRecalcIndexElement) ) { if ( !(this instanceof CRecalcIndexElement) ) {
return new CRecalcIndexElement (recalcType, position, bIsSaveIndex); return new CRecalcIndexElement (recalcType, position, bIsSaveIndex);
...@@ -855,68 +839,64 @@ ...@@ -855,68 +839,64 @@
return this; return this;
} }
CRecalcIndexElement.prototype = { // Пересчет для других
constructor: CRecalcIndexElement, CRecalcIndexElement.prototype.getLockOther = function (position, type) {
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? +1 : -1;
// Пересчет для других if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType &&
getLockOther: function (position, type) { true === this.m_bIsSaveIndex) {
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? +1 : -1; // Мы еще не применили чужие изменения (поэтому для insert не нужно отрисовывать)
if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType && // RecalcIndexRemove (потому что перевертываем для правильной отработки, от другого пользователя
true === this.m_bIsSaveIndex) { // пришло RecalcIndexAdd
// Мы еще не применили чужие изменения (поэтому для insert не нужно отрисовывать) return null;
// RecalcIndexRemove (потому что перевертываем для правильной отработки, от другого пользователя } else if (position === this._position &&
// пришло RecalcIndexAdd c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType &&
return null; c_oAscLockTypes.kLockTypeMine === type && false === this.m_bIsSaveIndex) {
} 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;
return null; else
} else if (position < this._position) return (position + inc);
return position; };
else // Пересчет для других (только для сохранения)
return (position + inc); CRecalcIndexElement.prototype.getLockSaveOther = function (position, type) {
}, if (this.m_bIsSaveIndex)
// Пересчет для других (только для сохранения) return position;
getLockSaveOther: function (position, type) {
if (this.m_bIsSaveIndex) var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? +1 : -1;
return position; if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType &&
true === this.m_bIsSaveIndex) {
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? +1 : -1; // Мы еще не применили чужие изменения (поэтому для insert не нужно отрисовывать)
if (position === this._position && c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType && // RecalcIndexRemove (потому что перевертываем для правильной отработки, от другого пользователя
true === this.m_bIsSaveIndex) { // пришло RecalcIndexAdd
// Мы еще не применили чужие изменения (поэтому для insert не нужно отрисовывать) return null;
// RecalcIndexRemove (потому что перевертываем для правильной отработки, от другого пользователя } else if (position === this._position &&
// пришло RecalcIndexAdd c_oAscRecalcIndexTypes.RecalcIndexRemove === this._recalcType &&
return null; c_oAscLockTypes.kLockTypeMine === type && false === this.m_bIsSaveIndex) {
} 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;
return null; else
} else if (position < this._position) return (position + inc);
return position; };
else // Пересчет для себя
return (position + inc); CRecalcIndexElement.prototype.getLockMe = function (position) {
}, var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? -1 : +1;
// Пересчет для себя if (position < this._position)
getLockMe: function (position) { return position;
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? -1 : +1; else
if (position < this._position) return (position + inc);
return position; };
else // Только когда от других пользователей изменения (для пересчета)
return (position + inc); CRecalcIndexElement.prototype.getLockMe2 = function (position) {
}, var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? -1 : +1;
// Только когда от других пользователей изменения (для пересчета) if (true !== this.m_bIsSaveIndex || position < this._position)
getLockMe2: function (position) { return position;
var inc = (c_oAscRecalcIndexTypes.RecalcIndexAdd === this._recalcType) ? -1 : +1; else
if (true !== this.m_bIsSaveIndex || position < this._position) return (position + inc);
return position;
else
return (position + inc);
}
}; };
function CRecalcIndex() { function CRecalcIndex() {
...@@ -929,118 +909,115 @@ ...@@ -929,118 +909,115 @@
return this; return this;
} }
CRecalcIndex.prototype = { CRecalcIndex.prototype.add = function (recalcType, position, count, bIsSaveIndex) {
constructor: CRecalcIndex, for (var i = 0; i < count; ++i)
add: function (recalcType, position, count, bIsSaveIndex) { this._arrElements.push(new CRecalcIndexElement(recalcType, position, bIsSaveIndex));
for (var i = 0; i < count; ++i) };
this._arrElements.push(new CRecalcIndexElement(recalcType, position, bIsSaveIndex)); // Удаляет из пересчета, для undo
}, CRecalcIndex.prototype.remove = function (count) {
// Удаляет из пересчета, для undo for (var i = 0; i < count; ++i)
remove: function (count) { this._arrElements.pop();
for (var i = 0; i < count; ++i) };
this._arrElements.pop(); CRecalcIndex.prototype.clear = function () {
}, this._arrElements.length = 0;
clear: function () { };
this._arrElements.length = 0;
}, // Пересчет для других
CRecalcIndex.prototype.getLockOther = function (position, type) {
// Пересчет для других var newPosition = position;
getLockOther: function (position, type) { /*var count = this._arrElements.length;
var newPosition = position; for (var i = 0; i < count; ++i) {
/*var count = this._arrElements.length; newPosition = this._arrElements[i].getLockOther(newPosition, type);
for (var i = 0; i < count; ++i) { if (null === newPosition)
break;
}*/
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); newPosition = this._arrElements[i].getLockOther(newPosition, type);
if (null === newPosition) if (null === newPosition)
break; break;
}*/
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;
}
} }
} else {
return newPosition; for (i = count - 1; i >= 0; --i) {
}, newPosition = this._arrElements[i].getLockOther(newPosition, type);
// Пересчет для других (только для сохранения)
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) if (null === newPosition)
break; break;
} }
}
return newPosition; return newPosition;
}, };
// Пересчет для себя // Пересчет для других (только для сохранения)
getLockMe: function (position) { CRecalcIndex.prototype.getLockSaveOther = function (position, type) {
var newPosition = position; var newPosition = position;
var count = this._arrElements.length; var count = this._arrElements.length;
if (0 >= count) for (var i = 0; i < count; ++i) {
return newPosition; newPosition = this._arrElements[i].getLockSaveOther(newPosition, type);
// Для пересчета, когда добавил сам - обратный порядок if (null === newPosition)
// Для пересчета, когда добавил кто-то другой - прямой break;
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;
};
// Пересчет для себя
CRecalcIndex.prototype.getLockMe = function (position) {
var newPosition = position;
var count = this._arrElements.length;
if (0 >= count)
return newPosition; return newPosition;
}, // Для пересчета, когда добавил сам - обратный порядок
// Только когда от других пользователей изменения (для пересчета) // Для пересчета, когда добавил кто-то другой - прямой
getLockMe2: function (position) { var bIsDirect = this._arrElements[0].m_bIsSaveIndex;
var newPosition = position; var i;
var count = this._arrElements.length; if (bIsDirect) {
if (0 >= count) for (i = 0; i < count; ++i) {
return newPosition; newPosition = this._arrElements[i].getLockMe(newPosition);
// Для пересчета, когда добавил сам - обратный порядок if (null === newPosition)
// Для пересчета, когда добавил кто-то другой - прямой break;
var bIsDirect = this._arrElements[0].m_bIsSaveIndex; }
var i; } else {
if (bIsDirect) { for (i = count - 1; i >= 0; --i) {
for (i = 0; i < count; ++i) { newPosition = this._arrElements[i].getLockMe(newPosition);
newPosition = this._arrElements[i].getLockMe2(newPosition); if (null === newPosition)
if (null === newPosition) break;
break;
}
} else {
for (i = count - 1; i >= 0; --i) {
newPosition = this._arrElements[i].getLockMe2(newPosition);
if (null === newPosition)
break;
}
} }
}
return newPosition;
};
// Только когда от других пользователей изменения (для пересчета)
CRecalcIndex.prototype.getLockMe2 = function (position) {
var newPosition = position;
var count = this._arrElements.length;
if (0 >= count)
return newPosition; 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;
}; };
/* /*
......
...@@ -1548,7 +1548,6 @@ ...@@ -1548,7 +1548,6 @@
this.view.MobileTouchManager.onTouchStart(event); this.view.MobileTouchManager.onTouchStart(event);
}; };
asc_CEventsController.prototype._onTouchMove = function (event){ asc_CEventsController.prototype._onTouchMove = function (event){
var n = new Date().getTime();
this.view.MobileTouchManager.onTouchMove(event); this.view.MobileTouchManager.onTouchMove(event);
}; };
asc_CEventsController.prototype._onTouchEnd = function (event){ asc_CEventsController.prototype._onTouchEnd = function (event){
......
...@@ -49,12 +49,12 @@ ...@@ -49,12 +49,12 @@
* Widget for displaying and editing Workbook object * Widget for displaying and editing Workbook object
* ----------------------------------------------------------------------------- * -----------------------------------------------------------------------------
* @param {Workbook} model Workbook * @param {Workbook} model Workbook
* @param {EventsController} controller Events controller * @param {asc.asc_CEventsController} controller Events controller
* @param {HandlersList} handlers Events handlers for WorkbookView events * @param {HandlersList} handlers Events handlers for WorkbookView events
* @param {Element} elem Container element * @param {Element} elem Container element
* @param {Element} inputElem Input element for top line editor * @param {Element} inputElem Input element for top line editor
* @param {Object} Api * @param {Object} Api
* @param {asc_CCollaborativeEditing} collaborativeEditing * @param {CCollaborativeEditing} collaborativeEditing
* @param {c_oAscFontRenderingModeType} fontRenderingMode * @param {c_oAscFontRenderingModeType} fontRenderingMode
* @param {Object} settings Settings * @param {Object} settings Settings
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment