Commit 84e33633 authored by Ilya Kirillov's avatar Ilya Kirillov

Worked out the situation when document ends on a long footnote.

parent 91aac575
...@@ -1977,122 +1977,128 @@ CDocument.prototype.Recalculate = function(bOneParagraph, bRecalcContentLast, _R ...@@ -1977,122 +1977,128 @@ CDocument.prototype.Recalculate = function(bOneParagraph, bRecalcContentLast, _R
} }
} }
if (-1 === RecalcData.Inline.Pos && -1 === SectPrIndex) if (-1 === RecalcData.Inline.Pos && -1 === SectPrIndex)
{ {
// Никаких изменений не было ни с самим документом, ни секциями // Никаких изменений не было ни с самим документом, ни секциями
ChangeIndex = -1; ChangeIndex = -1;
RecalcData.Inline.PageNum = 0; RecalcData.Inline.PageNum = 0;
} }
else if (-1 === RecalcData.Inline.Pos) else if (-1 === RecalcData.Inline.Pos)
{ {
// Были изменения только внутри секций // Были изменения только внутри секций
MainChange = false; MainChange = false;
// Выставляем начало изменений на начало секции // Выставляем начало изменений на начало секции
ChangeIndex = ( 0 === SectPrIndex ? 0 : this.SectionsInfo.Get_SectPr2(SectPrIndex - 1).Index + 1 ); ChangeIndex = ( 0 === SectPrIndex ? 0 : this.SectionsInfo.Get_SectPr2(SectPrIndex - 1).Index + 1 );
RecalcData.Inline.PageNum = 0; RecalcData.Inline.PageNum = 0;
} }
else if (-1 === SectPrIndex) else if (-1 === SectPrIndex)
{ {
// Изменения произошли только внутри основного документа // Изменения произошли только внутри основного документа
MainChange = true; MainChange = true;
ChangeIndex = RecalcData.Inline.Pos; ChangeIndex = RecalcData.Inline.Pos;
} }
else else
{ {
// Изменения произошли и внутри документа, и внутри секций. Смотрим на более ранюю точку начала изменений // Изменения произошли и внутри документа, и внутри секций. Смотрим на более ранюю точку начала изменений
// для секций и основоной части документа. // для секций и основоной части документа.
MainChange = true; MainChange = true;
ChangeIndex = RecalcData.Inline.Pos; ChangeIndex = RecalcData.Inline.Pos;
var ChangeIndex2 = ( 0 === SectPrIndex ? 0 : this.SectionsInfo.Get_SectPr2(SectPrIndex - 1).Index + 1 ); var ChangeIndex2 = ( 0 === SectPrIndex ? 0 : this.SectionsInfo.Get_SectPr2(SectPrIndex - 1).Index + 1 );
if (ChangeIndex2 <= ChangeIndex) if (ChangeIndex2 <= ChangeIndex)
{ {
ChangeIndex = ChangeIndex2; ChangeIndex = ChangeIndex2;
RecalcData.Inline.PageNum = 0; RecalcData.Inline.PageNum = 0;
} }
} }
if (ChangeIndex < 0) if (ChangeIndex < 0)
{ {
this.DrawingDocument.ClearCachePages(); this.DrawingDocument.ClearCachePages();
this.DrawingDocument.FirePaint(); this.DrawingDocument.FirePaint();
return; return;
} }
else if (ChangeIndex >= this.Content.length)
{
ChangeIndex = this.Content.length - 1;
}
// Здсь мы должны проверить предыдущие элементы на наличие параматра KeepNext // Найдем начальную страницу, с которой мы начнем пересчет
while (ChangeIndex > 0) var StartPage = 0;
{ var StartIndex = 0;
var PrevElement = this.Content[ChangeIndex - 1];
if (type_Paragraph === PrevElement.Get_Type() && true === PrevElement.Get_CompiledPr2(false).ParaPr.KeepNext)
{
ChangeIndex--;
RecalcData.Inline.PageNum = PrevElement.Get_StartPage_Absolute() + (PrevElement.Pages.length - 1); // считаем, что изменилась последняя страница
}
else
{
break;
}
}
// Найдем начальную страницу, с которой мы начнем пересчет if (ChangeIndex >= this.Content.length)
var StartPage = 0; {
var StartIndex = 0; // Сюда мы попадаем при рассчете сносок, которые выходят за пределы самого документа
StartIndex = this.Content.length;
StartPage = RecalcData.Inline.PageNum;
}
else
{
var ChangedElement = this.Content[ChangeIndex]; // Здсь мы должны проверить предыдущие элементы на наличие параматра KeepNext
if (ChangedElement.Pages.length > 0 && -1 !== ChangedElement.Index && ChangedElement.Get_StartPage_Absolute() < RecalcData.Inline.PageNum - 1) while (ChangeIndex > 0)
{ {
StartIndex = ChangeIndex; var PrevElement = this.Content[ChangeIndex - 1];
StartPage = RecalcData.Inline.PageNum - 1; if (type_Paragraph === PrevElement.Get_Type() && true === PrevElement.Get_CompiledPr2(false).ParaPr.KeepNext)
} {
else ChangeIndex--;
{ RecalcData.Inline.PageNum = PrevElement.Get_StartPage_Absolute() + (PrevElement.Pages.length - 1); // считаем, что изменилась последняя страница
var PagesCount = this.Pages.length; }
for (var PageIndex = 0; PageIndex < PagesCount; PageIndex++) else
{ {
if (ChangeIndex > this.Pages[PageIndex].Pos) break;
{ }
StartPage = PageIndex; }
StartIndex = this.Pages[PageIndex].Pos;
}
else
break;
}
if (ChangeIndex === StartIndex && StartPage < RecalcData.Inline.PageNum) var ChangedElement = this.Content[ChangeIndex];
StartPage = RecalcData.Inline.PageNum - 1; if (ChangedElement.Pages.length > 0 && -1 !== ChangedElement.Index && ChangedElement.Get_StartPage_Absolute() < RecalcData.Inline.PageNum - 1)
} {
StartIndex = ChangeIndex;
StartPage = RecalcData.Inline.PageNum - 1;
}
else
{
var PagesCount = this.Pages.length;
for (var PageIndex = 0; PageIndex < PagesCount; PageIndex++)
{
if (ChangeIndex > this.Pages[PageIndex].Pos)
{
StartPage = PageIndex;
StartIndex = this.Pages[PageIndex].Pos;
}
else
break;
}
// Если у нас уже начался долгий пересчет, тогда мы его останавливаем, и запускаем новый с текущими параметрами. if (ChangeIndex === StartIndex && StartPage < RecalcData.Inline.PageNum)
// Здесь возможен случай, когда мы долгий пересчет основной части документа останавливаем из-за пересчета StartPage = RecalcData.Inline.PageNum - 1;
// колонтитулов, в этом случае параметр MainContentPos не меняется, и мы будем пересчитывать только колонтитулы }
// либо до страницы, на которой они приводят к изменению основную часть документа, либо до страницы, где
// остановился предыдущий пересчет.
if (null != this.FullRecalc.Id) // Если у нас уже начался долгий пересчет, тогда мы его останавливаем, и запускаем новый с текущими параметрами.
{ // Здесь возможен случай, когда мы долгий пересчет основной части документа останавливаем из-за пересчета
clearTimeout(this.FullRecalc.Id); // колонтитулов, в этом случае параметр MainContentPos не меняется, и мы будем пересчитывать только колонтитулы
this.FullRecalc.Id = null; // либо до страницы, на которой они приводят к изменению основную часть документа, либо до страницы, где
this.DrawingDocument.OnEndRecalculate(false); // остановился предыдущий пересчет.
if (this.FullRecalc.StartIndex < StartIndex) if (null != this.FullRecalc.Id)
{ {
StartIndex = this.FullRecalc.StartIndex; clearTimeout(this.FullRecalc.Id);
StartPage = this.FullRecalc.PageIndex; this.FullRecalc.Id = null;
} this.DrawingDocument.OnEndRecalculate(false);
}
else if (null !== this.HdrFtrRecalc.Id) if (this.FullRecalc.StartIndex < StartIndex)
{ {
clearTimeout(this.HdrFtrRecalc.Id); StartIndex = this.FullRecalc.StartIndex;
this.HdrFtrRecalc.Id = null; StartPage = this.FullRecalc.PageIndex;
this.DrawingDocument.OnEndRecalculate(false); }
}
else if (null !== this.HdrFtrRecalc.Id)
{
clearTimeout(this.HdrFtrRecalc.Id);
this.HdrFtrRecalc.Id = null;
this.DrawingDocument.OnEndRecalculate(false);
}
} }
this.HdrFtrRecalc.PageCount = -1; this.HdrFtrRecalc.PageCount = -1;
...@@ -2758,34 +2764,53 @@ CDocument.prototype.Recalculate_PageColumn = function() ...@@ -2758,34 +2764,53 @@ CDocument.prototype.Recalculate_PageColumn = function()
if (Index >= Count) if (Index >= Count)
{ {
this.Internal_CheckCurPage(); // Пересчет основной части документа законечен. Возможна ситуация, при которой последние сноски с данной
this.DrawingDocument.OnEndRecalculate(true); // страницы переносятся на следующую (т.е. остались непересчитанные сноски). Эти сноски нужно пересчитать
this.DrawingObjects.onEndRecalculateDocument(this.Pages.length); if (this.Footnotes.HaveContinuesFootnotes(PageIndex, ColumnIndex))
{
bContinue = true;
_PageIndex = PageIndex;
_ColumnIndex = ColumnIndex + 1;
if (_ColumnIndex >= ColumnsCount)
{
_ColumnIndex = 0;
_PageIndex = PageIndex + 1;
}
if (true === this.Selection.UpdateOnRecalc) _bStart = true;
{ _StartIndex = Count;
this.Selection.UpdateOnRecalc = false; }
this.DrawingDocument.OnSelectEnd(); else
} {
this.Internal_CheckCurPage();
this.DrawingDocument.OnEndRecalculate(true);
this.DrawingObjects.onEndRecalculateDocument(this.Pages.length);
this.FullRecalc.Id = null; if (true === this.Selection.UpdateOnRecalc)
this.FullRecalc.MainStartPos = -1; {
this.Selection.UpdateOnRecalc = false;
this.DrawingDocument.OnSelectEnd();
}
// Основной пересчет окончен, если в колонтитулах есть элемент с количеством страниц, тогда нам надо this.FullRecalc.Id = null;
// запустить дополнительный пересчет колонтитулов. this.FullRecalc.MainStartPos = -1;
// Если так случилось, что после повторного полного пересчета, вызванного изменением количества страниц и
// изменением метрик колонтитула, новое количество страниц стало меньше, чем раньше, тогда мы не пересчитываем
// дальше, чтобы избежать зацикливаний.
if (-1 === this.HdrFtrRecalc.PageCount || this.HdrFtrRecalc.PageCount < this.Pages.length) // Основной пересчет окончен, если в колонтитулах есть элемент с количеством страниц, тогда нам надо
{ // запустить дополнительный пересчет колонтитулов.
this.HdrFtrRecalc.PageCount = this.Pages.length; // Если так случилось, что после повторного полного пересчета, вызванного изменением количества страниц и
var nPageCountStartPage = this.HdrFtr.HavePageCountElement(); // изменением метрик колонтитула, новое количество страниц стало меньше, чем раньше, тогда мы не пересчитываем
if (-1 !== nPageCountStartPage) // дальше, чтобы избежать зацикливаний.
if (-1 === this.HdrFtrRecalc.PageCount || this.HdrFtrRecalc.PageCount < this.Pages.length)
{ {
this.DrawingDocument.OnStartRecalculate(nPageCountStartPage); this.HdrFtrRecalc.PageCount = this.Pages.length;
this.HdrFtrRecalc.PageIndex = nPageCountStartPage; var nPageCountStartPage = this.HdrFtr.HavePageCountElement();
this.private_RecalculateHdrFtrPageCountUpdate(); if (-1 !== nPageCountStartPage)
{
this.DrawingDocument.OnStartRecalculate(nPageCountStartPage);
this.HdrFtrRecalc.PageIndex = nPageCountStartPage;
this.private_RecalculateHdrFtrPageCountUpdate();
}
} }
} }
} }
......
...@@ -488,6 +488,16 @@ CFootnotesController.prototype.LoadRecalculateObject = function(nPageAbs, nColum ...@@ -488,6 +488,16 @@ CFootnotesController.prototype.LoadRecalculateObject = function(nPageAbs, nColum
oColumn.LoadRecalculateObject(oRObject); oColumn.LoadRecalculateObject(oRObject);
}; };
CFootnotesController.prototype.HaveContinuesFootnotes = function(nPageAbs, nColumnAbs)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs);
if (!oColumn)
return false;
var arrContinues = oColumn.GetContinuesElements();
return (arrContinues.length > 0 ? true : false);
};
/** /**
* Проверяем, используется заданная сноска в документе. * Проверяем, используется заданная сноска в документе.
* @param {string} sFootnoteId * @param {string} sFootnoteId
......
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