Commit 05b4fa7c authored by Ilya Kirillov's avatar Ilya Kirillov

Handled the situation when a footnote must be moved to the next page.

parent 5f60818c
...@@ -306,6 +306,8 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn ...@@ -306,6 +306,8 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
break; break;
} }
oColumn.Height = Math.min(_YLimit, oColumn.Height);
return true; return true;
}; };
/** /**
......
...@@ -970,7 +970,7 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa ...@@ -970,7 +970,7 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 14. Проверяем Последние проверки // 14. Проверяем Последние проверки
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineCheckFootnotes(CurLine, CurPage, PRS)) if (false === this.private_RecalculateLineCheckFootnotes(CurLine, CurPage, PRS, ParaPr))
return; return;
}; };
...@@ -1388,62 +1388,8 @@ Paragraph.prototype.private_RecalculateLineBottomBound = function(CurLine, CurPa ...@@ -1388,62 +1388,8 @@ Paragraph.prototype.private_RecalculateLineBottomBound = function(CurLine, CurPa
// Перенос не делаем, если это первая строка на новой странице // Перенос не делаем, если это первая строка на новой странице
if (true === this.Use_YLimit() && (Top > YLimit || Bottom2 > YLimit) && (CurLine != this.Pages[CurPage].FirstLine || false === bNoFootnotes || (0 === RealCurPage && (null != this.Get_DocumentPrev() || (true === this.Parent.Is_TableCellContent() && true !== this.Parent.Is_TableFirstRowOnNewPage())))) && false === BreakPageLineEmpty) if (true === this.Use_YLimit() && (Top > YLimit || Bottom2 > YLimit) && (CurLine != this.Pages[CurPage].FirstLine || false === bNoFootnotes || (0 === RealCurPage && (null != this.Get_DocumentPrev() || (true === this.Parent.Is_TableCellContent() && true !== this.Parent.Is_TableFirstRowOnNewPage())))) && false === BreakPageLineEmpty)
{ {
// TODO: Неразрывные абзацы и висячие строки внутри колонок вместе с плавающими объектами пока не обсчитываем this.private_RecalculateMoveLineToNextPage(CurLine, CurPage, PRS, ParaPr);
var bSkipWidowAndKeepLines = this.private_CheckSkipKeepLinesAndWidowControl(CurPage); return false;
// Проверим висячую строку
if (this.Parent instanceof CDocument
&& false === bSkipWidowAndKeepLines
&& true === this.Parent.RecalcInfo.Can_RecalcWidowControl()
&& true === ParaPr.WidowControl
&& CurLine - this.Pages[CurPage].StartLine <= 1
&& CurLine >= 1 && true != PRS.BreakPageLine
&& ( 0 === CurPage && null != this.Get_DocumentPrev() ) )
{
// Вызываем данную функцию для удаления картинок с предыдущей страницы
this.Recalculate_Drawing_AddPageBreak(0, 0, true);
// TODO: Здесь перенос нужно делать сразу же, если в строке не было объектов с обтеканием
this.Parent.RecalcInfo.Set_WidowControl(this, CurLine - 1);
PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column;
return false;
}
else
{
// Учитываем неразрывные абзацы:
// 1. В Word2010 (версия <= 14) просто проверяем, если параграф разбивается на 2 страницы, тогда
// переносим его с новой страницы. Также не учитываем неразрывные параграфы внутри таблиц.
// 2. В Word2016 (версия >= 15) в добавок к предыдущему ориентируемся на колонки: пытаемся текущую
// страницу параграфа разместить в какой либо колонке (пересчитывая их по очереди), если параграф
// все равно не рассчитан до конца, тогда размещаем его в первой колонке и делаем перенос на следующую
// страницу.
if (true === ParaPr.KeepLines && this.LogicDocument && false === bSkipWidowAndKeepLines)
{
var CompatibilityMode = this.LogicDocument.Get_CompatibilityMode();
if (CompatibilityMode <= document_compatibility_mode_Word14)
{
if (null != this.Get_DocumentPrev() && true != this.Parent.Is_TableCellContent() && 0 === CurPage)
CurLine = 0;
}
else if (CompatibilityMode >= document_compatibility_mode_Word15)
{
// TODO: Разобраться с 2016 вордом
if (null != this.Get_DocumentPrev() && 0 === CurPage)
CurLine = 0;
}
}
// Восстанавливаем позицию нижней границы предыдущей страницы
this.Pages[CurPage].Bounds.Bottom = PRS.LinePrevBottom;
this.Pages[CurPage].Set_EndLine( CurLine - 1 );
if ( 0 === CurLine )
this.Lines[-1] = new CParaLine(0);
// Добавляем разрыв страницы
PRS.RecalcResult = recalcresult_NextPage;
return false;
}
} }
return true; return true;
...@@ -1866,7 +1812,7 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1866,7 +1812,7 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
return PRSA.RecalcResult; return PRSA.RecalcResult;
}; };
Paragraph.prototype.private_RecalculateLineCheckFootnotes = function(CurLine, CurPage, PRS) Paragraph.prototype.private_RecalculateLineCheckFootnotes = function(CurLine, CurPage, PRS, ParaPr)
{ {
if (!((PRS.RecalcResult & recalcresult_NextElement) || (PRS.RecalcResult & recalcresult_NextLine))) if (!((PRS.RecalcResult & recalcresult_NextElement) || (PRS.RecalcResult & recalcresult_NextLine)))
return false; return false;
...@@ -1890,17 +1836,14 @@ Paragraph.prototype.private_RecalculateLineCheckFootnotes = function(CurLine, Cu ...@@ -1890,17 +1836,14 @@ Paragraph.prototype.private_RecalculateLineCheckFootnotes = function(CurLine, Cu
if (oTopDocument instanceof CDocument) if (oTopDocument instanceof CDocument)
{ {
if (oTopDocument.Footnotes.RecalculateFootnotes(PRS.PageAbs, PRS.ColumnAbs, this.Pages[CurPage].Y + this.Lines[CurLine].Bottom, arrFootnotes)) if (!oTopDocument.Footnotes.RecalculateFootnotes(PRS.PageAbs, PRS.ColumnAbs, this.Pages[CurPage].Y + this.Lines[CurLine].Bottom, arrFootnotes))
{ {
// Все нормально this.private_RecalculateMoveLineToNextPage(CurLine, CurPage, PRS, ParaPr);
} return false;
else
{
console.log("Данную строчку нужно перенести на новую строку");
} }
} }
return true; return true;
}; };
Paragraph.prototype.private_RecalculateRange = function(CurRange, CurLine, CurPage, RangesCount, PRS, ParaPr) Paragraph.prototype.private_RecalculateRange = function(CurRange, CurLine, CurPage, RangesCount, PRS, ParaPr)
...@@ -2130,6 +2073,66 @@ Paragraph.prototype.private_CheckColumnBreak = function(CurPage) ...@@ -2130,6 +2073,66 @@ Paragraph.prototype.private_CheckColumnBreak = function(CurPage)
} }
}; };
Paragraph.prototype.private_RecalculateMoveLineToNextPage = function(CurLine, CurPage, PRS, ParaPr)
{
// TODO: Неразрывные абзацы и висячие строки внутри колонок вместе с плавающими объектами пока не обсчитываем
var bSkipWidowAndKeepLines = this.private_CheckSkipKeepLinesAndWidowControl(CurPage);
// Проверим висячую строку
if (this.Parent instanceof CDocument
&& false === bSkipWidowAndKeepLines
&& true === this.Parent.RecalcInfo.Can_RecalcWidowControl()
&& true === ParaPr.WidowControl
&& CurLine - this.Pages[CurPage].StartLine <= 1
&& CurLine >= 1 && true != PRS.BreakPageLine
&& ( 0 === CurPage && null != this.Get_DocumentPrev() ) )
{
// Вызываем данную функцию для удаления картинок с предыдущей страницы
this.Recalculate_Drawing_AddPageBreak(0, 0, true);
// TODO: Здесь перенос нужно делать сразу же, если в строке не было объектов с обтеканием
this.Parent.RecalcInfo.Set_WidowControl(this, CurLine - 1);
PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column;
return false;
}
else
{
// Учитываем неразрывные абзацы:
// 1. В Word2010 (версия <= 14) просто проверяем, если параграф разбивается на 2 страницы, тогда
// переносим его с новой страницы. Также не учитываем неразрывные параграфы внутри таблиц.
// 2. В Word2016 (версия >= 15) в добавок к предыдущему ориентируемся на колонки: пытаемся текущую
// страницу параграфа разместить в какой либо колонке (пересчитывая их по очереди), если параграф
// все равно не рассчитан до конца, тогда размещаем его в первой колонке и делаем перенос на следующую
// страницу.
if (true === ParaPr.KeepLines && this.LogicDocument && false === bSkipWidowAndKeepLines)
{
var CompatibilityMode = this.LogicDocument.Get_CompatibilityMode();
if (CompatibilityMode <= document_compatibility_mode_Word14)
{
if (null != this.Get_DocumentPrev() && true != this.Parent.Is_TableCellContent() && 0 === CurPage)
CurLine = 0;
}
else if (CompatibilityMode >= document_compatibility_mode_Word15)
{
// TODO: Разобраться с 2016 вордом
if (null != this.Get_DocumentPrev() && 0 === CurPage)
CurLine = 0;
}
}
// Восстанавливаем позицию нижней границы предыдущей страницы
this.Pages[CurPage].Bounds.Bottom = PRS.LinePrevBottom;
this.Pages[CurPage].Set_EndLine( CurLine - 1 );
if ( 0 === CurLine )
this.Lines[-1] = new CParaLine(0);
// Добавляем разрыв страницы
PRS.RecalcResult = recalcresult_NextPage;
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