Commit de293bc9 authored by Ilya Kirillov's avatar Ilya Kirillov

Fixed several bugs with calculating of a footnote when a reference for this...

Fixed several bugs with calculating of a footnote when a reference for this footnote is lying inside a table. Also was handled situation when footnote reference is lying inside a rotated cell.
parent f113d6ae
......@@ -70,6 +70,8 @@ function CFootnotesController(LogicDocument)
Direction : 0
};
this.CellLimits = []; // Для рассчета сносок, встречающихся в ячейках с минимальной или фиксированной высотой строки
this.CurFootnote = null;
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
......@@ -234,11 +236,11 @@ CFootnotesController.prototype.ContinueElementsFromPreviousColumn = function(nPa
* Рассчитываем сноски, которые перенеслись с предыдущей колонки
* @param {number} nPageAbs
* @param {number} nColumnAbs
* @param {number} Y
* @param {number} dY
* @param {Array.CFootEndnote} arrFootnotes
* @returns {boolean} true - расчиталось нормально, и перенос делать не надо, false - данные сноски перенеслись на следующую страницу
*/
CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumnAbs, Y, arrFootnotes)
CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumnAbs, dY, arrFootnotes)
{
if (!arrFootnotes || arrFootnotes.length <= 0)
return true;
......@@ -247,6 +249,13 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
if (!oColumn)
return true;
var Y = dY;
for (var nIndex = 0, nCount = this.CellLimits.length; nIndex < nCount; ++nIndex)
{
if (Y < this.CellLimits[nIndex] - 0.001)
Y = this.CellLimits[nIndex];
}
var isLowerY = (Y < oColumn.ReferenceY + 0.001 ? true : false);
if (oColumn.GetContinuesElements().length > 0)
......@@ -418,6 +427,14 @@ CFootnotesController.prototype.Shift = function(nPageAbs, nColumnAbs, dX, dY)
oFootnote.Shift(nFootnotePageIndex, dX, dY);
}
};
CFootnotesController.prototype.PushCellLimit = function(dY)
{
this.CellLimits.push(dY);
};
CFootnotesController.prototype.PopCellLimit = function()
{
this.CellLimits.length = Math.max(0, this.CellLimits.length - 1);
};
CFootnotesController.prototype.GetFootnoteNumberOnPage = function(nPageAbs, nColumnAbs)
{
// Случай, когда своя отдельная нумерация на каждой странице
......@@ -437,16 +454,7 @@ CFootnotesController.prototype.GetFootnoteNumberOnPage = function(nPageAbs, nCol
{
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;
}
nAdditional = arrContinuesElements.length - 1;
}
if (oColumn.Elements.length > 0)
......
......@@ -66,6 +66,11 @@ CTable.prototype.Draw = function(CurPage, pGraphics)
if (Row_last < Row_start)
return -1;
// Данный случай добавлен из-за сносок. Когда у таблицы на данной страницы ничего не убирается.
// TODO: Надо улучшить данную проверку, т.к. она не учитывает ситуацию с вложенными таблицами.
if (Row_start === Row_last && Math.abs(this.RowsInfo[Row_last].H[CurPage] - this.RowsInfo[Row_last].TopDy[CurPage]) < 0.001)
return -1;
pGraphics.SaveGrState();
var bIsSmartGrForcing = false;
......
......@@ -2204,6 +2204,27 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
if (-1 === X_max || Row_x_max > X_max)
X_max = Row_x_max;
var MaxTopMargin = 0;
for (var CurCell = 0; CurCell < CellsCount; CurCell++)
{
var Cell = Row.Get_Cell(CurCell);
var Vmerge = Cell.Get_VMerge();
var CellMar = Cell.Get_Margins();
if (vmerge_Restart === Vmerge && CellMar.Top.W > MaxTopMargin)
MaxTopMargin = CellMar.Top.W;
}
var RowH = Row.Get_Height();
var RowHValue = RowH.Value;
// В данном значении не учитываются маргины
RowHValue = RowH.Value + this.MaxBotMargin[CurRow] + MaxTopMargin;
if (oFootnotes && (Asc.linerule_AtLeast === RowH.HRule || Asc.linerule_Exact == RowH.HRule))
{
oFootnotes.PushCellLimit(Y + RowHValue);
}
// Дополнительный параметр для случая, если данная строка начнется с новой страницы.
// Мы запоминаем максимальное значение нижней границы(первой страницы (текущей)) у ячеек,
// объединенных вертикально так, чтобы это объединение заканчивалось на данной строке.
......@@ -2211,8 +2232,6 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
// мы должны данный параметр сравнить со значением нижней границы предыдущей строки.
var MaxBotValue_vmerge = -1;
var RowH = Row.Get_Height();
var MaxTopMargin = 0;
var Merged_Cell = [];
var VerticallCells = [];
var bAllCellsVertical = true;
......@@ -2248,9 +2267,6 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
var BottomMargin = this.MaxBotMargin[CurRow + VMergeCount - 1];
Y_content_end -= BottomMargin;
if (vmerge_Restart === Vmerge && CellMar.Top.W > MaxTopMargin)
MaxTopMargin = CellMar.Top.W;
// Такие ячейки мы обсчитываем, если либо сейчас происходит переход на новую страницу, либо
// это последняя ячейка в объединении.
// Обсчет такик ячеек произошел ранее
......@@ -2374,6 +2390,11 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
CurGridCol += GridSpan;
}
if (oFootnotes && (Asc.linerule_AtLeast === RowH.HRule || Asc.linerule_Exact == RowH.HRule))
{
oFootnotes.PopCellLimit();
}
var nCurFootnotesHeight = oFootnotes ? oFootnotes.GetHeight(nPageAbs, nColumnAbs) : 0;
if (oFootnotes && nCurFootnotesHeight > nFootnotesHeight + 0.001)
{
......@@ -2397,11 +2418,6 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
if (undefined === this.TableRowsBottom[CurRow][CurPage])
this.TableRowsBottom[CurRow][CurPage] = Y;
var RowHValue = RowH.Value;
// В данном значении не учитываются маргины
RowHValue = RowH.Value + this.MaxBotMargin[CurRow] + MaxTopMargin;
// Если в строке все ячейки с вертикальным выравниванием
if (true === bAllCellsVertical && Asc.linerule_Auto === RowH.HRule)
this.TableRowsBottom[CurRow][CurPage] = Y + 4.5 + this.MaxBotMargin[CurRow] + MaxTopMargin;
......@@ -2635,12 +2651,13 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
var CellHeight = this.TableRowsBottom[CurRow][CurPage] - Y;
// TODO: улучшить проверку на высоту строки (для строк разбитых на страницы)
if ( false === bNextPage && Asc.linerule_AtLeast === RowH.HRule && CellHeight < RowHValue )
{
CellHeight = RowHValue;
this.TableRowsBottom[CurRow][CurPage] = Y + CellHeight;
}
// TODO: улучшить проверку на высоту строки (для строк разбитых на страницы)
// Условие Y + RowHValue < Y_content_end добавлено из-за сносок.
if (false === bNextPage && Asc.linerule_AtLeast === RowH.HRule && CellHeight < RowHValue && Y + RowHValue < Y_content_end)
{
CellHeight = RowHValue;
this.TableRowsBottom[CurRow][CurPage] = Y + CellHeight;
}
// Рассчитываем ячейки с вертикальным текстом
var CellsCount2 = VerticallCells.length;
......@@ -2703,6 +2720,27 @@ CTable.prototype.private_RecalculatePage = function(CurPage)
}
}
// Еще раз проверим, были ли сноски
var nCurFootnotesHeight = oFootnotes ? oFootnotes.GetHeight(nPageAbs, nColumnAbs) : 0;
if (oFootnotes && nCurFootnotesHeight > nFootnotesHeight + 0.001)
{
this.Pages[CurPage].FootnotesH = nCurFootnotesHeight;
nFootnotesHeight = nCurFootnotesHeight;
bResetFootnotes = false;
Y = nSavedY;
TableHeight = nSavedTableHeight;
oFootnotes.LoadRecalculateObject(nPageAbs, nColumnAbs, oFootnotesObject);
CurRow--;
continue;
}
else
{
bResetFootnotes = true;
}
if ( null != CellSpacing )
this.RowsInfo[CurRow].H[CurPage] = CellHeight;
else
......
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