Commit 833516a8 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@53591 954022d7-b5bf-4e40-9824-e11837661b57
parent 05f04c79
......@@ -4849,33 +4849,43 @@ Paragraph.prototype =
Internal_Get_ClearPos : function(Pos)
{
// TODO: Переделать. Надо ускорить. При пересчете параграфа запоминать
// все позиции элементов para_NewLineRendered, para_InlineBreak, para_PageBreakRendered,
// para_FlowObjectAnchor, para_CollaborativeChangesEnd, para_CollaborativeChangesStart
var Counter = 0;
for ( var Index = 0; Index < Math.min(Pos, this.Content.length - 1); Index++ )
if ( true !== Debug_ParaRunMode )
{
if ( false === this.Content[Index].Is_RealContent() || para_Numbering === this.Content[Index].Type )
Counter++;
// TODO: Переделать. Надо ускорить. При пересчете параграфа запоминать
// все позиции элементов para_NewLineRendered, para_InlineBreak, para_PageBreakRendered,
// para_FlowObjectAnchor, para_CollaborativeChangesEnd, para_CollaborativeChangesStart
var Counter = 0;
for ( var Index = 0; Index < Math.min(Pos, this.Content.length - 1); Index++ )
{
if ( false === this.Content[Index].Is_RealContent() || para_Numbering === this.Content[Index].Type )
Counter++;
}
return Pos - Counter;
}
return Pos - Counter;
else
return 0;
},
Internal_Get_RealPos : function(Pos)
{
// TODO: Переделать. Надо ускорить. При пересчете параграфа запоминать
// все позиции элементов para_NewLineRendered, para_InlineBreak, para_PageBreakRendered,
// para_FlowObjectAnchor, para_CollaborativeChangesEnd, para_CollaborativeChangesStart
var Counter = Pos;
for ( var Index = 0; Index <= Math.min(Counter, this.Content.length - 1); Index++ )
if ( true !== Debug_ParaRunMode )
{
if ( false === this.Content[Index].Is_RealContent() || para_Numbering === this.Content[Index].Type )
Counter++;
}
// TODO: Переделать. Надо ускорить. При пересчете параграфа запоминать
// все позиции элементов para_NewLineRendered, para_InlineBreak, para_PageBreakRendered,
// para_FlowObjectAnchor, para_CollaborativeChangesEnd, para_CollaborativeChangesStart
var Counter = Pos;
for ( var Index = 0; Index <= Math.min(Counter, this.Content.length - 1); Index++ )
{
if ( false === this.Content[Index].Is_RealContent() || para_Numbering === this.Content[Index].Type )
Counter++;
}
return Counter;
return Counter;
}
else
return 0;
},
Internal_Get_ClearContentLength : function()
......@@ -4949,6 +4959,7 @@ Paragraph.prototype =
PRS.Line = ParaPos.Line;
PRS.Range = ParaPos.Range;
PRS.Paragraph = Run.Paragraph;
var CurLine = PRS.Line;
......@@ -7004,244 +7015,265 @@ Paragraph.prototype =
// bOnlyText - true: удаляем только текст и пробелы, false - Удаляем любые элементы
Remove : function(nCount, bOnlyText, bRemoveOnlySelection, bOnAddText)
{
this.Internal_Remove_CollaborativeMarks(true);
this.RecalcInfo.Set_Type_0(pararecalc_0_All);
// Сначала проверим имеется ли у нас селект
if ( true === this.Selection.Use )
if ( true !== Debug_ParaRunMode )
{
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
var StartPos2 = this.Selection.StartPos2;
var EndPos2 = this.Selection.EndPos2;
this.Internal_Remove_CollaborativeMarks(true);
if ( StartPos > EndPos )
this.RecalcInfo.Set_Type_0(pararecalc_0_All);
// Сначала проверим имеется ли у нас селект
if ( true === this.Selection.Use )
{
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
var StartPos2 = this.Selection.StartPos2;
var EndPos2 = this.Selection.EndPos2;
var Temp2 = EndPos2;
EndPos2 = StartPos2;
StartPos2 = Temp2;
}
if ( StartPos > EndPos )
{
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
this.Selection_Remove();
var Temp2 = EndPos2;
EndPos2 = StartPos2;
StartPos2 = Temp2;
}
if ( EndPos >= this.Content.length - 1 )
{
var CurPos2 = -1;
if ( undefined !== this.Content[StartPos2] && para_Math === this.Content[StartPos2].Type )
this.Selection_Remove();
if ( EndPos >= this.Content.length - 1 )
{
if ( false === this.Content[StartPos2].Remove(nCount, bOnAddText) )
var CurPos2 = -1;
if ( undefined !== this.Content[StartPos2] && para_Math === this.Content[StartPos2].Type )
{
// Нам нужно удалить данный элемент
this.Internal_Content_Remove( StartPos2, 1 );
if ( StartPos > StartPos2 )
StartPos--;
if ( false === this.Content[StartPos2].Remove(nCount, bOnAddText) )
{
// Нам нужно удалить данный элемент
this.Internal_Content_Remove( StartPos2, 1 );
if ( StartPos > StartPos2 )
StartPos--;
if ( EndPos > StartPos2 )
EndPos--;
}
else
{
// Нам нужно удалить данный элемент
if ( StartPos === StartPos2 )
StartPos++;
if ( EndPos > StartPos2 )
EndPos--;
}
else
{
// Нам нужно удалить данный элемент
if ( StartPos === StartPos2 )
StartPos++;
CurPos2 = StartPos2;
CurPos2 = StartPos2;
}
}
}
for ( var Index = StartPos; Index < this.Content.length - 2; Index++ )
{
var Item = this.Content[Index];
if ( para_Drawing === Item.Type )
for ( var Index = StartPos; Index < this.Content.length - 2; Index++ )
{
var ObjId = Item.Get_Id();
this.Parent.DrawingObjects.Remove_ById( ObjId );
var Item = this.Content[Index];
if ( para_Drawing === Item.Type )
{
var ObjId = Item.Get_Id();
this.Parent.DrawingObjects.Remove_ById( ObjId );
}
}
}
var Hyper_start = null;
if ( StartPos < EndPos )
Hyper_start = this.Check_Hyperlink2( StartPos );
// Удаляем внутреннюю часть селекта (без знака параграфа)
this.Internal_Content_Remove2( StartPos, this.Content.length - 2 - StartPos );
// После удаления позиции могли измениться
StartPos = this.Selection.StartPos;
EndPos = this.Selection.EndPos;
if ( StartPos > EndPos )
{
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
}
var Hyper_start = null;
if ( StartPos < EndPos )
Hyper_start = this.Check_Hyperlink2( StartPos );
this.CurPos.ContentPos2 = StartPos2;
this.Set_ContentPos( StartPos, true, -1 );
// Удаляем внутреннюю часть селекта (без знака параграфа)
this.Internal_Content_Remove2( StartPos, this.Content.length - 2 - StartPos );
if ( null != Hyper_start )
{
this.Internal_Content_Add( StartPos, new ParaTextPr() );
this.Internal_Content_Add( StartPos, new ParaHyperlinkEnd() );
}
// После удаления позиции могли измениться
StartPos = this.Selection.StartPos;
EndPos = this.Selection.EndPos;
// Данный параграф надо объединить со следующим
return false;
}
else
{
var CurPos2 = -1;
if ( undefined !== this.Content[EndPos2] && para_Math === this.Content[EndPos2].Type )
{
if ( false === this.Content[EndPos2].Remove(nCount, bOnAddText) )
if ( StartPos > EndPos )
{
// Нам нужно удалить данный элемент
this.Internal_Content_Remove( EndPos2, 1 );
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
}
else
this.CurPos.ContentPos2 = StartPos2;
this.Set_ContentPos( StartPos, true, -1 );
if ( null != Hyper_start )
{
if ( StartPos2 === EndPos2 )
CurPos2 = StartPos2;
this.Internal_Content_Add( StartPos, new ParaTextPr() );
this.Internal_Content_Add( StartPos, new ParaHyperlinkEnd() );
}
if ( EndPos > EndPos2 )
EndPos--;
// Данный параграф надо объединить со следующим
return false;
}
if ( undefined !== this.Content[StartPos2] && para_Math === this.Content[StartPos2].Type && StartPos2 !== EndPos2 )
else
{
if ( false === this.Content[EndPos2].Remove(nCount, bOnAddText) )
var CurPos2 = -1;
if ( undefined !== this.Content[EndPos2] && para_Math === this.Content[EndPos2].Type )
{
// Нам нужно удалить данный элемент
this.Internal_Content_Remove( EndPos2, 1 );
if ( false === this.Content[EndPos2].Remove(nCount, bOnAddText) )
{
// Нам нужно удалить данный элемент
this.Internal_Content_Remove( EndPos2, 1 );
}
else
{
if ( StartPos2 === EndPos2 )
CurPos2 = StartPos2;
}
if ( StartPos > StartPos2 )
StartPos--;
if ( EndPos > StartPos2 )
if ( EndPos > EndPos2 )
EndPos--;
}
else
if ( undefined !== this.Content[StartPos2] && para_Math === this.Content[StartPos2].Type && StartPos2 !== EndPos2 )
{
if ( StartPos === StartPos2 )
StartPos++;
if ( false === this.Content[EndPos2].Remove(nCount, bOnAddText) )
{
// Нам нужно удалить данный элемент
this.Internal_Content_Remove( EndPos2, 1 );
if ( EndPos === StartPos2 )
EndPos--;
if ( StartPos > StartPos2 )
StartPos--;
CurPos2 = StartPos2;
if ( EndPos > StartPos2 )
EndPos--;
}
else
{
if ( StartPos === StartPos2 )
StartPos++;
if ( EndPos === StartPos2 )
EndPos--;
CurPos2 = StartPos2;
}
}
}
if ( EndPos <= StartPos )
{
var MathItem = this.Content[CurPos2];
if ( undefined !== MathItem && para_Math === MathItem.Type )
if ( EndPos <= StartPos )
{
if ( true === MathItem.Selection_IsUse() && false === MathItem.Selection_IsEmpty() )
this.Internal_SelectMath( CurPos2 );
}
var MathItem = this.Content[CurPos2];
if ( undefined !== MathItem && para_Math === MathItem.Type )
{
if ( true === MathItem.Selection_IsUse() && false === MathItem.Selection_IsEmpty() )
this.Internal_SelectMath( CurPos2 );
}
this.CurPos.ContentPos2 = CurPos2;
this.Set_ContentPos( StartPos, true, -1 );
this.CurPos.ContentPos2 = CurPos2;
this.Set_ContentPos( StartPos, true, -1 );
return true;
}
return true;
}
var Hyper_start = this.Check_Hyperlink2( StartPos );
var Hyper_end = this.Check_Hyperlink2( EndPos );
var Hyper_start = this.Check_Hyperlink2( StartPos );
var Hyper_end = this.Check_Hyperlink2( EndPos );
// Если встречалось какое-либо изменение настроек, сохраним его последние изменение
var LastTextPr = null;
// Если встречалось какое-либо изменение настроек, сохраним его последние изменение
var LastTextPr = null;
for ( var Index = StartPos; Index < EndPos; Index++ )
{
var Item = this.Content[Index];
if ( para_Drawing === Item.Type )
for ( var Index = StartPos; Index < EndPos; Index++ )
{
var ObjId = Item.Get_Id();
this.Parent.DrawingObjects.Remove_ById( ObjId );
var Item = this.Content[Index];
if ( para_Drawing === Item.Type )
{
var ObjId = Item.Get_Id();
this.Parent.DrawingObjects.Remove_ById( ObjId );
}
else if ( para_TextPr === Item.Type )
LastTextPr = Item;
}
else if ( para_TextPr === Item.Type )
LastTextPr = Item;
}
this.Internal_Content_Remove2( StartPos, EndPos - StartPos );
this.Internal_Content_Remove2( StartPos, EndPos - StartPos );
// После удаления позиции могли измениться
StartPos = this.Selection.StartPos;
EndPos = this.Selection.EndPos;
// После удаления позиции могли измениться
StartPos = this.Selection.StartPos;
EndPos = this.Selection.EndPos;
if ( StartPos > EndPos )
{
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
}
if ( StartPos > EndPos )
{
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
}
if ( null != LastTextPr )
this.Internal_Content_Add( StartPos, new ParaTextPr( LastTextPr.Value ) );
if ( null != LastTextPr )
this.Internal_Content_Add( StartPos, new ParaTextPr( LastTextPr.Value ) );
this.CurPos.ContentPos2 = CurPos2;
this.Set_ContentPos( StartPos, true, -1 );
this.CurPos.ContentPos2 = CurPos2;
this.Set_ContentPos( StartPos, true, -1 );
if ( Hyper_start != Hyper_end )
{
if ( null != Hyper_end )
if ( Hyper_start != Hyper_end )
{
this.Internal_Content_Add( StartPos, Hyper_end );
this.Set_ContentPos( this.CurPos.ContentPos + 1 );
}
if ( null != Hyper_end )
{
this.Internal_Content_Add( StartPos, Hyper_end );
this.Set_ContentPos( this.CurPos.ContentPos + 1 );
}
if ( null != Hyper_start )
if ( null != Hyper_start )
{
this.Internal_Content_Add( StartPos, new ParaHyperlinkEnd() );
this.Set_ContentPos( this.CurPos.ContentPos + 1 );
}
}
else
{
// TODO: Пока селект реализован так, что тут начало гиперссылки не попадает в выделение, а конец попадает.
// Поэтому добавляем конец гиперссылки, и потом проверяем пустая ли она.
this.Internal_Content_Add( StartPos, new ParaHyperlinkEnd() );
this.Set_ContentPos( this.CurPos.ContentPos + 1 );
this.Internal_Check_EmptyHyperlink( StartPos );
}
}
return;
}
if ( 0 == nCount )
return;
var absCount = ( nCount < 0 ? -nCount : nCount );
for ( var Index = 0; Index < absCount; Index++ )
{
var OldPos = this.CurPos.ContentPos;
if ( nCount < 0 )
{
if ( false === this.Internal_RemoveBackward(bOnlyText) )
return false;
}
else
{
// TODO: Пока селект реализован так, что тут начало гиперссылки не попадает в выделение, а конец попадает.
// Поэтому добавляем конец гиперссылки, и потом проверяем пустая ли она.
this.Internal_Content_Add( StartPos, new ParaHyperlinkEnd() );
this.Internal_Check_EmptyHyperlink( StartPos );
if ( false === this.Internal_RemoveForward(bOnlyText) )
return false;
}
this.Internal_Check_EmptyHyperlink( OldPos );
}
return;
return true;
}
if ( 0 == nCount )
return;
var absCount = ( nCount < 0 ? -nCount : nCount );
for ( var Index = 0; Index < absCount; Index++ )
else
{
var OldPos = this.CurPos.ContentPos;
if ( nCount < 0 )
if ( true === this.Selection.Use )
{
if ( false === this.Internal_RemoveBackward(bOnlyText) )
return false;
}
else
{
if ( false === this.Internal_RemoveForward(bOnlyText) )
return false;
}
var ContentPos = this.CurPos.ContentPos;
this.Internal_Check_EmptyHyperlink( OldPos );
}
if ( false === this.Content[ContentPos].Remove(nCount, bOnAddText) )
{
return true;
}
return true;
}
}
},
Internal_RemoveBackward : function(bOnlyText)
......@@ -8166,6 +8198,57 @@ Paragraph.prototype =
this.Set_PresentationLevel( NewPresLvl );
},
// Корректируем позицию курсора:
// Если курсор находится в начале какого-либо рана, тогда мы его двигаем в конец предыдущего рана
Correct_ContentPos : function()
{
var CurPos = this.CurPos.ContentPos;
while ( CurPos > 0 && true === this.Content[CurPos].Cursor_Is_Start() )
{
CurPos--;
this.Content[CurPos].Cursor_MoveToEndPos();
}
this.CurPos.ContentPos = CurPos;
},
Get_ParaContentPos : function(bSelection, bStart)
{
var ContentPos = new CParagraphContentPos();
var Pos = ( true !== bSelection ? this.CurPos.ContentPos : ( false !== bStart ? this.Selection.StartPos : this.Selection.EndPos ) );
ContentPos.Add( Pos );
this.Content[Pos].Get_ParaContentPos( bSelection, bStart, ContentPos );
return ContentPos;
},
Set_ParaContentPos : function(ContentPos, bSelection, bStart)
{
var Pos = ContentPos.Get(0);
if ( true === bSelection )
{
if ( true === bStart )
{
this.Selection.StartPos = Pos;
this.Content[Pos].Set_ParaContentPos( ContentPos, 1, bSelection, bStart );
}
else
{
this.Selection.EndPos = Pos;
this.Content[Pos].Set_ParaContentPos( ContentPos, 1, bSelection, bStart );
}
}
else
{
this.CurPos.ContentPos = Pos;
this.Content[Pos].Set_ParaContentPos( ContentPos, 1, bSelection, bStart );
this.Correct_ContentPos();
}
},
Cursor_GetPos : function()
{
return { X : this.CurPos.RealX, Y : this.CurPos.RealY };
......@@ -8173,50 +8256,251 @@ Paragraph.prototype =
Cursor_MoveLeft : function(Count, AddToSelect, Word)
{
if ( this.CurPos.ContentPos < 0 )
return false;
if ( true !== Debug_ParaRunMode )
{
if ( this.CurPos.ContentPos < 0 )
return false;
if ( 0 == Count || !Count )
return;
if ( 0 == Count || !Count )
return;
var absCount = ( Count < 0 ? -Count : Count );
var absCount = ( Count < 0 ? -Count : Count );
for ( var Index = 0; Index < absCount; Index++ )
for ( var Index = 0; Index < absCount; Index++ )
{
if ( false === this.Internal_MoveCursorBackward(AddToSelect, Word) )
return false;
}
this.Internal_Recalculate_CurPos( this.CurPos.ContentPos, true, false, false );
this.CurPos.RealX = this.CurPos.X;
this.CurPos.RealY = this.CurPos.Y;
return true;
}
else
{
if ( false === this.Internal_MoveCursorBackward(AddToSelect, Word) )
if ( true === this.Selection.Use )
{
}
else
{
if ( true === AddToSelect )
{
}
else
{
var SearchPos = new CParagraphSearchPos();
var ContentPos = this.Get_ParaContentPos( false, false );
if ( true === Word )
this.Get_WordStartPos( SearchPos, ContentPos );
else
this.Get_LeftPos( SearchPos, ContentPos );
if ( true === SearchPos.Found )
{
this.Set_ParaContentPos( SearchPos.Pos, false, false );
return true;
}
else
{
return false;
}
}
}
}
},
Cursor_MoveRight : function(Count, AddToSelect, Word)
{
if ( true !== Debug_ParaRunMode )
{
if ( this.CurPos.ContentPos < 0 )
return false;
if ( 0 == Count || !Count )
return;
var absCount = ( Count < 0 ? -Count : Count );
for ( var Index = 0; Index < absCount; Index++ )
{
if ( false === this.Internal_MoveCursorForward(AddToSelect, Word) )
return false;
}
this.Internal_Recalculate_CurPos( this.CurPos.ContentPos, true, false, false );
this.CurPos.RealX = this.CurPos.X;
this.CurPos.RealY = this.CurPos.Y;
return true;
}
else
{
if ( true === this.Selection.Use )
{
}
else
{
if ( true === AddToSelect )
{
}
else
{
var SearchPos = new CParagraphSearchPos();
var ContentPos = this.Get_ParaContentPos( false, false );
if ( true === Word )
this.Get_WordEndPos( SearchPos, ContentPos );
else
this.Get_RightPos( SearchPos, ContentPos );
if ( true === SearchPos.Found )
{
this.Set_ParaContentPos( SearchPos.Pos, false, false );
return true;
}
else
{
return false;
}
}
}
}
},
this.Internal_Recalculate_CurPos( this.CurPos.ContentPos, true, false, false );
Get_LeftPos : function(SearchPos, ContentPos)
{
var Depth = 0;
var CurPos = ContentPos.Get(Depth);
this.CurPos.RealX = this.CurPos.X;
this.CurPos.RealY = this.CurPos.Y;
this.Content[CurPos].Get_LeftPos(SearchPos, ContentPos, Depth + 1, true);
SearchPos.Pos.Update( CurPos, Depth );
return true;
if ( true === SearchPos.Found )
return true;
CurPos--;
while ( CurPos >= 0 )
{
this.Content[CurPos].Get_LeftPos(SearchPos, ContentPos, Depth + 1, false);
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return true;
CurPos--;
}
return false;
},
Cursor_MoveRight : function(Count, AddToSelect, Word)
Get_RightPos : function(SearchPos, ContentPos)
{
if ( this.CurPos.ContentPos < 0 )
return false;
var Depth = 0;
var CurPos = ContentPos.Get(Depth);
this.Content[CurPos].Get_RightPos(SearchPos, ContentPos, Depth + 1, true);
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return true;
CurPos++;
var Count = this.Content.length;
while ( CurPos < this.Content.length )
{
this.Content[CurPos].Get_RightPos(SearchPos, ContentPos, Depth + 1, false);
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return true;
CurPos++;
}
return false;
},
Get_WordStartPos : function(SearchPos, ContentPos)
{
var Depth = 0;
var CurPos = ContentPos.Get(Depth);
this.Content[CurPos].Get_WordStartPos(SearchPos, ContentPos, Depth + 1, true);
if ( 0 == Count || !Count )
if ( true === SearchPos.UpdatePos )
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return;
var absCount = ( Count < 0 ? -Count : Count );
CurPos--;
for ( var Index = 0; Index < absCount; Index++ )
var Count = this.Content.length;
while ( CurPos >= 0 )
{
if ( false === this.Internal_MoveCursorForward(AddToSelect, Word) )
return false;
this.Content[CurPos].Get_WordStartPos(SearchPos, ContentPos, Depth + 1, false);
if ( true === SearchPos.UpdatePos )
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return;
CurPos--;
}
this.Internal_Recalculate_CurPos( this.CurPos.ContentPos, true, false, false );
// Случай, когда слово шло с самого начала параграфа
if ( true === SearchPos.Shift )
{
SearchPos.Found = true;
}
},
this.CurPos.RealX = this.CurPos.X;
this.CurPos.RealY = this.CurPos.Y;
Get_WordEndPos : function(SearchPos, ContentPos)
{
var Depth = 0;
var CurPos = ContentPos.Get(Depth);
return true;
this.Content[CurPos].Get_WordEndPos(SearchPos, ContentPos, Depth + 1, true);
if ( true === SearchPos.UpdatePos )
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return;
CurPos++;
var Count = this.Content.length;
while ( CurPos < Count )
{
this.Content[CurPos].Get_WordEndPos(SearchPos, ContentPos, Depth + 1, false);
if ( true === SearchPos.UpdatePos )
SearchPos.Pos.Update( CurPos, Depth );
if ( true === SearchPos.Found )
return;
CurPos++;
}
// Случай, когда слово шло с самого начала параграфа
if ( true === SearchPos.Shift )
{
SearchPos.Found = true;
}
},
Cursor_MoveUp : function(Count, AddToSelect)
......@@ -8672,89 +8956,127 @@ Paragraph.prototype =
Cursor_MoveToStartPos : function(AddToSelect)
{
if ( true === AddToSelect )
if ( true !== Debug_ParaRunMode )
{
if ( true === this.Selection.Use )
{
var MathElement = this.Content[this.Selection.StartPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
this.Selection.StartPos = this.Selection.StartPos2;
else
this.Selection.StartPos2 = -1;
}
else
if ( true === AddToSelect )
{
var MathElement = this.Content[this.CurPos.ContentPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
if ( true === this.Selection.Use )
{
this.Selection.StartPos = this.CurPos.ContentPos2;
this.Selection.StartPos2 = this.CurPos.ContentPos2;
var MathElement = this.Content[this.Selection.StartPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
this.Selection.StartPos = this.Selection.StartPos2;
else
this.Selection.StartPos2 = -1;
}
else
{
this.Selection.StartPos = this.CurPos.ContentPos;
this.Selection.StartPos2 = -1;
var MathElement = this.Content[this.CurPos.ContentPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
{
this.Selection.StartPos = this.CurPos.ContentPos2;
this.Selection.StartPos2 = this.CurPos.ContentPos2;
}
else
{
this.Selection.StartPos = this.CurPos.ContentPos;
this.Selection.StartPos2 = -1;
}
}
}
this.Selection.Use = true;
this.Selection.Start = false;
this.Selection.Use = true;
this.Selection.Start = false;
this.Selection.EndPos = 0;
this.Selection.EndPos2 = -1;
this.Selection.EndPos = 0;
this.Selection.EndPos2 = -1;
this.Set_ContentPos( this.Internal_GetStartPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
this.Set_ContentPos( this.Internal_GetStartPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
}
else
{
this.Selection.Use = false;
this.Set_ContentPos( this.Internal_GetStartPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
}
}
else
{
this.Selection.Use = false;
this.Set_ContentPos( this.Internal_GetStartPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
if ( true === AddToSelect )
{
}
else
{
this.Selection.Use = false;
this.Selection.Start = false;
this.CurPos.ContentPos = 0;
this.Content[0].Cursor_MoveToStartPos();
this.Correct_ContentPos();
}
}
},
Cursor_MoveToEndPos : function(AddToSelect)
{
if ( true === AddToSelect )
if ( true !== Debug_ParaRunMode )
{
if ( true === this.Selection.Use )
{
var MathElement = this.Content[this.Selection.StartPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
this.Selection.StartPos = this.Selection.StartPos2;
else
this.Selection.StartPos2 = -1;
}
else
if ( true === AddToSelect )
{
var MathElement = this.Content[this.CurPos.ContentPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
if ( true === this.Selection.Use )
{
this.Selection.StartPos = this.CurPos.ContentPos2;
this.Selection.StartPos2 = this.CurPos.ContentPos2;
var MathElement = this.Content[this.Selection.StartPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
this.Selection.StartPos = this.Selection.StartPos2;
else
this.Selection.StartPos2 = -1;
}
else
{
this.Selection.StartPos = this.CurPos.ContentPos;
this.Selection.StartPos2 = -1;
var MathElement = this.Content[this.CurPos.ContentPos2];
if ( undefined !== MathElement && para_Math === MathElement.Type )
{
this.Selection.StartPos = this.CurPos.ContentPos2;
this.Selection.StartPos2 = this.CurPos.ContentPos2;
}
else
{
this.Selection.StartPos = this.CurPos.ContentPos;
this.Selection.StartPos2 = -1;
}
}
}
this.Selection.Use = true;
this.Selection.Start = false;
this.Selection.Use = true;
this.Selection.Start = false;
this.Selection.EndPos = this.Content.length - 1;
this.Selection.EndPos2 = -1;
this.Selection.EndPos = this.Content.length - 1;
this.Selection.EndPos2 = -1;
this.Set_ContentPos( this.Internal_GetEndPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
this.Set_ContentPos( this.Internal_GetEndPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
}
else
{
this.Selection.Use = false;
this.Set_ContentPos( this.Internal_GetEndPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
}
}
else
{
this.Selection.Use = false;
this.Set_ContentPos( this.Internal_GetEndPos(), true, -1 );
this.CurPos.ContentPos2 = -1;
if ( true === AddToSelect )
{
}
else
{
this.Selection.Use = false;
this.Selection.Start = false;
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].Cursor_MoveToEndPos();
this.Correct_ContentPos();
}
}
},
......@@ -17554,4 +17876,23 @@ CParagraphDrawStateLines.prototype =
var g_oPDSH = new CParagraphDrawStateHightlights();
var g_oPDSE = new CParagraphDrawStateElements();
var g_oPDSL = new CParagraphDrawStateLines();
\ No newline at end of file
var g_oPDSL = new CParagraphDrawStateLines();
//----------------------------------------------------------------------------------------------------------------------
// Классы для работы с курсором
//----------------------------------------------------------------------------------------------------------------------
// Общий класс для нахождения позиции курсора слева/справа/начала и конца слова и т.д.
function CParagraphSearchPos()
{
this.Pos = new CParagraphContentPos(); // Искомая позиция
this.Found = false; // Нашли или нет
this.Stage = 0; // Номера этапов для поиска начала и конца слова
this.Shift = false;
this.Punctuation = false;
this.First = true;
this.UpdatePos = false;
}
......@@ -267,7 +267,9 @@ ParaRun.prototype =
var StartPos = this.Lines[CurLine].Ranges[CurRange].StartPos;
var EndPos = this.Lines[CurLine].Ranges[CurRange].EndPos;
for ( var Pos = StartPos; Pos < EndPos; Pos++ )
var Pos = StartPos;
var _EndPos = ( true === CurrentRun ? Math.min( EndPos, this.State.ContentPos ) : EndPos );
for ( ; Pos < _EndPos; Pos++ )
{
var Item = this.Content[Pos];
......@@ -275,96 +277,51 @@ ParaRun.prototype =
//if ( ItemNum === this.Numbering.Pos )
// X += this.Numbering.WidthVisible;
if ( true === CurrentRun && Pos === this.State.ContentPos )
switch( Item.Type )
{
// Если так случилось, что у нас заданная позиция идет до позиции с нумерацией, к которой привязана нумерация,
// тогда добавляем ширину нумерации.
var _X = X;
// TODO: Подумать насчет нумерации
//if ( ItemNum < this.Numbering.Pos )
// _X += this.Numbering.WidthVisible;
if ( true === UpdateCurPos )
case para_Text:
case para_Space:
case para_Sym:
case para_PageNum:
case para_Tab:
case para_End:
case para_NewLine:
{
// Обновляем позицию курсора в параграфе
var Para = this.Paragraph;
Para.CurPos.X = _X;
Para.CurPos.Y = Y;
Para.CurPos.PagesPos = CurPage;
if ( true === UpdateTarget )
{
var CurTextPr = this.Get_CompiledPr(false);
g_oTextMeasurer.SetTextPr( CurTextPr );
g_oTextMeasurer.SetFontSlot( fontslot_ASCII, CurTextPr.Get_FontKoef() );
var Height = g_oTextMeasurer.GetHeight();
var Descender = Math.abs( g_oTextMeasurer.GetDescender() );
var Ascender = Height - Descender;
Para.DrawingDocument.SetTargetSize( Height );
if ( true === CurTextPr.Color.Auto )
{
// Выясним какая заливка у нашего текста
var Pr = Para.Get_CompiledPr();
var BgColor = undefined;
if ( undefined !== Pr.ParaPr.Shd && shd_Nil !== Pr.ParaPr.Shd.Value )
{
BgColor = Pr.ParaPr.Shd.Color;
}
else
{
// Нам надо выяснить заливку у родительского класса (возможно мы находимся в ячейке таблицы с забивкой)
BgColor = Para.Parent.Get_TextBackGroundColor();
}
X += Item.WidthVisible;
break;
}
case para_Drawing:
{
if ( drawing_Inline != Item.DrawingType )
break;
// Определим автоцвет относительно заливки
var AutoColor = ( undefined != BgColor && false === BgColor.Check_BlackAutoColor() ? new CDocumentColor( 255, 255, 255, false ) : new CDocumentColor( 0, 0, 0, false ) );
Para.DrawingDocument.SetTargetColor( AutoColor.r, AutoColor.g, AutoColor.b );
}
else
Para.DrawingDocument.SetTargetColor( CurTextPr.Color.r, CurTextPr.Color.g, CurTextPr.Color.b );
X += Item.WidthVisible;
break;
}
}
}
var TargetY = Y - Ascender - CurTextPr.Position;
switch( CurTextPr.VertAlign )
{
case vertalign_SubScript:
{
TargetY -= CurTextPr.FontSize * g_dKoef_pt_to_mm * vertalign_Koef_Sub;
break;
}
case vertalign_SuperScript:
{
TargetY -= CurTextPr.FontSize * g_dKoef_pt_to_mm * vertalign_Koef_Super;
break;
}
}
if ( true === CurrentRun && Pos === this.State.ContentPos )
{
// Если так случилось, что у нас заданная позиция идет до позиции с нумерацией, к которой привязана нумерация,
// тогда добавляем ширину нумерации.
var Page_Abs = Para.Get_StartPage_Absolute() + CurPage;
Para.DrawingDocument.UpdateTarget( X, TargetY, Page_Abs );
var _X = X;
// TODO: Подумать насчет нумерации
//if ( ItemNum < this.Numbering.Pos )
// _X += this.Numbering.WidthVisible;
// TODO: Тут делаем, чтобы курсор не выходил за границы буквицы. На самом деле, надо делать, чтобы
// курсор не выходил за границы строки, но для этого надо делать обрезку по строкам, а без нее
// такой вариант будет смотреться плохо.
if ( undefined != Para.Get_FramePr() )
{
var __Y0 = TargetY, __Y1 = TargetY + Height;
var ___Y0 = Para.Pages[CurPage].Y + Para.Lines[CurLine].Top;
var ___Y1 = Para.Pages[CurPage].Y + Para.Lines[CurLine].Bottom;
if ( true === UpdateCurPos )
{
// Обновляем позицию курсора в параграфе
var __Y0 = Math.max( __Y0, ___Y0 );
var __Y1 = Math.min( __Y1, ___Y1 );
var Para = this.Paragraph;
Para.DrawingDocument.SetTargetSize( __Y1 - __Y0 );
Para.DrawingDocument.UpdateTarget( X, __Y0, Page_Abs );
}
}
}
Para.CurPos.X = _X;
Para.CurPos.Y = Y;
Para.CurPos.PagesPos = CurPage;
if ( true === ReturnTarget )
if ( true === UpdateTarget )
{
var CurTextPr = this.Get_CompiledPr(false);
g_oTextMeasurer.SetTextPr( CurTextPr );
......@@ -373,8 +330,31 @@ ParaRun.prototype =
var Descender = Math.abs( g_oTextMeasurer.GetDescender() );
var Ascender = Height - Descender;
var TargetY = Y - Ascender - CurTextPr.Position;
Para.DrawingDocument.SetTargetSize( Height );
if ( true === CurTextPr.Color.Auto )
{
// Выясним какая заливка у нашего текста
var Pr = Para.Get_CompiledPr();
var BgColor = undefined;
if ( undefined !== Pr.ParaPr.Shd && shd_Nil !== Pr.ParaPr.Shd.Value )
{
BgColor = Pr.ParaPr.Shd.Color;
}
else
{
// Нам надо выяснить заливку у родительского класса (возможно мы находимся в ячейке таблицы с забивкой)
BgColor = Para.Parent.Get_TextBackGroundColor();
}
// Определим автоцвет относительно заливки
var AutoColor = ( undefined != BgColor && false === BgColor.Check_BlackAutoColor() ? new CDocumentColor( 255, 255, 255, false ) : new CDocumentColor( 0, 0, 0, false ) );
Para.DrawingDocument.SetTargetColor( AutoColor.r, AutoColor.g, AutoColor.b );
}
else
Para.DrawingDocument.SetTargetColor( CurTextPr.Color.r, CurTextPr.Color.g, CurTextPr.Color.b );
var TargetY = Y - Ascender - CurTextPr.Position;
switch( CurTextPr.VertAlign )
{
case vertalign_SubScript:
......@@ -389,37 +369,59 @@ ParaRun.prototype =
}
}
return { X : _X, Y : TargetY, Height : Height, Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
var Page_Abs = Para.Get_StartPage_Absolute() + CurPage;
Para.DrawingDocument.UpdateTarget( X, TargetY, Page_Abs );
// TODO: Тут делаем, чтобы курсор не выходил за границы буквицы. На самом деле, надо делать, чтобы
// курсор не выходил за границы строки, но для этого надо делать обрезку по строкам, а без нее
// такой вариант будет смотреться плохо.
if ( undefined != Para.Get_FramePr() )
{
var __Y0 = TargetY, __Y1 = TargetY + Height;
var ___Y0 = Para.Pages[CurPage].Y + Para.Lines[CurLine].Top;
var ___Y1 = Para.Pages[CurPage].Y + Para.Lines[CurLine].Bottom;
var __Y0 = Math.max( __Y0, ___Y0 );
var __Y1 = Math.min( __Y1, ___Y1 );
Para.DrawingDocument.SetTargetSize( __Y1 - __Y0 );
Para.DrawingDocument.UpdateTarget( X, __Y0, Page_Abs );
}
}
else
return { X : _X, Y : Y, PageNum : CurPage + Para.Get_StartPage_Absolute(), Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
}
switch( Item.Type )
if ( true === ReturnTarget )
{
case para_Text:
case para_Space:
case para_Sym:
case para_PageNum:
case para_Tab:
case para_End:
case para_NewLine:
{
X += Item.WidthVisible;
break;
}
case para_Drawing:
var CurTextPr = this.Get_CompiledPr(false);
g_oTextMeasurer.SetTextPr( CurTextPr );
g_oTextMeasurer.SetFontSlot( fontslot_ASCII, CurTextPr.Get_FontKoef() );
var Height = g_oTextMeasurer.GetHeight();
var Descender = Math.abs( g_oTextMeasurer.GetDescender() );
var Ascender = Height - Descender;
var TargetY = Y - Ascender - CurTextPr.Position;
switch( CurTextPr.VertAlign )
{
if ( drawing_Inline != Item.DrawingType )
case vertalign_SubScript:
{
TargetY -= CurTextPr.FontSize * g_dKoef_pt_to_mm * vertalign_Koef_Sub;
break;
X += Item.WidthVisible;
break;
}
case vertalign_SuperScript:
{
TargetY -= CurTextPr.FontSize * g_dKoef_pt_to_mm * vertalign_Koef_Super;
break;
}
}
return { X : _X, Y : TargetY, Height : Height, Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
}
else
return { X : _X, Y : Y, PageNum : CurPage + Para.Get_StartPage_Absolute(), Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
}
return X;
return { X : X };
},
// Проверяем, произошло ли простейшее изменение (набор или удаление текста)
......@@ -2324,6 +2326,304 @@ ParaRun.prototype =
PDSL.X = X;
},
//-----------------------------------------------------------------------------------
// Функции для работы с курсором
//-----------------------------------------------------------------------------------
// Находится ли курсор в начале рана
Cursor_Is_Start : function()
{
if ( this.State.ContentPos <= 0 )
return true;
return false;
},
Cursor_Is_End : function()
{
if ( this.State.ContentPos >= this.Content.length )
return true;
return false;
},
Cursor_MoveToStartPos : function()
{
this.State.ContentPos = 0;
},
Cursor_MoveToEndPos : function()
{
var CurPos = this.Content.length;
while ( CurPos > 0 )
{
if ( para_End === this.Content[CurPos - 1].Type )
CurPos--;
else
break;
}
this.State.ContentPos = CurPos;
},
Get_ParaContentPos : function(bSelection, bStart, ContentPos)
{
var Pos = ( true !== bSelection ? this.State.ContentPos : ( false !== bStart ? this.State.Selection.StartPos : this.State.Selection.EndPos ) );
ContentPos.Add( Pos );
},
Set_ParaContentPos : function(ContentPos, Depth, bSelection, bStart)
{
var Pos = ContentPos.Get(Depth);
if ( true === bSelection )
{
if ( true === bStart )
{
this.State.Selection.StartPos = Pos;
}
else
{
this.State.Selection.EndPos = Pos;
}
}
else
{
this.State.ContentPos = Pos;
}
},
Get_LeftPos : function(SearchPos, ContentPos, Depth, UseContentPos)
{
var CurPos = ( true === UseContentPos ? ContentPos.Get(Depth) : this.Content.length );
while ( true )
{
CurPos--;
var Item = this.Content[CurPos];
if ( CurPos < 0 || para_Drawing !== Item.Type || false !== Item.Is_Inline() )
break;
}
if ( CurPos >= 0 )
{
SearchPos.Found = true;
SearchPos.Pos.Update( CurPos, Depth );
}
},
Get_RightPos : function(SearchPos, ContentPos, Depth, UseContentPos)
{
var CurPos = ( true === UseContentPos ? ContentPos.Get(Depth) : 0 );
var Count = this.Content.length;
while ( true )
{
CurPos++;
// Мы встали в конец рана:
// Если мы перешагнули para_End или para_Drawing Anchor, тогда возвращаем false
// В противном случае true
if ( Count === CurPos )
{
if ( CurPos === 0 )
return;
var PrevItem = this.Content[CurPos - 1];
if ( para_End === PrevItem.Type || (para_Drawing === PrevItem.Type && false === PrevItem.Is_Inline()) )
return;
break;
}
var Item = this.Content[CurPos];
if ( CurPos > Count || (para_Drawing !== Item.Type && para_End !== Item.Type) || (para_Drawing === Item.Type && false !== Item.Is_Inline()))
break;
}
if ( CurPos <= Count )
{
SearchPos.Found = true;
SearchPos.Pos.Update( CurPos, Depth );
}
},
Get_WordStartPos : function(SearchPos, ContentPos, Depth, UseContentPos)
{
var CurPos = ( true === UseContentPos ? ContentPos.Get(Depth) - 1 : this.Content.length - 1 );
if ( CurPos < 0 )
return;
SearchPos.Shift = true;
var NeedUpdate = false;
// На первом этапе ищем позицию первого непробельного элемента
if ( 0 === SearchPos.Stage )
{
while ( true )
{
var Item = this.Content[CurPos];
var Type = Item.Type;
var bSpace = false;
if ( para_Space === Type || para_Tab === Type || ( para_Text === Type && true === Item.Is_NBSP() ) || ( para_Drawing === Type && true !== Item.Is_Inline() ) )
bSpace = true;
if ( true === bSpace )
{
CurPos--;
// Выходим из данного рана
if ( CurPos < 0 )
return;
}
else
{
// Если мы остановились на нетекстовом элементе, тогда его и возвращаем
if ( para_Text !== this.Content[CurPos].Type )
{
SearchPos.Pos.Update( CurPos, Depth );
SearchPos.Found = true;
SearchPos.UpdatePos = true;
return;
}
SearchPos.Pos.Update( CurPos, Depth );
SearchPos.Stage = 1;
SearchPos.Punctuation = this.Content[CurPos].Is_Punctuation();
NeedUpdate = true;
break;
}
}
}
else
{
CurPos = ( true === UseContentPos ? ContentPos.Get(Depth) : this.Content.length );
}
// На втором этапе мы смотрим на каком элементе мы встали: если текст - пунктуация, тогда сдвигаемся
// до конца всех знаков пунктуации
while ( CurPos > 0 )
{
CurPos--;
var Item = this.Content[CurPos]
var TempType = Item.Type;
if ( para_Text !== TempType || true === Item.Is_NBSP() || ( true === SearchPos.Punctuation && true !== Item.Is_Punctuation() ) || ( false === SearchPos.Punctuation && false !== Item.Is_Punctuation() ) )
{
SearchPos.Found = true;
break;
}
else
{
SearchPos.Pos.Update( CurPos, Depth );
NeedUpdate = true;
}
}
SearchPos.UpdatePos = NeedUpdate;
},
Get_WordEndPos : function(SearchPos, ContentPos, Depth, UseContentPos)
{
var CurPos = ( true === UseContentPos ? ContentPos.Get(Depth) : 0 );
var ContentLen = this.Content.length;
if ( CurPos >= ContentLen )
return;
var NeedUpdate = false;
if ( 0 === SearchPos.Stage )
{
// На первом этапе ищем первый нетекстовый ( и не таб ) элемент
while ( true )
{
var Item = this.Content[CurPos];
var Type = Item.Type;
var bText = false;
if ( para_Text === Type && true != Item.Is_NBSP() && ( true === SearchPos.First || ( SearchPos.Punctuation === Item.Is_Punctuation() ) ) )
bText = true;
if ( true === bText )
{
if ( true === SearchPos.First )
{
SearchPos.First = false;
SearchPos.Punctuation = Item.Is_Punctuation();
}
CurPos++;
// Отмечаем, что сдвиг уже произошел
SearchPos.Shift = true;
// Выходим из рана
if ( CurPos >= ContentLen )
return;
}
else
{
SearchPos.Stage = 1;
// Первый найденный элемент не текстовый, смещаемся вперед
if ( true === SearchPos.First )
{
// Если первый найденный элеменет - конец параграфа, тогда выходим из поиска
if ( para_End === Type )
return;
CurPos++;
// Отмечаем, что сдвиг уже произошел
SearchPos.Shift = true;
}
break;
}
}
}
if ( CurPos >= ContentLen )
return;
// На втором этапе мы смотрим на каком элементе мы встали: если это не пробел, тогда
// останавливаемся здесь. В противном случае сдвигаемся вперед, пока не попали на первый
// не пробельный элемент.
if ( !(para_Space === this.Content[CurPos].Type || ( para_Text === this.Content[CurPos].Type && true === this.Content[CurPos].Is_NBSP() ) ) )
{
SearchPos.Pos.Update( CurPos, Depth );
SearchPos.Found = true;
SearchPos.UpdatePos = true;
}
else
{
while ( CurPos < ContentLen - 1 )
{
CurPos++;
var Item = this.Content[CurPos]
var TempType = Item.Type;
if ( para_End === TempType || !( para_Space === TempType || ( para_Text === TempType && true === Item.Is_NBSP() ) ) )
{
SearchPos.Found = true;
break;
}
}
// Обновляем позицию в конце каждого рана (хуже от этого не будет)
SearchPos.Pos.Update( CurPos, Depth );
SearchPos.UpdatePos = true;
}
},
//-----------------------------------------------------------------------------------
// Функции для работы с настройками текста свойств
//-----------------------------------------------------------------------------------
Recalc_CompiledPr : function(RecalcMeasure)
......
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