Commit 541601ac authored by Ilya Kirillov's avatar Ilya Kirillov

Continued to rework calculation of footnotes.

parent 746c3d02
......@@ -1665,10 +1665,8 @@ CDocument.prototype.Get_PageContentStartPos2 = function(StartPageIndex, St
var ColumnAbs = (StartColumnIndex + ElementPageIndex) - ((StartColumnIndex + ElementPageIndex) / ColumnsCount | 0) * ColumnsCount;
var PageAbs = StartPageIndex + ((StartColumnIndex + ElementPageIndex) / ColumnsCount | 0);
var FootnotesHeight = this.Footnotes.GetHeight(PageAbs, ColumnAbs);
var Y = SectPr.Get_PageMargin_Top();
var YLimit = SectPr.Get_PageHeight() - SectPr.Get_PageMargin_Bottom() - FootnotesHeight;
var YLimit = SectPr.Get_PageHeight() - SectPr.Get_PageMargin_Bottom();
var X = SectPr.Get_PageMargin_Left();
var XLimit = SectPr.Get_PageWidth() - SectPr.Get_PageMargin_Right();
......@@ -1677,7 +1675,7 @@ CDocument.prototype.Get_PageContentStartPos2 = function(StartPageIndex, St
if (this.Pages[PageAbs] && this.Pages[PageAbs].Sections[SectionIndex])
{
Y = this.Pages[PageAbs].Sections[SectionIndex].Get_Y();
YLimit = this.Pages[PageAbs].Sections[SectionIndex].Get_YLimit() - FootnotesHeight;
YLimit = this.Pages[PageAbs].Sections[SectionIndex].Get_YLimit();
}
var HdrFtrLine = this.HdrFtr.Get_HdrFtrLines(PageAbs);
......@@ -2300,7 +2298,6 @@ CDocument.prototype.Recalculate_PageColumn = function()
PageColumn.SpaceBefore = StartPos.ColumnSpaceBefore;
PageColumn.SpaceAfter = StartPos.ColumnSpaceAfter;
//var YLimitOrigin = YLimit;
this.Footnotes.ContinueElementsFromPreviousColumn(PageIndex, ColumnIndex, Y, YLimit);
var SectElement = this.SectionsInfo.Get_SectPr(StartIndex);
......
......@@ -215,7 +215,6 @@ CFootnotesController.prototype.ContinueElementsFromPreviousColumn = function(nPa
// Начиная с данной сноски мы все оставшиеся сноски заносим в массив ContinuesElements у данной колонки
var arrContniuesElements = arrElements.slice(nIndex);
oColumn.SetContinutesElements(arrContniuesElements);
break;
}
else if (recalcresult2_CurPage === nRecalcResult)
{
......@@ -225,6 +224,9 @@ CFootnotesController.prototype.ContinueElementsFromPreviousColumn = function(nPa
var oBounds = oFootnote.Get_PageBounds(nRelativePage);
_Y += oBounds.Bottom - oBounds.Top;
oColumn.Height = _Y;
if (recalcresult2_NextPage === nRecalcResult)
break;
}
}
};
......@@ -255,7 +257,7 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
var XLimit = oColumn.XLimit;
var _Y = oColumn.Height;
var _YLimit = oColumn.YLimit - oColumn.Y;
var _YLimit = oColumn.YLimit - Y;
if (oColumn.Elements.length <= 0 && null !== this.SeparatorFootnote)
{
......@@ -306,98 +308,6 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
return true;
};
/**
* Пересчитываем сноски на заданной странице.
*/
CFootnotesController.prototype.Recalculate = function(nPageAbs, nColumnAbs, Y, YLimit)
{
var oPrevColumn = (nColumnAbs > 0 ? this.Pages[nPageAbs].Columns[nColumnAbs - 1] : (nPageAbs > 0 ? this.Pages[nPageAbs - 1].Columns[this.Pages[nPageAbs - 1].Columns.length - 1] : null));
if (true === this.IsEmptyPageColumn(nPageAbs, nColumnAbs) && (null === oPrevColumn || true !== oPrevColumn.Continue))
return;
var oPage = this.Pages[nPageAbs];
var oColumn = oPage.Columns[nColumnAbs];
var nColumnsCount = oPage.Columns.length;
var X = oColumn.X;
var XLimit = oColumn.XLimit;
oColumn.YLimit = YLimit;
// Мы пересчет начинаем с 0, потом просто делаем сдвиг, через функцию Shift.
if (null !== oPrevColumn && true === oPrevColumn.Continue && oPrevColumn.Elements.length > 0)
{
var oLastFootnote = oPrevColumn.Elements[oPrevColumn.Elements.length - 1];
if (oLastFootnote !== oColumn.Elements[0])
oColumn.Elements.splice(0, 0, oLastFootnote);
oColumn.ContinuePrev = true;
oColumn.Y = Y;
}
var _YLimit = YLimit - oColumn.Y;
var CurY = 0;
if (oColumn.ContinuePrev)
{
if (null !== this.ContinuationSeparatorFootnote)
{
this.ContinuationSeparatorFootnote.Prepare_RecalculateObject();
this.ContinuationSeparatorFootnote.Reset(X, CurY, XLimit, _YLimit);
this.ContinuationSeparatorFootnote.Set_StartPage(nPageAbs, nColumnAbs, nColumnsCount);
this.ContinuationSeparatorFootnote.Recalculate_Page(0, true);
oColumn.ContinuationSeparatorRecalculateObject = this.ContinuationSeparatorFootnote.Save_RecalculateObject();
var Bounds = this.ContinuationSeparatorFootnote.Get_PageBounds(0);
CurY += Bounds.Bottom - Bounds.Top;
}
}
else
{
if (null !== this.SeparatorFootnote)
{
this.SeparatorFootnote.Prepare_RecalculateObject();
this.SeparatorFootnote.Reset(X, CurY, XLimit, _YLimit);
this.SeparatorFootnote.Set_StartPage(nPageAbs, nColumnAbs, nColumnsCount);
this.SeparatorFootnote.Recalculate_Page(0, true);
oColumn.SeparatorRecalculateObject = this.SeparatorFootnote.Save_RecalculateObject();
var Bounds = this.SeparatorFootnote.Get_PageBounds(0);
CurY += Bounds.Bottom - Bounds.Top;
}
}
oColumn.YStart = CurY;
for (var nIndex = 0; nIndex < oColumn.Elements.length; ++nIndex)
{
var Footnote = oColumn.Elements[nIndex];
if (0 !== nIndex || true !== oColumn.ContinuePrev)
{
Footnote.Reset(X, CurY, XLimit, _YLimit);
Footnote.Set_StartPage(nPageAbs, nColumnAbs, nColumnsCount);
}
var nRelativePage = Footnote.GetElementPageIndex(nPageAbs, nColumnAbs);
if (recalcresult2_NextPage === Footnote.Recalculate_Page(nRelativePage, true))
{
if (nIndex === oColumn.Elements.length - 1)
{
// Продолжаем сноску
oColumn.Continue = true;
}
else
{
// TODO: Надо пересчитать данную колонку заново, с учетом того, что последнюю сноску необходимо перенести на новую страницу
}
break;
}
var Bounds = Footnote.Get_PageBounds(nRelativePage);
CurY += Bounds.Bottom - Bounds.Top;
}
this.NeedShift = true;
};
/**
* Получаем суммарную высоту, занимаемую сносками на заданной странице.
* @param {number} nPageAbs
......@@ -406,41 +316,11 @@ CFootnotesController.prototype.Recalculate = function(nPageAbs, nColumnAbs, Y, Y
*/
CFootnotesController.prototype.GetHeight = function(nPageAbs, nColumnAbs)
{
if (true === this.IsEmptyPageColumn(nPageAbs, nColumnAbs))
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs);
if (!oColumn)
return 0;
var oColumn = this.Pages[nPageAbs].Columns[nColumnAbs];
var nHeight = 0;
if (true === oColumn.ContinuePrev)
{
if (null !== oColumn.ContinuationSeparatorRecalculateObject)
{
this.ContinuationSeparatorFootnote.Load_RecalculateObject(oColumn.ContinuationSeparatorRecalculateObject);
var oBounds = this.ContinuationSeparatorFootnote.Get_PageBounds(0);
nHeight += oBounds.Bottom - oBounds.Top;
}
}
else
{
if (null !== oColumn.SeparatorRecalculateObject)
{
this.SeparatorFootnote.Load_RecalculateObject(oColumn.SeparatorRecalculateObject);
var oBounds = this.SeparatorFootnote.Get_PageBounds(0);
nHeight += oBounds.Bottom - oBounds.Top;
}
}
for (var nIndex = 0, nCount = oColumn.Elements.length; nIndex < nCount; ++nIndex)
{
var oFootnote = oColumn.Elements[nIndex];
var nFootnotePageIndex = oFootnote.GetElementPageIndex(nPageAbs, nColumnAbs);
var oBounds = oFootnote.Get_PageBounds(nFootnotePageIndex);
nHeight += oBounds.Bottom - oBounds.Top;
}
return nHeight;
return oColumn.Height;
};
/**
* Отрисовываем сноски на заданной странице.
......@@ -460,21 +340,15 @@ CFootnotesController.prototype.Draw = function(nPageAbs, pGraphics)
if (!oColumn || oColumn.Elements.length <= 0)
continue;
if (true === oColumn.ContinuePrev)
if (null !== this.ContinuationSeparatorFootnote && null !== oColumn.ContinuationSeparatorRecalculateObject)
{
if (null !== this.ContinuationSeparatorFootnote && null !== oColumn.ContinuationSeparatorRecalculateObject)
{
this.ContinuationSeparatorFootnote.Load_RecalculateObject(oColumn.ContinuationSeparatorRecalculateObject);
this.ContinuationSeparatorFootnote.Draw(nPageAbs, pGraphics);
}
this.ContinuationSeparatorFootnote.Load_RecalculateObject(oColumn.ContinuationSeparatorRecalculateObject);
this.ContinuationSeparatorFootnote.Draw(nPageAbs, pGraphics);
}
else
if (null !== this.SeparatorFootnote && null !== oColumn.SeparatorRecalculateObject)
{
if (null !== this.SeparatorFootnote && null !== oColumn.SeparatorRecalculateObject)
{
this.SeparatorFootnote.Load_RecalculateObject(oColumn.SeparatorRecalculateObject);
this.SeparatorFootnote.Draw(nPageAbs, pGraphics);
}
this.SeparatorFootnote.Load_RecalculateObject(oColumn.SeparatorRecalculateObject);
this.SeparatorFootnote.Draw(nPageAbs, pGraphics);
}
for (var nIndex = 0, nCount = oColumn.Elements.length; nIndex < nCount; ++nIndex)
......@@ -494,30 +368,21 @@ CFootnotesController.prototype.Draw = function(nPageAbs, pGraphics)
*/
CFootnotesController.prototype.Shift = function(nPageAbs, nColumnAbs, dX, dY)
{
if (true !== this.NeedShift)
return;
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs);
if (!oColumn)
return;
if (true === oColumn.ContinuePrev)
if (null !== this.ContinuationSeparatorFootnote && null !== oColumn.ContinuationSeparatorRecalculateObject)
{
if (null !== this.ContinuationSeparatorFootnote && null !== oColumn.ContinuationSeparatorRecalculateObject)
{
this.ContinuationSeparatorFootnote.Load_RecalculateObject(oColumn.ContinuationSeparatorRecalculateObject);
this.ContinuationSeparatorFootnote.Shift(0, dX, dY);
oColumn.ContinuationSeparatorRecalculateObject = this.ContinuationSeparatorFootnote.Save_RecalculateObject();
}
this.ContinuationSeparatorFootnote.Load_RecalculateObject(oColumn.ContinuationSeparatorRecalculateObject);
this.ContinuationSeparatorFootnote.Shift(0, dX, dY);
oColumn.ContinuationSeparatorRecalculateObject = this.ContinuationSeparatorFootnote.Save_RecalculateObject();
}
else
if (null !== this.SeparatorFootnote && null !== oColumn.SeparatorRecalculateObject)
{
if (null !== this.SeparatorFootnote && null !== oColumn.SeparatorRecalculateObject)
{
this.SeparatorFootnote.Load_RecalculateObject(oColumn.SeparatorRecalculateObject);
this.SeparatorFootnote.Shift(0, dX, dY);
oColumn.SeparatorRecalculateObject = this.SeparatorFootnote.Save_RecalculateObject();
}
this.SeparatorFootnote.Load_RecalculateObject(oColumn.SeparatorRecalculateObject);
this.SeparatorFootnote.Shift(0, dX, dY);
oColumn.SeparatorRecalculateObject = this.SeparatorFootnote.Save_RecalculateObject();
}
for (var nIndex = 0, nCount = oColumn.Elements.length; nIndex < nCount; ++nIndex)
......@@ -526,8 +391,6 @@ CFootnotesController.prototype.Shift = function(nPageAbs, nColumnAbs, dX, dY)
var nFootnotePageIndex = oFootnote.GetElementPageIndex(nPageAbs, nColumnAbs);
oFootnote.Shift(nFootnotePageIndex, dX, dY);
}
this.NeedShift = false;
};
/**
* Добавляем заданную сноску на страницу для пересчета.
......@@ -687,7 +550,7 @@ CFootnotesController.prototype.Get_PageContentStartPos = function(nPageAbs, nCol
if (!oColumn)
return {X : 0, Y : 0, XLimit : 0, YLimit : 0};
return {X : oColumn.X, Y : oColumn.YStart, XLimit : oColumn.XLimit, YLimit : oColumn.YLimit - oColumn.Y};
return {X : oColumn.X, Y : oColumn.Height, XLimit : oColumn.XLimit, YLimit : oColumn.YLimit - oColumn.Y};
};
CFootnotesController.prototype.GetCurFootnote = function()
{
......@@ -3081,36 +2944,20 @@ function CFootEndnotePageColumn()
this.Y = 0;
this.XLimit = 0;
this.YLimit = 0;
this.YStart = 0; // фактически тут задается высота специальной сноски-разделителя
this.Height = 0;
this.ElementsY = []; // Начальная позиция
this.Height = 0;
this.Elements = []; // Элементы, которые пересчитаны на данной странице
this.ContniuesElements = []; // Элементы, которые нужно пересчитывать на следующей колонке
this.Continue = false;
this.ContinuePrev = false;
this.SeparatorRecalculateObject = null;
this.ContinuationSeparatorRecalculateObject = null;
this.ContinuationNoticeRecalculateObject = null;
}
CFootEndnotePageColumn.prototype.Reset = function()
{
this.X = 0;
this.Y = 0;
this.XLimit = 0;
this.YLimit = 0;
this.YStart = 0;
this.Elements = [];
this.Continue = false;
this.ContinuePrev = false;
this.Height = 0;
this.Elements = [];
this.ContniuesElements = [];
this.SeparatorRecalculateObject = null;
this.ContinuationSeparatorRecalculateObject = null;
......
......@@ -79,11 +79,16 @@ Paragraph.prototype.Recalculate_FastWholeParagraph = function()
// последнюю строку на pageBreak/columnBreak, а во время пересчета смотрим изменяeтся ли положение
// flow-объектов, привязанных к данному параграфу, кроме того, если по какой-то причине пересчет возвращает
// не recalcresult_NextElement, тогда тоже отменяем быстрый пересчет
this.m_oPRSW.SetFast(true);
var OldBounds = this.Pages[0].Bounds;
var isPageBreakLastLine1 = this.Lines[this.Lines.length - 1].Info & paralineinfo_BreakPage;
var isPageBreakLastLine2 = this.Lines[this.Lines.length - 1].Info & paralineinfo_BreakRealPage;
var FastRecalcResult = this.Recalculate_Page(0, true);
this.m_oPRSW.SetFast(false);
if (FastRecalcResult & recalcresult_NextElement
&& 1 === this.Pages.length
&& true === this.Pages[0].Bounds.Compare(OldBounds)
......@@ -118,12 +123,17 @@ Paragraph.prototype.Recalculate_FastWholeParagraph = function()
var OldLinesCount_0 = this.Pages[0].EndLine - this.Pages[0].StartLine + 1;
var OldLinesCount_1 = this.Pages[1].EndLine - this.Pages[1].StartLine + 1;
var FastRecalcResult = this.Recalculate_Page(0, true);
this.m_oPRSW.SetFast(true);
var FastRecalcResult = this.Recalculate_Page(0, true);
if (!(FastRecalcResult & recalcresult_NextPage))
return [];
if (!(FastRecalcResult & recalcresult_NextPage))
{
this.m_oPRSW.SetFast(false);
return [];
}
FastRecalcResult = this.Recalculate_Page(1);
this.m_oPRSW.SetFast(false);
if (!(FastRecalcResult & recalcresult_NextElement))
return [];
......@@ -252,6 +262,8 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
var PrevLine = Line;
var PrevRange = Range;
this.m_oPRSW.SetFast(true);
while ( PrevLine >= 0 )
{
PrevRange--;
......@@ -317,7 +329,10 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
{
var TempResult = this.private_RecalculateFastRange(CurRange, CurLine);
if ( -1 === TempResult )
return -1;
{
this.m_oPRSW.SetFast(false);
return -1;
}
if ( CurLine === Line && CurRange === Range )
Result = TempResult;
......@@ -339,12 +354,13 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
//console.log("Recalc Fast Range");
this.m_oPRSW.SetFast(false);
return this.Get_AbsolutePage(Result);
};
/**
* Функция для пересчета страницы параграфа.
* @param {number} PageIndex - Номер страницы, которую нужно пересчитать (относительный номер страницы для параграфа).
* @param {number} CurPage - Номер страницы, которую нужно пересчитать (относительный номер страницы для параграфа).
* Предыдущая страница ДОЛЖНА быть пересчитана, если задано не нулевое значение.
* @returns {*} Возвращается результат пересчета
*/
......@@ -1307,6 +1323,9 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa
Bottom += ParaPr.Brd.Between.Space;
}
// TODO: Здесь нужно сделать корректировку YLimit с учетом сносок. Надо разобраться почему вообще здесь
// используется this.YLimit вместо Page.YLimit
if ( false === this.Parent.Is_TableCellContent() && Bottom > this.YLimit && Bottom - this.YLimit <= ParaPr.Spacing.After )
Bottom = this.YLimit;
}
......@@ -1343,14 +1362,31 @@ Paragraph.prototype.private_RecalculateLineBottomBound = function(CurLine, CurPa
var RealCurPage = this.private_GetRelativePageIndex(CurPage) - this.Get_StartPage_Relative();
var YLimit = PRS.YLimit;
var oTopDocument = PRS.TopDocument;
var bNoFootnotes = true;
if (oTopDocument instanceof CDocument && oTopDocument.Footnotes.GetHeight(PRS.PageAbs, PRS.ColumnAbs) > 0.001)
bNoFootnotes = false;
if (oTopDocument instanceof CDocument)
{
// bNoFootnotes - означает есть или нет сноска на данной колонке
var nHeight = oTopDocument.Footnotes.GetHeight(PRS.PageAbs, PRS.ColumnAbs);
if (nHeight > 0.001)
{
bNoFootnotes = false;
YLimit -= nHeight;
}
}
else if (oTopDocument instanceof CFootEndnote)
{
// bNoFootnotes - означает, первая или нет данная сноска в колонке. Если она не первая,
// тогда если у нее не убирается первая строка первого параграфа, все равно надо делать перенос
var oLogicDocument = this.LogicDocument;
if (true !== oLogicDocument.Footnotes.IsEmptyPageColumn(PRS.PageAbs, PRS.ColumnAbs))
bNoFootnotes = false;
}
// Сначала проверяем не нужно ли сделать перенос страницы в данном месте
// Перенос не делаем, если это первая строка на новой странице
if (true === this.Use_YLimit() && (Top > PRS.YLimit || Bottom2 > PRS.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: Неразрывные абзацы и висячие строки внутри колонок вместе с плавающими объектами пока не обсчитываем
var bSkipWidowAndKeepLines = this.private_CheckSkipKeepLinesAndWidowControl(CurPage);
......@@ -1835,56 +1871,84 @@ Paragraph.prototype.private_RecalculateLineCheckFootnotes = function(CurLine, Cu
if (!((PRS.RecalcResult & recalcresult_NextElement) || (PRS.RecalcResult & recalcresult_NextLine)))
return false;
var oTopDocument = PRS.TopDocument;
for (var nIndex = 0, nCount = PRS.Footnotes.length; nIndex < nCount; ++nIndex)
{
var oFootnote = PRS.Footnotes[nIndex].FootnoteReference.Get_Footnote();
var oPos = PRS.Footnotes[nIndex].Pos;
// Проверим позицию
if (true === this.MoveToLBP && PRS.LineBreakPos.Compare(oPos) >= 0)
return true;
// TODO: Здесь надо разобраться с параграфами внутри таблицы.
if (oTopDocument instanceof CDocument)
{
var RecalcInfo = oTopDocument.RecalcInfo;
var nPageAbs = PRS.PageAbs;
var nColumnAbs = PRS.ColumnAbs;
if (true === RecalcInfo.Can_RecalcObject())
{
RecalcInfo.Set_FootnoteReference(oFootnote, nPageAbs, nColumnAbs);
oTopDocument.Footnotes.AddFootnoteToPage(nPageAbs, nColumnAbs, oFootnote, this.Pages[CurPage].Y + this.Lines[CurLine].Bottom);
PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column | recalcresultflags_Footnotes;
return false;
}
else if (true === RecalcInfo.Check_FootnoteReference(oFootnote))
{
if (true === RecalcInfo.Is_PageBreakBefore())
{
//PRS.RecalcResult
}
if (PRS.Fast)
return true;
if (nPageAbs === RecalcInfo.FootnotePage && nColumnAbs === RecalcInfo.FootnoteColumn)
{
// Все нормально пересчиталось
RecalcInfo.Reset_FootnoteReference();
}
else
{
// TODO: Реализовать
RecalcInfo.Set_PageBreakBefore(true);
oTopDocument.Footnotes.RemoveFootnoteFromPage(nPageAbs, nColumnAbs, oFootnote);
PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column | recalcresultflags_Footnotes;
return false;
}
}
else
{
// Ничего не делаем, просто пропускаем ссылку на данную сноску
}
}
}
var oTopDocument = PRS.TopDocument;
// for (var nIndex = 0, nCount = PRS.Footnotes.length; nIndex < nCount; ++nIndex)
// {
// var oFootnote = PRS.Footnotes[nIndex].FootnoteReference.Get_Footnote();
// var oPos = PRS.Footnotes[nIndex].Pos;
//
// // Проверим позицию
// if (true === this.MoveToLBP && PRS.LineBreakPos.Compare(oPos) >= 0)
// return true;
//
// // TODO: Здесь надо разобраться с параграфами внутри таблицы.
// if (oTopDocument instanceof CDocument)
// {
// var RecalcInfo = oTopDocument.RecalcInfo;
// var nPageAbs = PRS.PageAbs;
// var nColumnAbs = PRS.ColumnAbs;
// if (true === RecalcInfo.Can_RecalcObject())
// {
// RecalcInfo.Set_FootnoteReference(oFootnote, nPageAbs, nColumnAbs);
// oTopDocument.Footnotes.AddFootnoteToPage(nPageAbs, nColumnAbs, oFootnote, this.Pages[CurPage].Y + this.Lines[CurLine].Bottom);
// PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column | recalcresultflags_Footnotes;
// return false;
// }
// else if (true === RecalcInfo.Check_FootnoteReference(oFootnote))
// {
// if (true === RecalcInfo.Is_PageBreakBefore())
// {
// //PRS.RecalcResult
// }
//
// if (nPageAbs === RecalcInfo.FootnotePage && nColumnAbs === RecalcInfo.FootnoteColumn)
// {
// // Все нормально пересчиталось
// RecalcInfo.Reset_FootnoteReference();
// }
// else
// {
// // TODO: Реализовать
// RecalcInfo.Set_PageBreakBefore(true);
// oTopDocument.Footnotes.RemoveFootnoteFromPage(nPageAbs, nColumnAbs, oFootnote);
// PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column | recalcresultflags_Footnotes;
// return false;
// }
// }
// else
// {
// // Ничего не делаем, просто пропускаем ссылку на данную сноску
// }
// }
// }
var arrFootnotes = [];
for (var nIndex = 0, nCount = PRS.Footnotes.length; nIndex < nCount; ++nIndex)
{
var oFootnote = PRS.Footnotes[nIndex].FootnoteReference.Get_Footnote();
var oPos = PRS.Footnotes[nIndex].Pos;
// Проверим позицию
if (true === this.MoveToLBP && PRS.LineBreakPos.Compare(oPos) >= 0)
return true;
arrFootnotes.push(oFootnote);
}
if (oTopDocument instanceof CDocument)
{
if (oTopDocument.Footnotes.RecalculateFootnotes(PRS.PageAbs, PRS.ColumnAbs, this.Pages[CurPage].Y + this.Lines[CurLine].Bottom, arrFootnotes))
{
// Все нормально
}
else
{
console.log("Данную строчку нужно перенести на новую строку");
}
}
return true;
};
......@@ -2527,6 +2591,8 @@ function CParagraphRecalculateStateWrap(Para)
this.PageAbs = 0;
this.ColumnAbs = 0;
this.Fast = false; // Быстрый ли пересчет
//
this.Page = 0;
this.Line = 0;
......@@ -2946,7 +3012,12 @@ CParagraphRecalculateStateWrap.prototype =
Add_FootnoteReference : function(FootnoteReference, Pos)
{
this.Footnotes.push({FootnoteReference : FootnoteReference, Pos : Pos});
}
},
SetFast : function(bValue)
{
this.Fast = bValue;
}
};
function CParagraphRecalculateStateCounter()
......
......@@ -1404,7 +1404,7 @@ ParaRun.prototype.Is_SimpleChanges = function(Changes)
// нельзя обсчитывать функцией Recalculate_Fast.
// TODO: Но на самом деле стоило бы сделать нормальную проверку на высоту строки в функции Recalculate_Fast
var ItemType = Item.Type;
if (para_Drawing === ItemType || para_NewLine === ItemType)
if (para_Drawing === ItemType || para_NewLine === ItemType || para_FootnoteRef === ItemType || para_FootnoteReference === ItemType)
return false;
// Проверяем, что все изменения произошли в одном и том же отрезке
......
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