Commit 9f7bc1ae authored by Ilya Kirillov's avatar Ilya Kirillov

Implemented NumRestart and NumStart values for indexing of a footnotes.

parent f8406989
......@@ -43,6 +43,7 @@ function CFootEndnote(DocumentController)
CFootEndnote.superclass.constructor.call(this, DocumentController, DocumentController ? DocumentController.Get_DrawingDocument() : undefined, 0, 0, 0, 0, true, false, false);
this.Number = 1;
this.SectPr = null;
}
AscCommon.extendClass(CFootEndnote, CDocumentContent);
......@@ -76,14 +77,19 @@ CFootEndnote.prototype.Read_FromBinary2 = function(Reader)
Reader.GetLong(); // Должен вернуть historyitem_type_DocumentContent
CFootEndnote.superclass.Read_FromBinary2.call(this, Reader);
};
CFootEndnote.prototype.SetNumber = function(nNumber)
CFootEndnote.prototype.SetNumber = function(nNumber, oSectPr)
{
this.Number = nNumber;
this.SectPr = oSectPr;
};
CFootEndnote.prototype.GetNumber = function()
{
return this.Number;
};
CFootEndnote.prototype.GetReferenceSectPr = function()
{
return this.SectPr;
};
//--------------------------------------------------------export----------------------------------------------------
window['AscCommonWord'] = window['AscCommonWord'] || {};
......
......@@ -549,39 +549,117 @@ CFootnotesController.prototype.PopCellLimit = function()
{
this.CellLimits.length = Math.max(0, this.CellLimits.length - 1);
};
CFootnotesController.prototype.GetFootnoteNumberOnPage = function(nPageAbs, nColumnAbs)
CFootnotesController.prototype.GetFootnoteNumberOnPage = function(nPageAbs, nColumnAbs, oSectPr)
{
// Случай, когда своя отдельная нумерация на каждой странице
// Мы делаем не совсем как в Word, если у нас происходит ситуация, что ссылка на сноску на одной странице, а сама
// сноска на следующей, тогда у этих страниц нумерация общая, в Word ставится номер "1" в такой ситуации, и становится
// непонятно, потому что есть две ссылки с номером 1 на странице, ссылающиеся на разные сноски.
var nNumRestart = section_footnote_RestartEachPage;
var nNumStart = 1;
if (oSectPr)
{
nNumRestart = oSectPr.GetFootnoteNumRestart();
nNumStart = oSectPr.GetFootnoteNumStart();
}
// В таблицах сами сноски могут переносится на другую колонку, а ссылки будут оставаться на данной, и они пока еще
// не рассчитаны и никуда не добавлены, поэтому нам также надо учитывать количество переносимы сносок на следующую
// колонку.
var nAdditional = 0;
// NumStart никак не влияет в случаях RestartEachPage и RestartEachSect. Влияет только на случай RestartContinious:
// к общему количеству сносок добавляется данное значение, взятое для текущей секции, этоже значение из предыдущих
// секций не учитывается.
for (var nColumnIndex = nColumnAbs; nColumnIndex >= 0; --nColumnIndex)
if (section_footnote_RestartEachPage === nNumRestart)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnIndex);
if (nColumnIndex === nColumnAbs)
// Случай, когда своя отдельная нумерация на каждой странице
// Мы делаем не совсем как в 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)
nAdditional = arrContinuesElements.length - 1;
}
if (oColumn.Elements.length > 0)
{
var oFootnote = oColumn.Elements[oColumn.Elements.length - 1];
var nStartPage = oFootnote.Get_StartPage_Absolute();
if (nStartPage >= nPageAbs || (nStartPage === nPageAbs - 1 && true !== oFootnote.Is_ContentOnFirstPage()))
return oFootnote.GetNumber() + 1 + nAdditional;
else
return 1 + nAdditional;
}
}
}
else if (section_footnote_RestartEachSect === nNumRestart)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs);
if (oColumn)
{
var arrContinuesElements = oColumn.GetContinuesElements();
if (arrContinuesElements.length > 0)
nAdditional = arrContinuesElements.length - 1;
if (arrContinuesElements.length > 0 && oColumn.Elements.length > 0)
{
var oFootnote = oColumn.Elements[oColumn.Elements.length - 1];
if (oFootnote.GetReferenceSectPr() !== oSectPr)
return 1;
// Второе условие не нужно, потому что если arrContinuesElements.length > 0, то на такой колонке
// пусть и пустая но должна быть хоть одна сноска рассчитана
return oColumn.Elements[oColumn.Elements.length - 1].GetNumber() + 1 + arrContinuesElements.length;
}
}
if (oColumn.Elements.length > 0)
// Дальше мы ищем колонку, на которой была последняя сноска. Заметим, что переносы сносок мы не проверяем, т.к.
// их не может быть вплоть до последней сноски, а что последняя сноска не переносится мы проверили выше.
for (var nPageIndex = nPageAbs; nPageIndex >= 0; --nPageIndex)
{
var oFootnote = oColumn.Elements[oColumn.Elements.length - 1];
var nStartPage = oFootnote.Get_StartPage_Absolute();
var nColumnStartIndex = (nPageIndex === nPageAbs ? nColumnAbs : this.Pages[nPageAbs].Columns.length - 1);
for (var nColumnIndex = nColumnStartIndex; nColumnIndex >= 0; --nColumnIndex)
{
oColumn = this.private_GetPageColumn(nPageIndex, nColumnIndex);
if (oColumn && oColumn.Elements.length > 0)
{
var oFootnote = oColumn.Elements[oColumn.Elements.length - 1];
if (oFootnote.GetReferenceSectPr() !== oSectPr)
return 1;
if (nStartPage >= nPageAbs || (nStartPage === nPageAbs - 1 && true !== oFootnote.Is_ContentOnFirstPage()))
return oFootnote.GetNumber() + 1 + nAdditional;
else
return 1 + nAdditional;
return oColumn.Elements[oColumn.Elements.length - 1].GetNumber() + 1;
}
}
}
}
else// if (section_footnote_RestartContinious === nNumRestart)
{
// Здесь нам надо считать, сколько сносок всего в документе до данного момента, отталкиваться от предыдущей мы
// не можем, потому что Word считает общее количество сносок, а не продолжает нумерацию с предыдущей секции,
// т.е. после последнего номера 4 в старой секции, в новой секции может идти уже, например, 9.
var nFootnotesCount = 0;
for (var nPageIndex = nPageAbs; nPageIndex >= 0; --nPageIndex)
{
var nColumnStartIndex = (nPageIndex === nPageAbs ? nColumnAbs : this.Pages[nPageAbs].Columns.length - 1);
for (var nColumnIndex = nColumnStartIndex; nColumnIndex >= 0; --nColumnIndex)
{
oColumn = this.private_GetPageColumn(nPageIndex, nColumnIndex);
if (oColumn && oColumn.Elements.length > 0)
{
var oFirstFootnote = oColumn.Elements[0];
if (oFirstFootnote.Pages.length > 1)
nFootnotesCount += oColumn.Elements.length - 1;
else
nFootnotesCount += oColumn.Elements.length;
}
}
}
return nFootnotesCount + nNumStart;
}
return 1;
......
......@@ -13411,7 +13411,7 @@ Paragraph.prototype.Is_TrackRevisions = function()
};
/**
* Отличие данной функции от Get_SectionPr в том, что здесь возвращаются настройки секции, к которой
* принадлежит данный параграф, а там конкретно настройки секции, которыы лежат в данном параграфе.
* принадлежит данный параграф, а там конкретно настройки секции, которые лежат в данном параграфе.
*/
Paragraph.prototype.Get_SectPr = function()
{
......
......@@ -7667,12 +7667,13 @@ ParaFootnoteReference.prototype.UpdateNumber = function(PRS)
var nPageAbs = PRS.GetPageAbs();
var nColumnAbs = PRS.GetColumnAbs();
var nAdditional = PRS.GetFootnoteReferencesCount(this);
var oSectPr = PRS.GetSectPr();
var oLogicDocument = this.Footnote.Get_LogicDocument();
var oFootnotesController = oLogicDocument.GetFootnotesController();
this.Number = oFootnotesController.GetFootnoteNumberOnPage(nPageAbs, nColumnAbs) + nAdditional;
this.Number = oFootnotesController.GetFootnoteNumberOnPage(nPageAbs, nColumnAbs, oSectPr) + nAdditional;
this.private_Measure();
this.Footnote.SetNumber(this.Number);
this.Footnote.SetNumber(this.Number, oSectPr);
}
};
ParaFootnoteReference.prototype.private_Measure = function()
......
......@@ -2552,6 +2552,7 @@ function CParagraphRecalculateStateWrap(Para)
this.PageAbs = 0;
this.ColumnAbs = 0;
this.InTable = false;
this.SectPr = null; // настройки секции, к которой относится данный параграф
this.Fast = false; // Быстрый ли пересчет
......@@ -2673,6 +2674,7 @@ CParagraphRecalculateStateWrap.prototype =
this.PageAbs = Paragraph.Get_AbsolutePage(CurPage);
this.ColumnAbs = Paragraph.Get_AbsoluteColumn(CurPage);
this.InTable = Paragraph.Parent.Is_TableCellContent();
this.SectPr = null;
this.RunRecalcInfoLast = (0 === CurPage ? null : Paragraph.Pages[CurPage - 1].EndInfo.RunRecalcInfo);
this.RunRecalcInfoBreak = this.RunRecalcInfoLast;
......@@ -3036,6 +3038,13 @@ CParagraphRecalculateStateWrap.prototype.IsInTable = function()
{
return this.InTable;
};
CParagraphRecalculateStateWrap.prototype.GetSectPr = function()
{
if (null === this.SectPr && this.Paragraph)
this.SectPr = this.Paragraph.Get_SectPr();
return this.SectPr;
};
function CParagraphRecalculateStateCounter()
{
......
......@@ -1892,7 +1892,7 @@ CSectionPr.prototype.SetFootnoteNumStart = function(nStart)
CSectionPr.prototype.GetFootnoteNumStart = function()
{
if (undefined === this.FootnotePr.NumStart)
return this.private_GetDocumentWideFootnotePr().NumStart;
return 1;
return this.FootnotePr.NumStart;
};
......
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