Commit 20f00f63 authored by Ilya Kirillov's avatar Ilya Kirillov

Fixed problem with calculating spacing before paragraph.

parent b4391d3b
...@@ -9385,6 +9385,19 @@ CDocument.prototype.GetCurrentSectionPr = function() ...@@ -9385,6 +9385,19 @@ CDocument.prototype.GetCurrentSectionPr = function()
return oSectPr; return oSectPr;
}; };
CDocument.prototype.GetFirstElementInSection = function(SectionIndex)
{
if (SectionIndex <= 0)
return this.Content[0] ? this.Content[0] : null;
var nElementPos = this.SectionsInfo.Get_SectPr2(SectionIndex - 1).Index + 1;
return this.Content[nElementPos] ? this.Content[nElementPos] : null;
};
CDocument.prototype.GetSectionIndexByElementIndex = function(ElementIndex)
{
return this.SectionsInfo.Get_Index(ElementIndex);
};
/** /**
* Определяем использовать ли заливку текста в особых случаях, когда вызывается заливка параграфа. * Определяем использовать ли заливку текста в особых случаях, когда вызывается заливка параграфа.
* @param bUse * @param bUse
......
...@@ -38,8 +38,8 @@ var g_oTextMeasurer = AscCommon.g_oTextMeasurer; ...@@ -38,8 +38,8 @@ var g_oTextMeasurer = AscCommon.g_oTextMeasurer;
// TODO: В колонтитулах быстрые пересчеты отключены. Надо реализовать. // TODO: В колонтитулах быстрые пересчеты отключены. Надо реализовать.
/** /**
* Здесь мы пытаемся быстро пересчитать текущий параграф. Если быстрый пересчет срабатывает, тогда возвращаются страницы, * Здесь мы пытаемся быстро пересчитать текущий параграф. Если быстрый пересчет срабатывает, тогда возвращаются
* которые нужно перерисовать, в противном случае возвращается пустой массив. * страницы, которые нужно перерисовать, в противном случае возвращается пустой массив.
* @returns {*} * @returns {*}
*/ */
Paragraph.prototype.Recalculate_FastWholeParagraph = function() Paragraph.prototype.Recalculate_FastWholeParagraph = function()
...@@ -908,7 +908,7 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa ...@@ -908,7 +908,7 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 2. Проверяем, является ли данная строка висячей // 2. Проверяем, является ли данная строка висячей
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if(false === this.private_RecalculateLineWidow(CurLine, CurPage, PRS, ParaPr)) if (false === this.private_RecalculateLineWidow(CurLine, CurPage, PRS, ParaPr))
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
...@@ -1200,9 +1200,9 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa ...@@ -1200,9 +1200,9 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa
if (0 === CurLine) if (0 === CurLine)
{ {
// Добавляем расстояние до параграфа (Pr.Spacing.Before) // Добавляем расстояние до параграфа (Pr.Spacing.Before)
if (0 === CurPage || true === this.Parent.Is_TableCellContent() || true === ParaPr.PageBreakBefore) if (this.private_CheckNeedBeforeSpacing(CurPage, PRS))
BaseLineOffset += ParaPr.Spacing.Before; BaseLineOffset += ParaPr.Spacing.Before;
// Добавляем толщину границы параграфа (если граница задана) // Добавляем толщину границы параграфа (если граница задана)
if ((true === ParaPr.Brd.First || 1 === CurPage) && border_Single === ParaPr.Brd.Top.Value) if ((true === ParaPr.Brd.First || 1 === CurPage) && border_Single === ParaPr.Brd.Top.Value)
...@@ -1214,7 +1214,12 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa ...@@ -1214,7 +1214,12 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa
PRS.BaseLineOffset = BaseLineOffset; PRS.BaseLineOffset = BaseLineOffset;
} }
else else
BaseLineOffset = PRS.BaseLineOffset; {
if (this.Lines[CurLine].Info & paralineinfo_RangeY)
PRS.BaseLineOffset = this.Lines[CurLine].Metrics.Ascent;
else
BaseLineOffset = PRS.BaseLineOffset;
}
var Top, Bottom; var Top, Bottom;
var Top2, Bottom2; // верх и низ без Pr.Spacing var Top2, Bottom2; // верх и низ без Pr.Spacing
...@@ -1228,7 +1233,7 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa ...@@ -1228,7 +1233,7 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa
if ( 0 === CurLine ) if ( 0 === CurLine )
{ {
if ( 0 === CurPage || true === this.Parent.Is_TableCellContent() ) if (this.private_CheckNeedBeforeSpacing(CurPage, PRS))
{ {
Top2 = Top + ParaPr.Spacing.Before; Top2 = Top + ParaPr.Spacing.Before;
Bottom2 = Top + ParaPr.Spacing.Before + this.Lines[0].Metrics.Ascent + this.Lines[0].Metrics.Descent; Bottom2 = Top + ParaPr.Spacing.Before + this.Lines[0].Metrics.Ascent + this.Lines[0].Metrics.Descent;
...@@ -1283,7 +1288,7 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa ...@@ -1283,7 +1288,7 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa
Top = PRS.Y; Top = PRS.Y;
Top2 = PRS.Y; Top2 = PRS.Y;
if ( 0 === CurPage || true === this.Parent.Is_TableCellContent() || true === ParaPr.PageBreakBefore ) if (this.private_CheckNeedBeforeSpacing(CurPage, PRS))
{ {
Top2 = Top + ParaPr.Spacing.Before; Top2 = Top + ParaPr.Spacing.Before;
Bottom2 = Top + ParaPr.Spacing.Before + this.Lines[0].Metrics.Ascent + this.Lines[0].Metrics.Descent; Bottom2 = Top + ParaPr.Spacing.Before + this.Lines[0].Metrics.Ascent + this.Lines[0].Metrics.Descent;
...@@ -1458,7 +1463,6 @@ Paragraph.prototype.private_RecalculateLineBaseLine = function(CurLine, CurPa ...@@ -1458,7 +1463,6 @@ Paragraph.prototype.private_RecalculateLineBaseLine = function(CurLine, CurPa
if (this.Lines[CurLine].Info & paralineinfo_RangeY) if (this.Lines[CurLine].Info & paralineinfo_RangeY)
{ {
this.Lines[CurLine].Y = PRS.Y - this.Pages[CurPage].Y; this.Lines[CurLine].Y = PRS.Y - this.Pages[CurPage].Y;
PRS.BaseLineOffset = this.Lines[CurLine].Metrics.Ascent;
} }
else else
{ {
...@@ -2145,6 +2149,31 @@ Paragraph.prototype.private_RecalculateMoveLineToNextPage = function(CurLine, Cu ...@@ -2145,6 +2149,31 @@ Paragraph.prototype.private_RecalculateMoveLineToNextPage = function(CurLine, Cu
} }
}; };
Paragraph.prototype.private_CheckNeedBeforeSpacing = function(CurPage, PRS)
{
if (CurPage <= 0)
return true;
if (!this.Check_FirstPage(CurPage))
return false;
if (!(PRS.Parent instanceof CDocument))
return true;
// Если дошли до этого места, то тут все зависит от того на какой мы странице. Если на первой странице данной секции
// тогда добавляем расстояние, а если нет - нет. Но подсчет первой страницы здесь не совпадает с тем, как она
// считается для нумерации. Если разрыв секции идет на текущей странице, то первой считается сразу данная страница.
var LogicDocument = PRS.Parent;
var SectionIndex = LogicDocument.GetSectionIndexByElementIndex(this.Get_Index());
var FirstElement = LogicDocument.GetFirstElementInSection(SectionIndex);
if (!FirstElement || FirstElement.Get_AbsolutePage(0) === PRS.GetPageAbs())
return true;
return false;
};
var ERecalcPageType = var ERecalcPageType =
{ {
START : 0x00, // начать заново пересчет, с начала страницы START : 0x00, // начать заново пересчет, с начала страницы
......
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