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