Commit 60872e69 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@53998 954022d7-b5bf-4e40-9824-e11837661b57
parent 1de29d0e
......@@ -386,7 +386,7 @@ CHistory.prototype =
var Item = Point.Items[Index];
if ( Class !== Item.Class )
return null;
return [];
}
if ( Class instanceof ParaRun && Class.Is_SimpleChanges(Point.Items) )
......
......@@ -3706,27 +3706,18 @@ Paragraph.prototype =
this.Lines[CurLine].Set_RangeStartPos( CurRange, StartPos );
if ( 0 === CurLine && true === PRS.EmptyLine )
if ( 0 !== CurRange && 0 === CurLine && true === PRS.EmptyLine )
{
if ( ParaPr.Ind.FirstLine < 0 )
{
Range.X += ParaPr.Ind.Left + ParaPr.Ind.FirstLine;
}
else
{
Range.X += ParaPr.Ind.FirstLine;
Range.FirstRange = true;
}
// TODO: Проверить корректность данного условия
if ( true === Range.FirstRange && 0 !== CurRange )
{
if ( ParaPr.Ind.FirstLine < 0 )
Range.X1 += ParaPr.Ind.Left + ParaPr.Ind.FirstLine;
else
Range.X1 += ParaPr.Ind.FirstLine;
}
}
var X = Range.X;
var XEnd = ( CurRange == RangesCount ? PRS.XLimit : PRS.Ranges[CurRange].X0 );
......@@ -3742,13 +3733,7 @@ Paragraph.prototype =
if ( ( 0 === Pos && 0 === CurLine ) || Pos !== StartPos )
{
Item.Recalculate_Reset( CurLine );
// TODO: пересмотреть работу с нумерацией
if ( 0 === Pos && 0 === CurLine )
Item.NeedAddNumbering = true;
else if ( Pos > 1 )
Item.NeedAddNumbering = this.Content[Pos - 1].NeedAddNumbering;
Item.Recalculate_Reset( CurLine, ( 0 === Pos && 0 === CurLine ? null : this.Content[Pos - 1].Get_RecalcInfo() ) );
}
PRS.Update_CurPos( Pos, 0 );
......@@ -3833,25 +3818,6 @@ Paragraph.prototype =
// 1. Обновляем метрики данной строки
//-------------------------------------------------------------------------------------------------------------
// TODO: Данная часть была перенесена, необходимо проверить ее корректность
if ( linerule_Exact === ParaPr.Spacing.LineRule )
{
// Смещение не учитывается в метриках строки, когда расстояние между строк точное
if ( PRS.LineAscent < this.TextAscent )
PRS.LineAscent = this.TextAscent;
if ( PRS.LineDescent < this.TextDescent )
PRS.LineDescent = this.TextDescent;
}
else
{
if ( PRS.LineAscent < this.TextAscent + this.YOffset )
PRS.LineAscent = this.TextAscent + this.YOffset;
if ( PRS.LineDescent < this.TextDescent - this.YOffset )
PRS.LineDescent = this.TextDescent - this.YOffset;
}
// Строка пустая, у нее надо выставить ненулевую высоту. Делаем как Word, выставляем высоту по размеру
// текста, на котором закончилась данная строка.
if ( true === PRS.EmptyLine || PRS.LineAscent < 0.001 )
......@@ -4756,7 +4722,7 @@ Paragraph.prototype =
if ( true === bCheckLeft && TabPos > PageStart.X + ParaPr.Ind.Left )
{
TabsPos.push( PageStart.X + ParaPr.Ind.Left );
TabsPos.push( new CParaTab(tab_Left, ParaPr.Ind.Left) );
bCheckLeft = false;
}
......@@ -4765,7 +4731,7 @@ Paragraph.prototype =
}
if ( true === bCheckLeft )
TabsPos.push( PageStart.X + ParaPr.Ind.Left );
TabsPos.push( new CParaTab(tab_Left, ParaPr.Ind.Left) );
TabsCount = TabsPos.length;
......@@ -4781,7 +4747,7 @@ Paragraph.prototype =
}
}
var NewX = null;
var NewX = 0;
// Если табов нет, либо их позиции левее текущей позиции ставим таб по умолчанию
if ( null === Tab )
......@@ -4797,16 +4763,7 @@ Paragraph.prototype =
}
else
{
// Если таб левый, тогда мы сразу смещаемся к нему
if ( tab_Left === Tab.Value )
{
NewX = Tab.Pos + PageStart.X;
}
else
{
// Ставим отрицательно значение, чтобы дать понять, что данный таб не левый
NewX = -(Tab.Pos + PageStart.X)
}
NewX = Tab.Pos + PageStart.X;
}
return { NewX : NewX, TabValue : ( null === Tab ? tab_Left : Tab.Value ) };
......@@ -7783,6 +7740,7 @@ Paragraph.prototype =
case para_PageNum:
case para_Tab:
case para_Drawing:
case para_NewLine:
{
// Элементы данного типа добавляем во внутренний элемент
this.Content[this.CurPos.ContentPos].Add( Item );
......@@ -8458,11 +8416,6 @@ Paragraph.prototype =
else
SearchPos.InText = false;
if ( SearchPos.NumberingDiffX <= SearchPos.DiffX )
SearchPos.Numbering = true;
else
SearchPos.Numbering = false;
SearchPos.Line = CurLine;
return SearchPos;
......@@ -10235,7 +10188,7 @@ Paragraph.prototype =
}
else
{
// TODO: Надо перейти в предыдущий элемент документа
// Надо перейти в предыдущий элемент документа
return false;
}
......@@ -10261,7 +10214,7 @@ Paragraph.prototype =
else
{
this.Selection.Use = false;
// TODO: Надо перейти в предыдущий элемент документа
// Надо перейти в предыдущий элемент документа
return false;
}
}
......@@ -10539,7 +10492,7 @@ Paragraph.prototype =
}
else
{
// TODO: Надо перейти в предыдущий элемент документа
// Надо перейти в предыдущий элемент документа
return false;
}
}
......@@ -10564,7 +10517,7 @@ Paragraph.prototype =
else
{
this.Selection.Use = false;
// TODO: Надо перейти в предыдущий элемент документа
// Надо перейти в предыдущий элемент документа
return false;
}
}
......@@ -10615,7 +10568,7 @@ Paragraph.prototype =
}
else
{
// TODO: Надо перейти в следующий элемент документа
// Надо перейти в следующий элемент документа
return false;
}
......@@ -11869,12 +11822,11 @@ Paragraph.prototype =
var NumPr = this.Numbering_Get();
if ( true === SearchPosXY.Numbering && undefined != NumPr )
{
// TODO: Разобраться с нумерацией
// Передвигаем курсор в начало параграфа
this.Set_ParaContentPos(this.Get_StartPos(), -1, true);
// Ставим именно 0, а не this.Internal_GetStartPos(), чтобы при нажатии на клавишу "направо"
// мы оказывались в начале параграфа.
//this.Set_ContentPos( 0, true, -1 );
//this.Parent.Document_SelectNumbering( NumPr );
// Производим выделение нумерации
this.Parent.Document_SelectNumbering( NumPr );
}
else
{
......@@ -12253,42 +12205,47 @@ Paragraph.prototype =
}
case selectionflag_Numbering:
{
// TODO: Реализовать нумерацию
var ParaNum = this.Numbering;
var NumberingRun = ParaNum.Run;
// var ParaNum = this.Numbering;
// var NumberingPos = this.Numbering.Pos;
// if ( -1 === NumberingPos )
// break;
//
// var ParaNumPos = this.Internal_Get_ParaPos_By_Pos(NumberingPos);
// if ( ParaNumPos.Page != CurPage )
// break;
//
// var CurRange = ParaNumPos.Range;
// var CurLine = ParaNumPos.Line;
//
// var NumPr = this.Numbering_Get();
// var SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible;
// var SelectW = ParaNum.WidthVisible;
// var NumJc = this.Parent.Get_Numbering().Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl].Jc;
// switch ( NumJc )
// {
// case align_Center:
// SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible - ParaNum.WidthNum / 2;
// SelectW = ParaNum.WidthVisible + ParaNum.WidthNum / 2;
// break;
// case align_Right:
// SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible - ParaNum.WidthNum;
// SelectW = ParaNum.WidthVisible + ParaNum.WidthNum;
// break;
// case align_Left:
// default:
// SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible;
// SelectW = ParaNum.WidthVisible;
// break;
// }
//
// this.DrawingDocument.AddPageSelection(Page_abs, SelectX, this.Lines[CurLine].Top + this.Pages[CurPage].Y, SelectW, this.Lines[CurLine].Bottom - this.Lines[CurLine].Top);
if ( null === NumberingRun )
break;
var CurLine = ParaNum.Line;
var CurRange = ParaNum.Range;
var SelectY = this.Lines[CurLine].Top + this.Pages[CurPage].Y;
var SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible;
var SelectW = ParaNum.WidthVisible;
var SelectH = this.Lines[CurLine].Bottom - this.Lines[CurLine].Top;
var NumPr = this.Numbering_Get();
var NumJc = this.Parent.Get_Numbering().Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl].Jc;
switch ( NumJc )
{
case align_Center:
{
SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible - ParaNum.WidthNum / 2;
SelectW = ParaNum.WidthVisible + ParaNum.WidthNum / 2;
break;
}
case align_Right:
{
SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible - ParaNum.WidthNum;
SelectW = ParaNum.WidthVisible + ParaNum.WidthNum;
break;
}
case align_Left:
default:
{
SelectX = this.Lines[CurLine].Ranges[CurRange].XVisible;
SelectW = ParaNum.WidthVisible;
break;
}
}
this.DrawingDocument.AddPageSelection( Page_abs, SelectX, SelectY, SelectW, SelectH );
break;
}
......@@ -18124,10 +18081,10 @@ CParaLineMetrics.prototype =
this.Descent = Descent;
if ( this.Ascent < this.TextAscent )
this.TextAscent = this.Ascent;
this.Ascent = this.TextAscent;
if ( this.Descent < this.TextDescent )
this.TextDescent = this.Descent;
this.Descent = this.TextDescent;
this.LineGap = this.Recalculate_LineGap( ParaPr, this.TextAscent, this.TextDescent );
},
......
......@@ -2662,8 +2662,12 @@ ParaEmpty.prototype =
function ParaNumbering()
{
this.Type = para_Numbering;
this.Item = undefined;
this.Pos = new CParagraphContentPos();
this.Item = null; // Элемент в ране, к которому привязана нумерация
this.Run = null; // Ран, к которому привязана нумерация
this.Line = 0;
this.Range = 0;
this.Internal =
{
......
......@@ -16,7 +16,6 @@ function ParaRun(Document,Parent)
this.State = new CParaRunState(); // Положение курсора и селекта в данного run
this.CompiledPr = new CTextPr(); // Скомпилированные настройки
this.RecalcInfo = new CParaRunRecalcInfo(); // Флаги для пересчета (там же флаг пересчета стиля)
this.TextRun = false;
this.TextAscent = 0; // текстовый ascent + linegap
this.TextDescent = 0; // текстовый descent
......@@ -319,6 +318,7 @@ ParaRun.prototype =
Recalculate_CurPos : function(X, Y, CurrentRun, _CurRange, _CurLine, CurPage, UpdateCurPos, UpdateTarget, ReturnTarget)
{
var Para = this.Paragraph;
var NumberingItem = Para.Numbering.Item;
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
......@@ -332,9 +332,8 @@ ParaRun.prototype =
{
var Item = this.Content[Pos];
// TODO: Подумать насчет нумерации
//if ( ItemNum === this.Numbering.Pos )
// X += this.Numbering.WidthVisible;
if ( true === this.RecalcInfo.NumberingUse && Item === NumberingItem )
X += Para.Numbering.WidthVisible;
switch( Item.Type )
{
......@@ -360,21 +359,17 @@ ParaRun.prototype =
}
}
// Если следующий элемент именно тот, к которому привязана нумерация, тогда добавляем сдвиг нумерации
if ( true === this.RecalcInfo.NumberingUse && _EndPos < this.Content.length && this.Content[_EndPos] === NumberingItem )
X += Para.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 )
{
// Обновляем позицию курсора в параграфе
Para.CurPos.X = _X;
Para.CurPos.X = X;
Para.CurPos.Y = Y;
Para.CurPos.PagesPos = CurPage;
......@@ -472,10 +467,10 @@ ParaRun.prototype =
}
}
return { X : _X, Y : TargetY, Height : Height, Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
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 : X, Y : Y, PageNum : CurPage + Para.Get_StartPage_Absolute(), Internal : { Line : CurLine, Page : CurPage, Range : CurRange } };
}
return { X : X };
......@@ -522,10 +517,20 @@ ParaRun.prototype =
//-----------------------------------------------------------------------------------
// Выставляем начальную строку и обнуляем массив строк
Recalculate_Reset : function(StartLine)
Recalculate_Reset : function(StartLine, RecalcInfo)
{
this.StartLine = StartLine;
this.LinesLength = 0;
if ( null === RecalcInfo )
this.RecalcInfo.NumberingAdd = true;
else
{
this.RecalcInfo.NumberingAdd = RecalcInfo.NumberingAdd;
}
this.RecalcInfo.NumberingUse = false;
this.RecalcInfo.NumberingItem = null;
},
// Пересчитываем размеры всех элементов
......@@ -538,9 +543,6 @@ ParaRun.prototype =
g_oTextMeasurer.SetTextPr( Pr );
g_oTextMeasurer.SetFontSlot( fontslot_ASCII );
var bText = false;
var bNoText = false;
// Запрашиваем текущие метрики шрифта, под TextAscent мы будем понимать ascent + linegap(которые записаны в шрифте)
this.TextHeight = g_oTextMeasurer.GetHeight();
this.TextDescent = Math.abs( g_oTextMeasurer.GetDescender() );
......@@ -554,11 +556,6 @@ ParaRun.prototype =
{
var Item = this.Content[Pos];
if ( ( para_Text === Item.Type && true !== Item.SpaceAfter ) || para_Sym === Item.Type )
bText = true;
else
bNoText = true;
if ( para_Drawing === Item.Type )
{
Item.Parent = this;
......@@ -569,13 +566,6 @@ ParaRun.prototype =
Item.Measure( g_oTextMeasurer, Pr );
}
if ( true === bText && true !== bNoText )
this.TextRun = true;
else
this.TextRun = false;
this.TextRun = false;
this.RecalcInfo.Recalc = true;
this.RecalcInfo.Measure = false;
},
......@@ -671,10 +661,12 @@ ParaRun.prototype =
var ItemType = Item.Type;
// Проверяем, не нужно ли добавить нумерацию к данному элементу
if ( true === this.NeedAddNumbering && true === Item.Can_AddNumbering() )
if ( true === this.RecalcInfo.NumberingAdd && true === Item.Can_AddNumbering() )
{
this.Internal_Recalculate_Numbering( Item, PRS, ParaPr );
PRS.Set_NumberingPos( Pos, Item );
var TempRes = this.Internal_Recalculate_Numbering( Item, PRS.Paragraph, ParaPr, X, PRS.LineAscent, PRS.Page, PRS.Line, PRS.Range );
X = TempRes.X;
PRS.LineAscent = TempRes.LineAscent;
}
switch( Item.Type )
......@@ -1005,14 +997,15 @@ ParaRun.prototype =
WordLen = 0;
var TabPos = Para.Internal_GetTabPos(X, ParaPr, PRS.CurPage);
var NewX = TabPos.NewX;
var NewX = TabPos.NewX;
var TabValue = TabPos.TabValue;
// Если таб не левый (NewX < 0), значит он не может быть сразу рассчитан, а если левый, тогда
// Если таб не левый, значит он не может быть сразу рассчитан, а если левый, тогда
// рассчитываем его сразу здесь
if ( NewX < 0 )
if ( tab_Left !== TabValue )
{
PRS.LastTab.TabPos = -NewX;
PRS.LastTab.Value = TabPos.TabValue;
PRS.LastTab.TabPos = NewX;
PRS.LastTab.Value = TabValue;
PRS.LastTab.X = X;
PRS.LastTab.Item = Item;
......@@ -1140,6 +1133,24 @@ ParaRun.prototype =
if ( PRS.LineTextDescent < this.TextDescent )
PRS.LineTextDescent = this.TextDescent;
if ( linerule_Exact === ParaPr.Spacing.LineRule )
{
// Смещение не учитывается в метриках строки, когда расстояние между строк точное
if ( PRS.LineAscent < this.TextAscent )
PRS.LineAscent = this.TextAscent;
if ( PRS.LineDescent < this.TextDescent )
PRS.LineDescent = this.TextDescent;
}
else
{
if ( PRS.LineAscent < this.TextAscent + this.YOffset )
PRS.LineAscent = this.TextAscent + this.YOffset;
if ( PRS.LineDescent < this.TextDescent - this.YOffset )
PRS.LineDescent = this.TextDescent - this.YOffset;
}
}
PRS.MoveToLBP = MoveToLBP;
......@@ -1203,7 +1214,7 @@ ParaRun.prototype =
{
var Item = this.Content[Pos];
if ( Item === NumberingItem )
if ( true === this.RecalcInfo.NumberingUse && Item === NumberingItem )
PRSC.Range.W += PRSC.Paragraph.Numbering.WidthVisible;
switch( Item.Type )
......@@ -1316,8 +1327,6 @@ ParaRun.prototype =
{
if ( true === PRSC.Word && PRSC.Range.Words > 1 )
PRSC.Range.Spaces += PRSC.SpacesCount;
else
PRSC.Range.SpacesSkip += PRSC.SpacesCount;
PRSC.SpacesCount = 0;
PRSC.Word = false;
......@@ -1348,7 +1357,7 @@ ParaRun.prototype =
{
var Item = this.Content[Pos];
if ( Item === NumberingItem )
if ( true === this.RecalcInfo.NumberingUse && Item === NumberingItem )
PRSA.X += PRSA.Paragraph.Numbering.WidthVisible;
switch( Item.Type )
......@@ -1559,10 +1568,11 @@ ParaRun.prototype =
}
},
Internal_Recalculate_Numbering : function(Item, PRS, ParaPr)
Internal_Recalculate_Numbering : function(Item, Para, ParaPr, _X, _LineAscent, CurPage, CurLine, CurRange)
{
var X = _X, LineAscent = _LineAscent;
// Если нужно добавить нумерацию и на текущем элементе ее можно добавить, тогда добавляем её
var Para = PRS.Paragraph;
var NumberingItem = Para.Numbering;
var NumberingType = Para.Numbering.Type;
......@@ -1580,8 +1590,8 @@ ParaRun.prototype =
var NumLvl = Numbering.Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl];
var NumSuff = NumLvl.Suff;
var NumJc = NumLvl.Jc;
var NumInfo = Para.Parent.Internal_GetNumInfo( this.Id, NumPr );
var NumTextPr = Pr.TextPr.Copy();
var NumInfo = Para.Parent.Internal_GetNumInfo( Para.Id, NumPr );
var NumTextPr = Para.Get_CompiledPr2(false).TextPr.Copy();
NumTextPr.Merge( Para.TextPr.Value );
NumTextPr.Merge( NumLvl.TextPr );
......@@ -1604,18 +1614,18 @@ ParaRun.prototype =
case align_Center:
{
NumberingItem.WidthVisible = NumberingItem.WidthNum / 2;
PRS.X += NumberingItem.WidthNum / 2;
break;
}
case align_Left:
default:
{
NumberingItem.WidthVisible = NumberingItem.WidthNum;
PRS.X += NumberingItem.WidthNum;
break;
}
}
X += NumberingItem.WidthVisible;
switch( NumSuff )
{
case numbering_suff_Nothing:
......@@ -1634,60 +1644,9 @@ ParaRun.prototype =
}
case numbering_suff_Tab:
{
var NewX = null;
var PageStart = Para.Parent.Get_PageContentStartPos( Para.PageNum + PRS.Page );
// Если у данного параграфа есть табы, тогда ищем среди них
var TabsCount = ParaPr.Tabs.Get_Count();
// Добавим в качестве таба левую границу
var TabsPos = new Array();
var bCheckLeft = true;
for ( var Index = 0; Index < TabsCount; Index++ )
{
var Tab = ParaPr.Tabs.Get(Index);
var TabPos = Tab.Pos + PageStart.X;
if ( true === bCheckLeft && TabPos > PageStart.X + ParaPr.Ind.Left )
{
TabsPos.push( PageStart.X + ParaPr.Ind.Left );
bCheckLeft = false;
}
if ( tab_Clear != Tab.Value )
TabsPos.push( TabPos );
}
if ( true === bCheckLeft )
TabsPos.push( PageStart.X + ParaPr.Ind.Left );
TabsCount++;
for ( var Index = 0; Index < TabsCount; Index++ )
{
var TabPos = TabsPos[Index];
var NewX = Para.Internal_GetTabPos(X, ParaPr, CurPage).NewX;
if ( X < TabPos )
{
NewX = TabPos;
break;
}
}
// Если табов нет, либо их позиции левее текущей позиции ставим таб по умолчанию
if ( null === NewX )
{
if ( X < PageStart.X + ParaPr.Ind.Left )
NewX = PageStart.X + ParaPr.Ind.Left;
else
{
NewX = this.X;
while ( X >= NewX )
NewX += Default_Tab_Stop;
}
}
NumberingItem.WidthSuff = NewX - PRS.X;
NumberingItem.WidthSuff = NewX - X;
break;
}
......@@ -1696,7 +1655,7 @@ ParaRun.prototype =
NumberingItem.Width = NumberingItem.WidthNum;
NumberingItem.WidthVisible += NumberingItem.WidthSuff;
PRS.X += NumberingItem.WidthSuff;
X += NumberingItem.WidthSuff;
}
}
else if ( para_PresentationNumbering === NumberingType )
......@@ -1705,15 +1664,27 @@ ParaRun.prototype =
if ( numbering_presentationnumfrmt_None != Bullet.Get_Type() )
{
if ( ParaPr.Ind.FirstLine < 0 )
NumberingItem.WidthVisible = Math.max( NumberingItem.Width, Para.X + ParaPr.Ind.Left + ParaPr.Ind.FirstLine - PRS.X, Para.X + ParaPr.Ind.Left - PRS.X );
NumberingItem.WidthVisible = Math.max( NumberingItem.Width, Para.X + ParaPr.Ind.Left + ParaPr.Ind.FirstLine - X, Para.X + ParaPr.Ind.Left - X );
else
NumberingItem.WidthVisible = Math.max( Para.X + ParaPr.Ind.Left + NumberingItem.Width - PRS.X, Para.X + ParaPr.Ind.Left + ParaPr.Ind.FirstLine - PRS.X, Para.X + ParaPr.Ind.Left - PRS.X );
NumberingItem.WidthVisible = Math.max( Para.X + ParaPr.Ind.Left + NumberingItem.Width - X, Para.X + ParaPr.Ind.Left + ParaPr.Ind.FirstLine - X, Para.X + ParaPr.Ind.Left - X );
}
PRS.X += NumberingItem.WidthVisible;
X += NumberingItem.WidthVisible;
}
this.NeedAddNumbering = false;
// Запоминаем, что на данном элементе была добавлена нумерация
this.RecalcInfo.NumberingAdd = false;
this.RecalcInfo.NumberingUse = true;
this.RecalcInfo.NumberingItem = NumberingItem;
// Заполним обратные данные в элементе нумерации
NumberingItem.Item = Item;
NumberingItem.Run = this;
NumberingItem.Line = CurLine;
NumberingItem.Range = CurRange;
return { X : X, LineAscent : LineAscent };
},
Internal_Recalculate_LineMetrics : function(PRS, SpacingLineRule)
......@@ -1804,6 +1775,11 @@ ParaRun.prototype =
this.LinesLength = SL.LinesLength;
this.Range = this.Lines[0].Ranges[0];
},
Get_RecalcInfo : function()
{
return this.RecalcInfo;
},
//-----------------------------------------------------------------------------------
// Функции отрисовки
//-----------------------------------------------------------------------------------
......@@ -2010,6 +1986,7 @@ ParaRun.prototype =
//var CurParaPos = PDSE.CurPos.Copy();
// var CurDepth = CurParaPos.Add( 0 );
var Para = PDSE.Paragraph;
var NumItem = PDSE.Paragraph.Numbering.Item;
var pGraphics = PDSE.Graphics;
var AutoColor = PDSE.AutoColor;
......@@ -2050,137 +2027,135 @@ ParaRun.prototype =
//CurParaPos.Update( Pos, CurDepth );
// if ( 0 === CurParaPos.Compare( Para.Numbering.Pos ) )
// {
// var NumberingItem = Para.Numbering;
// if ( para_Numbering === Para.Numbering.Type )
// {
// var Pr = Para.Get_CompiledPr2(false);
// var NumPr = Pr.ParaPr.NumPr;
// if ( undefined === NumPr || undefined === NumPr.NumId || 0 === NumPr.NumId || "0" === NumPr.NumId )
// {
// // Ничего не делаем
// }
// else
// {
// var Numbering = Para.Parent.Get_Numbering();
// var NumLvl = Numbering.Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl];
// var NumSuff = NumLvl.Suff;
// var NumJc = NumLvl.Jc;
// var NumTextPr = Para.Get_CompiledPr2(false).TextPr.Copy();
//
// // Word не рисует подчеркивание у символа списка, если оно пришло из настроек для
// // символа параграфа.
//
// var TextPr_temp = Para.TextPr.Value.Copy();
// TextPr_temp.Underline = undefined;
//
// NumTextPr.Merge( TextPr_temp );
// NumTextPr.Merge( NumLvl.TextPr );
//
// var X_start = X;
//
// if ( align_Right === NumJc )
// X_start = X - NumberingItem.WidthNum;
// else if ( align_Center === NumJc )
// X_start = X - NumberingItem.WidthNum / 2;
//
// if ( true === NumTextPr.Color.Auto )
// pGraphics.b_color1( AutoColor.r, AutoColor.g, AutoColor.b, 255);
// else
// pGraphics.b_color1( NumTextPr.Color.r, NumTextPr.Color.g, NumTextPr.Color.b, 255 );
//
// // Рисуется только сам символ нумерации
// switch ( NumJc )
// {
// case align_Right:
// NumberingItem.Draw( X - NumberingItem.WidthNum, Y, pGraphics, Numbering, NumTextPr, NumPr );
// break;
//
// case align_Center:
// NumberingItem.Draw( X - NumberingItem.WidthNum / 2, Y, pGraphics, Numbering, NumTextPr, NumPr );
// break;
//
// case align_Left:
// default:
// NumberingItem.Draw( X, Y, pGraphics, Numbering, NumTextPr, NumPr );
// break;
// }
//
// if ( true === editor.ShowParaMarks && numbering_suff_Tab === NumSuff )
// {
// var TempWidth = NumberingItem.WidthSuff;
// var TempRealWidth = 3.143; // ширина символа "стрелка влево" в шрифте Wingding3,10
//
// var X1 = X;
// switch ( NumJc )
// {
// case align_Right:
// break;
//
// case align_Center:
// X1 += NumberingItem.WidthNum / 2;
// break;
//
// case align_Left:
// default:
// X1 += NumberingItem.WidthNum;
// break;
// }
//
// var X0 = TempWidth / 2 - TempRealWidth / 2;
//
// pGraphics.SetFont( {FontFamily: { Name : "Wingdings 3", Index : -1 }, FontSize: 10, Italic: false, Bold : false} );
//
// if ( X0 > 0 )
// pGraphics.FillText2( X1 + X0, Y, String.fromCharCode( tab_Symbol ), 0, TempWidth );
// else
// pGraphics.FillText2( X1, Y, String.fromCharCode( tab_Symbol ), TempRealWidth - TempWidth, TempWidth );
// }
//
// if ( true === NumTextPr.Strikeout || true === NumTextPr.Underline )
// {
// if ( true === NumTextPr.Color.Auto )
// pGraphics.p_color( AutoColor.r, AutoColor.g, AutoColor.b, 255);
// else
// pGraphics.p_color( NumTextPr.Color.r, NumTextPr.Color.g, NumTextPr.Color.b, 255 );
// }
//
// if ( true === NumTextPr.Strikeout )
// pGraphics.drawHorLine(0, (Y - NumTextPr.FontSize * g_dKoef_pt_to_mm * 0.27), X_start, X_start + NumberingItem.WidthNum, (NumTextPr.FontSize / 18) * g_dKoef_pt_to_mm);
//
// if ( true === NumTextPr.Underline )
// pGraphics.drawHorLine( 0, (Y + this.Lines[CurLine].Metrics.TextDescent * 0.4), X_start, X_start + NumberingItem.WidthNum, (NumTextPr.FontSize / 18) * g_dKoef_pt_to_mm);
//
//
// X += NumberingItem.WidthVisible;
//
// // Восстановим настройки
// pGraphics.SetTextPr( CurTextPr );
// if ( true === bVisitedHyperlink )
// pGraphics.b_color1( 128, 0, 151, 255 );
// else if ( true === CurTextPr.Color.Auto )
// pGraphics.b_color1( AutoColor.r, AutoColor.g, AutoColor.b, 255);
// else
// pGraphics.b_color1( CurTextPr.Color.r, CurTextPr.Color.g, CurTextPr.Color.b, 255);
// }
// }
// else if ( para_PresentationNumbering === this.Numbering.Type )
// {
// if ( true != Para.IsEmpty() )
// {
// // Найдем настройки для первого текстового элемента
// var FirstTextPr = this.Internal_CalculateTextPr( this.Internal_GetStartPos() );
//
// if ( Pr.ParaPr.Ind.FirstLine < 0 )
// NumberingItem.Draw( X, Y, pGraphics, FirstTextPr );
// else
// NumberingItem.Draw( Para.X + Pr.ParaPr.Ind.Left, Y, pGraphics, FirstTextPr );
// }
//
// X += NumberingItem.WidthVisible;
// }
// }
if ( true === this.RecalcInfo.NumberingUse && Item === NumItem )
{
var NumberingItem = Para.Numbering;
if ( para_Numbering === Para.Numbering.Type )
{
var Pr = Para.Get_CompiledPr2(false);
var NumPr = Pr.ParaPr.NumPr;
if ( undefined === NumPr || undefined === NumPr.NumId || 0 === NumPr.NumId || "0" === NumPr.NumId )
{
// Ничего не делаем
}
else
{
var Numbering = Para.Parent.Get_Numbering();
var NumLvl = Numbering.Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl];
var NumSuff = NumLvl.Suff;
var NumJc = NumLvl.Jc;
var NumTextPr = Para.Get_CompiledPr2(false).TextPr.Copy();
// Word не рисует подчеркивание у символа списка, если оно пришло из настроек для
// символа параграфа.
var TextPr_temp = Para.TextPr.Value.Copy();
TextPr_temp.Underline = undefined;
NumTextPr.Merge( TextPr_temp );
NumTextPr.Merge( NumLvl.TextPr );
var X_start = X;
if ( align_Right === NumJc )
X_start = X - NumberingItem.WidthNum;
else if ( align_Center === NumJc )
X_start = X - NumberingItem.WidthNum / 2;
if ( true === NumTextPr.Color.Auto )
pGraphics.b_color1( AutoColor.r, AutoColor.g, AutoColor.b, 255);
else
pGraphics.b_color1( NumTextPr.Color.r, NumTextPr.Color.g, NumTextPr.Color.b, 255 );
// Рисуется только сам символ нумерации
switch ( NumJc )
{
case align_Right:
NumberingItem.Draw( X - NumberingItem.WidthNum, Y, pGraphics, Numbering, NumTextPr, NumPr );
break;
case align_Center:
NumberingItem.Draw( X - NumberingItem.WidthNum / 2, Y, pGraphics, Numbering, NumTextPr, NumPr );
break;
case align_Left:
default:
NumberingItem.Draw( X, Y, pGraphics, Numbering, NumTextPr, NumPr );
break;
}
if ( true === editor.ShowParaMarks && numbering_suff_Tab === NumSuff )
{
var TempWidth = NumberingItem.WidthSuff;
var TempRealWidth = 3.143; // ширина символа "стрелка влево" в шрифте Wingding3,10
var X1 = X;
switch ( NumJc )
{
case align_Right:
break;
case align_Center:
X1 += NumberingItem.WidthNum / 2;
break;
case align_Left:
default:
X1 += NumberingItem.WidthNum;
break;
}
var X0 = TempWidth / 2 - TempRealWidth / 2;
pGraphics.SetFont( {FontFamily: { Name : "Wingdings 3", Index : -1 }, FontSize: 10, Italic: false, Bold : false} );
if ( X0 > 0 )
pGraphics.FillText2( X1 + X0, Y, String.fromCharCode( tab_Symbol ), 0, TempWidth );
else
pGraphics.FillText2( X1, Y, String.fromCharCode( tab_Symbol ), TempRealWidth - TempWidth, TempWidth );
}
if ( true === NumTextPr.Strikeout || true === NumTextPr.Underline )
{
if ( true === NumTextPr.Color.Auto )
pGraphics.p_color( AutoColor.r, AutoColor.g, AutoColor.b, 255);
else
pGraphics.p_color( NumTextPr.Color.r, NumTextPr.Color.g, NumTextPr.Color.b, 255 );
}
if ( true === NumTextPr.Strikeout )
pGraphics.drawHorLine(0, (Y - NumTextPr.FontSize * g_dKoef_pt_to_mm * 0.27), X_start, X_start + NumberingItem.WidthNum, (NumTextPr.FontSize / 18) * g_dKoef_pt_to_mm);
if ( true === NumTextPr.Underline )
pGraphics.drawHorLine( 0, (Y + this.Lines[CurLine].Metrics.TextDescent * 0.4), X_start, X_start + NumberingItem.WidthNum, (NumTextPr.FontSize / 18) * g_dKoef_pt_to_mm);
X += NumberingItem.WidthVisible;
}
}
else if ( para_PresentationNumbering === this.Numbering.Type )
{
if ( true != Para.IsEmpty() )
{
if ( Pr.ParaPr.Ind.FirstLine < 0 )
NumberingItem.Draw( X, Y, pGraphics, CurTextPr );
else
NumberingItem.Draw( Para.X + Pr.ParaPr.Ind.Left, Y, pGraphics, CurTextPr );
}
X += NumberingItem.WidthVisible;
}
// Восстановим настройки
pGraphics.SetTextPr( CurTextPr );
if ( true === PDSE.VisitedHyperlink )
pGraphics.b_color1( 128, 0, 151, 255 );
else if ( true === CurTextPr.Color.Auto )
pGraphics.b_color1( AutoColor.r, AutoColor.g, AutoColor.b, 255);
else
pGraphics.b_color1( CurTextPr.Color.r, CurTextPr.Color.g, CurTextPr.Color.b, 255);
}
switch( Item.Type )
{
......@@ -2284,6 +2259,7 @@ ParaRun.prototype =
//var CurParaPos = PDSL.CurPos.Copy();
//var CurDepth = CurParaPos.Add( 0 );
var Para = PDSL.Paragraph;
var NumItem = PDSL.Paragraph.Numbering.Item;
var aStrikeout = PDSL.Strikeout;
var aDStrikeout = PDSL.DStrikeout;
......@@ -2312,8 +2288,8 @@ ParaRun.prototype =
var Item = this.Content[Pos];
// TODO: Нумерация зачеркивается и подчеркивается отдельно в Draw_Elements (неплохо бы сюда перенести)
// if ( 0 === CurParaPos.Compare( Para.Numbering.Pos ) )
// X += Para.Numbering.WidthVisible;
if ( true === this.RecalcInfo.NumberingUse && Item === NumItem )
X += Para.Numbering.WidthVisible;
switch( Item.Type )
{
......@@ -2486,57 +2462,55 @@ ParaRun.prototype =
var StartPos = Range.StartPos;
var EndPos = Range.EndPos;
var NumberingItem = this.Paragraph.Numbering;
var NumItem = NumberingItem.Item;
for ( var CurPos = StartPos; CurPos < EndPos; CurPos++ )
{
var Item = this.Content[CurPos];
var TempDx = 0;
// TODO: Сделать поддержку нумерации
// if ( ItemNum === this.Numbering.Pos )
// {
// if ( para_Numbering === this.Numbering.Type )
// {
// var NumberingItem = this.Numbering;
// var NumPr = this.Numbering_Get();
// var NumJc = this.Parent.Get_Numbering().Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl].Jc;
//
// var NumX0 = CurX;
// var NumX1 = CurX;
//
// switch( NumJc )
// {
// case align_Right:
// {
// NumX0 -= NumberingItem.WidthNum;
// break;
// }
// case align_Center:
// {
// NumX0 -= NumberingItem.WidthNum / 2;
// NumX1 += NumberingItem.WidthNum / 2;
// break;
// }
// case align_Left:
// default:
// {
// NumX1 += NumberingItem.WidthNum;
// break;
// }
// }
//
// if ( X >= NumX0 && X <= NumX1 )
// NumberingDiffX = 0;
// }
//
// CurX += this.Numbering.WidthVisible;
//
// if ( -1 != DiffPos )
// {
// DiffX = Math.abs( X - CurX );
// DiffPos = ItemNum;
// }
// }
// Проверим попадание в нумерацию
if ( true === this.RecalcInfo.NumberingUse && Item === NumItem )
{
var NumPr = this.Paragraph.Numbering_Get();
if ( para_Numbering === NumberingItem.Type && undefined !== NumPr )
{
var NumJc = this.Paragraph.Parent.Get_Numbering().Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl].Jc;
var NumX0 = SearchPos.CurX;
var NumX1 = SearchPos.CurX;
switch( NumJc )
{
case align_Right:
{
NumX0 -= NumberingItem.WidthNum;
break;
}
case align_Center:
{
NumX0 -= NumberingItem.WidthNum / 2;
NumX1 += NumberingItem.WidthNum / 2;
break;
}
case align_Left:
default:
{
NumX1 += NumberingItem.WidthNum;
break;
}
}
if ( SearchPos.X >= NumX0 && SearchPos.X <= NumX1 )
{
SearchPos.Numbering = true;
}
}
SearchPos.CurX += NumberingItem.WidthVisible;
}
if ( para_Drawing != Item.Type || true === Item.Is_Inline() )
{
......@@ -2847,14 +2821,14 @@ ParaRun.prototype =
for ( var CurPos = StartPos; CurPos < EndPos; CurPos++ )
{
var Item = this.Content[CurPos];
if ( !((para_Drawing === Item.Type && true !== Item.Is_Inline) || para_End === Item.Type) )
if ( !((para_Drawing === Item.Type && true !== Item.Is_Inline) || para_End === Item.Type || (para_NewLine === Item.Type && break_Line === Item.BreakType ) ) )
LastPos = CurPos + 1;
}
// Проверяем, попал ли хоть один элемент в данный отрезок, если нет, тогда не регистрируем такой ран
if ( -1 !== LastPos )
{
SearchPos.Pos.Update( EndPos, Depth );
SearchPos.Pos.Update( LastPos, Depth );
return true;
}
else
......@@ -2995,11 +2969,21 @@ ParaRun.prototype =
var FindStart = SelectionDraw.FindStart;
var NumItem = ( true === this.RecalcInfo.NumberingUse ? this.Paragraph.Numbering.Item : null );
for ( var CurPos = StartPos; CurPos < EndPos; CurPos++ )
{
var Item = this.Content[CurPos];
var DrawSelection = false;
if ( NumItem === Item )
{
if ( true === FindStart )
SelectionDraw.StartX += this.Paragraph.Numbering.WidthVisible;
else // Такого не должно быть
SelectionDraw.W += this.Paragraph.Numbering.WidthVisible;
}
if ( true === FindStart )
{
if ( true === Selection.Use && CurPos >= SelectionStartPos && CurPos < SelectionEndPos )
......@@ -3649,8 +3633,18 @@ function CParaRunRecalcInfo()
this.Measure = true; // Нужно ли перемерять элементы
this.Recalc = true; // Нужно ли пересчитывать (только если текстовый ран)
this.RunLen = 0;
// Далее идут параметры, которые выставляются после пересчета данного Range, такие как пересчитывать ли нумерацию
this.NumberingItem = null;
this.NumberingUse = false; // Используется ли нумерация в данном ране
this.NumberingAdd = true; // Нужно ли в следующем ране использовать нумерацию
}
CParaRunRecalcInfo.prototype =
{
};
function CParaRunRange(StartPos, EndPos)
{
this.StartPos = StartPos; // Начальная позиция в контенте, с которой начинается данный отрезок
......
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