Commit 7dea547f authored by Ilya.Kirillov's avatar Ilya.Kirillov

Исправлен баг с определением первой строки у параграфов, в которых идет...

Исправлен баг с определением первой строки у параграфов, в которых идет PageBreak в самом начале (баг 22585).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@56121 954022d7-b5bf-4e40-9824-e11837661b57
parent 55674c4a
...@@ -3970,7 +3970,7 @@ Paragraph.prototype = ...@@ -3970,7 +3970,7 @@ Paragraph.prototype =
this.Lines[CurLine].Set_RangeStartPos( CurRange, StartPos ); this.Lines[CurLine].Set_RangeStartPos( CurRange, StartPos );
if ( 0 !== CurRange && 0 === CurLine && true === PRS.EmptyLine ) if ( true === PRS.UseFirstLine && 0 !== CurRange && true === PRS.EmptyLine )
{ {
if ( ParaPr.Ind.FirstLine < 0 ) if ( ParaPr.Ind.FirstLine < 0 )
{ {
...@@ -4066,10 +4066,24 @@ Paragraph.prototype = ...@@ -4066,10 +4066,24 @@ Paragraph.prototype =
// Обнуляем параметры PRS для строки // Обнуляем параметры PRS для строки
PRS.Reset_Line(); PRS.Reset_Line();
// Проверим, нужно ли в данной строке учитывать FirstLine (т.к. не всегда это первая строка должна быть)
var UseFirstLine = true;
for ( var TempCurLine = CurLine - 1; TempCurLine >= 0; TempCurLine-- )
{
var TempLineInfo = this.Lines[TempCurLine].LineInfo;
if ( !(TempLineInfo & 1) || !(TempLineInfo & 2) )
{
UseFirstLine = false;
break;
}
}
PRS.UseFirstLine = UseFirstLine;
// Заполняем строку отрезками обтекания. Выставляем начальные сдвиги для отрезков. Начало промежутка = конец вырезаемого промежутка // Заполняем строку отрезками обтекания. Выставляем начальные сдвиги для отрезков. Начало промежутка = конец вырезаемого промежутка
this.Lines[CurLine].Reset(); this.Lines[CurLine].Reset();
this.Lines[CurLine].Add_Range( ( 0 == CurLine ? PRS.XStart + ParaPr.Ind.Left + ParaPr.Ind.FirstLine : PRS.XStart + ParaPr.Ind.Left ), (RangesCount == 0 ? PRS.XLimit : Ranges[0].X0) ); this.Lines[CurLine].Add_Range( ( true === UseFirstLine ? PRS.XStart + ParaPr.Ind.Left + ParaPr.Ind.FirstLine : PRS.XStart + ParaPr.Ind.Left ), (RangesCount == 0 ? PRS.XLimit : Ranges[0].X0) );
for ( var Index = 1; Index < Ranges.length + 1; Index++ ) for ( var Index = 1; Index < Ranges.length + 1; Index++ )
{ {
this.Lines[CurLine].Add_Range( Ranges[Index - 1].X1, (RangesCount == Index ? PRS.XLimit : Ranges[Index].X0) ); this.Lines[CurLine].Add_Range( Ranges[Index - 1].X1, (RangesCount == Index ? PRS.XLimit : Ranges[Index].X0) );
...@@ -4305,6 +4319,18 @@ Paragraph.prototype = ...@@ -4305,6 +4319,18 @@ Paragraph.prototype =
// Переносим строку по PageBreak. Если в строке ничего нет, кроме PageBreak, тогда нам не надо проверять высоту строки и обтекание. // Переносим строку по PageBreak. Если в строке ничего нет, кроме PageBreak, тогда нам не надо проверять высоту строки и обтекание.
var bBreakPageLineEmpty = ( true === PRS.BreakPageLine && true === PRS.EmptyLine ); var bBreakPageLineEmpty = ( true === PRS.BreakPageLine && true === PRS.EmptyLine );
// Сохраним это, чтобы знать, использовать ли FirstLine в следующей строке или нет
this.Lines[CurLine].LineInfo = 0;
if ( true === PRS.BreakPageLine )
this.Lines[CurLine].LineInfo |= 1;
if ( true === PRS.EmptyLine )
this.Lines[CurLine].LineInfo |= 2;
if ( true === PRS.End )
this.Lines[CurLine].LineInfo |= 4;
// Сначала проверяем не нужно ли сделать перенос страницы в данном месте // Сначала проверяем не нужно ли сделать перенос страницы в данном месте
// Перенос не делаем, если это первая строка на новой странице // Перенос не делаем, если это первая строка на новой странице
...@@ -5379,6 +5405,10 @@ Paragraph.prototype = ...@@ -5379,6 +5405,10 @@ Paragraph.prototype =
// TODO: Сделать проверку на добавление пробела и удаление // TODO: Сделать проверку на добавление пробела и удаление
return -1; return -1;
} }
// Если у нас есть PageBreak в строке, запускаем обычный пересчет, либо если это пустой параграф.
if ( this.Lines[Line].LineInfo & 1 || ( this.Lines[Line].LineInfo & 2 && this.Lines[Line].LineInfo & 4 ) )
return -1;
// Если у нас отрезок, в котором произошли изменения является отрезком с нумерацией, тогда надо запустить // Если у нас отрезок, в котором произошли изменения является отрезком с нумерацией, тогда надо запустить
// обычный пересчет. // обычный пересчет.
...@@ -5398,7 +5428,7 @@ Paragraph.prototype = ...@@ -5398,7 +5428,7 @@ Paragraph.prototype =
// TODO: Улучишить данную проверку // TODO: Улучишить данную проверку
if ( 1 === this.Lines.length && true !== this.Is_Inline() ) if ( 1 === this.Lines.length && true !== this.Is_Inline() )
return -1; return -1;
// Мы должны пересчитать как минимум 3 отрезка: текущий, предыдущий и следующий, потому что при удалении элемента // Мы должны пересчитать как минимум 3 отрезка: текущий, предыдущий и следующий, потому что при удалении элемента
// или добавлении пробела первое слово в данном отрезке может убраться в предыдущем отрезке, и кроме того при // или добавлении пробела первое слово в данном отрезке может убраться в предыдущем отрезке, и кроме того при
// удалении возможен вариант, когда мы неправильно определили отрезок (т.е. более ранний взяли). Но возможен // удалении возможен вариант, когда мы неправильно определили отрезок (т.е. более ранний взяли). Но возможен
...@@ -20577,6 +20607,11 @@ function CParaLine(StartPos) ...@@ -20577,6 +20607,11 @@ function CParaLine(StartPos)
this.RangeY = false; this.RangeY = false;
this.StartPos = StartPos; // Позиция в контенте параграфа, с которой начинается данная строка this.StartPos = StartPos; // Позиция в контенте параграфа, с которой начинается данная строка
this.EndPos = StartPos; // Позиция последнего элемента в данной строке this.EndPos = StartPos; // Позиция последнего элемента в данной строке
this.LineInfo = 0; // Побитовая информация о строке:
// 1 бит : есть ли PageBreak в строке
// 2 бит : пустая ли строка (без учета PageBreak)
// 3 бит : последняя ли это строка (т.е. строка с ParaEnd)
} }
CParaLine.prototype = CParaLine.prototype =
...@@ -21234,6 +21269,7 @@ function CParagraphRecalculateStateWrap() ...@@ -21234,6 +21269,7 @@ function CParagraphRecalculateStateWrap()
this.AddNumbering = true; this.AddNumbering = true;
this.BreakPageLine = false; this.BreakPageLine = false;
this.UseFirstLine = false;
this.ExtendBoundToBottom = false; this.ExtendBoundToBottom = false;
...@@ -21291,6 +21327,7 @@ CParagraphRecalculateStateWrap.prototype = ...@@ -21291,6 +21327,7 @@ CParagraphRecalculateStateWrap.prototype =
this.EmptyLine = true; this.EmptyLine = true;
this.BreakPageLine = false; this.BreakPageLine = false;
this.End = false; this.End = false;
this.UseFirstLine = false;
this.LineTextAscent = 0; this.LineTextAscent = 0;
this.LineTextAscent2 = 0; this.LineTextAscent2 = 0;
......
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