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