Commit b2d4fbf8 authored by Ilya Kirillov's avatar Ilya Kirillov

Fix bug #25106 Пустой параграф после вложенной таблицы теперь отображается...

Fix bug #25106 Пустой параграф после вложенной таблицы теперь отображается справа от таблицы и не портит рассчет файла.
parent fbf22433
......@@ -3249,37 +3249,6 @@ CDocument.prototype.private_RecalculateFlowParagraphCount = function(Index)
return FlowCount;
};
CDocument.prototype.private_RecalculateEmptySectionParagraph = function(Element, PrevElement, PageIndex, ColumnIndex, ColumnsCount)
{
var LastVisibleBounds = PrevElement.Get_LastRangeVisibleBounds();
var ___X = LastVisibleBounds.X + LastVisibleBounds.W;
var ___Y = LastVisibleBounds.Y;
// Чтобы у нас знак разрыва секции рисовался красиво и где надо делаем небольшую хитрость:
// перед пересчетом данного параграфа меняем в нем в скомпилированных настройках прилегание и
// отступы, а после пересчета помечаем, что настройки нужно скомпилировать заново.
var CompiledPr = Element.Get_CompiledPr2(false).ParaPr;
CompiledPr.Jc = align_Left;
CompiledPr.Ind.FirstLine = 0;
CompiledPr.Ind.Left = 0;
CompiledPr.Ind.Right = 0;
// Делаем предел по X минимум 10 мм, чтобы всегда было видно элемент разрыва секции
Element.Reset(___X, ___Y, Math.max(___X + 10, LastVisibleBounds.XLimit), 10000, PageIndex, ColumnIndex, ColumnsCount);
Element.Recalculate_Page(0);
Element.Recalc_CompiledPr();
// Меняем насильно размер строки и страницы данного параграфа, чтобы у него границы попадания и
// селект были ровно такие же как и у последней строки предыдущего элемента.
Element.Pages[0].Y = ___Y;
Element.Lines[0].Top = 0;
Element.Lines[0].Y = LastVisibleBounds.BaseLine;
Element.Lines[0].Bottom = LastVisibleBounds.H;
Element.Pages[0].Bounds.Top = ___Y;
Element.Pages[0].Bounds.Bottom = ___Y + LastVisibleBounds.H;
};
CDocument.prototype.OnColumnBreak_WhileRecalculate = function()
{
var PageIndex = this.FullRecalc.PageIndex;
......
......@@ -1008,8 +1008,24 @@ CDocumentContent.prototype.Recalculate_Page = function(PageIndex,
Element.Reset(X, Y, XLimit, YLimit, PageIndex, 0, 1);
}
var ElementPageIndex = this.private_GetElementPageIndex(Index, PageIndex, 0, 1);
RecalcResult = Element.Recalculate_Page(ElementPageIndex);
if (Index === Count - 1 && Index > 0 && type_Paragraph === Element.GetType() && type_Table === this.Content[Index - 1].GetType() && true === Element.IsEmpty() && true === this.Is_TableCellContent())
{
RecalcResult = recalcresult_NextElement;
this.private_RecalculateEmptySectionParagraph(Element, this.Content[Index - 1], PageIndex, 0, 1);
// Добавим в список особых параграфов
this.Pages[PageIndex].EndSectionParas.push(Element);
// Выставляем этот флаг, чтобы у нас не менялось значение по Y
bFlow = true;
}
else
{
var ElementPageIndex = this.private_GetElementPageIndex(Index, PageIndex, 0, 1);
RecalcResult = Element.Recalculate_Page(ElementPageIndex);
}
}
Element.TurnOn_RecalcEvent();
......@@ -8127,17 +8143,27 @@ CDocumentContent.prototype.Table_CheckSplit = function()
//-----------------------------------------------------------------------------------
CDocumentContent.prototype.Internal_GetContentPosByXY = function(X, Y, PageNum)
{
if (undefined === PageNum)
if (undefined === PageNum || null === PageNum)
PageNum = this.CurPage;
// TODO: изенить здесь
PageNum = Math.min(PageNum, this.Pages.length - 1);
PageNum = Math.max(0, Math.min(PageNum, this.Pages.length - 1));
// Сначала проверим Flow-таблицы
var FlowTable = this.LogicDocument && this.LogicDocument.DrawingObjects.getTableByXY(X, Y, PageNum + this.Get_StartPage_Absolute(), this);
if (null != FlowTable)
return FlowTable.Table.Index;
// Теперь проверим пустые параграфы с окончанием секций (в нашем случае это пустой параграф послей таблицы внутри таблицы)
var SectCount = this.Pages[PageNum].EndSectionParas.length;
for (var Index = 0; Index < SectCount; ++Index)
{
var Item = this.Pages[PageNum].EndSectionParas[Index];
var Bounds = Item.Pages[0].Bounds;
if (Y < Bounds.Bottom && Y > Bounds.Top && X > Bounds.Left && X < Bounds.Right)
return Item.Index;
}
var StartPos = Math.min(this.Pages[PageNum].Pos, this.Content.length - 1);
var EndPos = this.Content.length - 1;
......@@ -8149,7 +8175,9 @@ CDocumentContent.prototype.Internal_GetContentPosByXY = function(X, Y, PageNum)
for (var Index = StartPos; Index <= EndPos; Index++)
{
var Item = this.Content[Index];
if (type_Table != Item.GetType() || false != Item.Is_Inline())
var bEmptySectPara = this.Pages[PageNum].Check_EndSectionPara(Item);
if (false != Item.Is_Inline() && (type_Table === Item.GetType() || false === bEmptySectPara))
InlineElements.push(Index);
}
......
......@@ -46,4 +46,42 @@ CDocumentContentBase.prototype.private_ReindexContent = function(StartPos)
if (-1 === this.ReindexStartPos || this.ReindexStartPos > StartPos)
this.ReindexStartPos = StartPos;
};
/**
* Специальная функия для рассчета пустого параграфа с разрывом секции.
* @param Element
* @param PrevElement
* @param PageIndex
* @param ColumnIndex
* @param ColumnsCount
*/
CDocumentContentBase.prototype.private_RecalculateEmptySectionParagraph = function(Element, PrevElement, PageIndex, ColumnIndex, ColumnsCount)
{
var LastVisibleBounds = PrevElement.Get_LastRangeVisibleBounds();
var ___X = LastVisibleBounds.X + LastVisibleBounds.W;
var ___Y = LastVisibleBounds.Y;
// Чтобы у нас знак разрыва секции рисовался красиво и где надо делаем небольшую хитрость:
// перед пересчетом данного параграфа меняем в нем в скомпилированных настройках прилегание и
// отступы, а после пересчета помечаем, что настройки нужно скомпилировать заново.
var CompiledPr = Element.Get_CompiledPr2(false).ParaPr;
CompiledPr.Jc = align_Left;
CompiledPr.Ind.FirstLine = 0;
CompiledPr.Ind.Left = 0;
CompiledPr.Ind.Right = 0;
// Делаем предел по X минимум 10 мм, чтобы всегда было видно элемент разрыва секции
Element.Reset(___X, ___Y, Math.max(___X + 10, LastVisibleBounds.XLimit), 10000, PageIndex, ColumnIndex, ColumnsCount);
Element.Recalculate_Page(0);
Element.Recalc_CompiledPr();
// Меняем насильно размер строки и страницы данного параграфа, чтобы у него границы попадания и
// селект были ровно такие же как и у последней строки предыдущего элемента.
Element.Pages[0].Y = ___Y;
Element.Lines[0].Top = 0;
Element.Lines[0].Y = LastVisibleBounds.BaseLine;
Element.Lines[0].Bottom = LastVisibleBounds.H;
Element.Pages[0].Bounds.Top = ___Y;
Element.Pages[0].Bounds.Bottom = ___Y + LastVisibleBounds.H;
};
\ No newline at end of file
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