Commit 11ee4292 authored by Ilya Kirillov's avatar Ilya Kirillov

Handled the situation when a reference footnote lies inside a table.

parent 7fb3f2d8
......@@ -8424,6 +8424,10 @@ CDocumentContent.prototype.Get_StartPage_Relative = function()
{
return this.StartPage;
};
CDocumentContent.prototype.Get_StartColumn_Absolute = function()
{
return this.Get_AbsoluteColumn(0);
};
CDocumentContent.prototype.Set_StartPage = function(StartPage, StartColumn, ColumnsCount)
{
this.StartPage = StartPage;
......@@ -8459,6 +8463,11 @@ CDocumentContent.prototype.Get_AbsoluteColumn = function(CurPage)
};
CDocumentContent.prototype.private_GetColumnIndex = function(CurPage)
{
// TODO: Разобраться здесь нужно ли данное условие. Оно появилось из-за параграфов в таблице в
// основной части документа и из-за параграфов в сносках.
if (1 === this.ColumnsCount)
return this.Parent.Get_AbsoluteColumn(this.private_GetRelativePageIndex(CurPage));
return (this.StartColumn + CurPage) - (((this.StartColumn + CurPage) / this.ColumnsCount | 0) * this.ColumnsCount);
};
//-----------------------------------------------------------------------------------
......
......@@ -247,6 +247,8 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
if (!oColumn)
return true;
var isLowerY = (Y < oColumn.ReferenceY + 0.001 ? true : false);
if (oColumn.GetContinuesElements().length > 0)
{
// Если уже есть элементы, которые переносятся, тогда данные сноски точно не убирутся
......@@ -254,7 +256,7 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
// на следующую страницу. Такое возможно в таблицах, когда сноски расположены в разных ячейках одной строки,
// причем вторая сноска выше первой.
if (Y < oColumn.ReferenceY)
if (isLowerY)
{
oColumn.AddContinuesElements(arrFootnotes);
return true;
......@@ -273,7 +275,7 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
var _Y = oColumn.Height;
var _YLimit = oColumn.YLimit - Y;
if (Y < oColumn.ReferenceY)
if (isLowerY)
_YLimit = oColumn.YLimit - oColumn.ReferenceY;
if (oColumn.Elements.length <= 0 && null !== this.SeparatorFootnote)
......@@ -303,7 +305,7 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
{
// Если у нас первая сноска не убирается, тогда мы переносим. Есть исключение, когда мы находимся в таблице
// и у нас уже есть сноски на странице, а ссылка на данную сноску выше чем те, которые мы уже добавили.
if (0 === nIndex && true !== oFootnote.Is_ContentOnFirstPage() && (0 === oColumn.Elements.length || Y > oColumn.ReferenceY))
if (0 === nIndex && true !== oFootnote.Is_ContentOnFirstPage() && (0 === oColumn.Elements.length || !isLowerY))
return false;
// Начиная с данной сноски мы все оставшиеся сноски заносим в массив ContinuesElements у данной колонки
......@@ -327,7 +329,7 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
oColumn.Height = Math.min(_YLimit, oColumn.Height);
if (oColumn.ReferenceY < Y)
if (!isLowerY)
oColumn.ReferenceY = Y;
return true;
......@@ -422,9 +424,30 @@ CFootnotesController.prototype.GetFootnoteNumberOnPage = function(nPageAbs, nCol
// Мы делаем не совсем как в Word, если у нас происходит ситуация, что ссылка на сноску на одной странице, а сама
// сноска на следующей, тогда у этих страниц нумерация общая, в Word ставится номер "1" в такой ситуации, и становится
// непонятно, потому что есть две ссылки с номером 1 на странице, ссылающиеся на разные сноски.
// В таблицах сами сноски могут переносится на другую колонку, а ссылки будут оставаться на данной, и они пока еще
// не рассчитаны и никуда не добавлены, поэтому нам также надо учитывать количество переносимы сносок на следующую
// колонку.
var nAdditional = 0;
for (var nColumnIndex = nColumnAbs; nColumnIndex >= 0; --nColumnIndex)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnIndex);
if (nColumnIndex === nColumnAbs)
{
var arrContinuesElements = oColumn.GetContinuesElements();
if (arrContinuesElements.length > 0)
{
var oFootnote = arrContinuesElements[0];
var nStartPage = oFootnote.Get_StartPage_Absolute();
var nStartColumn = oFootnote.Get_StartColumn_Absolute();
if (nStartPage === nPageAbs && nStartColumn === nColumnAbs && true !== oFootnote.Is_ContentOnFirstPage())
nAdditional = arrContinuesElements.length;
else
nAdditional = arrContinuesElements.length - 1;
}
}
if (oColumn.Elements.length > 0)
{
......@@ -432,9 +455,9 @@ CFootnotesController.prototype.GetFootnoteNumberOnPage = function(nPageAbs, nCol
var nStartPage = oFootnote.Get_StartPage_Absolute();
if (nStartPage >= nPageAbs || (nStartPage === nPageAbs - 1 && true !== oFootnote.Is_ContentOnFirstPage()))
return oFootnote.GetNumber() + 1;
return oFootnote.GetNumber() + 1 + nAdditional;
else
return 1;
return 1 + nAdditional;
}
}
......@@ -2995,8 +3018,8 @@ CFootEndnotePageColumn.prototype.SaveRecalculateObject = function()
oColumn.ContinuesElements = this.ContinuesElements;
oColumn.SeparatorRecalculateObject = this.SeparatorRecalculateObject;
oColumn.ContinuationSeparatorRecalculateObject = this.SeparatorRecalculateObject;
oColumn.ContinuationNoticeRecalculateObject = this.ContinuationSeparatorRecalculateObject;
oColumn.ContinuationSeparatorRecalculateObject = this.ContinuationSeparatorRecalculateObject;
oColumn.ContinuationNoticeRecalculateObject = this.ContinuationNoticeRecalculateObject;
return oColumn;
};
CFootEndnotePageColumn.prototype.LoadRecalculateObject = function(oObject)
......@@ -3018,38 +3041,16 @@ CFootEndnotePageColumn.prototype.LoadRecalculateObject = function(oObject)
this.ContinuesElements = oObject.ContinuesElements;
this.SeparatorRecalculateObject = oObject.SeparatorRecalculateObject;
this.ContinuationSeparatorRecalculateObject = oObject.SeparatorRecalculateObject;
this.ContinuationNoticeRecalculateObject = oObject.ContinuationSeparatorRecalculateObject;
this.ContinuationSeparatorRecalculateObject = oObject.ContinuationSeparatorRecalculateObject;
this.ContinuationNoticeRecalculateObject = oObject.ContinuationNoticeRecalculateObject;
};
function CFootEndnotePage()
{
this.X = 0;
this.Y = 0;
this.XLimit = 0;
this.YLimit = 0;
this.Elements = [];
this.SeparatorRecalculateObject = null;
this.ContinuationSeparatorRecalculateObject = null;
this.ContinuationNoticeRecalculateObject = null;
this.Columns = [];
}
CFootEndnotePage.prototype.Reset = function()
{
this.X = 0;
this.Y = 0;
this.XLimit = 0;
this.YLimit = 0;
this.Elements = [];
this.SeparatorRecalculateObject = null;
this.ContinuationSeparatorRecalculateObject = null;
this.ContinuationNoticeRecalculateObject = null;
this.Columns = [];
};
CFootEndnotePage.prototype.AddColumn = function(oColumn)
......
......@@ -1377,7 +1377,10 @@ Paragraph.prototype.private_RecalculateLineBottomBound = function(CurLine, CurPa
if (nHeight > 0.001)
{
bNoFootnotes = false;
YLimit -= nHeight;
// В таблицах граница разруливается по своему
if (true !== PRS.IsInTable())
YLimit -= nHeight;
}
}
else if (oTopDocument instanceof CFootEndnote)
......@@ -2548,6 +2551,7 @@ function CParagraphRecalculateStateWrap(Para)
this.TopDocument = null;
this.PageAbs = 0;
this.ColumnAbs = 0;
this.InTable = false;
this.Fast = false; // Быстрый ли пересчет
......@@ -2668,6 +2672,7 @@ CParagraphRecalculateStateWrap.prototype =
this.TopDocument = Paragraph.Parent.Get_TopDocumentContent();
this.PageAbs = Paragraph.Get_AbsolutePage(CurPage);
this.ColumnAbs = Paragraph.Get_AbsoluteColumn(CurPage);
this.InTable = Paragraph.Parent.Is_TableCellContent();
this.RunRecalcInfoLast = (0 === CurPage ? null : Paragraph.Pages[CurPage - 1].EndInfo.RunRecalcInfo);
this.RunRecalcInfoBreak = this.RunRecalcInfoLast;
......@@ -3027,6 +3032,10 @@ CParagraphRecalculateStateWrap.prototype.LoadFootnotesInfo = function()
if (oTopDocument instanceof CDocument && this.FootnotesRecalculateObject)
oTopDocument.Footnotes.LoadRecalculateObject(this.PageAbs, this.ColumnAbs, this.FootnotesRecalculateObject);
};
CParagraphRecalculateStateWrap.prototype.IsInTable = function()
{
return this.InTable;
};
function CParagraphRecalculateStateCounter()
{
......
......@@ -1621,9 +1621,10 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
if ( true === this.TurnOffRecalc )
return;
var isInnerTable = this.Parent.Is_TableCellContent();
var oTopDocument = this.Parent.Is_TopDocument(true);
var isTopLogicDocument = (oTopDocument instanceof CDocument ? true : false);
var oFootnotes = (isTopLogicDocument? oTopDocument.Footnotes : null);
var oFootnotes = (isTopLogicDocument && !isInnerTable ? oTopDocument.Footnotes : null);
var nPageAbs = this.Get_AbsolutePage(CurPage);
var nColumnAbs = this.Get_AbsoluteColumn(CurPage);
......@@ -2111,7 +2112,7 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
{
if (true === bResetFootnotes && oFootnotes)
{
oFootnotesObject = oFootnotes.SaveRecalculateObject();
oFootnotesObject = oFootnotes.SaveRecalculateObject(nPageAbs, nColumnAbs);
nFootnotesHeight = oFootnotes.GetHeight(nPageAbs, nColumnAbs);
nSavedY = Y;
nSavedTableHeight = TableHeight;
......@@ -2215,9 +2216,6 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
var VerticallCells = [];
var bAllCellsVertical = true;
var bNeedRecalcFootnotes = false;
var nCurFootnotesHeight = 0;
for ( var CurCell = 0; CurCell < CellsCount; CurCell++ )
{
var Cell = Row.Get_Cell( CurCell );
......@@ -2233,7 +2231,7 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
var X_content_end = Page.X + CellMetrics.X_content_end;
var Y_content_start = Y + CellMar.Top.W;
var Y_content_end = this.Pages[CurPage].YLimit + nFootnotesHeight;
var Y_content_end = this.Pages[CurPage].YLimit - nFootnotesHeight;
// TODO: При расчете YLimit для ячейки сделать учет толщины нижних
// границ ячейки и таблицы
......@@ -2372,27 +2370,18 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
}
}
if (oFootnotes)
{
nCurFootnotesHeight = oFootnotes.GetHeight(nPageAbs, nColumnAbs);
if (Math.abs(nCurFootnotesHeight - nFootnotesHeight) > 0.001)
{
bNeedRecalcFootnotes = true;
break;
}
}
CurGridCol += GridSpan;
}
if (true === bNeedRecalcFootnotes && nCurFootnotesHeight > nFootnotesHeight)
var nCurFootnotesHeight = oFootnotes ? oFootnotes.GetHeight(nPageAbs, nColumnAbs) : 0;
if (oFootnotes && nCurFootnotesHeight > nFootnotesHeight + 0.001)
{
nFootnotesHeight = nCurFootnotesHeight;
bResetFootnotes = false;
Y = nSavedY;
TableHeight = nSavedTableHeight;
oFootnotes.LoadRecalculateObject(oFootnotesObject);
oFootnotes.LoadRecalculateObject(nPageAbs, nColumnAbs, oFootnotesObject);
CurRow--;
continue;
......
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