Commit dad5a280 authored by Ilya Kirillov's avatar Ilya Kirillov

Bug fix #32499 Исправлен баг с зависанием пересчета, когда в параграфе есть...

Bug fix #32499 Исправлен баг с зависанием пересчета, когда в параграфе есть автофигура с обтеканием, размерами больше страницы, и находящаяся не в последней колонке.
parent 4c6efb1d
...@@ -2221,8 +2221,8 @@ CDocument.prototype.Recalculate_PageColumn = function() ...@@ -2221,8 +2221,8 @@ CDocument.prototype.Recalculate_PageColumn = function()
var StartIndex = this.FullRecalc.StartIndex; var StartIndex = this.FullRecalc.StartIndex;
var bResetStartElement = this.FullRecalc.ResetStartElement; var bResetStartElement = this.FullRecalc.ResetStartElement;
//console.log("Page " + PageIndex + " Section " + SectionIndex + " Column " + ColumnIndex + " Element " + StartIndex); // console.log("Page " + PageIndex + " Section " + SectionIndex + " Column " + ColumnIndex + " Element " + StartIndex);
//console.log(this.RecalcInfo); // console.log(this.RecalcInfo);
var StartPos = this.Get_PageContentStartPos2(PageIndex, ColumnIndex, 0, StartIndex); var StartPos = this.Get_PageContentStartPos2(PageIndex, ColumnIndex, 0, StartIndex);
...@@ -2569,6 +2569,40 @@ CDocument.prototype.Recalculate_PageColumn = function() ...@@ -2569,6 +2569,40 @@ CDocument.prototype.Recalculate_PageColumn = function()
break; break;
} }
else if (RecalcResult & recalcresultflags_Page)
{
PageColumn.EndPos = Index;
PageSection.EndPos = Index;
Page.EndPos = Index;
bContinue = true;
_SectionIndex = 0;
_ColumnIndex = 0;
_PageIndex = PageIndex + 1;
_StartIndex = Index;
_bStart = true;
if (PageColumn.EndPos === PageColumn.Pos)
{
var Element = this.Content[PageColumn.Pos];
var ElementPageIndex = this.private_GetElementPageIndex(Index, PageIndex, ColumnIndex, ColumnsCount);
if (true === Element.Is_EmptyPage(ElementPageIndex))
PageColumn.Empty = true;
}
for (var TempColumnIndex = ColumnIndex + 1; TempColumnIndex < ColumnsCount; ++TempColumnIndex)
{
var ElementPageIndex = this.private_GetElementPageIndex(Index, PageIndex, TempColumnIndex, ColumnsCount);
this.Content[Index].Recalculate_SkipPage(ElementPageIndex);
PageSection.Columns[TempColumnIndex].Empty = true;
PageSection.Columns[TempColumnIndex].Pos = Index;
PageSection.Columns[TempColumnIndex].EndPos = Index - 1;
}
break;
}
else else
{ {
PageColumn.EndPos = Index; PageColumn.EndPos = Index;
......
...@@ -312,8 +312,8 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges) ...@@ -312,8 +312,8 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
/** /**
* Функция для пересчета страницы параграфа. * Функция для пересчета страницы параграфа.
* @param PageIndex номер страницы, которую нужно пересчитать. Этот номер считается относительно нумерации * @param {number} PageIndex - Номер страницы, которую нужно пересчитать (относительный номер страницы для параграфа).
* родительского класса. * Предыдущая страница ДОЛЖНА быть пересчитана, если задано не нулевое значение.
* @returns {*} Возвращается результат пересчета * @returns {*} Возвращается результат пересчета
*/ */
Paragraph.prototype.Recalculate_Page = function(PageIndex) Paragraph.prototype.Recalculate_Page = function(PageIndex)
...@@ -338,6 +338,32 @@ Paragraph.prototype.Recalculate_Page = function(PageIndex) ...@@ -338,6 +338,32 @@ Paragraph.prototype.Recalculate_Page = function(PageIndex)
return RecalcResult; return RecalcResult;
}; };
/**
* Функция для пересчета страницы параграфа, так чтобы на данной странице ничего не было. Применяется, когда из-за
* пересчета плавающей автофигуры нужно сразу перейти на следующую страницу, пропустив несколько колонок.
* @param {number} PageIndex - Номер страницы, пересчет которой мы пропускаем. (предыдущая страница ДОЛЖНА быть
* пересчитана, если это не нулевое значение)
*/
Paragraph.prototype.Recalculate_SkipPage = function(PageIndex)
{
if (0 === PageIndex)
{
this.Start_FromNewPage();
}
else
{
var PrevPage = this.Pages[PageIndex - 1];
var EndLine = Math.max(PrevPage.StartLine, PrevPage.EndLine); // На случай, если предыдущая страница тоже пустая
var NewPage = new CParaPage(PrevPage.X, PrevPage.Y, PrevPage.XLimit, PrevPage.YLimit, EndLine);
NewPage.StartLine = EndLine;
NewPage.EndLine = EndLine - 1;
NewPage.TextPr = PrevPage.TextPr;
this.Pages[PageIndex] = NewPage;
}
};
/** /**
* Функция для сохранения объекта пересчета. * Функция для сохранения объекта пересчета.
* @returns {*} Возвращается объект (CParagraphRecalculateObject) с информацией о текущем пересчете параграфа * @returns {*} Возвращается объект (CParagraphRecalculateObject) с информацией о текущем пересчете параграфа
......
...@@ -2732,7 +2732,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2732,7 +2732,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if (null != Para.Get_DocumentPrev() && true != Para.Parent.Is_TableCellContent() && 0 === CurPage) if (null != Para.Get_DocumentPrev() && true != Para.Parent.Is_TableCellContent() && 0 === CurPage)
{ {
Para.Recalculate_Drawing_AddPageBreak(0, 0, true); Para.Recalculate_Drawing_AddPageBreak(0, 0, true);
PRS.RecalcResult = recalcresult_NextPage; PRS.RecalcResult = recalcresult_NextPage | recalcresultflags_Page;
PRS.NewRange = true; PRS.NewRange = true;
return; return;
} }
...@@ -2741,7 +2741,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2741,7 +2741,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if (ParaLine != Para.Pages[CurPage].FirstLine) if (ParaLine != Para.Pages[CurPage].FirstLine)
{ {
Para.Recalculate_Drawing_AddPageBreak(ParaLine, CurPage, false); Para.Recalculate_Drawing_AddPageBreak(ParaLine, CurPage, false);
PRS.RecalcResult = recalcresult_NextPage; PRS.RecalcResult = recalcresult_NextPage | recalcresultflags_Page;
PRS.NewRange = true; PRS.NewRange = true;
return; return;
} }
......
...@@ -33,6 +33,24 @@ CTable.prototype.Recalculate_Page = function(PageIndex) ...@@ -33,6 +33,24 @@ CTable.prototype.Recalculate_Page = function(PageIndex)
return Result; return Result;
}; };
CTable.prototype.Recalculate_SkipPage = function(PageIndex)
{
if (0 === PageIndex)
{
this.Start_FromNewPage();
}
else
{
var PrevPage = this.Pages[PageIndex - 1];
var LastRow = Math.max(PrevPage.FirstRow, PrevPage.LastRow); // На случай, если предыдущая страница тоже пустая
var NewPage = new CTablePage(PrevPage.X, PrevPage.Y, PrevPage.XLimit, PrevPage.YLimit, LastRow, PrevPage.MaxTopBorder);
NewPage.FirstRow = LastRow;
NewPage.LastRow = LastRow - 1;
this.Pages[PageIndex] = NewPage;
}
};
CTable.prototype.Recalculate_Grid = function() CTable.prototype.Recalculate_Grid = function()
{ {
this.private_RecalculateGrid(); this.private_RecalculateGrid();
......
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