Commit 4c2a82c4 authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

fix bug #30242

При загрузке lock-и должны приходить после того, как мы открыли документ. (ToDo возможно стоит вообще пересмотреть этот момент и реализовать его в doccoapi).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@64703 954022d7-b5bf-4e40-9824-e11837661b57
parent b01c17cc
......@@ -89,6 +89,9 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
//текущий обьект куда записываются информация для update, когда принимаются изменения в native редакторе
this.oRedoObjectParamNative = null;
// Массив lock-ов, которые были на открытии документа
this.arrPreOpenLocksObjects = [];
// CoAuthoring and Chat
this.User = undefined;
this.CoAuthoringApi = new CDocsCoApi();
......@@ -160,8 +163,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
this.formulasList = null; // Список всех формул
this.TrackFile = null;
this.fCallbackSendCommand = null;
this.fCurCallback = null;
......@@ -1497,6 +1498,12 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
t.handlers.trigger("asc_onConnectionStateChanged", e);
};
this.CoAuthoringApi.onLocksAcquired = function(e) {
if (!t.IsSendDocumentLoadCompleate) {
// Пока документ еще не загружен, будем сохранять функцию и аргументы
t.arrPreOpenLocksObjects.push(function(){t.CoAuthoringApi.onLocksAcquired(e);});
return;
}
if (2 != e["state"]) {
var elementValue = e["blockValue"];
var lockElem = t.collaborativeEditing.getLockByElem(elementValue, c_oAscLockTypes.kLockTypeOther);
......@@ -1555,6 +1562,12 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
}
};
this.CoAuthoringApi.onLocksReleased = function(e, bChanges) {
if (!t.IsSendDocumentLoadCompleate) {
// Пока документ еще не загружен, будем сохранять функцию и аргументы
t.arrPreOpenLocksObjects.push(function(){t.CoAuthoringApi.onLocksReleased(e, bChanges);});
return;
}
var element = e["block"];
var lockElem = t.collaborativeEditing.getLockByElem(element, c_oAscLockTypes.kLockTypeOther);
if (null != lockElem) {
......@@ -1600,6 +1613,11 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
}
};
this.CoAuthoringApi.onLocksReleasedEnd = function() {
if (!t.IsSendDocumentLoadCompleate) {
// Пока документ еще не загружен ничего не делаем
return;
}
if (t.wb) {
// Шлем update для toolbar-а, т.к. когда select в lock ячейке нужно сбросить блокировку toolbar
t.wb._onWSSelectionChanged(/*info*/null);
......@@ -1885,6 +1903,12 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
// Применяем пришедшие при открытии изменения
this._applyFirstLoadChanges();
// Применяем все lock-и (ToDo возможно стоит пересмотреть вообще Lock-и)
for (var i = 0; i < this.arrPreOpenLocksObjects.length; ++i) {
this.arrPreOpenLocksObjects[i]();
}
this.arrPreOpenLocksObjects = [];
// Меняем тип состояния (на никакое)
this.advancedOptionsAction = c_oAscAdvancedOptionsAction.None;
......
......@@ -68,6 +68,9 @@ function asc_docs_api(name)
this.isApplyChangesOnOpen = false;
this.isApplyChangesOnOpenEnabled = true;
// Массив lock-ов, которые были на открытии документа
this.arrPreOpenLocksObjects = [];
this.IsSupportEmptyPresentation = true;
this.ShowParaMarks = false;
......@@ -169,8 +172,7 @@ function asc_docs_api(name)
this.IsLongActionCurrent = 0;
this.LongActionCallbacks = [];
this.LongActionCallbacksParams = [];
this.TrackFile = null;
this.fCurCallback = null;
var oThis = this;
......@@ -245,204 +247,184 @@ asc_docs_api.prototype._coAuthoringInit = function (fCallback) {
this.CoAuthoringApi.onAuthParticipantsChanged = function (e, count) { t.asc_fireCallback("asc_onAuthParticipantsChanged", e, count); };
this.CoAuthoringApi.onMessage = function (e, clear) { t.asc_fireCallback( "asc_onCoAuthoringChatReceiveMessage", e, clear); };
this.CoAuthoringApi.onConnectionStateChanged = function (e) { t.asc_fireCallback( "asc_onConnectionStateChanged", e); };
this.CoAuthoringApi.onLocksAcquired = function (e) {
if (2 != e["state"]) {
this.CoAuthoringApi.onLocksAcquired = function(e) {
if (t.isApplyChangesOnOpenEnabled) {
// Пока документ еще не загружен, будем сохранять функцию и аргументы
t.arrPreOpenLocksObjects.push(function(){t.CoAuthoringApi.onLocksAcquired(e);});
return;
}
var block_value = e["blockValue"];
var classes = [];
switch(block_value["type"])
{
case c_oAscLockTypeElemPresentation.Object:
{
classes.push(block_value["objId"]);
//classes.push(block_value["slideId"]);
break;
}
case c_oAscLockTypeElemPresentation.Slide:
{
classes.push(block_value["val"]);
break;
}
case c_oAscLockTypeElemPresentation.Presentation:
{
break;
}
}
var Id = e["block"];
if (2 != e["state"]) {
for(var i = 0; i < classes.length; ++i)
{
var Class = g_oTableId.Get_ById(classes[i]);// g_oTableId.Get_ById( Id );
if ( null != Class )
{
var Lock = Class.Lock;
var OldType = Class.Lock.Get_Type();
if ( locktype_Other2 === OldType || locktype_Other3 === OldType )
Lock.Set_Type( locktype_Other3, true );
else
Lock.Set_Type( locktype_Other, true );
if ( Class instanceof PropLocker )
{
var object = g_oTableId.Get_ById(Class.objectId);
if(object instanceof Slide && Class === object.deleteLock)
{
editor.WordControl.m_oLogicDocument.DrawingDocument.LockSlide(object.num);
}
}
// Выставляем ID пользователя, залочившего данный элемент
Lock.Set_UserId( e["user"] );
if ( Class instanceof PropLocker )
{
var object = g_oTableId.Get_ById(Class.objectId);
if(object instanceof CPresentation)
{
if(Class === editor.WordControl.m_oLogicDocument.themeLock)
{
editor.asc_fireCallback("asc_onLockDocumentTheme");
}
else if(Class === editor.WordControl.m_oLogicDocument.schemeLock)
{
editor.asc_fireCallback("asc_onLockDocumentSchema");
}
else if(Class === editor.WordControl.m_oLogicDocument.slideSizeLock)
{
editor.asc_fireCallback("asc_onLockDocumentProps");
}
}
}
if(Class instanceof CComment)
{
editor.sync_LockComment(Class.Get_Id(), e["user"]);
}
// TODO: Здесь для ускорения надо сделать проверку, является ли текущим элемент с
// заданным Id. Если нет, тогда и не надо обновлять состояние.
editor.WordControl.m_oLogicDocument.Document_UpdateInterfaceState();
}
else
{
if(classes[i].indexOf("new_object") > -1 && block_value["type"] === c_oAscLockTypeElemPresentation.Object)
{
var slide_id = block_value["slideId"];
var delete_lock = g_oTableId.Get_ById(slide_id);
if(isRealObject(delete_lock))
{
var Lock = delete_lock.Lock;
var OldType = Lock.Get_Type();
if ( locktype_Other2 === OldType || locktype_Other3 === OldType )
Lock.Set_Type( locktype_Other3, true );
else
Lock.Set_Type( locktype_Other, true );
editor.WordControl.m_oLogicDocument.DrawingDocument.LockSlide(g_oTableId.Get_ById(delete_lock.objectId).num);
}
else
{
CollaborativeEditing.Add_NeedLock(slide_id, e["user"]);
}
}
else
{
CollaborativeEditing.Add_NeedLock(classes[i], e["user"]);
}
}
}
}
};
this.CoAuthoringApi.onLocksReleased = function (e, bChanges) {
var Id;
var block_value = e["block"];
var classes = [];
switch(block_value["type"])
var block_value = e["blockValue"];
var classes = [];
switch (block_value["type"]) {
case c_oAscLockTypeElemPresentation.Object:
{
case c_oAscLockTypeElemPresentation.Object:
{
classes.push(block_value["objId"]);
//classes.push(block_value["slideId"]);
break;
classes.push(block_value["objId"]);
//classes.push(block_value["slideId"]);
break;
}
case c_oAscLockTypeElemPresentation.Slide:
{
classes.push(block_value["val"]);
break;
}
case c_oAscLockTypeElemPresentation.Presentation:
{
break;
}
}
for (var i = 0; i < classes.length; ++i) {
var Class = g_oTableId.Get_ById(classes[i]);// g_oTableId.Get_ById( Id );
if (null != Class) {
var Lock = Class.Lock;
var OldType = Class.Lock.Get_Type();
if (locktype_Other2 === OldType || locktype_Other3 === OldType) {
Lock.Set_Type(locktype_Other3, true);
} else {
Lock.Set_Type(locktype_Other, true);
}
if (Class instanceof PropLocker) {
var object = g_oTableId.Get_ById(Class.objectId);
if (object instanceof Slide && Class === object.deleteLock) {
editor.WordControl.m_oLogicDocument.DrawingDocument.LockSlide(object.num);
}
case c_oAscLockTypeElemPresentation.Slide:
{
classes.push(block_value["val"]);
break;
}
// Выставляем ID пользователя, залочившего данный элемент
Lock.Set_UserId(e["user"]);
if (Class instanceof PropLocker) {
var object = g_oTableId.Get_ById(Class.objectId);
if (object instanceof CPresentation) {
if (Class === editor.WordControl.m_oLogicDocument.themeLock) {
editor.asc_fireCallback("asc_onLockDocumentTheme");
} else if (Class === editor.WordControl.m_oLogicDocument.schemeLock) {
editor.asc_fireCallback("asc_onLockDocumentSchema");
} else if (Class === editor.WordControl.m_oLogicDocument.slideSizeLock) {
editor.asc_fireCallback("asc_onLockDocumentProps");
}
}
case c_oAscLockTypeElemPresentation.Presentation:
{
break;
}
if (Class instanceof CComment) {
editor.sync_LockComment(Class.Get_Id(), e["user"]);
}
// TODO: Здесь для ускорения надо сделать проверку, является ли текущим элемент с
// заданным Id. Если нет, тогда и не надо обновлять состояние.
editor.WordControl.m_oLogicDocument.Document_UpdateInterfaceState();
} else {
if (classes[i].indexOf("new_object") > -1 && block_value["type"] === c_oAscLockTypeElemPresentation.Object) {
var slide_id = block_value["slideId"];
var delete_lock = g_oTableId.Get_ById(slide_id);
if (isRealObject(delete_lock)) {
var Lock = delete_lock.Lock;
var OldType = Lock.Get_Type();
if (locktype_Other2 === OldType || locktype_Other3 === OldType) {
Lock.Set_Type(locktype_Other3, true);
} else {
Lock.Set_Type(locktype_Other, true);
}
editor.WordControl.m_oLogicDocument.DrawingDocument.LockSlide(g_oTableId.Get_ById(delete_lock.objectId).num);
} else {
CollaborativeEditing.Add_NeedLock(slide_id, e["user"]);
}
} else {
CollaborativeEditing.Add_NeedLock(classes[i], e["user"]);
}
}
for(var i = 0; i < classes.length; ++i)
{
Id = classes[i];
var Class = g_oTableId.Get_ById( Id );
if ( null != Class )
{
var Lock = Class.Lock;
if ( "undefined" != typeof(Lock) )
{
var CurType = Lock.Get_Type();
var NewType = locktype_None;
if ( CurType === locktype_Other )
{
if ( true != bChanges )
NewType = locktype_None;
else
{
NewType = locktype_Other2;
CollaborativeEditing.Add_Unlock(Class);
}
}
else if ( CurType === locktype_Mine )
{
// Такого быть не должно
NewType = locktype_Mine;
}
else if ( CurType === locktype_Other2 || CurType === locktype_Other3 )
NewType = locktype_Other2;
Lock.Set_Type( NewType, true );
if(Class instanceof PropLocker )
{
var object = g_oTableId.Get_ById(Class.objectId);
if(object instanceof Slide && Class === object.deleteLock)
{
if(NewType !== locktype_Mine && NewType !== locktype_None)
editor.WordControl.m_oLogicDocument.DrawingDocument.LockSlide(object.num);
else
editor.WordControl.m_oLogicDocument.DrawingDocument.UnLockSlide(object.num);
}
if(object instanceof CPresentation)
{
if(Class === object.themeLock)
{
if(NewType !== locktype_Mine && NewType !== locktype_None)
editor.asc_fireCallback("asc_onLockDocumentTheme");
else
editor.asc_fireCallback("asc_onUnLockDocumentTheme");
}
if(Class === object.slideSizeLock)
{
if(NewType !== locktype_Mine && NewType !== locktype_None)
editor.asc_fireCallback("asc_onLockDocumentProps");
else
editor.asc_fireCallback("asc_onUnLockDocumentProps");
}
}
}
}
}
}
};
this.CoAuthoringApi.onLocksReleased = function(e, bChanges) {
if (t.isApplyChangesOnOpenEnabled) {
// Пока документ еще не загружен, будем сохранять функцию и аргументы
t.arrPreOpenLocksObjects.push(function(){t.CoAuthoringApi.onLocksReleased(e, bChanges);});
return;
}
var Id;
var block_value = e["block"];
var classes = [];
switch (block_value["type"]) {
case c_oAscLockTypeElemPresentation.Object:
{
classes.push(block_value["objId"]);
//classes.push(block_value["slideId"]);
break;
}
case c_oAscLockTypeElemPresentation.Slide:
{
classes.push(block_value["val"]);
break;
}
case c_oAscLockTypeElemPresentation.Presentation:
{
break;
}
}
for (var i = 0; i < classes.length; ++i) {
Id = classes[i];
var Class = g_oTableId.Get_ById(Id);
if (null != Class) {
var Lock = Class.Lock;
if ("undefined" != typeof(Lock)) {
var CurType = Lock.Get_Type();
var NewType = locktype_None;
if (CurType === locktype_Other) {
if (true != bChanges) {
NewType = locktype_None;
} else {
NewType = locktype_Other2;
CollaborativeEditing.Add_Unlock(Class);
}
else
{
CollaborativeEditing.Remove_NeedLock(Id);
} else if (CurType === locktype_Mine) {
// Такого быть не должно
NewType = locktype_Mine;
} else if (CurType === locktype_Other2 || CurType === locktype_Other3) {
NewType = locktype_Other2;
}
Lock.Set_Type(NewType, true);
if (Class instanceof PropLocker) {
var object = g_oTableId.Get_ById(Class.objectId);
if (object instanceof Slide && Class === object.deleteLock) {
if (NewType !== locktype_Mine && NewType !== locktype_None) {
editor.WordControl.m_oLogicDocument.DrawingDocument.LockSlide(object.num);
} else {
editor.WordControl.m_oLogicDocument.DrawingDocument.UnLockSlide(object.num);
}
}
if (object instanceof CPresentation) {
if (Class === object.themeLock) {
if (NewType !== locktype_Mine && NewType !== locktype_None) {
editor.asc_fireCallback("asc_onLockDocumentTheme");
} else {
editor.asc_fireCallback("asc_onUnLockDocumentTheme");
}
}
if (Class === object.slideSizeLock) {
if (NewType !== locktype_Mine && NewType !== locktype_None) {
editor.asc_fireCallback("asc_onLockDocumentProps");
} else {
editor.asc_fireCallback("asc_onUnLockDocumentProps");
}
}
}
}
}
};
} else {
CollaborativeEditing.Remove_NeedLock(Id);
}
}
};
this.CoAuthoringApi.onSaveChanges = function (e, userId, bFirstLoad) {
// bSendEvent = false - это означает, что мы загружаем имеющиеся изменения при открытии
var Changes = new CCollaborativeChanges();
......@@ -3926,6 +3908,12 @@ asc_docs_api.prototype.OpenDocumentEndCallback = function()
}
return;
}
// Применяем все lock-и (ToDo возможно стоит пересмотреть вообще Lock-и)
for (var i = 0; i < this.arrPreOpenLocksObjects.length; ++i) {
this.arrPreOpenLocksObjects[i]();
}
this.arrPreOpenLocksObjects = [];
}
}
this.WordControl.m_oLogicDocument.Recalculate({Drawings: {All:true, Map: {}}});
......
......@@ -411,6 +411,9 @@ function asc_docs_api(name)
this.isApplyChangesOnOpen = false;
this.isApplyChangesOnOpenEnabled = true;
// Массив lock-ов, которые были на открытии документа
this.arrPreOpenLocksObjects = [];
this.mailMergeFileData = null;
// Тип состояния на данный момент (сохранение, открытие или никакое)
......@@ -520,8 +523,7 @@ function asc_docs_api(name)
this.ParcedDocument = false;
this.isStartCoAuthoringOnEndLoad = false; // Подсоединились раньше, чем документ загрузился
this.TrackFile = null;
this.fCurCallback = null;
var oThis = this;
......@@ -1310,83 +1312,83 @@ asc_docs_api.prototype._coAuthoringInit = function(fCallback)
this.CoAuthoringApi.onAuthParticipantsChanged = function (e, count) { t.asc_fireCallback("asc_onAuthParticipantsChanged", e, count); };
this.CoAuthoringApi.onMessage = function (e, clear) { t.asc_fireCallback("asc_onCoAuthoringChatReceiveMessage", e, clear); };
this.CoAuthoringApi.onConnectionStateChanged = function (e) { t.asc_fireCallback("asc_onConnectionStateChanged", e); };
this.CoAuthoringApi.onLocksAcquired = function (e)
{
if ( 2 != e["state"] )
{
var Id = e["block"];
var Class = g_oTableId.Get_ById( Id );
if ( null != Class )
{
var Lock = Class.Lock;
var OldType = Class.Lock.Get_Type();
if ( locktype_Other2 === OldType || locktype_Other3 === OldType )
Lock.Set_Type( locktype_Other3, true );
else
Lock.Set_Type( locktype_Other, true );
// Выставляем ID пользователя, залочившего данный элемент
Lock.Set_UserId( e["user"] );
if ( Class instanceof CHeaderFooterController )
editor.sync_LockHeaderFooters();
else if ( Class instanceof CDocument )
editor.sync_LockDocumentProps();
else if ( Class instanceof CComment )
editor.sync_LockComment(Class.Get_Id(), e["user"]);
else if ( Class instanceof CGraphicObjects )
editor.sync_LockDocumentSchema();
// TODO: Здесь для ускорения надо сделать проверку, является ли текущим элемент с
// заданным Id. Если нет, тогда и не надо обновлять состояние.
editor.WordControl.m_oLogicDocument.Document_UpdateInterfaceState();
}
else
{
CollaborativeEditing.Add_NeedLock(Id, e["user"]);
}
this.CoAuthoringApi.onLocksAcquired = function(e) {
if (t.isApplyChangesOnOpenEnabled) {
// Пока документ еще не загружен, будем сохранять функцию и аргументы
t.arrPreOpenLocksObjects.push(function(){t.CoAuthoringApi.onLocksAcquired(e);});
return;
}
if (2 != e["state"]) {
var Id = e["block"];
var Class = g_oTableId.Get_ById(Id);
if (null != Class) {
var Lock = Class.Lock;
var OldType = Class.Lock.Get_Type();
if (locktype_Other2 === OldType || locktype_Other3 === OldType) {
Lock.Set_Type(locktype_Other3, true);
} else {
Lock.Set_Type(locktype_Other, true);
}
};
this.CoAuthoringApi.onLocksReleased = function (e, bChanges)
{
var Id = e["block"];
var Class = g_oTableId.Get_ById( Id );
if ( null != Class )
{
var Lock = Class.Lock;
if ( "undefined" != typeof(Lock) )
{
var CurType = Lock.Get_Type();
var NewType = locktype_None;
if ( CurType === locktype_Other )
{
if ( true != bChanges )
NewType = locktype_None;
else
{
NewType = locktype_Other2;
CollaborativeEditing.Add_Unlock(Class);
}
}
else if ( CurType === locktype_Mine )
{
// Такого быть не должно
NewType = locktype_Mine;
}
else if ( CurType === locktype_Other2 || CurType === locktype_Other3 )
NewType = locktype_Other2;
Lock.Set_Type( NewType, true );
}
// Выставляем ID пользователя, залочившего данный элемент
Lock.Set_UserId(e["user"]);
if (Class instanceof CHeaderFooterController) {
editor.sync_LockHeaderFooters();
} else if (Class instanceof CDocument) {
editor.sync_LockDocumentProps();
} else if (Class instanceof CComment) {
editor.sync_LockComment(Class.Get_Id(), e["user"]);
} else if (Class instanceof CGraphicObjects) {
editor.sync_LockDocumentSchema();
}
else
{
CollaborativeEditing.Remove_NeedLock(Id);
// TODO: Здесь для ускорения надо сделать проверку, является ли текущим элемент с
// заданным Id. Если нет, тогда и не надо обновлять состояние.
editor.WordControl.m_oLogicDocument.Document_UpdateInterfaceState();
} else {
CollaborativeEditing.Add_NeedLock(Id, e["user"]);
}
}
};
this.CoAuthoringApi.onLocksReleased = function(e, bChanges) {
if (t.isApplyChangesOnOpenEnabled) {
// Пока документ еще не загружен, будем сохранять функцию и аргументы
t.arrPreOpenLocksObjects.push(function(){t.CoAuthoringApi.onLocksReleased(e, bChanges);});
return;
}
var Id = e["block"];
var Class = g_oTableId.Get_ById(Id);
if (null != Class) {
var Lock = Class.Lock;
if ("undefined" != typeof(Lock)) {
var CurType = Lock.Get_Type();
var NewType = locktype_None;
if (CurType === locktype_Other) {
if (true != bChanges) {
NewType = locktype_None;
} else {
NewType = locktype_Other2;
CollaborativeEditing.Add_Unlock(Class);
}
} else if (CurType === locktype_Mine) {
// Такого быть не должно
NewType = locktype_Mine;
} else if (CurType === locktype_Other2 || CurType === locktype_Other3) {
NewType = locktype_Other2;
}
};
Lock.Set_Type(NewType, true);
}
} else {
CollaborativeEditing.Remove_NeedLock(Id);
}
};
this.CoAuthoringApi.onSaveChanges = function (e, userId, bFirstLoad)
{
var bUseColor;
......@@ -6185,6 +6187,12 @@ asc_docs_api.prototype.OpenDocumentEndCallback = function()
this.isApplyChangesOnOpen = true;
CollaborativeEditing.Apply_Changes();
CollaborativeEditing.Release_Locks();
// Применяем все lock-и (ToDo возможно стоит пересмотреть вообще Lock-и)
for (var i = 0; i < this.arrPreOpenLocksObjects.length; ++i) {
this.arrPreOpenLocksObjects[i]();
}
this.arrPreOpenLocksObjects = [];
}
// History.RecalcData_Add( { Type : historyrecalctype_Inline, Data : { Pos : 0, PageNum : 0 } } );
......
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