Commit 22ad3c87 authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Добавил в c_oAscAsyncAction тип PrepareToSave (Подготовка к сохранению)

Добавил автосохранение:
autoSaveGap - Интервал автосохранения (0 - означает, что автосохранения нет)
autoSaveGapAsk - Константа для повторного запуска автосохранения, если не смогли сделать сразу lock (только при автосохранении)

В функцию asc_Save добавил параметр isAutoSave - это если мы запускаем функцию из автосохранения
Переделал порядок сохранения. Теперь мы не ждем ответа от сервера сохранения документа, чтобы отослать всем свои изменения. Мы их отправляем сразу. Но не даем сохранять никому, пока сервер не сохранит документ. В связи с этим переделал информационные эвенты.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@48650 954022d7-b5bf-4e40-9824-e11837661b57
parent 88028026
/** @define {boolean} */
/** @define {boolean} */
var ASC_DOCS_API_DEBUG = true;
var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
......@@ -540,6 +540,12 @@ function asc_docs_api(name)
this.isSpellCheckEnable = true;
/**************************************/
// AutoSave
this.autoSaveGap = 0; // Интервал автосохранения (0 - означает, что автосохранения нет)
this.autoSaveTimeOutId = null; // Идентификатор таймаута
this.isAutoSave = false; // Флаг, означает что запущено автосохранение
this.autoSaveGapAsk = 5000; // Константа для повторного запуска автосохранения, если не смогли сделать сразу lock (только при автосохранении)
this.bInit_word_control = false;
this.isDocumentModify = false;
......@@ -815,6 +821,7 @@ asc_docs_api.prototype.LoadDocument = function(c_DocInfo)
}
else
{
// ToDo убрать зависимость от this.FontLoader.fontFilesPath
documentUrl = this.FontLoader.fontFilesPath + "../Word/document/";
this.DocInfo.put_OfflineApp(true);
......@@ -1433,6 +1440,24 @@ asc_docs_api.prototype._coSpellCheckInit = function() {
asc_docs_api.prototype.asc_getSpellCheckLanguages = function() {
return g_spellCheckLanguages;
};
/////////////////////////////////////////////////////////////////////////
////////////////////////////AutoSave api/////////////////////////////////
/////////////////////////////////////////////////////////////////////////
asc_docs_api.prototype.autoSaveInit = function (autoSaveGap) {
if (autoSaveGap || this.autoSaveGap) {
// Очищаем предыдущий таймер
if (null !== this.autoSaveTimeOutId)
clearTimeout(this.autoSaveTimeOutId);
var t = this;
this.autoSaveTimeOutId = setTimeout(function () {
t.autoSaveTimeOutId = null;
if (t.isDocumentModified())
t.asc_Save(/*isAutoSave*/true);
else
t.autoSaveInit();
}, (autoSaveGap || this.autoSaveGap));
}
};
// get functions
// Возвращает
......@@ -2212,43 +2237,38 @@ asc_docs_api.prototype.Paste = function()
asc_docs_api.prototype.Share = function(){
}
asc_docs_api.prototype.asc_Save = function()
{
if(true == this.canSave)
{
asc_docs_api.prototype.asc_Save = function (isAutoSave) {
if(true === this.canSave) {
this.canSave = false;
// Не даем пользователю что-нибудь менять пока не закончится сохранени
CollaborativeEditing.m_bGlobalLock = true;
editor.sync_StartAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.Save);
editor.sync_StartAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
this.isAutoSave = !!isAutoSave;
if (!this.isAutoSave)
editor.sync_StartAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.PrepareToSave);
this.CoAuthoringApi.askSaveChanges( OnSave_Callback );
}
}
};
asc_docs_api.prototype.asc_OnSaveEnd = function(isDocumentSaved)
{
asc_docs_api.prototype.asc_OnSaveEnd = function (isDocumentSaved) {
this.canSave = true;
editor.sync_EndAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.Save);
//Обратно выставляем, что документ не модифицирован
editor.SetUnchangedDocument();
// Пересылаем свои изменения
if(isDocumentSaved)
{
CollaborativeEditing.Send_Changes();
this.isAutoSave = false;
editor.sync_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
if (isDocumentSaved) {
editor.CoAuthoringApi.unSaveChanges();
}
else
{
// Запускаем таймер автосохранения
this.autoSaveInit();
} else {
editor.CoAuthoringApi.unSaveChanges();
editor.CoAuthoringApi.logout();
}
return;
}
};
function OnSave_Callback(e)
{
var nState;
if ( false == e["savelock"] ) {
CollaborativeEditing.m_bGlobalLock = false;
if (editor.isAutoSave)
editor.sync_StartAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.PrepareToSave);
if ( c_oAscCollaborativeMarksShowType.LastChanges === editor.CollaborativeMarksShowType )
CollaborativeEditing.Clear_CollaborativeMarks();
......@@ -2283,12 +2303,33 @@ function OnSave_Callback(e)
editor.processSavedFile(incomeObject.data, true);
}, sData);
}
// Пересылаем свои изменения
CollaborativeEditing.Send_Changes();
//Обратно выставляем, что документ не модифицирован
editor.SetUnchangedDocument();
// Заканчиваем сохранение, т.к. мы хотим дать пользователю продолжать набирать документ
// Но сохранять до прихода ответа от сервера не сможет
editor.sync_EndAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.PrepareToSave);
} else {
nState = editor.CoAuthoringApi.get_state();
if (3 === nState) {
// Отключаемся от сохранения, соединение потеряно
editor.sync_EndAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.Save);
if (!editor.isAutoSave)
editor.sync_EndAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.PrepareToSave);
editor.sync_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
editor.isAutoSave = false;
editor.canSave = true;
} else {
// Если автосохранение, то не будем ждать ответа, а просто перезапустим таймер на немного
if (editor.isAutoSave) {
editor.isAutoSave = false;
editor.canSave = true;
editor.autoSaveInit(editor.autoSaveGapAsk);
return;
}
// Для автосохранения не стоит пытаться еще раз запросить... (нужно рестартовать функцию автосохранения)
setTimeout( function(){ editor.CoAuthoringApi.askSaveChanges( OnSave_Callback ); }, 1000 );
}
}
......@@ -5816,7 +5857,9 @@ asc_docs_api.prototype.OpenDocumentEndCallback = function()
{
window['qtDocBridge']['documentContentReady'] ();
}
// Запускаем таймер автосохранения
this.autoSaveInit();
}
asc_docs_api.prototype.UpdateInterfaceState = function()
......@@ -6441,12 +6484,13 @@ function sendCommand(editor, fCallback, rdata){
setTimeout( function(){sendCommand(editor, fCallback, JSON.stringify(rData))}, 3000);
break;
case "changes":
editor.canSave = true;
editor.sync_EndAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.Save);
//var rData = {"id":documentId, "c":"sfc", "outputformat": c_oAscFileType.DOCX};
//sendCommand(editor, fCallback, JSON.stringify(rData));
if(fCallback)
fCallback(incomeObject);
// Важно: потом сверху этот эвент придти не должен (т.е. мы не отправляем ссылку на документ наверх)
editor.asc_OnSaveEnd(/*isDocumentSaved*/true);
break;
case "save":
if(fCallback)
......
......@@ -2,62 +2,61 @@ var c_oAscZoomType = {
Current :0,
FitWidth:1,
FitPage :2
}
};
var c_oAscAsyncActionType = {
Information : 0,
BlockInteraction : 1
}
};
var c_oAscAsyncAction = {
Open:0, // �������� ���������
Save:1,
LoadDocumentFonts:2, // ��������� ����� ��������� (����� ����� ��������)
LoadDocumentImages:3, // ��������� �������� ��������� (����� ����� �������� �������)
LoadFont:4, // ��������� ������� ������
LoadImage:5, // ��������� ��������
DownloadAs:6,
Print:7,//����������� � PDF � ���������� � ������������
UploadImage:8,
ApplyChanges:9 //���������� ��������� �� ������� ������������.
}
Open : 0, // открытие документа
Save : 1,
LoadDocumentFonts : 2, // загружаем фонты документа (сразу после открытия)
LoadDocumentImages : 3, // загружаем картинки документа (сразу после загрузки шрифтов)
LoadFont : 4, // подгрузка нужного шрифта
LoadImage : 5, // подгрузка картинки
DownloadAs : 6,
Print : 7, // конвертация в PDF и сохранение у пользователя
UploadImage : 8,
ApplyChanges : 9, // применение изменений от другого пользователя.
PrepareToSave : 10 // Подготовка к сохранению
};
//files type for Saving & DownloadAs
var c_oAscFileType = {
INNER: 0x0041,
DOCX: 0x0041,
DOC: 0x0042,
ODT: 0x0043,
RTF: 0x0044,
TXT: 0x0045,
HTML_ZIP: 0x0803,
MHT: 0x0047,
PDF: 0x0802,
EPUB: 0x0048,
FB2: 0x0049,
MOBI: 0x004a,
DOCY: 0x1001
}
INNER: 0x0041,
DOCX: 0x0041,
DOC: 0x0042,
ODT: 0x0043,
RTF: 0x0044,
TXT: 0x0045,
HTML_ZIP: 0x0803,
MHT: 0x0047,
PDF: 0x0802,
EPUB: 0x0048,
FB2: 0x0049,
MOBI: 0x004a,
DOCY: 0x1001
};
// Right = 0; Left = 1; Center = 2; Justify = 3;
var c_oAscAlignType = {
LEFT:0,
CENTER:1,
RIGHT:2,
JUSTIFY:3,
TOP:4,
MIDDLE:5,
BOTTOM:6
}
LEFT:0,
CENTER:1,
RIGHT:2,
JUSTIFY:3,
TOP:4,
MIDDLE:5,
BOTTOM:6
};
// image wrap style
var c_oAscWrapStyle =
{
var c_oAscWrapStyle = {
Inline:0,
Flow : 1
}
};
var c_oAscWrapStyle2 =
{
var c_oAscWrapStyle2 = {
Inline : 0,
Square : 1,
Tight : 2,
......@@ -65,53 +64,52 @@ var c_oAscWrapStyle2 =
TopAndBottom : 4,
Behind : 5,
InFront : 6
}
};
/*Error level & ID*/
/*Error level & ID*/
var c_oAscError = {
Level: {
Critical:-1,
NoCritical:0
},
ID : {
ServerSaveComplete: 3,
ConvertationProgress: 2,
DownloadProgress: 1,
No: 0,
Unknown: -1,
ConvertationTimeout: -2,
ConvertationError: -3,
DownloadError: -4,
UnexpectedGuid: -5,
Database: -6,
FileRequest: -7,
FileVKey: -8,
UplImageSize: -9,
UplImageExt: -10,
UplImageFileCount: -11,
NoSupportClipdoard: -12,
SplitCellMaxRows: -13,
SplitCellMaxCols: -14,
SplitCellRowsDivider: -15,
CoAuthoringDisconnect: -18,
VKeyEncrypt: -20,
KeyExpire: -21,
UserCountExceed: -22,
MobileUnexpectedCharCount: -23
}
Level: {
Critical:-1,
NoCritical:0
},
ID : {
ServerSaveComplete: 3,
ConvertationProgress: 2,
DownloadProgress: 1,
No: 0,
Unknown: -1,
ConvertationTimeout: -2,
ConvertationError: -3,
DownloadError: -4,
UnexpectedGuid: -5,
Database: -6,
FileRequest: -7,
FileVKey: -8,
UplImageSize: -9,
UplImageExt: -10,
UplImageFileCount: -11,
NoSupportClipdoard: -12,
SplitCellMaxRows: -13,
SplitCellMaxCols: -14,
SplitCellRowsDivider: -15,
CoAuthoringDisconnect: -18,
VKeyEncrypt: -20,
KeyExpire: -21,
UserCountExceed: -22,
MobileUnexpectedCharCount: -23
}
};
var c_oAscTypeSelectElement =
{
var c_oAscTypeSelectElement = {
Paragraph : 0,
Table : 1,
Image : 2,
Header : 3,
Hyperlink : 4,
SpellCheck : 5
}
};
var c_oAscTableBordersType = {
LEFT:0,
......@@ -123,26 +121,25 @@ var c_oAscTableBordersType = {
INSIDE:6,
OUTSIDE:7,
ALL:8
}
var c_oAscImageUploadProp = {//�� ��� �������� ��������� �������� ���������� � ����� �� ��������(�������� ie9), ����� ��������� ����� ���� �������� ����������� ��������� � cwFileUploader.ashx
};
var c_oAscImageUploadProp = {//Не все браузеры позволяют получить информацию о файле до загрузки(например ie9), меняя параметры здесь надо поменять аналогичные параметры в cwFileUploader.ashx
MaxFileSize:25000000, //25 mb
SupportedFormats:[ "jpg", "jpeg", "jpe", "png", "gif", "bmp"]
}
};
var FONT_THUMBNAIL_HEIGHT = parseInt(7 * 96.0 / 25.4);
var c_oAscStyleImage = {
Default :0,
Document:1
}
};
var c_oAscLineDrawingRule =
{
var c_oAscLineDrawingRule = {
Left : 0,
Center : 1,
Right : 2,
Top : 0,
Bottom : 2
}
};
var align_Right = 0;
var align_Left = 1;
......@@ -159,13 +156,12 @@ var hdrftr_Default = 0x01;
var hdrftr_Even = 0x02;
var hdrftr_First = 0x03;
var c_oAscTableSelectionType =
{
var c_oAscTableSelectionType = {
Cell : 0,
Row : 1,
Column : 2,
Table : 3
}
};
var linerule_AtLeast = 0;
var linerule_Auto = 1;
......@@ -174,34 +170,29 @@ var linerule_Exact = 2;
var shd_Clear = 0;
var shd_Nil = 1;
var c_oAscContextMenuTypes =
{
Common : 0, // ������� ����������� ����
ChangeHdrFtr : 1 // ����������� ���������� ���� ��� ��������� � ����������
}
var c_oAscContextMenuTypes = {
Common : 0, // Обычное контекстное меню
ChangeHdrFtr : 1 // Специальное контестное меню для попадания в колонтитул
};
var c_oAscMouseMoveDataTypes =
{
var c_oAscMouseMoveDataTypes = {
Common : 0,
Hyperlink : 1,
LockedObject : 2
}
};
var c_oAscMouseMoveLockedObjectType =
{
var c_oAscMouseMoveLockedObjectType = {
Common : 0,
Header : 1,
Footer : 2
}
};
var c_oAscCollaborativeMarksShowType =
{
var c_oAscCollaborativeMarksShowType = {
All : 0,
LastChanges : 1
};
var c_oAscRelativeFromH =
{
var c_oAscRelativeFromH = {
Character : 0x00,
Column : 0x01,
InsideMargin : 0x02,
......@@ -212,8 +203,7 @@ var c_oAscRelativeFromH =
RightMargin : 0x07
};
var c_oAscAlignH =
{
var c_oAscAlignH = {
Center : 0x00,
Inside : 0x01,
Left : 0x02,
......@@ -221,16 +211,14 @@ var c_oAscAlignH =
Right : 0x04
};
var c_oAscChangeLevel =
{
var c_oAscChangeLevel = {
BringToFront : 0x00,
BringForward : 0x01,
SendToBack : 0x02,
BringBackward: 0x03
};
var c_oAscRelativeFromV =
{
var c_oAscRelativeFromV = {
BottomMargin : 0x00,
InsideMargin : 0x01,
Line : 0x02,
......@@ -241,8 +229,7 @@ var c_oAscRelativeFromV =
TopMargin : 0x07
};
var c_oAscAlignV =
{
var c_oAscAlignV = {
Bottom : 0x00,
Center : 0x01,
Inside : 0x02,
......@@ -250,21 +237,18 @@ var c_oAscAlignV =
Top : 0x04
};
var c_oAscVertAlignJc =
{
var c_oAscVertAlignJc = {
Top : 0x00, // var vertalignjc_Top = 0x00;
Center : 0x01, // var vertalignjc_Center = 0x01;
Bottom : 0x02 // var vertalignjc_Bottom = 0x02
};
var c_oAscTableLayout =
{
var c_oAscTableLayout = {
AutoFit : 0x00,
Fixed : 0x01
};
var c_oAscHAnchor =
{
var c_oAscHAnchor = {
Margin : 0x00,
Page : 0x01,
Text : 0x02,
......@@ -272,8 +256,7 @@ var c_oAscHAnchor =
PageInternal : 0xFF // только для внутреннего использования
};
var c_oAscXAlign =
{
var c_oAscXAlign = {
Center : 0x00,
Inside : 0x01,
Left : 0x02,
......@@ -281,8 +264,7 @@ var c_oAscXAlign =
Right : 0x04
};
var c_oAscYAlign =
{
var c_oAscYAlign = {
Bottom : 0x00,
Center : 0x01,
Inline : 0x02,
......@@ -291,8 +273,7 @@ var c_oAscYAlign =
Top : 0x05
};
var c_oAscVAnchor =
{
var c_oAscVAnchor = {
Margin : 0x00,
Page : 0x01,
Text : 0x02
......@@ -359,8 +340,7 @@ var c_oAscLineBeginType = {
Triangle: 5
};
var c_oAscLineBeginSize =
{
var c_oAscLineBeginSize = {
small_small : 0,
small_mid : 1,
small_large : 2,
......
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