Commit 20e50106 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@53520 954022d7-b5bf-4e40-9824-e11837661b57
parent 7b950521
......@@ -1089,6 +1089,27 @@ CDocument.prototype =
// Увеличиваем номер пересчета
this.RecalcId++;
if ( true === Debug_ParaRunMode )
{
// Проверяем можно ли сделать быстрый пересчет
var SimpleChanges = History.Is_SimpleChanges();
if ( 1 === SimpleChanges.length )
{
var Run = SimpleChanges[0].Class;
var Para = Run.Paragraph;
var Res = Para.Recalculate_Fast( SimpleChanges );
if ( false !== Res )
{
// Перерисуем страницу, на которой произошли изменения
this.DrawingDocument.OnRecalculatePage( 0, this.Pages[0] );
this.DrawingDocument.OnEndRecalculate( false, true );
return;
}
}
}
// Очищаем данные пересчета
this.RecalcInfo.Reset();
......@@ -1096,8 +1117,6 @@ CDocument.prototype =
// Получаем данные об произошедших изменениях
var RecalcData = ( undefined === _RecalcData ? History.Get_RecalcData() : _RecalcData );
//var SimplePara = History.Is_SimpleChanges();
//SimplePara.Recalculate_Fast();
// 1. Пересчитываем все автофигуры, которые нужно пересчитать. Изменения в них ни на что не влияют.
for ( var GraphIndex = 0; GraphIndex < RecalcData.Flow.length; GraphIndex++ )
......@@ -1646,9 +1665,6 @@ CDocument.prototype =
this.Pages[PageIndex].EndPos = Count - 1;
console.log("LastRecalc: " + ((new Date().getTime() - StartTime) / 1000) );
console.log("RangesCount: " + RunRangesCount );
console.log("RangesElementCount: " + RunRangesElementsCount );
console.log("ParaRangesCount: " + ParaRangesCount );
RunRangesCount = 0;
RunRangesElementsCount = 0;
......@@ -1706,23 +1722,21 @@ CDocument.prototype =
return;
}
if ( _PageIndex > this.FullRecalc.StartPage + 2 )
{
this.FullRecalc.Id = setTimeout( Document_Recalculate_Page, 20 );
/*
this.FullRecalc.Id = setTimeout( function()
{
var LogicDocument = editor.WordControl.m_oLogicDocument;
var FullRecalc = LogicDocument.FullRecalc;
LogicDocument.Recalculate_Page( FullRecalc.PageIndex, FullRecalc.Start, FullRecalc.StartIndex );
}, 10 );
*/
}
else
this.Recalculate_Page( _PageIndex, _bStart, _StartIndex );
// if ( _PageIndex > this.FullRecalc.StartPage + 2 )
// {
// this.FullRecalc.Id = setTimeout( Document_Recalculate_Page, 20 );
// /*
// this.FullRecalc.Id = setTimeout( function()
// {
// var LogicDocument = editor.WordControl.m_oLogicDocument;
// var FullRecalc = LogicDocument.FullRecalc;
// LogicDocument.Recalculate_Page( FullRecalc.PageIndex, FullRecalc.Start, FullRecalc.StartIndex );
// }, 10 );
// */
// }
// else
// this.Recalculate_Page( _PageIndex, _bStart, _StartIndex );
}
},
......
......@@ -51,6 +51,9 @@ var historyitem_Paragraph_PresentationPr_Level = 33; // Изменяем у
var historyitem_Paragraph_FramePr = 34; // Изменяем настройки рамки
var historyitem_Paragraph_Shd = 35; // Изменяем настройки заливки целиком
var historyitem_Run_AddItem = 1;
var historyitem_Run_RemoveItem = 2;
// Типы изменений в классе ParaTextPr
var historyitem_TextPr_Change = 1; // Изменяем настройку
var historyitem_TextPr_Bold = 2; // Изменяем жирность
......@@ -773,11 +776,11 @@ CHistory.prototype =
return null;
}
if ( Class instanceof Paragraph && Class.Is_SimpleChanges(Point.Items) )
return Class;
if ( Class instanceof ParaRun && Class.Is_SimpleChanges(Point.Items) )
return Point.Items;
}
return null;
return [];
},
Set_Additional_ExtendDocumentToPos : function()
......
......@@ -351,6 +351,8 @@ Paragraph.prototype =
// Добавляем элемент в содержимое параграфа. (Здесь передвигаются все позиции
// CurPos.ContentPos, Selection.StartPos, Selection.EndPos)
Internal_Content_Add : function (Pos, Item, bCorrectPos)
{
if ( true !== Debug_ParaRunMode )
{
if ( true === Item.Is_RealContent() )
{
......@@ -411,6 +413,12 @@ Paragraph.prototype =
// Передвинем все метки слов для проверки орфографии
this.SpellChecker.Update_OnAdd( this, Pos, Item );
}
else
{
History.Add( this, { Type : historyitem_Paragraph_AddItem, Pos : Pos, EndPos : Pos, Items : [ Item ] } );
this.Content.splice( Pos, 0, Item );
}
},
Internal_Content_Add2 : function (Pos, Item, bCorrectPos)
......@@ -713,6 +721,33 @@ Paragraph.prototype =
this.m_oContentChanges.Refresh();
},
Get_CurrentParaPos : function()
{
// Сначала определим строку и отрезок
var ParaPos = this.Content[this.CurPos.ContentPos].Get_CurrentParaPos();
var CurLine = ParaPos.Line;
// Определим страницу
var PagesCount = this.Pages.length;
for ( var CurPage = PagesCount - 1; CurPage >= 0; CurPage-- )
{
var Page = this.Pages[CurPage];
if ( CurLine >= Page.StartLine && CurLine <= Page.EndLine )
{
ParaPos.Page = CurPage;
return ParaPos;
}
}
if ( -1 !== this.CurPos.Line )
{
// TODO: разобраться с Range
ParaPos.Line = this.CurPos.Line;
}
return ParaPos;
},
Internal_Get_ParaPos_By_Pos : function(ContentPos)
{
var _ContentPos = Math.max( 0, Math.min( ContentPos, this.Content.length - 1 ) );
......@@ -3627,7 +3662,6 @@ Paragraph.prototype =
Recalculate_Range : function(ParaPr)
{
ParaRangesCount++;
var PRS = g_oPRSW;
var CurLine = PRS.Line;
......@@ -4394,6 +4428,8 @@ Paragraph.prototype =
// Пересчитываем заданную позицию элемента или текущую позицию курсора.
Internal_Recalculate_CurPos : function(Pos, UpdateCurPos, UpdateTarget, ReturnTarget)
{
if ( true !== Debug_ParaRunMode )
{
if ( this.Lines.length <= 0 )
return { X : 0, Y : 0, Height : 0, Internal : { Line : 0, Page : 0, Range : 0 } };
......@@ -4507,6 +4543,37 @@ Paragraph.prototype =
return { X : X, Y : TargetY, Height : Height, Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
else
return { X : X, Y : Y, PageNum : CurPage + this.Get_StartPage_Absolute(), Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
}
else
{
if ( this.Lines.length <= 0 )
return { X : 0, Y : 0, Height : 0, Internal : { Line : 0, Page : 0, Range : 0 } };
var LinePos = this.Get_CurrentParaPos();
var CurLine = LinePos.Line;
var CurRange = LinePos.Range;
var CurPage = LinePos.Page;
var X = this.Lines[CurLine].Ranges[CurRange].XVisible;
var Y = this.Pages[CurPage].Y + this.Lines[CurLine].Y;
var StartPos = this.Lines[CurLine].Ranges[CurRange].StartPos;
var EndPos = this.Lines[CurLine].Ranges[CurRange].EndPos;
for ( var CurPos = StartPos; CurPos <= EndPos; CurPos++ )
{
var Item = this.Content[CurPos];
var Res = Item.Recalculate_CurPos( X, Y, (CurPos === this.CurPos.ContentPos ? true : false), CurRange, CurLine, CurPage, UpdateCurPos, UpdateTarget, ReturnTarget );
if ( CurPos === this.CurPos.ContentPos )
return Res;
else
X = Res.X;
}
return { X : X, Y : Y, PageNum : CurPage + this.Get_StartPage_Absolute(), Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
}
},
Internal_UpdateCurPos : function(X, Y, CurPos, CurLine, CurPage, UpdateTarget)
......@@ -4825,9 +4892,126 @@ Paragraph.prototype =
return ClearLen;
},
Recalculate_Fast : function()
Recalculate_Fast : function(SimpleChanges)
{
var Run = SimpleChanges[0].Class;
var StartLine = Run.StartLine;
var StartRange = Run.StartRange;
var StartPos = this.Lines[StartLine].Ranges[StartRange].StartPos;
var EndPos = this.Lines[StartLine].Ranges[StartRange].EndPos;
var RunPos = -1;
for ( RunPos = StartPos; RunPos <= EndPos; RunPos++ )
{
// TODO: переделать данную проверку, т.к. Run может быть вложенным
if ( this.Content[RunPos] === Run )
break;
}
// Не нашли нужный Run
if ( RunPos > EndPos )
return false;
var ParaPos = Run.Get_SimpleChanges_ParaPos(SimpleChanges);
var PRS = g_oPRSW;
var XStart, YStart, XLimit, YLimit;
if ( 0 === CurPage )//|| ( undefined != this.Get_FramePr() && this.Parent instanceof CDocument ) )
{
XStart = this.X;
YStart = this.Y;
XLimit = this.XLimit;
YLimit = this.YLimit;
}
else
{
var PageStart = this.Parent.Get_PageContentStartPos( this.PageNum + CurPage );
XStart = PageStart.X;
YStart = PageStart.Y;
XLimit = PageStart.XLimit;
YLimit = PageStart.YLimit;
}
PRS.XStart = XStart;
PRS.YStart = YStart;
PRS.XLimit = XLimit;
PRS.YLimit = YLimit;
// Обнуляем параметры PRS для строки и отрезка
PRS.Reset_Line();
PRS.Page = 0;
PRS.Line = ParaPos.Line;
PRS.Range = ParaPos.Range;
PRS.Paragraph = Run.Paragraph;
var CurLine = PRS.Line;
var CurRange = PRS.Range;
var CurPage = PRS.Page;
var RangesCount = PRS.RangesCount;
var Line = this.Lines[CurLine];
var Range = Line.Ranges[CurRange];
var StartPos = Range.StartPos;
var EndPos = Range.EndPos;
// Обновляем состояние пересчета
PRS.Reset_Range(Range.X, Range.XEnd);
var ContentLen = this.Content.length;
var ParaPr = this.Get_CompiledPr2( false).ParaPr;
for ( var Pos = StartPos; Pos <= EndPos; Pos++ )
{
var Item = this.Content[Pos];
// TODO: разобраться с нумерацией
PRS.Update_CurPos( Pos, 0 );
var SL = Item.Save_Lines();
var SavedLines = SL.Lines;
Item.Recalculate_Range( ParaPr );
if ( ( true === PRS.NewRange && Pos !== EndPos ) || ( Pos === EndPos && true !== PRS.NewRange ) )
return false;
// Нам нужно проверить только строку с номером CurLine
if ( false === SavedLines[CurLine - Item.StartLine].Compare( Item.Lines[CurLine - Item.StartLine] ) )
return false;
Item.Restore_Lines( SL );
}
// Recalculate_Lines_Width
var PRSC = g_oPRSC;
var StartPos = Range.StartPos;
var EndPos = Range.EndPos;
Range.Reset_Width();
PRSC.Reset( this, Range );
for ( var Pos = StartPos; Pos <= EndPos; Pos++ )
{
var Item = this.Content[Pos];
Item.Recalculate_Range_Width( PRSC, CurLine, CurRange );
}
//------------------------------------------------
var RecalcResultAlign = this.Recalculate_Lines_Align(PRS, CurPage, ParaPr);
if ( recalcresult_NextElement !== RecalcResultAlign )
return false;
return true;
},
Start_FromNewPage : function()
......@@ -4956,12 +5140,19 @@ Paragraph.prototype =
},
RecalculateCurPos : function()
{
if ( true !== Debug_ParaRunMode )
{
var Pos = this.CurPos.ContentPos2;
if ( undefined !== this.Content[Pos] && para_Math === this.Content[Pos].Type )
return this.Content[Pos].RecalculateCurPos();
this.Internal_Recalculate_CurPos( this.CurPos.ContentPos, true, true, false );
}
else
{
this.Internal_Recalculate_CurPos( this.CurPos.ContentPos, true, true, false );
}
},
Recalculate_MinMaxContentWidth : function()
......@@ -7426,6 +7617,8 @@ Paragraph.prototype =
// Добавляем новый элемент к содержимому параграфа (на текущую позицию)
Add : function(Item)
{
if ( true !== Debug_ParaRunMode )
{
var CurPos = this.CurPos.ContentPos;
var CurPos2 = this.CurPos.ContentPos2;
......@@ -7483,6 +7676,44 @@ Paragraph.prototype =
this.DeleteCollaborativeMarks = true;
this.RecalcInfo.Set_Type_0(pararecalc_0_All);
}
else
{
// Выставляем родительский класс
Item.Parent = this;
switch (Item.Type)
{
case para_Text:
case para_Space:
case para_PageNum:
case para_Tab:
case para_Drawing:
{
// Элементы данного типа добавляем во внутренний элемент
this.Content[this.CurPos.ContentPos].Add( Item );
break;
}
case para_TextPr:
{
// TODO: Сделать добавление TextPr
break;
}
case para_HyperlinkStart:
{
// TODO: Сделать добавление гиперссылок
break;
}
case para_Math:
{
// TODO: Сделать добавление формул
break;
}
}
}
},
// Данная функция вызывается, когда уже точно известно, что у нас либо выделение начинается с начала параграфа, либо мы стоим курсором в начале параграфа
......@@ -16306,6 +16537,16 @@ CParaLineRange.prototype =
this.X += Dx;
this.XEnd += Dx;
this.XVisible += Dx;
},
Reset_Width : function()
{
this.W = 0;
this.Words = 0;
this.Spaces = 0;
this.Letters = 0;
this.SpacesSkip = 0;
this.LettersSkip = 0;
}
};
......
......@@ -4,16 +4,13 @@
* Time: 18:28
*/
var RunRangesCount = 0;
var RunRangesElementsCount = 0;
var ParaRangesCount = 0;
function ParaRun(Document,Parent)
{
this.Id = g_oIdCounter.Get_NewId(); // Id данного элемента
this.Type = para_Run; // тип данного элемента
this.Document = Document; // Ссылка на верхний класс документа
this.Parent = Parent; // Ссылка на родительский класс
this.Paragraph = Parent; // Ссылка на параграф
this.Pr = new CTextPr(); // Текстовые настройки данного run
this.Content = new Array(); // Содержимое данного run
this.State = new CParaRunState(); // Положение курсора и селекта в данного run
......@@ -39,6 +36,7 @@ function ParaRun(Document,Parent)
this.Range = this.Lines[0].Ranges[0];
this.StartLine = 0; // Строка, с которой начинается данный ран
this.StartRange = 0;
this.CollaborativeMarks = new Array(); // Массив CParaRunCollaborativeMark
......@@ -77,6 +75,390 @@ ParaRun.prototype =
return this.Parent;
},
//-----------------------------------------------------------------------------------
// Функции для работы с содержимым данного рана
//-----------------------------------------------------------------------------------
// Добавляем элемент в текущую позицию
Add : function(Item)
{
this.Add_ToContent( this.State.ContentPos, Item, true );
},
// Добавляем элемент в позицию с сохранием в историю
Add_ToContent : function(Pos, Item, UpdatePosition)
{
History.Add( this, { Type : historyitem_Run_AddItem, Pos : Pos, EndPos : Pos, Items : [ Item ] } );
this.Content.splice( Pos, 0, Item );
if ( true === UpdatePosition )
{
// Обновляем текущую позицию
if ( this.State.ContentPos >= Pos )
this.State.ContentPos++;
// Обновляем начало и конец селекта
if ( true === this.State.Selection.Use )
{
if ( this.State.Selection.StartPos >= Pos )
this.State.Selection.StartPos++;
if ( this.State.Selection.EndPos >= Pos )
this.State.Selection.EndPos++;
}
// Также передвинем всем метки переносов страниц и строк
var LinesCount = this.Lines.length;
for ( var CurLine = 0; CurLine < LinesCount; CurLine++ )
{
var RangesCount = this.Lines[CurLine].RangesLength;
for ( var CurRange = 0; CurRange < RangesCount; CurRange++ )
{
var Range = this.Lines[CurLine].Ranges[CurRange];
if ( Range.StartPos > Pos )
Range.StartPos++;
if ( Range.EndPos > Pos )
Range.EndPos++;
}
}
// TODO: Поиск, NearPos, SpellCheck
// for ( var CurSearch in this.SearchResults )
// {
// if ( this.SearchResults[CurSearch].StartPos >= Pos )
// this.SearchResults[CurSearch].StartPos++;
//
// if ( this.SearchResults[CurSearch].EndPos >= Pos )
// this.SearchResults[CurSearch].EndPos++;
// }
//
// for ( var Id in this.NearPosArray )
// {
// var NearPos = this.NearPosArray[Id];
// if ( NearPos.ContentPos >= Pos )
// NearPos.ContentPos++;
// }
//
// this.SpellChecker.Update_OnAdd( this, Pos, Item );
}
// Отмечаем, что надо перемерить элементы в данном ране
this.RecalcInfo.Measure = true;
},
Remove_FromContent : function(Pos, Count, UpdatePosition)
{
// Получим массив удаляемых элементов
var DeletedItems = this.Content.slice( Pos, Pos + Count );
History.Add( this, { Type : historyitem_Paragraph_RemoveItem, Pos : Pos, EndPos : Pos + Count - 1, Items : DeletedItems } );
this.Content.splice( Pos, Count );
if ( true === UpdatePosition )
{
// Обновим текущую позицию
if ( this.State.ContentPos > Pos + Count )
this.State.ContentPos -= Count;
else if ( this.State.ContentPos > Pos )
this.State.ContentPos = Pos;
// Обновим начало и конец селекта
if ( true === this.Selection.Use )
{
if ( this.State.Selection.StartPos <= this.State.Selection.EndPos )
{
if ( this.State.Selection.StartPos > Pos + Count )
this.State.Selection.StartPos -= Count;
else if ( this.State.Selection.StartPos > Pos )
this.State.Selection.StartPos = Pos;
if ( this.State.Selection.EndPos >= Pos + Count )
this.State.Selection.EndPos -= Count;
else if ( this.State.Selection.EndPos > Pos )
this.State.Selection.EndPos = Math.max( 0, Pos - 1 );
}
else
{
if ( this.State.Selection.StartPos >= Pos + Count )
this.State.Selection.StartPos -= Count;
else if ( this.State.Selection.StartPos > Pos )
this.State.Selection.StartPos = Math.max( 0, Pos - 1 );
if ( this.State.Selection.EndPos > Pos + Count )
this.State.Selection.EndPos -= Count;
else if ( this.State.Selection.EndPos > Pos )
this.State.Selection.EndPos = Pos;
}
}
// Также передвинем всем метки переносов страниц и строк
var LinesCount = this.Lines.length;
for ( var CurLine = 0; CurLine < LinesCount; CurLine++ )
{
var RangesCount = this.Lines[CurLine].RangesLength;
for ( var CurRange = 0; CurRange < RangesCount; CurRange++ )
{
var Range = this.Lines[CurLine].Ranges[CurRange];
if ( Range.StartPos > Pos + Count )
Range.StartPos -= Count;
else if ( Range.StartPos > Pos )
Range.StartPos = Math.max( 0 , Pos );
if ( Range.EndPos >= Pos + Count )
Range.EndPos -= Count;
else if ( Range.EndPos >= Pos )
Range.EndPos = Math.max( 0 , Pos );
}
}
// TODO: Поиск, NearPos, Spelling
// for ( var Id in this.NearPosArray )
// {
// var NearPos = this.NearPosArray[Id];
//
// if ( NearPos.ContentPos > Pos + Count )
// NearPos.ContentPos -= Count;
// else if ( NearPos.ContentPos > Pos )
// NearPos.ContentPos = Math.max( 0 , Pos );
// }
//
// // Передвинем все метки слов для проверки орфографии
// this.SpellChecker.Update_OnRemove( this, Pos, Count );
}
// Отмечаем, что надо перемерить элементы в данном ране
this.RecalcInfo.Measure = true;
},
// Определим строку и отрезок текущей позиции
Get_CurrentParaPos : function()
{
var Pos = this.State.ContentPos;
var CurLine = 0;
var CurRange = 0;
var LinesCount = this.LinesLength;
for ( ; CurLine < LinesCount; CurLine++ )
{
var RangesCount = this.Lines[CurLine].RangesLength;
for ( CurRange = 0; CurRange < RangesCount; CurRange++ )
{
var Range = this.Lines[CurLine].Ranges[CurRange];
if ( Pos < Range.EndPos && Pos >= Range.StartPos )
return new CParaPos( ( CurLine === 0 ? CurRange + this.StartRange : CurRange ), CurLine + this.StartLine, 0, 0 );
}
}
return new CParaPos( ( LinesCount === 1 ? this.Lines[0].RangesLength - 1 + this.StartRange : this.Lines[0].RangesLength - 1 ), LinesCount - 1 + this.StartLine, 0, 0 );
},
Recalculate_CurPos : function(X, Y, CurrentRun, _CurRange, _CurLine, CurPage, UpdateCurPos, UpdateTarget, ReturnTarget)
{
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
var StartPos = this.Lines[CurLine].Ranges[CurRange].StartPos;
var EndPos = this.Lines[CurLine].Ranges[CurRange].EndPos;
for ( var Pos = StartPos; Pos < EndPos; Pos++ )
{
var Item = this.Content[Pos];
// TODO: Подумать насчет нумерации
//if ( ItemNum === this.Numbering.Pos )
// X += this.Numbering.WidthVisible;
if ( true === CurrentRun && Pos === this.State.ContentPos )
{
// Если так случилось, что у нас заданная позиция идет до позиции с нумерацией, к которой привязана нумерация,
// тогда добавляем ширину нумерации.
var _X = X;
// TODO: Подумать насчет нумерации
//if ( ItemNum < this.Numbering.Pos )
// _X += this.Numbering.WidthVisible;
if ( true === UpdateCurPos )
{
// Обновляем позицию курсора в параграфе
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();
}
// Определим автоцвет относительно заливки
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:
{
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;
}
}
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 );
}
}
}
if ( true === ReturnTarget )
{
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 )
{
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;
}
}
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 } };
}
switch( Item.Type )
{
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:
{
if ( drawing_Inline != Item.DrawingType )
break;
X += Item.WidthVisible;
break;
}
}
}
return X;
},
// Проверяем, произошло ли простейшее изменение (набор или удаление текста)
Is_SimpleChanges : function(Changes)
{
if ( Changes.length !== 1 )
return false;
var Type = Changes[0].Data.Type;
if ( historyitem_Run_AddItem === Type || historyitem_Run_RemoveItem === Type )
return true;
return false;
},
// Возвращаем строку и отрезок, в котором произошли простейшие изменения
Get_SimpleChanges_ParaPos : function(Changes)
{
var Change = Changes[0].Data;
var Pos = ( Changes[0].Data.Type === historyitem_Run_AddItem ? Change.Pos : Change.StartPos );
var CurLine = 0;
var CurRange = 0;
var LinesCount = this.LinesLength;
for ( ; CurLine < LinesCount; CurLine++ )
{
var RangesCount = this.Lines[CurLine].RangesLength;
for ( CurRange = 0; CurRange < RangesCount; CurRange++ )
{
var Range = this.Lines[CurLine].Ranges[CurRange];
if ( Pos < Range.EndPos && Pos >= Range.StartPos )
return new CParaPos( ( CurLine === 0 ? CurRange + this.StartRange : CurRange ), CurLine + this.StartLine, 0, 0 );
}
}
return new CParaPos( this.StartRange, this.StartLine, 0, 0 );
},
//-----------------------------------------------------------------------------------
// Функции пересчета
//-----------------------------------------------------------------------------------
......@@ -141,7 +523,6 @@ ParaRun.prototype =
Recalculate_Range : function( ParaPr)
{
RunRangesCount++;
// Сначала измеряем элементы (можно вызывать каждый раз, внутри разруливается, чтобы измерялось 1 раз)
this.Recalculate_MeasureContent();
......@@ -220,7 +601,6 @@ ParaRun.prototype =
var ContentLen = this.Content.length;
for ( ; Pos < ContentLen; Pos++ )
{
RunRangesElementsCount++;
if ( false === StartWord && true === FirstItemOnLine && Math.abs( XEnd - X ) < 0.001 && RangesCount > 0 )
{
NewRange = true;
......@@ -733,6 +1113,7 @@ ParaRun.prototype =
{
this.Range.StartPos = RangeStartPos;
this.Range.EndPos = RangeEndPos;
this.Lines[0].RangesLength = 1;
}
else
this.Lines[CurLine].Add_Range( PRS.Range, RangeStartPos, RangeEndPos );
......@@ -1337,6 +1718,30 @@ ParaRun.prototype =
PRS.X += TabCalcW;
}
},
Refresh_RecalcData : function(Data)
{
this.Parent.Refresh_RecalcData2(0);
},
Save_Lines : function()
{
var Lines = new Array();
for ( var CurLine = 0; CurLine < this.LinesLength; CurLine++ )
{
Lines.push( this.Lines[CurLine].Copy() );
}
return { Lines : Lines, LinesLength : this.LinesLength } ;
},
Restore_Lines : function(SL)
{
this.Lines = SL.Lines;
this.LinesLength = SL.LinesLength;
this.Range = this.Lines[0].Ranges[0];
},
//-----------------------------------------------------------------------------------
// Функции отрисовки
//-----------------------------------------------------------------------------------
......@@ -2444,6 +2849,19 @@ ParaRun.prototype =
switch ( Type )
{
}
},
//-----------------------------------------------------------------------------------
// Функции для совместного редактирования
//-----------------------------------------------------------------------------------
Save_Changes : function(Data, Writer)
{
},
Load_Changes : function(Reader)
{
}
};
......@@ -2490,15 +2908,46 @@ CParaRunLine.prototype =
{
this.Ranges[RangeIndex] = new CParaRunRange( StartPos, EndPos );
this.RangesLength = RangeIndex + 1;
//this.Ranges.length = RangeIndex + 1;
}
else
{
this.Ranges[0].StartPos = StartPos;
this.Ranges[0].EndPos = EndPos;
//this.RangesLength = 1;
this.Ranges.length = 1;
this.RangesLength = 1;
}
},
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)
{
if ( this.RangesLength !== OtherLine.RangesLength )
return false;
for ( var CurRange = 0; CurRange < this.RangesLength; CurRange++ )
{
var OtherRange = OtherLine.Ranges[CurRange];
var ThisRange = this.Ranges[CurRange];
if ( OtherRange.StartPos !== ThisRange.StartPos || OtherRange.EndPos !== ThisRange.EndPos )
return false;
}
return true;
}
......
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