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 ...@@ -732,13 +732,19 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa
this.private_RecalculateLineBaseLine(CurLine, CurPage, PRS, ParaPr); 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)) if (recalcresult_NextElement !== this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, false))
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 12. Последние проверки // 13. Последние проверки
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineEnd(CurLine, CurPage, PRS, ParaPr)) if (false === this.private_RecalculateLineEnd(CurLine, CurPage, PRS, ParaPr))
return; return;
...@@ -1186,42 +1192,16 @@ Paragraph.prototype.private_RecalculateLineBaseLine = function(CurLine, CurPa ...@@ -1186,42 +1192,16 @@ Paragraph.prototype.private_RecalculateLineBaseLine = function(CurLine, CurPa
this.Lines[CurLine].Y += this.Lines[CurLine].Metrics.LineGap; 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 картинки, место к которому она была привязана перешло на // Такое случается, когда у нас после пересчета Flow картинки, место к которому она была привязана перешло на
// следующую страницу. // следующую страницу.
if (recalcresult_NextPage === PRS.RecalcResult) if (recalcresult_NextPage === PRS.RecalcResult)
return false; 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 ...@@ -1229,13 +1209,13 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa
var Ranges = PRS.Ranges; var Ranges = PRS.Ranges;
var RangesMaxY = Ranges[0].Y1; 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; 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мм PRS.Y = RangesMaxY + 1; // смещаемся по 1мм
else else
PRS.Y = RangesMaxY + 0.001; // Добавляем 0.001, чтобы избавиться от погрешности PRS.Y = RangesMaxY + 0.001; // Добавляем 0.001, чтобы избавиться от погрешности
...@@ -1250,6 +1230,38 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa ...@@ -1250,6 +1230,38 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa
return false; 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 ) if ( true === PRS.ForceNewPage )
{ {
this.Pages[CurPage].Set_EndLine( CurLine - 1 ); 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