Commit 19074c20 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@58517 954022d7-b5bf-4e40-9824-e11837661b57
parent a8667bc3
......@@ -732,13 +732,19 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa
this.private_RecalculateLineBaseLine(CurLine, CurPage, PRS, ParaPr);
//-------------------------------------------------------------------------------------------------------------
// 11. Пересчитываем сдвиги элементов внутри параграфа и видимые ширины пробелов, в зависимости от align.
// 11. Проверяем не съехала ли вся строка из-за обтекания
//-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineCheckRangeY(CurLine, CurPage, PRS, ParaPr))
return;
//-------------------------------------------------------------------------------------------------------------
// 12. Пересчитываем сдвиги элементов внутри параграфа и видимые ширины пробелов, в зависимости от align.
//-------------------------------------------------------------------------------------------------------------
if (recalcresult_NextElement !== this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, false))
return;
//-------------------------------------------------------------------------------------------------------------
// 12. Последние проверки
// 13. Последние проверки
//-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineEnd(CurLine, CurPage, PRS, ParaPr))
return;
......@@ -1186,42 +1192,16 @@ Paragraph.prototype.private_RecalculateLineBaseLine = function(CurLine, CurPa
this.Lines[CurLine].Y += this.Lines[CurLine].Metrics.LineGap;
};
Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPage, PRS, ParaPr)
Paragraph.prototype.private_RecalculateLineCheckRangeY = function(CurLine, CurPage, PRS, ParaPr)
{
if ( true === PRS.NewPage )
{
// Если это последний элемент параграфа, тогда нам не надо переносить текущий параграф
// на новую страницу. Нам надо выставить границы так, чтобы следующий параграф начинался
// с новой страницы.
// Здесь проверяем специальный случай, когда у нас после PageBreak в параграфе ничего не идет кроме
// плавающих объектов. В такой ситуации мы располагаем эти объекты на текущей странице (см. DemoHyden v2).
if ( true === this.Check_BreakPageEnd( PRS.PageBreak ) )
{
PRS.PageBreak.Flags.NewLine = false;
PRS.ExtendBoundToBottom = true;
PRS.SkipPageBreak = true;
PRS.RecalcResult = recalcresult_CurLine;
return false;
}
this.Pages[CurPage].Set_EndLine( CurLine );
PRS.RecalcResult = recalcresult_NextPage;
return false;
}
// Такое случается, когда у нас после пересчета Flow картинки, место к которому она была привязана перешло на
// следующую страницу.
if (recalcresult_NextPage === PRS.RecalcResult)
return false;
if (true !== PRS.End)
{
// Если строка пустая в следствии того, что у нас было обтекание, тогда мы не добавляем новую строку,
// а просто текущую смещаем ниже.
if ( true === PRS.EmptyLine && PRS.RangesCount > 0 )
if (true !== PRS.End && true === PRS.EmptyLine && PRS.RangesCount > 0)
{
// Найдем верхнюю точку объектов обтекания (т.е. так чтобы при новом обсчете не учитывался только
// этот объект, заканчивающийся выше всех)
......@@ -1229,13 +1209,13 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa
var Ranges = PRS.Ranges;
var RangesMaxY = Ranges[0].Y1;
for ( var Index = 1; Index < Ranges.length; Index++ )
for (var Index = 1; Index < Ranges.length; Index++)
{
if ( RangesMaxY > Ranges[Index].Y1 )
if (RangesMaxY > Ranges[Index].Y1)
RangesMaxY = Ranges[Index].Y1;
}
if ( Math.abs(RangesMaxY - PRS.Y) < 0.001 )
if (Math.abs(RangesMaxY - PRS.Y) < 0.001)
PRS.Y = RangesMaxY + 1; // смещаемся по 1мм
else
PRS.Y = RangesMaxY + 0.001; // Добавляем 0.001, чтобы избавиться от погрешности
......@@ -1250,6 +1230,38 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa
return false;
}
return true;
};
Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPage, PRS, ParaPr)
{
if ( true === PRS.NewPage )
{
// Если это последний элемент параграфа, тогда нам не надо переносить текущий параграф
// на новую страницу. Нам надо выставить границы так, чтобы следующий параграф начинался
// с новой страницы.
// Здесь проверяем специальный случай, когда у нас после PageBreak в параграфе ничего не идет кроме
// плавающих объектов. В такой ситуации мы располагаем эти объекты на текущей странице (см. DemoHyden v2).
if ( true === this.Check_BreakPageEnd( PRS.PageBreak ) )
{
PRS.PageBreak.Flags.NewLine = false;
PRS.ExtendBoundToBottom = true;
PRS.SkipPageBreak = true;
PRS.RecalcResult = recalcresult_CurLine;
return false;
}
this.Pages[CurPage].Set_EndLine( CurLine );
PRS.RecalcResult = recalcresult_NextPage;
return false;
}
if (true !== PRS.End)
{
if ( true === PRS.ForceNewPage )
{
this.Pages[CurPage].Set_EndLine( CurLine - 1 );
......
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