Commit 8934ea55 authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander.Trofimov

Переделано совместное редактирования для нового параграфа.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@54981 954022d7-b5bf-4e40-9824-e11837661b57
parent 995fa441
......@@ -133,7 +133,7 @@ function CTableId()
{
case historyitem_type_Paragraph : Element = new Paragraph(); break;
case historyitem_type_TextPr : Element = new ParaTextPr(); break;
case historyitem_type_Hyperlink : Element = new ParaHyperlinkStart(); break;
case historyitem_type_Hyperlink : if ( true !== Debug_ParaRunMode ) Element = new ParaHyperlinkStart(); else Element = new ParaHyperlink(); break;
case historyitem_type_Drawing : Element = new ParaDrawing(); break;
case historyitem_type_DrawingObjects : Element = new CDrawingObjects(); break;
case historyitem_type_FlowObjects : Element = new FlowObjects(); break;
......@@ -156,6 +156,8 @@ function CTableId()
case historyitem_type_TextBody : Element = new CTextBody(); break;
case historyitem_type_ChartTitle : Element = new CChartTitle(); break;
case historyitem_type_Math : Element = new ParaMath(); break;
case historyitem_type_CommentMark : Element = new ParaComment(); break;
case historyitem_type_ParaRun : Element = new ParaRun(); break;
}
Element.Read_FromBinary2(Reader);
......
......@@ -901,8 +901,10 @@ function CComments()
function ParaComment(Start, Id)
{
this.Start = Start;
this.Id = Id;
this.Id = g_oIdCounter.Get_NewId();
this.Start = Start;
this.CommentId = Id;
this.Type = para_Comment;
......@@ -911,10 +913,17 @@ function ParaComment(Start, Id)
this.Lines = new Array();
this.LinesLength = 0;
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
g_oTableId.Add( this, this.Id );
}
ParaComment.prototype =
{
Get_Id : function()
{
return this.Id;
},
Set_Paragraph : function()
{
......@@ -1001,17 +1010,17 @@ ParaComment.prototype =
var Page = Para.Get_StartPage_Absolute() + CurPage;
if ( true === this.Start )
DocumentComments.Set_StartInfo( this.Id, Page, X, Y, H, Para.Get_Id() );
DocumentComments.Set_StartInfo( this.CommentId, Page, X, Y, H, Para.Get_Id() );
else
DocumentComments.Set_EndInfo( this.Id, Page, X, Y, H, Para.Get_Id() );
DocumentComments.Set_EndInfo( this.CommentId, Page, X, Y, H, Para.Get_Id() );
},
Recalculate_PageEndInfo : function(PRSI, _CurLine, _CurRange)
{
if ( true === this.Start )
PRSI.Add_Comment( this.Id );
PRSI.Add_Comment( this.CommentId );
else
PRSI.Remove_Comment( this.Id );
PRSI.Remove_Comment( this.CommentId );
},
Save_Lines : function()
......@@ -1049,9 +1058,9 @@ ParaComment.prototype =
Draw_HighLights : function(PDSH)
{
if ( true === this.Start )
PDSH.Add_Comment( this.Id );
PDSH.Add_Comment( this.CommentId );
else
PDSH.Remove_Comment( this.Id );
PDSH.Remove_Comment( this.CommentId );
},
Draw_Elements : function(PDSE)
......@@ -1191,14 +1200,24 @@ ParaComment.prototype =
//----------------------------------------------------------------------------------------------------------------------
// Функции совместного редактирования
//----------------------------------------------------------------------------------------------------------------------
Write_ToBinary : function(Writer)
Write_ToBinary2 : function(Writer)
{
Writer.WriteLong( historyitem_type_CommentMark );
// String : Id
// String : Id комментария
// Bool : Start
Writer.WriteString2( "" + this.Id );
Writer.WriteString2( "" + this.CommentId );
Writer.WriteBool( this.Start );
},
Read_FromBinary : function(Reader)
Read_FromBinary2 : function(Reader)
{
this.Id = Reader.GetString2();
this.CommentId = Reader.GetString2();
this.Start = Reader.GetBool();
}
};
......
......@@ -187,18 +187,22 @@ CHistory.prototype =
( Class instanceof CDocumentContent && ( historyitem_DocumentContent_AddItem === Data.Type || historyitem_DocumentContent_RemoveItem === Data.Type ) ) ||
( Class instanceof CTable && ( historyitem_Table_AddRow === Data.Type || historyitem_Table_RemoveRow === Data.Type ) ) ||
( Class instanceof CTableRow && ( historyitem_TableRow_AddCell === Data.Type || historyitem_TableRow_RemoveCell === Data.Type ) ) ||
( Class instanceof Paragraph && ( historyitem_Paragraph_AddItem === Data.Type || historyitem_Paragraph_RemoveItem === Data.Type ) ) )
( Class instanceof Paragraph && ( historyitem_Paragraph_AddItem === Data.Type || historyitem_Paragraph_RemoveItem === Data.Type ) ) ||
( Class instanceof ParaHyperlink && ( historyitem_Hyperlink_AddItem === Data.Type || historyitem_Hyperlink_RemoveItem === Data.Type ) ) ||
( Class instanceof ParaRun && ( historyitem_ParaRun_AddItem === Data.Type || historyitem_ParaRun_RemoveItem === Data.Type ) ) )
{
var bAdd = ( ( Class instanceof CDocument && historyitem_Document_AddItem === Data.Type ) ||
( Class instanceof CDocumentContent && historyitem_DocumentContent_AddItem === Data.Type ) ||
( Class instanceof CTable && historyitem_Table_AddRow === Data.Type ) ||
( Class instanceof CTableRow && historyitem_TableRow_AddCell === Data.Type ) ||
( Class instanceof Paragraph && historyitem_Paragraph_AddItem === Data.Type )
( Class instanceof Paragraph && historyitem_Paragraph_AddItem === Data.Type ) ||
( Class instanceof ParaHyperlink && historyitem_Hyperlink_AddItem === Data.Type ) ||
( Class instanceof ParaRun && historyitem_ParaRun_AddItem === Data.Type )
) ? true : false;
var Count = 1;
if ( ( Class instanceof Paragraph ) ||
if ( ( Class instanceof Paragraph ) || ( Class instanceof ParaHyperlink) || ( Class instanceof ParaRun ) ||
( Class instanceof CDocument && historyitem_Document_RemoveItem === Data.Type ) ||
( Class instanceof CDocumentContent && historyitem_DocumentContent_RemoveItem === Data.Type ) )
Count = Data.Items.length;
......
......@@ -16,6 +16,8 @@ function ParaHyperlink()
this.Content = new Array();
this.m_oContentChanges = new CContentChanges(); // список изменений(добавление/удаление элементов)
this.StartLine = 0;
this.StartRange = 0;
......@@ -40,6 +42,21 @@ ParaHyperlink.prototype =
return this.Id;
},
Clear_ContentChanges : function()
{
this.m_oContentChanges.Clear();
},
Add_ContentChanges : function(Changes)
{
this.m_oContentChanges.Add( Changes );
},
Refresh_ContentChanges : function()
{
this.m_oContentChanges.Refresh();
},
Copy : function(Selected)
{
var NewHyperlink = new ParaHyperlink();
......@@ -679,6 +696,12 @@ ParaHyperlink.prototype =
{
var PRS = g_oPRSW;
if ( this.Paragraph !== PRS.Paragraph )
{
this.Paragraph = PRS.Paragraph;
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
}
var CurLine = PRS.Line - this.StartLine;
var CurRange = ( 0 === CurLine ? PRS.Range - this.StartRange : PRS.Range );
......@@ -1639,33 +1662,224 @@ ParaHyperlink.prototype =
//----------------------------------------------------------------------------------------------------------------------
// Функции совместного редактирования
//----------------------------------------------------------------------------------------------------------------------
Write_ToBinary : function(Writer)
Save_Changes : function(Data, Writer)
{
// Сохраняем изменения из тех, которые используются для Undo/Redo в бинарный файл.
// Long : тип класса
// Long : тип изменений
Writer.WriteLong( historyitem_type_Hyperlink );
var Type = Data.Type;
// Пишем тип
Writer.WriteLong( Type );
switch(Type)
{
case historyitem_Hyperlink_AddItem :
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Id элемента
// }
var bArray = Data.UseArray;
var Count = Data.Items.length;
Writer.WriteLong( Count );
for ( var Index = 0; Index < Count; Index++ )
{
if ( true === bArray )
Writer.WriteLong( Data.PosArray[Index] );
else
Writer.WriteLong( Data.Pos + Index );
Writer.WriteString2( Data.Items[Index].Get_Id() );
}
break;
}
case historyitem_Hyperlink_RemoveItem :
{
// Long : Количество удаляемых элементов
// Array of Long : позиции удаляемых элементов
var bArray = Data.UseArray;
var Count = Data.Items.length;
var StartPos = Writer.GetCurPosition();
Writer.Skip(4);
var RealCount = Count;
for ( var Index = 0; Index < Count; Index++ )
{
if ( true === bArray )
{
if ( false === Data.PosArray[Index] )
RealCount--;
else
Writer.WriteLong( Data.PosArray[Index] );
}
else
Writer.WriteLong( Data.Pos );
}
var EndPos = Writer.GetCurPosition();
Writer.Seek( StartPos );
Writer.WriteLong( RealCount );
Writer.Seek( EndPos );
break;
}
case historyitem_Hyperlink_Value :
{
// String : Value
Writer.WriteString2( Data.New );
break;
}
case historyitem_Hyperlink_ToolTip :
{
// String : ToolTip
Writer.WriteString2( Data.New );
break;
}
}
},
Read_FromBinary : function(Reader)
Load_Changes : function(Reader)
{
// Сохраняем изменения из тех, которые используются для Undo/Redo в бинарный файл.
// Long : тип класса
// Long : тип изменений
var ClassType = Reader.GetLong();
if ( historyitem_type_Hyperlink != ClassType )
return;
var Type = Reader.GetLong();
switch ( Type )
{
case historyitem_Hyperlink_AddItem :
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Id Элемента
// }
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var Pos = this.m_oContentChanges.Check( contentchanges_Add, Reader.GetLong() );
var Element = g_oTableId.Get_ById( Reader.GetString2() );
if ( null != Element )
{
this.Content.splice( Pos, 0, Element );
}
}
if ( null !== this.Paragraph && undefined !== this.Paragraph )
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
break;
}
case historyitem_Hyperlink_RemoveItem:
{
// Long : Количество удаляемых элементов
// Array of Long : позиции удаляемых элементов
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var ChangesPos = this.m_oContentChanges.Check( contentchanges_Remove, Reader.GetLong() );
// действие совпало, не делаем его
if ( false === ChangesPos )
continue;
this.Content.splice( ChangesPos, 1 );
}
if ( null !== this.Paragraph && undefined !== this.Paragraph )
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
break;
}
case historyitem_Hyperlink_Value:
{
// String : Value
this.Value = Reader.GetString2();
break;
}
case historyitem_Hyperlink_ToolTip :
{
// String : ToolTip
this.ToolTip = Reader.GetString2();
break;
}
}
},
Write_ToBinary2 : function(Writer)
{
Writer.WriteLong( historyitem_type_Hyperlink );
},
// String : Id
// String : Value
// String : ToolTip
// Long : Количество элементов
// Array of Strings : массив с Id элементов
Read_FromBinary2 : function(Reader)
{
Writer.WriteString2( this.Id );
Writer.WriteString2( this.Value );
Writer.WriteString2( this.ToolTip );
var Count = this.Content.length;
Writer.WriteLong( Count );
for ( var Index = 0; Index < Count; Index++ )
{
Writer.WriteString2( this.Content[Index].Get_Id() );
}
},
Save_Changes : function(Data, Writer)
Read_FromBinary2 : function(Reader)
{
// String : Id
// String : Value
// String : ToolTip
// Long : Количество элементов
// Array of Strings : массив с Id элементов
},
this.Id = Reader.GetString2();
this.Value = Reader.GetString2();
this.ToolTip = Reader.GetString2();
Load_Changes : function(Reader)
{
var Count = Reader.GetLong();
this.Content = new Array();
for ( var Index = 0; Index < Count; Index++ )
{
var Element = g_oTableId.Get_ById( Reader.GetString2() );
if ( null !== Element )
this.Content.push( Element );
}
}
};
......@@ -5,6 +5,10 @@
// Internal_MoveCursorForward, Internal_AddTextPr, Internal_GetContentPosByXY,
// Selection_SetEnd, Selection_CalculateTextPr, IsEmpty, Selection_IsEmpty,
// Cursor_IsStart, Cursor_IsEnd, Is_ContentOnFirstPage
// TODO: Надо избавиться от ParaEnd внутри ParaRun, а сам ParaEnd держать также как и ParaNumbering, как параметр
// внутри самого класса Paragraph
var type_Paragraph = 0x0001;
var UnknownValue = null;
......@@ -19072,26 +19076,53 @@ Paragraph.prototype =
{
case historyitem_Paragraph_AddItem:
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Элемент
// }
if ( true !== Debug_ParaRunMode )
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Элемент
// }
var bArray = Data.UseArray;
var Count = Data.Items.length;
var bArray = Data.UseArray;
var Count = Data.Items.length;
Writer.WriteLong( Count );
Writer.WriteLong( Count );
for ( var Index = 0; Index < Count; Index++ )
for ( var Index = 0; Index < Count; Index++ )
{
if ( true === bArray )
Writer.WriteLong( Data.PosArray[Index] );
else
Writer.WriteLong( Data.Pos + Index );
Data.Items[Index].Write_ToBinary(Writer);
}
}
else
{
if ( true === bArray )
Writer.WriteLong( Data.PosArray[Index] );
else
Writer.WriteLong( Data.Pos + Index );
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Id элемента
// }
Data.Items[Index].Write_ToBinary(Writer);
var bArray = Data.UseArray;
var Count = Data.Items.length;
Writer.WriteLong( Count );
for ( var Index = 0; Index < Count; Index++ )
{
if ( true === bArray )
Writer.WriteLong( Data.PosArray[Index] );
else
Writer.WriteLong( Data.Pos + Index );
Writer.WriteString2( Data.Items[Index].Get_Id() );
}
}
break;
......@@ -19414,45 +19445,91 @@ Paragraph.prototype =
{
case historyitem_Paragraph_AddItem:
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Элемент
// }
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
if ( true !== Debug_ParaRunMode )
{
var Pos = this.Internal_Get_RealPos( this.m_oContentChanges.Check( contentchanges_Add, Reader.GetLong() ) );
var Element = ParagraphContent_Read_FromBinary(Reader);
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Элемент
// }
if ( null != Element )
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
if ( Element instanceof ParaCommentStart )
var Pos = this.Internal_Get_RealPos( this.m_oContentChanges.Check( contentchanges_Add, Reader.GetLong() ) );
var Element = ParagraphContent_Read_FromBinary(Reader);
if ( null != Element )
{
var Comment = g_oTableId.Get_ById( Element.Id );
if ( null != Comment )
Comment.Set_StartInfo( 0, 0, 0, 0, this.Get_Id() );
if ( Element instanceof ParaCommentStart )
{
var Comment = g_oTableId.Get_ById( Element.Id );
if ( null != Comment )
Comment.Set_StartInfo( 0, 0, 0, 0, this.Get_Id() );
}
else if ( Element instanceof ParaCommentEnd )
{
var Comment = g_oTableId.Get_ById( Element.Id );
if ( null != Comment )
Comment.Set_EndInfo( 0, 0, 0, 0, this.Get_Id() );
}
// TODO: Подумать над тем как по минимуму вставлять отметки совместного редактирования
this.Content.splice( Pos, 0, new ParaCollaborativeChangesEnd() );
this.Content.splice( Pos, 0, Element );
this.Content.splice( Pos, 0, new ParaCollaborativeChangesStart() );
CollaborativeEditing.Add_ChangedClass(this);
}
else if ( Element instanceof ParaCommentEnd )
}
this.DeleteCollaborativeMarks = false;
}
else
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Id Элемента
// }
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var Pos = this.m_oContentChanges.Check( contentchanges_Add, Reader.GetLong() );
var Element = g_oTableId.Get_ById( Reader.GetString2() );
if ( null != Element )
{
var Comment = g_oTableId.Get_ById( Element.Id );
if ( null != Comment )
Comment.Set_EndInfo( 0, 0, 0, 0, this.Get_Id() );
}
if ( para_Comment === Element.Type )
{
var Comment = g_oTableId.Get_ById( Element.CommentId );
if ( null != Comment )
{
if ( true === Element.Start )
Comment.Set_StartInfo( 0, 0, 0, 0, this.Get_Id() );
else
Comment.Set_EndInfo( 0, 0, 0, 0, this.Get_Id() );
}
}
// TODO: Подумать над тем как по минимуму вставлять отметки совместного редактирования
this.Content.splice( Pos, 0, new ParaCollaborativeChangesEnd() );
this.Content.splice( Pos, 0, Element );
this.Content.splice( Pos, 0, new ParaCollaborativeChangesStart() );
// TODO: Нужно пометить, что это новый элемент, добавленный в совместном редактировании
// this.Content.splice( Pos, 0, new ParaCollaborativeChangesEnd() );
// this.Content.splice( Pos, 0, Element );
// this.Content.splice( Pos, 0, new ParaCollaborativeChangesStart() );
// CollaborativeEditing.Add_ChangedClass(this);
CollaborativeEditing.Add_ChangedClass(this);
this.Content.splice( Pos, 0, Element );
}
}
}
this.DeleteCollaborativeMarks = false;
//this.DeleteCollaborativeMarks = false;
}
break;
}
......@@ -19472,7 +19549,7 @@ Paragraph.prototype =
if ( false === ChangesPos )
continue;
var Pos = this.Internal_Get_RealPos( ChangesPos );
var Pos = ( true !== Debug_ParaRunMode ? this.Internal_Get_RealPos( ChangesPos ) : ChangesPos );
this.Content.splice( Pos, 1 );
}
......@@ -20064,74 +20141,131 @@ Paragraph.prototype =
{
Writer.WriteLong( historyitem_type_Paragraph );
// String : Id
// String : Id родительского класса
// Variable : ParaPr
// String : Id TextPr
// Long : количество элементов, у которых Is_RealContent = true
if ( true !== Debug_ParaRunMode )
{
// String : Id
// String : Id родительского класса
// Variable : ParaPr
// String : Id TextPr
// Long : количество элементов, у которых Is_RealContent = true
Writer.WriteString2( "" + this.Id );
Writer.WriteString2( this.Parent.Get_Id() );
// Writer.WriteString2( this.Parent.Get_Id() );
Writer.WriteString2( "" + this.Id );
Writer.WriteString2( this.Parent.Get_Id() );
// Writer.WriteString2( this.Parent.Get_Id() );
this.Pr.Write_ToBinary( Writer );
this.Pr.Write_ToBinary( Writer );
Writer.WriteString2( this.TextPr.Get_Id() );
Writer.WriteString2( this.TextPr.Get_Id() );
var StartPos = Writer.GetCurPosition();
Writer.Skip( 4 );
var StartPos = Writer.GetCurPosition();
Writer.Skip( 4 );
var Len = this.Content.length;
var Count = 0;
for ( var Index = 0; Index < Len; Index++ )
{
var Item = this.Content[Index];
if ( true === Item.Is_RealContent() )
var Len = this.Content.length;
var Count = 0;
for ( var Index = 0; Index < Len; Index++ )
{
Item.Write_ToBinary( Writer );
Count++;
var Item = this.Content[Index];
if ( true === Item.Is_RealContent() )
{
Item.Write_ToBinary( Writer );
Count++;
}
}
var EndPos = Writer.GetCurPosition();
Writer.Seek( StartPos );
Writer.WriteLong( Count );
Writer.Seek( EndPos );
}
else
{
// String2 : Id
// String2 : Id родительского класса
// Variable : ParaPr
// String2 : Id TextPr
// Long : количество элементов
// Array of String2 : массив с Id элементами
Writer.WriteString2( "" + this.Id );
Writer.WriteString2( "" + this.Parent.Get_Id() );
this.Pr.Write_ToBinary( Writer );
Writer.WriteString2( "" + this.TextPr.Get_Id() );
var Count = this.Content.length;
Writer.WriteLong( Count );
var EndPos = Writer.GetCurPosition();
Writer.Seek( StartPos );
Writer.WriteLong( Count );
Writer.Seek( EndPos );
for ( var Index = 0; Index < Count; Index++ )
{
Writer.WriteString2( "" + this.Content[Index].Get_Id() );
}
}
},
Read_FromBinary2 : function(Reader)
{
// String : Id
// String : Id родительского класса
// Variable : ParaPr
// String : Id TextPr
// Long : количество элементов, у которых Is_RealContent = true
if ( true !== Debug_ParaRunMode )
{
// String : Id
// String : Id родительского класса
// Variable : ParaPr
// String : Id TextPr
// Long : количество элементов, у которых Is_RealContent = true
this.Id = Reader.GetString2();
this.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
this.Id = Reader.GetString2();
this.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
var LinkData = new Object();
LinkData.Parent = Reader.GetString2();
var LinkData = new Object();
LinkData.Parent = Reader.GetString2();
this.Pr = new CParaPr();
this.Pr.Read_FromBinary( Reader );
this.Pr = new CParaPr();
this.Pr.Read_FromBinary( Reader );
// this.TextPr = g_oTableId.Get_ById( Reader.GetString2() );
LinkData.TextPr = Reader.GetString2();
CollaborativeEditing.Add_LinkData(this, LinkData);
// this.TextPr = g_oTableId.Get_ById( Reader.GetString2() );
LinkData.TextPr = Reader.GetString2();
CollaborativeEditing.Add_LinkData(this, LinkData);
this.Content = new Array();
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var Element = ParagraphContent_Read_FromBinary(Reader);
this.Content = new Array();
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var Element = ParagraphContent_Read_FromBinary(Reader);
if ( null != Element )
this.Content.push( Element );
}
if ( null != Element )
this.Content.push( Element );
CollaborativeEditing.Add_NewObject( this );
}
else
{
// String2 : Id
// String2 : Id родительского класса
// Variable : ParaPr
// String2 : Id TextPr
// Long : количество элементов
// Array of String2 : массив с Id элементами
this.DrawingDocument = editor.WordControl.m_oLogicDocument.DrawingDocument;
this.Id = Reader.GetString2();
this.Parent = g_oTableId.Get_ById( Reader.GetString2() );
this.Pr = new CParaPr();
this.Pr.Read_FromBinary( Reader );
this.TextPr = g_oTableId.Get_ById( Reader.GetString2() );
CollaborativeEditing.Add_NewObject( this );
this.Content = new Array();
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var Element = g_oTableId.Get_ById( Reader.GetString2() );
if ( null != Element )
this.Content.push( Element );
}
}
},
Load_LinkData : function(LinkData)
......@@ -20498,7 +20632,7 @@ Paragraph.prototype =
for ( var Pos = 0; Pos < Count; Pos++ )
{
var Item = this.Content[Pos];
if ( para_Comment === Item.Type && Id === Item.Id )
if ( para_Comment === Item.Type && Id === Item.CommentId )
{
this.Internal_Content_Remove( Pos );
Pos--;
......
......@@ -36,7 +36,8 @@ function ParaRun(Paragraph)
this.StartLine = 0; // Строка, с которой начинается данный ран
this.StartRange = 0;
this.CollaborativeMarks = new Array(); // Массив CParaRunCollaborativeMark
this.CollaborativeMarks = new CRunCollaborativeMarks();
this.m_oContentChanges = new CContentChanges(); // список изменений(добавление/удаление элементов)
this.NearPosArray = new Array();
this.SearchMarks = new Array();
......@@ -107,6 +108,21 @@ ParaRun.prototype =
return NewRun;
},
Clear_ContentChanges : function()
{
this.m_oContentChanges.Clear();
},
Add_ContentChanges : function(Changes)
{
this.m_oContentChanges.Add( Changes );
},
Refresh_ContentChanges : function()
{
this.m_oContentChanges.Refresh();
},
Get_Text : function(Text)
{
if ( null === Text.Text )
......@@ -363,6 +379,9 @@ ParaRun.prototype =
this.Paragraph.SpellChecker.Update_OnAdd( this, Pos, Item );
// Обновляем позиции меток совместного редактирования
this.CollaborativeMarks.Update_OnAdd( Pos );
// Отмечаем, что надо перемерить элементы в данном ране
this.RecalcInfo.Measure = true;
},
......@@ -479,6 +498,9 @@ ParaRun.prototype =
this.Paragraph.SpellChecker.Update_OnRemove( this, Pos, Count );
// Обновляем позиции меток совместного редактирования
this.CollaborativeMarks.Update_OnRemove( Pos, Count );
// Отмечаем, что надо перемерить элементы в данном ране
this.RecalcInfo.Measure = true;
},
......@@ -1077,11 +1099,19 @@ ParaRun.prototype =
Recalculate_Range : function(ParaPr, Depth)
{
var PRS = g_oPRSW;
if ( this.Paragraph !== g_oPRSW.Paragraph )
{
this.Paragraph = g_oPRSW.Paragraph;
this.RecalcInfo.TextPr = true;
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
}
// Сначала измеряем элементы (можно вызывать каждый раз, внутри разруливается, чтобы измерялось 1 раз)
this.Recalculate_MeasureContent();
var PRS = g_oPRSW;
var CurLine = PRS.Line - this.StartLine;
var CurRange = ( 0 === CurLine ? PRS.Range - this.StartRange : PRS.Range );
......@@ -2351,6 +2381,8 @@ ParaRun.prototype =
var SearchMarksCount = this.SearchMarks.length;
this.CollaborativeMarks.Init_Drawing();
for ( var Pos = StartPos; Pos < EndPos; Pos++ )
{
var Item = this.Content[Pos];
......@@ -2369,19 +2401,7 @@ ParaRun.prototype =
var DrawSearch = ( PDSH.SearchCounter > 0 ? true : false );
var nCollaborativeChanges = 0;
if ( true === bDrawColl )
{
var CollCount = this.CollaborativeMarks.length;
for ( var TempIndex = 0; TempIndex < CollCount; TempIndex++ )
{
var CollMark = this.CollaborativeMarks[TempIndex];
if ( CollMark.Pos <= Pos && pararun_CollaborativeMark_Start === CollMark.Type )
nCollaborativeChanges++;
else if ( CollMark.Pos <= Pos && pararun_CollaborativeMark_End === CollMark.Type )
nCollaborativeChanges--;
}
}
var DrawColl = this.CollaborativeMarks.Check( Pos );
switch( Item.Type )
{
......@@ -2401,7 +2421,7 @@ ParaRun.prototype =
if ( true === DrawSearch )
aFind.Add( Y0, Y1, X, X + Item.WidthVisible, 0, 0, 0, 0 );
else if ( nCollaborativeChanges > 0 )
else if ( true === DrawColl )
aColl.Add( Y0, Y1, X, X + Item.WidthVisible, 0, 0, 0, 0 );
if ( para_Drawing != Item.Type || drawing_Anchor != Item.DrawingType )
......@@ -2424,7 +2444,7 @@ ParaRun.prototype =
if ( true === DrawSearch )
aFind.Add( Y0, Y1, X, X + Item.WidthVisible, 0, 0, 0, 0 );
else if ( nCollaborativeChanges > 0 )
else if ( true === DrawColl )
aColl.Add( Y0, Y1, X, X + Item.WidthVisible, 0, 0, 0, 0 );
X += Item.WidthVisible;
......@@ -2433,7 +2453,7 @@ ParaRun.prototype =
}
case para_End:
{
if ( nCollaborativeChanges > 0 )
if ( true === DrawColl )
aColl.Add( Y0, Y1, X, X + Item.WidthVisible, 0, 0, 0, 0 );
X += Item.Width;
......@@ -4901,199 +4921,1019 @@ ParaRun.prototype =
//-----------------------------------------------------------------------------------
Save_Changes : function(Data, Writer)
{
// Сохраняем изменения из тех, которые используются для Undo/Redo в бинарный файл.
// Long : тип класса
// Long : тип изменений
},
Load_Changes : function(Reader)
{
Writer.WriteLong( historyitem_type_ParaRun );
},
var Type = Data.Type;
Write_ToBinary2 : function(Writer)
{
// Пишем тип
Writer.WriteLong( Type );
},
switch ( Type )
{
case historyitem_ParaRun_AddItem:
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Элемент
// }
Read_FromBinary2 : function(Reader)
{
var bArray = Data.UseArray;
var Count = Data.Items.length;
},
Writer.WriteLong( Count );
for ( var Index = 0; Index < Count; Index++ )
{
if ( true === bArray )
Writer.WriteLong( Data.PosArray[Index] );
else
Writer.WriteLong( Data.Pos + Index );
Write_ToBinary : function(Writer)
{
// TODO: Скорее всего надо будет убрать эти функции
},
Data.Items[Index].Write_ToBinary(Writer);
}
Read_FromBinary : function(Reader)
{
// TODO: Скорее всего надо будет убрать эти функции
},
break;
}
Is_RealContent : function()
{
// TODO: Скорее всего надо будет убрать эти функции
return true;
}
};
case historyitem_ParaRun_RemoveItem:
{
// Long : Количество удаляемых элементов
// Array of Long : позиции удаляемых элементов
function CParaRunSelection()
{
this.Use = false;
this.StartPos = false;
this.EndPos = false;
}
var bArray = Data.UseArray;
var Count = Data.Items.length;
function CParaRunState()
{
this.Selection = new CParaRunSelection();
this.ContentPos = 0;
}
var StartPos = Writer.GetCurPosition();
Writer.Skip(4);
var RealCount = Count;
function CParaRunRecalcInfo()
{
this.TextPr = true; // Нужно ли пересчитать скомпилированные настройки
this.Measure = true; // Нужно ли перемерять элементы
this.Recalc = true; // Нужно ли пересчитывать (только если текстовый ран)
this.RunLen = 0;
for ( var Index = 0; Index < Count; Index++ )
{
if ( true === bArray )
{
if ( false === Data.PosArray[Index] )
RealCount--;
else
Writer.WriteLong( Data.PosArray[Index] );
}
else
Writer.WriteLong( Data.Pos );
}
// Далее идут параметры, которые выставляются после пересчета данного Range, такие как пересчитывать ли нумерацию
this.NumberingItem = null;
this.NumberingUse = false; // Используется ли нумерация в данном ране
this.NumberingAdd = true; // Нужно ли в следующем ране использовать нумерацию
}
var EndPos = Writer.GetCurPosition();
Writer.Seek( StartPos );
Writer.WriteLong( RealCount );
Writer.Seek( EndPos );
CParaRunRecalcInfo.prototype =
{
Reset : function()
{
this.TextPr = true;
this.Measure = true;
this.Recalc = true;
this.RunLen = 0;
}
break;
}
};
case historyitem_ParaRun_TextPr:
{
// CTextPr
this.Pr.Write_ToBinary( Writer );
function CParaRunRange(StartPos, EndPos)
{
this.StartPos = StartPos; // Начальная позиция в контенте, с которой начинается данный отрезок
this.EndPos = EndPos; // Конечная позиция в контенте, на которой заканчивается данный отрезок (перед которой)
}
break;
}
function CParaRunLine()
{
this.Ranges = [];
this.Ranges[0] = new CParaRunRange( 0, 0 );
this.RangesLength = 0;
}
case historyitem_ParaRun_Bold:
case historyitem_ParaRun_Italic:
case historyitem_ParaRun_Strikeout:
case historyitem_ParaRun_Underline:
{
// Bool : IsUndefined
// Bool : Value
CParaRunLine.prototype =
{
Add_Range : function(RangeIndex, StartPos, EndPos)
{
if ( 0 !== RangeIndex )
{
this.Ranges[RangeIndex] = new CParaRunRange( StartPos, EndPos );
this.RangesLength = RangeIndex + 1;
}
else
{
this.Ranges[0].StartPos = StartPos;
this.Ranges[0].EndPos = EndPos;
this.RangesLength = 1;
}
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Writer.WriteBool( Data.New );
}
else
Writer.WriteBool( true );
if ( this.Ranges.length > this.RangesLength )
this.Ranges.legth = this.RangesLength;
},
break;
}
Copy : function()
{
var NewLine = new CParaRunLine();
case historyitem_ParaRun_FontSize:
{
// Bool : IsUndefined
// Double : FontSize
NewLine.RangesLength = this.RangesLength;
if ( undefined != Data.New )
{
Writer.WriteBool(false);
Writer.WriteDouble( Data.New );
}
else
Writer.WriteBool(true);
for ( var CurRange = 0; CurRange < this.RangesLength; CurRange++ )
{
var Range = this.Ranges[CurRange];
NewLine.Ranges[CurRange] = new CParaRunRange( Range.StartPos, Range.EndPos );
}
break;
}
return NewLine;
},
case historyitem_ParaRun_Color:
{
// Bool : IsUndefined
// Variable : Color (CDocumentColor)
if ( undefined != Data.New )
{
Writer.WriteBool(false);
Data.New.Write_ToBinary( Writer );
}
else
Writer.WriteBool(true);
Compare : function(OtherLine, CurRange)
{
// Сначала проверим наличие данного отрезка в обеих строках
if ( this.RangesLength <= CurRange || OtherLine.RangesLength <= CurRange )
return false;
break;
}
var OtherRange = OtherLine.Ranges[CurRange];
var ThisRange = this.Ranges[CurRange];
case historyitem_ParaRun_VertAlign:
{
// Bool : IsUndefined
// Long : VertAlign
if ( OtherRange.StartPos !== ThisRange.StartPos || OtherRange.EndPos !== ThisRange.EndPos )
return false;
if ( undefined != Data.New )
{
Writer.WriteBool(false);
Writer.WriteLong(Data.New);
}
else
Writer.WriteBool(true);
return true;
}
break;
}
case historyitem_ParaRun_HighLight:
{
// Bool : IsUndefined
// Если false
// Bool : IsNone
// Если false
// Variable : Color (CDocumentColor)
};
if ( undefined != Data.New )
{
Writer.WriteBool(false);
if ( highlight_None != Data.New )
{
Writer.WriteBool( false );
Data.New.Write_ToBinary( Writer );
}
else
Writer.WriteBool( true );
}
else
Writer.WriteBool(true);
// Метка о конце или начале изменений пришедших от других соавторов документа
var pararun_CollaborativeMark_Start = 0x00;
var pararun_CollaborativeMark_End = 0x01;
break;
}
function CParaRunCollaborativeMark(Pos, Type)
{
this.Pos = Pos;
this.Type = Type;
}
case historyitem_ParaRun_RStyle:
{
// Bool : IsUndefined
// Если false
// String : RStyle
function FontSize_IncreaseDecreaseValue(bIncrease, Value)
{
// Закон изменения размеров :
// 1. Если значение меньше 8, тогда мы увеличиваем/уменьшаем по 1 (от 1 до 8)
// 2. Если значение больше 72, тогда мы увеличиваем/уменьшаем по 10 (от 80 до бесконечности
// 3. Если значение в отрезке [8,72], тогда мы переходим по следующим числам 8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Writer.WriteString2( Data.New );
}
else
Writer.WriteBool( true );
var Sizes = [8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72];
break;
}
var NewValue = Value;
if ( true === bIncrease )
{
if ( Value < Sizes[0] )
{
if ( Value >= Sizes[0] - 1 )
NewValue = Sizes[0];
else
NewValue = Math.floor(Value + 1);
}
else if ( Value >= Sizes[Sizes.length - 1] )
{
NewValue = Math.min( 300, Math.floor( Value / 10 + 1 ) * 10 );
}
else
{
for ( var Index = 0; Index < Sizes.length; Index++ )
case historyitem_ParaRun_Spacing:
case historyitem_ParaRun_Position:
{
if ( Value < Sizes[Index] )
// Bool : IsUndefined
// Если false
// Double : Spacing
if ( undefined != Data.New )
{
NewValue = Sizes[Index];
break;
Writer.WriteBool( false );
Writer.WriteDouble( Data.New );
}
else
Writer.WriteBool( true );
break;
}
}
}
else
{
if ( Value <= Sizes[0] )
{
NewValue = Math.max( Math.floor( Value - 1 ), 1 );
}
else if ( Value > Sizes[Sizes.length - 1] )
case historyitem_ParaRun_DStrikeout:
case historyitem_ParaRun_Caps:
case historyitem_ParaRun_SmallCaps:
{
// Bool : IsUndefined
// Если false
// Bool : value
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Writer.WriteBool( Data.New );
}
else
Writer.WriteBool( true );
break;
}
case historyitem_ParaRun_RFonts:
{
// Bool : undefined ?
// false -> CRFonts
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Data.New.Write_ToBinary( Writer );
}
else
Writer.WriteBool( true );
break;
}
case historyitem_ParaRun_RFonts_Ascii:
case historyitem_ParaRun_RFonts_HAnsi:
case historyitem_ParaRun_RFonts_CS:
case historyitem_ParaRun_RFonts_EastAsia:
{
// Bool : undefined?
// false -> String
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Writer.WriteString2( Data.New.Name );
}
else
Writer.WriteBool( true );
break;
}
case historyitem_ParaRun_RFonts_Hint:
{
// Bool : undefined?
// false -> Long
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Writer.WriteLong( Data.New );
}
else
Writer.WriteBool( true );
break;
}
case historyitem_ParaRun_Lang:
{
// Bool : undefined ?
// false -> CLang
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Data.New.Write_ToBinary( Writer );
}
else
Writer.WriteBool( true );
break;
}
case historyitem_ParaRun_Lang_Bidi:
case historyitem_ParaRun_Lang_EastAsia:
case historyitem_ParaRun_Lang_Val:
{
// Bool : undefined ?
// false -> Long
if ( undefined != Data.New )
{
Writer.WriteBool( false );
Writer.WriteLong( Data.New );
}
else
Writer.WriteBool( true );
break;
}
}
return Writer;
},
Load_Changes : function(Reader)
{
// Сохраняем изменения из тех, которые используются для Undo/Redo в бинарный файл.
// Long : тип класса
// Long : тип изменений
var ClassType = Reader.GetLong();
if ( historyitem_type_ParaRun != ClassType )
return;
var Type = Reader.GetLong();
switch ( Type )
{
case historyitem_ParaRun_AddItem :
{
// Long : Количество элементов
// Array of :
// {
// Long : Позиция
// Variable : Id Элемента
// }
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var Pos = this.m_oContentChanges.Check( contentchanges_Add, Reader.GetLong() );
var Element = ParagraphContent_Read_FromBinary(Reader);
if ( null != Element )
{
this.CollaborativeMarks.Update_OnAdd( Pos );
this.CollaborativeMarks.Add( Pos, Pos + 1 );
this.Content.splice( Pos, 0, Element );
CollaborativeEditing.Add_ChangedClass(this);
}
}
this.RecalcInfo.Measure = true;
if ( undefined !== this.Paragraph && null !== this.Paragraph )
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
break;
}
case historyitem_ParaRun_RemoveItem:
{
// Long : Количество удаляемых элементов
// Array of Long : позиции удаляемых элементов
var Count = Reader.GetLong();
for ( var Index = 0; Index < Count; Index++ )
{
var ChangesPos = this.m_oContentChanges.Check( contentchanges_Remove, Reader.GetLong() );
// действие совпало, не делаем его
if ( false === ChangesPos )
continue;
this.CollaborativeMarks.Update_OnRemove( ChangesPos, 1 );
this.Content.splice( ChangesPos, 1 );
}
this.RecalcInfo.Measure = true;
if ( undefined !== this.Paragraph && null !== this.Paragraph )
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
break;
}
case historyitem_ParaRun_TextPr:
{
// CTextPr
this.Pr = new CTextPr();
this.Pr.Read_FromBinary( Reader );
break;
}
case historyitem_ParaRun_Bold:
{
// Bool : IsUndefined
// Bool : Bold
if ( true === Reader.GetBool() )
this.Pr.Bold = undefined;
else
this.Pr.Bold = Reader.GetBool();
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Italic:
{
// Bool : IsUndefined
// Bool : Italic
if ( true === Reader.GetBool() )
this.Pr.Italic = undefined;
else
this.Pr.Italic = Reader.GetBool();
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Strikeout:
{
// Bool : IsUndefined
// Bool : Strikeout
if ( true === Reader.GetBool() )
this.Pr.Strikeout = undefined;
else
this.Pr.Strikeout = Reader.GetBool();
this.Recalc_CompiledPr(false);
break;
}
case historyitem_ParaRun_Underline:
{
// Bool : IsUndefined?
// Bool : Underline
if ( true != Reader.GetBool() )
this.Pr.Underline = Reader.GetBool();
else
this.Pr.Underline = undefined;
this.Recalc_CompiledPr(false);
break;
}
case historyitem_ParaRun_FontSize:
{
// Bool : IsUndefined
// Double : FontSize
if ( true != Reader.GetBool() )
this.Pr.FontSize = Reader.GetDouble();
else
this.Pr.FontSize = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Color:
{
// Bool : IsUndefined
// Variable : Color (CDocumentColor)
if ( true != Reader.GetBool() )
{
var r = Reader.GetByte();
var g = Reader.GetByte();
var b = Reader.GetByte();
this.Pr.Color = new CDocumentColor( r, g, b );
}
else
this.Pr.Color = undefined;
this.Recalc_CompiledPr(false);
break;
}
case historyitem_ParaRun_VertAlign:
{
// Bool : IsUndefined
// Long : VertAlign
if ( true != Reader.GetBool() )
this.Pr.VertAlign = Reader.GetLong();
else
this.Pr.VertAlign = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_HighLight:
{
// Bool : IsUndefined
// Если false
// Bool : IsNull
// Если false
// Variable : Color (CDocumentColor)
if ( true != Reader.GetBool() )
{
if ( true != Reader.GetBool() )
{
this.Pr.HighLight = new CDocumentColor(0,0,0);
this.Pr.HighLight.Read_FromBinary(Reader);
}
else
this.Pr.HighLight = highlight_None;
}
else
this.Pr.HighLight = undefined;
this.Recalc_CompiledPr(false);
break;
}
case historyitem_ParaRun_RStyle:
{
// Bool : IsUndefined
// Если false
// String : RStyle
if ( true != Reader.GetBool() )
this.Pr.RStyle = Reader.GetString2();
else
this.Pr.RStyle = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Spacing:
{
// Bool : IsUndefined
// Если false
// Double : Spacing
if ( true != Reader.GetBool() )
this.Pr.Spacing = Reader.GetDouble();
else
this.Pr.Spacing = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_DStrikeout:
{
// Bool : IsUndefined
// Если false
// Bool : DStrikeout
if ( true != Reader.GetBool() )
this.Pr.DStrikeout = Reader.GetBool();
else
this.Pr.DStrikeout = undefined;
this.Recalc_CompiledPr(false);
break;
}
case historyitem_ParaRun_Caps:
{
// Bool : IsUndefined
// Если false
// Bool : Caps
if ( true != Reader.GetBool() )
this.Value.Caps = Reader.GetBool();
else
this.Value.Caps = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_SmallCaps:
{
// Bool : IsUndefined
// Если false
// Bool : SmallCaps
if ( true != Reader.GetBool() )
this.Pr.SmallCaps = Reader.GetBool();
else
this.Pr.SmallCaps = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Position:
{
// Bool : IsUndefined
// Если false
// Double : Position
if ( true != Reader.GetBool() )
this.Pr.Position = Reader.GetDouble();
else
this.Pr.Position = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_RFonts:
{
// Bool : undefined ?
// false -> CRFonts
if ( false === Reader.GetBool() )
{
this.Pr.RFonts = new CRFonts();
this.Pr.RFonts.Read_FromBinary( Reader );
}
else
this.Pr.RFonts = new CRFonts();
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_RFonts_Ascii:
{
// Bool : undefined ?
// false -> String
if ( false === Reader.GetBool() )
{
this.Pr.RFonts.Ascii =
{
Name : Reader.GetString2(),
Index : -1
};
}
else
this.Pr.RFonts.Ascii = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_RFonts_HAnsi:
{
// Bool : undefined ?
// false -> String
if ( false === Reader.GetBool() )
{
this.Pr.RFonts.HAnsi =
{
Name : Reader.GetString2(),
Index : -1
};
}
else
this.Pr.RFonts.HAnsi = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_RFonts_CS:
{
// Bool : undefined ?
// false -> String
if ( false === Reader.GetBool() )
{
this.Pr.RFonts.CS =
{
Name : Reader.GetString2(),
Index : -1
};
}
else
this.Pr.RFonts.CS = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_RFonts_EastAsia:
{
// Bool : undefined ?
// false -> String
if ( false === Reader.GetBool() )
{
this.Pr.RFonts.EastAsia =
{
Name : Reader.GetString2(),
Index : -1
};
}
else
this.Pr.RFonts.Ascii = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_RFonts_Hint:
{
// Bool : undefined ?
// false -> Long
if ( false === Reader.GetBool() )
this.Pr.RFonts.Hint = Reader.GetLong();
else
this.Pr.RFonts.Hint = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Lang:
{
// Bool : undefined ?
// false -> Lang
if ( false === Reader.GetBool() )
{
this.Pr.Lang = new CLang();
this.Pr.Lang.Read_FromBinary( Reader );
}
else
this.Pr.Lang = new CLang();
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Lang_Bidi:
{
// Bool : undefined ?
// false -> Long
if ( false === Reader.GetBool() )
this.Pr.Lang.Bidi = Reader.GetLong();
else
this.Pr.Lang.Bidi = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Lang_EastAsia:
{
// Bool : undefined ?
// false -> Long
if ( false === Reader.GetBool() )
this.Pr.Lang.EastAsia = Reader.GetLong();
else
this.Pr.Lang.EastAsia = undefined;
this.Recalc_CompiledPr(true);
break;
}
case historyitem_ParaRun_Lang_Val:
{
// Bool : undefined ?
// false -> Long
if ( false === Reader.GetBool() )
this.Pr.Lang.Val = Reader.GetLong();
else
this.Pr.Lang.Val = undefined;
this.Recalc_CompiledPr(true);
break;
}
}
},
Write_ToBinary2 : function(Writer)
{
Writer.WriteLong( historyitem_type_ParaRun );
// String : Id
// String : Paragraph Id
// Variable : CTextPr
// Long : Количество элементов
// Array of variable : массив с элементами
Writer.WriteString2( this.Id );
Writer.WriteString2( null !== this.Paragraph && undefined !== this.Paragraph ? this.Paragraph.Get_Id() : "" );
this.Pr.Write_ToBinary( Writer );
var Count = this.Content.length;
Writer.WriteLong( Count );
for ( var Index = 0; Index < Count; Index++ )
{
var Item = this.Content[Index];
Item.Write_ToBinary( Writer );
}
},
Read_FromBinary2 : function(Reader)
{
// String : Id
// String : Paragraph Id
// Variable : CTextPr
// Long : Количество элементов
// Array of variable : массив с элементами
this.Id = Reader.GetString2();
this.Parent = g_oTableId.Get_ById( Reader.GetString2() );
this.Pr = new CTextPr();
this.Pr.Read_FromBinary( Reader );
var Count = Reader.GetLong();
this.Content = new Array();
for ( var Index = 0; Index < Count; Index++ )
{
var Element = ParagraphContent_Read_FromBinary( Reader );
if ( null !== Element )
this.Content.push( Element );
}
},
Clear_CollaborativeMarks : function()
{
this.CollaborativeMarks.Clear();
}
};
function CParaRunSelection()
{
this.Use = false;
this.StartPos = false;
this.EndPos = false;
}
function CParaRunState()
{
this.Selection = new CParaRunSelection();
this.ContentPos = 0;
}
function CParaRunRecalcInfo()
{
this.TextPr = true; // Нужно ли пересчитать скомпилированные настройки
this.Measure = true; // Нужно ли перемерять элементы
this.Recalc = true; // Нужно ли пересчитывать (только если текстовый ран)
this.RunLen = 0;
// Далее идут параметры, которые выставляются после пересчета данного Range, такие как пересчитывать ли нумерацию
this.NumberingItem = null;
this.NumberingUse = false; // Используется ли нумерация в данном ране
this.NumberingAdd = true; // Нужно ли в следующем ране использовать нумерацию
}
CParaRunRecalcInfo.prototype =
{
Reset : function()
{
this.TextPr = true;
this.Measure = true;
this.Recalc = true;
this.RunLen = 0;
}
};
function CParaRunRange(StartPos, EndPos)
{
this.StartPos = StartPos; // Начальная позиция в контенте, с которой начинается данный отрезок
this.EndPos = EndPos; // Конечная позиция в контенте, на которой заканчивается данный отрезок (перед которой)
}
function CParaRunLine()
{
this.Ranges = [];
this.Ranges[0] = new CParaRunRange( 0, 0 );
this.RangesLength = 0;
}
CParaRunLine.prototype =
{
Add_Range : function(RangeIndex, StartPos, EndPos)
{
if ( 0 !== RangeIndex )
{
this.Ranges[RangeIndex] = new CParaRunRange( StartPos, EndPos );
this.RangesLength = RangeIndex + 1;
}
else
{
this.Ranges[0].StartPos = StartPos;
this.Ranges[0].EndPos = EndPos;
this.RangesLength = 1;
}
if ( this.Ranges.length > this.RangesLength )
this.Ranges.legth = this.RangesLength;
},
Copy : function()
{
var NewLine = new CParaRunLine();
NewLine.RangesLength = this.RangesLength;
for ( var CurRange = 0; CurRange < this.RangesLength; CurRange++ )
{
var Range = this.Ranges[CurRange];
NewLine.Ranges[CurRange] = new CParaRunRange( Range.StartPos, Range.EndPos );
}
return NewLine;
},
Compare : function(OtherLine, CurRange)
{
// Сначала проверим наличие данного отрезка в обеих строках
if ( this.RangesLength <= CurRange || OtherLine.RangesLength <= CurRange )
return false;
var OtherRange = OtherLine.Ranges[CurRange];
var ThisRange = this.Ranges[CurRange];
if ( OtherRange.StartPos !== ThisRange.StartPos || OtherRange.EndPos !== ThisRange.EndPos )
return false;
return true;
}
};
// Метка о конце или начале изменений пришедших от других соавторов документа
var pararun_CollaborativeMark_Start = 0x00;
var pararun_CollaborativeMark_End = 0x01;
function CParaRunCollaborativeMark(Pos, Type)
{
this.Pos = Pos;
this.Type = Type;
}
function FontSize_IncreaseDecreaseValue(bIncrease, Value)
{
// Закон изменения размеров :
// 1. Если значение меньше 8, тогда мы увеличиваем/уменьшаем по 1 (от 1 до 8)
// 2. Если значение больше 72, тогда мы увеличиваем/уменьшаем по 10 (от 80 до бесконечности
// 3. Если значение в отрезке [8,72], тогда мы переходим по следующим числам 8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72
var Sizes = [8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72];
var NewValue = Value;
if ( true === bIncrease )
{
if ( Value < Sizes[0] )
{
if ( Value >= Sizes[0] - 1 )
NewValue = Sizes[0];
else
NewValue = Math.floor(Value + 1);
}
else if ( Value >= Sizes[Sizes.length - 1] )
{
NewValue = Math.min( 300, Math.floor( Value / 10 + 1 ) * 10 );
}
else
{
for ( var Index = 0; Index < Sizes.length; Index++ )
{
if ( Value < Sizes[Index] )
{
NewValue = Sizes[Index];
break;
}
}
}
}
else
{
if ( Value <= Sizes[0] )
{
NewValue = Math.max( Math.floor( Value - 1 ), 1 );
}
else if ( Value > Sizes[Sizes.length - 1] )
{
if ( Value <= Math.floor( Sizes[Sizes.length - 1] / 10 + 1 ) * 10 )
NewValue = Sizes[Sizes.length - 1];
......@@ -5115,3 +5955,150 @@ function FontSize_IncreaseDecreaseValue(bIncrease, Value)
return NewValue;
}
function CRunCollaborativeMarks()
{
this.Ranges = new Array();
this.DrawingObj = new Object();
}
CRunCollaborativeMarks.prototype =
{
Add : function(PosS, PosE)
{
var Count = this.Ranges.length;
for ( var Index = 0; Index < Count; Index++ )
{
var Range = this.Ranges[Index];
if ( PosE < Range.PosS )
continue;
else if ( PosS >= Range.PosS && PosS <= Range.PosE && PosE >= Range.PosS && PosE <= Range.PosE )
{
return;
}
else if ( PosS > Range.PosE )
{
this.Ranges.splice( Index + 1, 0, new CRunCollaborativeRange(PosS, PosE) );
return;
}
else if ( PosS < Range.PosS && PosE > Range.PosE )
{
Range.PosS = PosS;
Range.PosE = PosE;
return;
}
else if ( PosS < Range.PosS ) // && PosE <= Range.PosE )
{
Range.PosS = PosS;
return;
}
else //if ( PosS >= Range.PosS && PosE > Range.Pos.E )
{
Range.PosE = PosE;
return;
}
}
this.Ranges.push( new CRunCollaborativeRange(PosS, PosE) );
},
Update_OnAdd : function(Pos)
{
var Count = this.Ranges.length;
for ( var Index = 0; Index < Count; Index++ )
{
var Range = this.Ranges[Index];
if ( Pos <= Range.PosS )
{
Range.PosS++;
Range.PosE++;
}
else if ( Pos > Range.PosS && Pos < Range.PosE )
{
var NewRange = new CRunCollaborativeRange( Pos + 1, Range.PosE + 1 );
this.Ranges.splice( Index + 1, 0, NewRange );
Range.PosE = Pos;
Count++;
Index++;
}
//else if ( Pos < Range.PosE )
// Range.PosE++;
}
},
Update_OnRemove : function(Pos, Count)
{
var Len = this.Ranges.length;
for ( var Index = 0; Index < Len; Index++ )
{
var Range = this.Ranges[Index];
var PosE = Pos + Count;
if ( Pos < Range.PosS )
{
if ( PosE <= Range.PosS )
{
Range.PosS -= Count;
Range.PosE -= Count;
}
else if ( PosE >= Range.PosE )
{
this.Ranges.splice( Index, 1 );
Len--;
Index--;
continue;
}
else
{
Range.PosS = Pos;
Range.PosE -= Count;
}
}
else if ( Pos >= Range.PosS && Pos < Range.PosE )
{
if ( PosE >= Range.PosE )
Range.PosE = Pos;
else
Range.PosE -= Count;
}
else
continue;
}
},
Clear : function()
{
this.Ranges = new Array();
},
Init_Drawing : function()
{
this.DrawingObj = new Object();
var Count = this.Ranges.length;
for ( var CurPos = 0; CurPos < Count; CurPos++ )
{
var Range = this.Ranges[CurPos];
for ( var Pos = Range.PosS; Pos < Range.PosE; Pos++ )
this.DrawingObj[Pos] = true;
}
},
Check : function(Pos)
{
if ( true === this.DrawingObj[Pos] )
return true;
return false;
}
};
function CRunCollaborativeRange(PosS, PosE)
{
this.PosS = PosS;
this.PosE = PosE;
}
\ No newline at end of file
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