Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

2830 lines
84 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
// Import
var global_MatrixTransformer = AscCommon.global_MatrixTransformer;
//----------------------------------------------------------------------------------------------------------------------
// Класс CTableCell
//----------------------------------------------------------------------------------------------------------------------
function CTableCell(Row, ColW)
{
this.Id = AscCommon.g_oIdCounter.Get_NewId();
this.Row = Row;
this.Prev = null;
this.Next = null;
this.Content = new CDocumentContent(this, (undefined !== this.Row ? this.Row.Table.DrawingDocument : undefined), 0, 0, 0, 0, false, false, undefined !== this.Row ? this.Row.Table.bPresentation : undefined);
this.Content.Set_StartPage( ( Row ? this.Row.Table.PageNum : 0 ) );
this.CompiledPr =
{
Pr : null, // настройки ячейки
TextPr : null, // настройки текста
ParaPr : null, // настройки параграфа
NeedRecalc : true
};
this.Pr = new CTableCellPr();
if ( undefined != ColW )
this.Pr.TableCellW = new CTableMeasurement(tblwidth_Mm, ColW);
// Массивы с рассчитанными стилями для границ данной ячейки.
// В каждом элементе лежит массив стилей.
this.BorderInfo = {
Top : null,
Left : null,
Right : null,
Bottom : null, // Используется для последней строки таблицы,
TopHeader : null, // Используется для первой строки таблицы с заголовком на странице
Bottom_BeforeCount : -1, // когда Spacing = null(у последней строки) или когда в следущей строке
Bottom_AfterCount : -1, // GridBefore и/или GridAfter отлично от 0.
MaxLeft : 0,
MaxRight : 0
};
// Метрики данной ячейки(они все относительные, а не абсолютные). Абсолютные хранятся в строке
this.Metrics =
{
StartGridCol : 0,
X_grid_start : 0,
X_grid_end : 0,
X_cell_start : 0,
X_cell_end : 0,
X_content_start : 0,
X_content_end : 0
};
this.Temp =
{
Y : 0,
CurPage : 0,
X_start : 0,
Y_start : 0,
X_end : 0,
Y_end : 0,
X_cell_start : 0,
X_cell_end : 0,
Y_cell_start : 0,
Y_cell_end : 0,
UseClip : false,
ClipTop : 0,
ClipBottom : 0,
Y_VAlign_offset : [] // Сдвиг, который нужно сделать из-за VAlign (массив по страницам)
};
this.CachedMinMax = {
RecalcId : -1,
MinMax : null
};
this.Index = 0;
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
AscCommon.g_oTableId.Add( this, this.Id );
}
CTableCell.prototype =
{
Get_Id : function()
{
return this.Id;
},
GetId : function()
{
return this.Id;
},
Get_Theme : function()
{
return this.Row.Table.Get_Theme();
},
Get_ColorMap: function()
{
return this.Row.Table.Get_ColorMap();
},
Copy : function(Row, oPr)
{
var Cell = new CTableCell(Row);
// Копируем настройки ячейки
Cell.Copy_Pr( this.Pr.Copy(), false );
// Копируем содержимое ячейки
Cell.Content.Copy2(this.Content, oPr);
// Скопируем BorderInfo и метрики, чтобы при копировании строки целиком не надо было их пересчитывать
Cell.BorderInfo.Top = this.BorderInfo.Top;
Cell.BorderInfo.Left = this.BorderInfo.Left;
Cell.BorderInfo.Right = this.BorderInfo.Right;
Cell.BorderInfo.Bottom = this.BorderInfo.Bottom;
Cell.BorderInfo.Bottom_BeforeCount = this.BorderInfo.Bottom_BeforeCount;
Cell.BorderInfo.Bottom_AfterCount = this.BorderInfo.Bottom_AfterCount;
Cell.BorderInfo.MaxLeft = this.BorderInfo.MaxLeft;
Cell.BorderInfo.MaxRight = this.BorderInfo.MaxRight;
Cell.Metrics.StartGridCol = this.Metrics.StartGridCol;
Cell.Metrics.X_grid_start = this.Metrics.X_grid_start;
Cell.Metrics.X_grid_end = this.Metrics.X_grid_end;
Cell.Metrics.X_cell_start = this.Metrics.X_cell_start;
Cell.Metrics.X_cell_end = this.Metrics.X_cell_end;
Cell.Metrics.X_content_start = this.Metrics.X_content_start;
Cell.Metrics.X_content_end = this.Metrics.X_content_end;
return Cell;
},
Set_Metrics : function(StartGridCol, X_grid_start, X_grid_end, X_cell_start, X_cell_end, X_content_start, X_content_end )
{
this.Metrics.StartGridCol = StartGridCol;
this.Metrics.X_grid_start = X_grid_start;
this.Metrics.X_grid_end = X_grid_end;
this.Metrics.X_cell_start = X_cell_start;
this.Metrics.X_cell_end = X_cell_end;
this.Metrics.X_content_start = X_content_start;
this.Metrics.X_content_end = X_content_end;
},
GetEndInfo : function()
{
return this.Content.GetEndInfo();
},
GetPrevElementEndInfo : function(CurElement)
{
return this.Row.GetPrevElementEndInfo( this.Index );
},
SaveRecalculateObject : function()
{
var RecalcObj = new CTableCellRecalculateObject();
RecalcObj.Save( this );
return RecalcObj;
},
LoadRecalculateObject : function(RecalcObj)
{
RecalcObj.Load(this);
},
PrepareRecalculateObject : function()
{
this.BorderInfo =
{
Top : null,
Left : null,
Right : null,
Bottom : null, // Используется для последней строки таблицы,
Bottom_BeforeCount : -1, // когда Spacing = null(у последней строки) или когда в следущей строке
Bottom_AfterCount : -1, // GridBefore и/или GridAfter отлично от 0.
MaxLeft : 0,
MaxRight : 0
};
// Метрики данной ячейки(они все относительные, а не абсолютные). Абсолютные хранятся в строке
this.Metrics =
{
StartGridCol : 0,
X_grid_start : 0,
X_grid_end : 0,
X_cell_start : 0,
X_cell_end : 0,
X_content_start : 0,
X_content_end : 0
};
this.Temp =
{
Y : 0,
CurPage : 0,
Y_VAlign_offset : [] // Сдвиг, который нужно сделать из-за VAlign (массив по страницам)
};
this.Content.PrepareRecalculateObject();
},
//-----------------------------------------------------------------------------------
// Работаем с стилем ячейки
//-----------------------------------------------------------------------------------
Recalc_CompiledPr : function()
{
this.CompiledPr.NeedRecalc = true;
this.Content.Recalc_AllParagraphs_CompiledPr();
var oTable = this.GetTable();
if (oTable)
oTable.RecalcInfo.RecalcBorders();
},
// Формируем конечные свойства параграфа на основе стиля и прямых настроек.
Get_CompiledPr : function(bCopy)
{
let forceCompile = false;
if (true === AscCommon.g_oIdCounter.m_bLoad || true === AscCommon.g_oIdCounter.m_bRead)
{
let logicDocument = this.GetLogicDocument();
if (logicDocument
&& logicDocument.IsDocumentEditor()
&& logicDocument.CompileStyleOnLoad)
forceCompile = true;
}
if ( true === this.CompiledPr.NeedRecalc )
{
if (!forceCompile && (true === AscCommon.g_oIdCounter.m_bLoad || true === AscCommon.g_oIdCounter.m_bRead))
{
this.CompiledPr.Pr = g_oDocumentDefaultTableCellPr;
this.CompiledPr.ParaPr = g_oDocumentDefaultParaPr;
this.CompiledPr.TextPr = g_oDocumentDefaultTextPr;
this.CompiledPr.NeedRecalc = true;
}
else
{
// TODO: Возможно стоит разделить рассчет стиля для ячейки и для текста
var FullPr = this.Internal_Compile_Pr();
this.CompiledPr.Pr = FullPr.CellPr;
this.CompiledPr.ParaPr = FullPr.ParaPr;
this.CompiledPr.TextPr = FullPr.TextPr;
this.CompiledPr.NeedRecalc = forceCompile;
}
}
if ( false === bCopy )
return this.CompiledPr.Pr;
else
return this.CompiledPr.Pr.Copy(); // Отдаем копию объекта, чтобы никто не поменял извне настройки стиля
},
Internal_Compile_Pr : function()
{
var Table = this.Row.Table;
var TablePr = Table.Get_CompiledPr(false);
var TableLook = Table.Get_TableLook();
var CellIndex = this.Index;
var RowIndex = this.Row.Index;
// Сначала возьмем настройки по умолчанию для всей таблицы
var CellPr = TablePr.TableCellPr.Copy();
var ParaPr = TablePr.ParaPr.Copy();
var TextPr;
if(!Table.bPresentation)
{
TextPr = TablePr.TextPr.Copy();
}
else
{
TextPr = TablePr.TableWholeTable.TextPr.Copy();
}
// Совместим настройки с настройками для групп строк. Сначала группы строк, потом группы колонок.
if ( true === TableLook.IsBandHor() )
{
var RowBandSize = TablePr.TablePr.TableStyleRowBandSize;
var __RowIndex = ( true != TableLook.IsFirstRow() ? RowIndex : RowIndex - 1 );
var _RowIndex = ( 1 != RowBandSize ? Math.floor( __RowIndex / RowBandSize ) : __RowIndex );
var TableBandStyle = null;
if ( 0 === _RowIndex % 2 )
TableBandStyle = TablePr.TableBand1Horz;
else
TableBandStyle = TablePr.TableBand2Horz;
CellPr.Merge( TableBandStyle.TableCellPr );
TextPr.Merge( TableBandStyle.TextPr );
ParaPr.Merge( TableBandStyle.ParaPr );
}
// Совместим с настройками для групп колонок
// Согласно спецификации DOCX, совмещать надо всегда. Word проверяет наличие первой колонки не только
// через флаг TableLook.IsFirstCol(), но и самим наличием непустого стиля для первой колонки.
if (true === TableLook.IsBandVer())
{
var bFirstCol = false;
if (true === TableLook.IsFirstCol())
{
var oStyles = this.Get_Styles();
var oTableStyle = oStyles && oStyles.Get(this.Row.Table.Get_TableStyle());
if (oTableStyle && styletype_Table === oTableStyle.Get_Type() && oTableStyle.TableFirstCol)
{
var oCondStyle = oTableStyle.TableFirstCol;
if (true !== oCondStyle.TableCellPr.Is_Empty()
|| true !== oCondStyle.ParaPr.Is_Empty()
|| true !== oCondStyle.TextPr.Is_Empty())
{
bFirstCol = true;
}
}
}
var ColBandSize = TablePr.TablePr.TableStyleColBandSize;
var _ColIndex = ( true != bFirstCol ? CellIndex : CellIndex - 1 );
var ColIndex = ( 1 != ColBandSize ? Math.floor(_ColIndex / ColBandSize) : _ColIndex );
var TableBandStyle = null;
if (0 === ColIndex % 2)
TableBandStyle = TablePr.TableBand1Vert;
else
TableBandStyle = TablePr.TableBand2Vert;
CellPr.Merge(TableBandStyle.TableCellPr);
TextPr.Merge(TableBandStyle.TextPr);
ParaPr.Merge(TableBandStyle.ParaPr);
}
// Совместим настройки с настройками для последней колонки
if ( true === TableLook.IsLastCol() && this.Row.Get_CellsCount() - 1 === CellIndex )
{
CellPr.Merge( TablePr.TableLastCol.TableCellPr );
TextPr.Merge( TablePr.TableLastCol.TextPr );
ParaPr.Merge( TablePr.TableLastCol.ParaPr );
}
// Совместим настройки с настройками для первой колонки
if ( true === TableLook.IsFirstCol() && 0 === CellIndex )
{
CellPr.Merge( TablePr.TableFirstCol.TableCellPr );
TextPr.Merge( TablePr.TableFirstCol.TextPr );
ParaPr.Merge( TablePr.TableFirstCol.ParaPr );
}
// Совместим настройки с настройками для последней строки
if ( true === TableLook.IsLastRow() && Table.Content.length - 1 === RowIndex )
{
CellPr.Merge( TablePr.TableLastRow.TableCellPr );
TextPr.Merge( TablePr.TableLastRow.TextPr );
ParaPr.Merge( TablePr.TableLastRow.ParaPr );
}
// Совместим настройки с настройками для первой строки
if ( true === TableLook.IsFirstRow() && ( 0 === RowIndex || true === this.Row.Pr.TableHeader ) )
{
CellPr.Merge( TablePr.TableFirstRow.TableCellPr );
TextPr.Merge( TablePr.TableFirstRow.TextPr );
ParaPr.Merge( TablePr.TableFirstRow.ParaPr );
}
// Совместим настройки с настройками для правой нижней ячейки
if ( this.Row.Get_CellsCount() - 1 === CellIndex && Table.Content.length - 1 === RowIndex && (!Table.bPresentation || true === TableLook.IsLastRow() && true === TableLook.IsLastCol()))
{
CellPr.Merge( TablePr.TableBRCell.TableCellPr );
TextPr.Merge( TablePr.TableBRCell.TextPr );
ParaPr.Merge( TablePr.TableBRCell.ParaPr );
}
// Совместим настройки с настройками для левой нижней ячейки
if ( 0 === CellIndex && Table.Content.length - 1 === RowIndex && (!Table.bPresentation || true === TableLook.IsLastRow() && true === TableLook.IsFirstCol()))
{
CellPr.Merge( TablePr.TableBLCell.TableCellPr );
TextPr.Merge( TablePr.TableBLCell.TextPr );
ParaPr.Merge( TablePr.TableBLCell.ParaPr );
}
// Совместим настройки с настройками для правой верхней ячейки
if ( this.Row.Get_CellsCount() - 1 === CellIndex && 0 === RowIndex && (!Table.bPresentation || true === TableLook.IsFirstRow() && true === TableLook.IsLastCol()) )
{
CellPr.Merge( TablePr.TableTRCell.TableCellPr );
TextPr.Merge( TablePr.TableTRCell.TextPr );
ParaPr.Merge( TablePr.TableTRCell.ParaPr );
}
// Совместим настройки с настройками для левой верхней ячейки
if ( 0 === CellIndex && 0 === RowIndex && (!Table.bPresentation || true === TableLook.IsFirstRow() && true === TableLook.IsFirstCol()))
{
CellPr.Merge( TablePr.TableTLCell.TableCellPr );
TextPr.Merge( TablePr.TableTLCell.TextPr );
ParaPr.Merge( TablePr.TableTLCell.ParaPr );
}
if ( null === CellPr.TableCellMar && undefined != this.Pr.TableCellMar && null != this.Pr.TableCellMar )
CellPr.TableCellMar = {};
// Полученные настройки совместим с прямыми настройками ячейки
CellPr.Merge( this.Pr );
if(Table.bPresentation)
{
CellPr.Check_PresentationPr(Table.Get_Theme())
}
return { CellPr : CellPr, ParaPr : ParaPr, TextPr : TextPr };
},
//-----------------------------------------------------------------------------------
// Функции, к которым идет обращение из контента
//-----------------------------------------------------------------------------------
OnContentReDraw : function(StartPage, EndPage)
{
this.Row.Table.Parent.OnContentReDraw( StartPage, EndPage );
},
Get_Styles : function(Lvl)
{
return this.Row.Table.Get_Styles(Lvl);
},
Get_TableStyleForPara : function()
{
this.Get_CompiledPr(false);
var TextPr = this.CompiledPr.TextPr.Copy();
var ParaPr = this.CompiledPr.ParaPr.Copy();
return { TextPr : TextPr, ParaPr : ParaPr };
},
Get_ShapeStyleForPara: function()
{
var oTable = this.GetTable();
return oTable ? oTable.Get_ShapeStyleForPara() : null;
},
Get_TextBackGroundColor : function()
{
// Сначала проверим заливку данной ячейки, если ее нет, тогда спрашиваем у таблицы
var Shd = this.Get_Shd();
if (Shd && !Shd.IsNil())
return Shd.GetSimpleColor(this.Get_Theme(), this.Get_ColorMap());
var oTable = this.GetTable();
return oTable ? oTable.Get_TextBackGroundColor() : null;
},
Get_Numbering : function()
{
var oTable = this.GetTable();
return oTable ? oTable.Get_Numbering() : null;
},
IsCell : function(isReturnCell)
{
if (true === isReturnCell)
return this;
return true;
},
IsTableFirstRowOnNewPage : function()
{
var oTable = this.GetTable();
if (!oTable)
return false;
return oTable.IsTableFirstRowOnNewPage(this.GetRow().GetIndex());
},
Check_AutoFit : function()
{
return false;
},
Is_DrawingShape : function(bRetShape)
{
var oTableParent = this.GetTableParent();
if (!oTableParent)
return (bRetShape ? null : false);
return oTableParent.Is_DrawingShape(bRetShape);
},
IsHdrFtr : function(bReturnHdrFtr)
{
var oTableParent = this.GetTableParent();
if (!oTableParent)
return (bReturnHdrFtr ? null : false);
return oTableParent.IsHdrFtr(bReturnHdrFtr);
},
IsFootnote : function(bReturnFootnote)
{
var oTableParent = this.GetTableParent();
if (!oTableParent)
return (bReturnFootnote ? null : false);
return oTableParent.IsFootnote(bReturnFootnote);
},
Is_TopDocument : function(bReturnTopDocument)
{
if (true === bReturnTopDocument)
{
var oTableParent = this.GetTableParent();
if (!oTableParent)
return (bReturnTopDocument ? null : false);
return oTableParent.Is_TopDocument(bReturnTopDocument);
}
return false;
},
IsInTable : function(bReturnTopTable)
{
if (true === bReturnTopTable)
{
var oTable = this.GetTable();
if (!oTable)
return null;
var oTopTable = oTable.Parent ? oTable.Parent.IsInTable(true) : null;
if (oTopTable)
return oTopTable;
else
return oTable;
}
return true;
},
IsUseInDocument : function(Id)
{
if (!this.Row)
return false;
return this.Row.IsUseInDocument(this.GetId());
},
GetPageContentFrame : function(page)
{
return this.Row.Table.GetCellPageContentFrame(page + this.Content.StartPage, this.Row.Index, this.Index);
},
Set_CurrentElement : function(bUpdateStates)
{
var Table = this.Row.Table;
// Делаем данную ячейку текущей в таблице
Table.Selection.Start = false;
Table.Selection.Type = table_Selection_Text;
Table.Selection.Use = this.Content.IsSelectionUse();
Table.Selection.StartPos.Pos = { Row : this.Row.Index, Cell : this.Index };
Table.Selection.EndPos.Pos = { Row : this.Row.Index, Cell : this.Index };
Table.Markup.Internal.RowIndex = 0;
Table.Markup.Internal.CellIndex = 0;
Table.Markup.Internal.PageNum = 0;
Table.CurCell = this;
// Делаем таблицу текущим элементом в документе
Table.Document_SetThisElementCurrent(bUpdateStates);
},
IsThisElementCurrent : function()
{
var Table = this.Row.Table;
if ( false === Table.Selection.Use && this === Table.CurCell )
{
var Parent = Table.Parent;
if ((Parent instanceof AscFormat.CGraphicFrame) || docpostype_Content === Parent.GetDocPosType() && false === Parent.Selection.Use && this.Index === Parent.CurPos.ContentPos )
return Table.Parent.IsThisElementCurrent();
}
return false;
},
CheckTableCoincidence : function(Table)
{
var CurTable = this.Row.Table;
if (Table === CurTable)
return true;
else
return CurTable.Parent.CheckTableCoincidence(Table);
},
//-----------------------------------------------------------------------------------
// Функции для работы с номерами страниц
//-----------------------------------------------------------------------------------
GetAbsoluteStartPage : function()
{
return this.Row.Table.GetAbsoluteStartPage();
},
GetRelativeStartPage : function()
{
return this.Row.Table.GetRelativeStartPage();
},
/**
* Получаем абсолютный номер страницы по относительному номеру страницы (относительно таблицы, а не ячейки!)
* @param CurPage
* @returns {number}
*/
GetAbsolutePage : function(CurPage)
{
return this.Row.Table.GetAbsolutePage(CurPage);
},
/**
* Получаем абсолютный номер колонки по относительному номеру страницы (относительно таблицы, а не ячейки!)
* @param CurPage
* @returns {number}
*/
GetAbsoluteColumn : function(CurPage)
{
return this.Row.Table.GetAbsoluteColumn(CurPage);
},
GetAbsoluteSection : function(curPage)
{
return this.Row.Table.GetAbsoluteSection(curPage);
},
//-----------------------------------------------------------------------------------
// Работаем с содержимым ячейки
//-----------------------------------------------------------------------------------
Get_ParentTextTransform: function()
{
var oParentTransform = this.Row.Table.Get_ParentTextTransform();
var oOwnTransform = this.private_GetTextDirectionTransform();
if(oOwnTransform && oParentTransform)
{
global_MatrixTransformer.MultiplyAppend(oOwnTransform, oParentTransform);
return oOwnTransform;
}
return oParentTransform || oOwnTransform;
},
Content_Reset : function(X, Y, XLimit, YLimit)
{
this.Content.Reset( X, Y, XLimit, YLimit );
this.Content.SetCurPosXY( X, Y );
},
Content_Get_PageBounds : function(PageIndex)
{
return this.Content.Get_PageBounds(PageIndex);
},
Content_Get_PagesCount : function()
{
return this.Content.Get_PagesCount();
},
Content_Draw_Line : function (pGraphics)
{
const oParagraph = this.Content.Get_FirstParagraph();
if (oParagraph)
{
const nLineWidth = oParagraph.XLimit - oParagraph.X;
const nOffset = nLineWidth * 0.2;
const nLeftOffset = oParagraph.X + nOffset;
const nRightOffset = oParagraph.XLimit - nOffset;
const oTextPr = oParagraph.Get_FirstTextPr();
if (oTextPr.Unifill)
{
const oColor = oTextPr.Unifill.getRGBAColor();
pGraphics.p_color(oColor.R, oColor.G, oColor.B, 255);
}
else if (oTextPr.Color)
{
const oColor = oTextPr.Color;
pGraphics.p_color(oColor.r, oColor.g, oColor.b, 255);
}
else
{
pGraphics.p_color(0, 0, 0, 255);
}
pGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, oParagraph.Y + (this.Row.Height / 2), nLeftOffset, nRightOffset, 4 * AscCommon.g_dKoef_pix_to_mm);
}
},
Content_Draw : function(PageIndex, pGraphics)
{
var TextDirection = this.Get_TextDirection();
var bNeedRestore = false;
var _transform = undefined;
if (textdirection_BTLR === TextDirection || textdirection_TBRL === TextDirection)
{
bNeedRestore = true;
pGraphics.SaveGrState();
pGraphics.AddClipRect(this.Temp.X_cell_start, this.Temp.Y_cell_start, this.Temp.X_cell_end - this.Temp.X_cell_start, this.Temp.Y_cell_end - this.Temp.Y_cell_start);
_transform = this.Get_ParentTextTransform();
if (pGraphics.CheckUseFonts2 !== undefined)
pGraphics.CheckUseFonts2(_transform);
pGraphics.transform3(_transform);
}
if (pGraphics.bIsDrawCellTextLines)
{
this.Content_Draw_Line(pGraphics);
}
else
{
this.Content.Draw(PageIndex, pGraphics);
}
if (bNeedRestore)
{
pGraphics.RestoreGrState();
if (pGraphics.UncheckUseFonts2 !== undefined && _transform)
pGraphics.UncheckUseFonts2(_transform);
}
},
Content_Selection_SetStart : function(X, Y, CurPage, MouseEvent)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
this.Content.Selection_SetStart(_X, _Y, CurPage, MouseEvent);
},
Content_Selection_SetEnd : function(X, Y, CurPage, MouseEvent)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
this.Content.Selection_SetEnd(_X, _Y, CurPage, MouseEvent);
},
Content_Selection_Stop : function()
{
return this.Content.Selection_Stop();
},
Content_CheckPosInSelection : function(X, Y, CurPage, NearPos)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.CheckPosInSelection(_X, _Y, CurPage, NearPos);
},
Content_MoveCursorToXY : function(X, Y, bLine, bDontChangeRealPos, CurPage)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
this.Content.MoveCursorToXY(_X, _Y, bLine, bDontChangeRealPos, CurPage);
},
Content_UpdateCursorType : function(X, Y, CurPage)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.UpdateCursorType(_X, _Y, CurPage);
},
Content_DrawSelectionOnPage : function(CurPage)
{
var Transform = this.private_GetTextDirectionTransform();
var DrawingDocument = this.Row.Table.DrawingDocument;
if (null !== Transform && DrawingDocument)
DrawingDocument.MultiplyTargetTransform(Transform);
this.Content.DrawSelectionOnPage(CurPage);
},
Content_RecalculateCurPos : function(bUpdateX, bUpdateY, isUpdateTarget)
{
var Transform = this.private_GetTextDirectionTransform();
var DrawingDocument = this.Row.Table.DrawingDocument;
if (null !== Transform && DrawingDocument)
DrawingDocument.MultiplyTargetTransform(Transform);
return this.Content.RecalculateCurPos(bUpdateX, bUpdateY, isUpdateTarget);
},
Content_Get_NearestPos : function(CurPage, X, Y, bAnchor, Drawing)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.Get_NearestPos(CurPage, _X, _Y, bAnchor, Drawing);
},
Content_Is_TableBorder : function(X, Y, CurPage)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.IsTableBorder(_X, _Y, CurPage);
},
Content_Is_InText : function(X, Y, CurPage)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.IsInText(_X, _Y, CurPage);
},
Content_Is_InDrawing : function(X, Y, CurPage)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.IsInDrawing(_X, _Y, CurPage);
},
Content_GetCurPosXY : function()
{
return this.Content.GetCurPosXY();
},
Content_SetCurPosXY : function(X, Y)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.SetCurPosXY(_X, _Y);
},
Content_MoveCursorUpToLastRow : function(X, Y, AddToSelect)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.MoveCursorUpToLastRow(_X, _Y, AddToSelect);
},
Content_MoveCursorDownToFirstRow : function(X, Y, AddToSelect)
{
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return this.Content.MoveCursorDownToFirstRow(_X, _Y, AddToSelect);
},
RecalculateMinMaxContentWidth : function(isRotated, nPctWidth)
{
var oLogicDocument = this.GetLogicDocument();
if (undefined === isRotated)
isRotated = false;
if (true === this.IsVerticalText())
isRotated = true !== isRotated;
let layoutCoeff = this.GetTable().getLayoutScaleCoefficient();
var oResult;
if (oLogicDocument && oLogicDocument.GetRecalcId() === this.CachedMinMax.RecalcId)
{
oResult = this.CachedMinMax.MinMax;
}
else
{
oResult = this.Content.RecalculateMinMaxContentWidth(isRotated);
// В MSWord у ячейки минимальная ширина 0.1мм
if (oResult.Min < 0.1)
oResult.Min = 0.1;
var oMargins = this.GetMargins();
var oRow = this.GetRow();
var nAdd = 0;
if (oRow)
{
var nCellSpacing = oRow.GetCellSpacing();
var oBorders = this.GetBorders();
if (nCellSpacing)
{
nAdd = oMargins.Left.W + oMargins.Right.W;
if (border_Single === oBorders.Left.Value)
{
nAdd += oBorders.Left.Size;
}
if (border_Single === oBorders.Right.Value)
{
nAdd += oBorders.Right.Size;
}
}
else
{
if (border_Single === oBorders.Left.Value && oBorders.Left.Size / 2 > oMargins.Left.W)
{
nAdd += oBorders.Left.Size / 2;
}
else
{
nAdd += oMargins.Left.W;
}
if (border_Single === oBorders.Right.Value && oBorders.Right.Size / 2 > oMargins.Right.W)
{
nAdd += oBorders.Right.Size / 2;
}
else
{
nAdd += oMargins.Right.W;
}
}
}
else
{
nAdd = oMargins.Left.W + oMargins.Right.W;
}
nAdd *= layoutCoeff;
oResult.Min += nAdd;
oResult.Max += nAdd;
oResult.ContentMin = oResult.Min;
oResult.ContentMax = oResult.Max;
var oPrefW = this.GetW();
if (tblwidth_Mm === oPrefW.Type)
{
if (oResult.Min < oPrefW.W * layoutCoeff)
oResult.Min = oPrefW.W * layoutCoeff;
if (oResult.Max < oPrefW.W * layoutCoeff)
oResult.Max = oPrefW.W * layoutCoeff;
}
else if (tblwidth_Pct === oPrefW.Type && nPctWidth)
{
var nPrefW = nPctWidth * oPrefW.W / 100;
if (oResult.Min < nPrefW)
oResult.Min = nPrefW;
if (oResult.Max < nPrefW)
oResult.Max = nPrefW;
}
if (true !== isRotated && this.GetNoWrap())
{
if (this.GetW().IsMM())
{
oResult.ContentMin = Math.max(oResult.ContentMin, oResult.Min);
}
else
{
oResult.ContentMin = Math.max(oResult.ContentMin, oResult.ContentMax);
oResult.Min = Math.max(oResult.Min, oResult.Max);
oResult.Max = oResult.Min;
}
}
if (oLogicDocument)
{
this.CachedMinMax.RecalcId = oLogicDocument.GetRecalcId();
this.CachedMinMax.MinMax = oResult;
}
}
return oResult;
},
ShiftCell : function(CurPage, dX, dY)
{
// TODO: По логике нужно тут двигать this.Temp.ClipTop/ClipBottom, но при пересчете мы их проставляем заново,
// возможно сделать через флаг
if (true === this.IsVerticalText())
{
this.Temp.X_start += dX;
this.Temp.Y_start += dY;
this.Temp.X_end += dX;
this.Temp.Y_end += dY;
this.Temp.X_cell_start += dX;
this.Temp.Y_cell_start += dY;
this.Temp.X_cell_end += dX;
this.Temp.Y_cell_end += dY;
this.Temp.Y += dY;
}
else
{
this.ShiftCellContent(CurPage, dX, dY);
}
},
ShiftCellContent : function(nCurPage, nShiftX, nShiftY, keepClip)
{
this.Content.Shift(nCurPage, nShiftX, nShiftY, keepClip);
var arrDrawings = this.Content.GetAllDrawingObjects();
for (var nIndex = 0, nCount = arrDrawings.length; nIndex < nCount; ++nIndex)
{
var _nShiftX = 0, _nShiftY = 0;
var oDrawing = arrDrawings[nIndex];
if (!oDrawing.IsInline() && oDrawing.IsLayoutInCell())
{
if (!oDrawing.IsMoveWithTextHorizontally())
_nShiftX = nShiftX;
if (!oDrawing.IsMoveWithTextVertically())
_nShiftY = nShiftY;
oDrawing.Shift(_nShiftX, _nShiftY);
}
}
},
private_GetTextDirectionTransform : function()
{
var Transform = null;
var TextDirection = this.Get_TextDirection();
if (textdirection_BTLR === TextDirection)
{
Transform = new AscCommon.CMatrix();
global_MatrixTransformer.RotateRadAppend(Transform, 0.5 * Math.PI);
global_MatrixTransformer.TranslateAppend(Transform, this.Temp.X_start, this.Temp.Y_end);
}
else if (textdirection_TBRL === TextDirection)
{
var Transform = new AscCommon.CMatrix();
global_MatrixTransformer.RotateRadAppend(Transform, -0.5 * Math.PI);
global_MatrixTransformer.TranslateAppend(Transform, this.Temp.X_end, this.Temp.Y_start);
}
return Transform;
},
Recalculate : function()
{
this.Content.Recalculate();
},
Content_Merge : function(OtherContent)
{
this.Content.Add_Content( OtherContent );
},
Content_Is_ContentOnFirstPage : function()
{
return this.Content.IsContentOnFirstPage();
},
Content_Set_StartPage : function(PageNum)
{
this.Content.Set_StartPage(PageNum);
},
Content_Document_CreateFontMap : function(FontMap)
{
this.Content.Document_CreateFontMap( FontMap );
},
Content_MoveCursorToStartPos : function()
{
this.Content.MoveCursorToStartPos();
},
Content_MoveCursorToEndPos : function()
{
this.Content.MoveCursorToEndPos();
},
//-----------------------------------------------------------------------------------
// Работаем с настройками ячейки
//-----------------------------------------------------------------------------------
Clear_DirectFormatting : function(bClearMerge)
{
// Очищаем все строки и всех ее ячеек
this.Set_Shd( undefined );
this.Set_Margins( undefined );
this.Set_Border( undefined, 0 );
this.Set_Border( undefined, 1 );
this.Set_Border( undefined, 2 );
this.Set_Border( undefined, 3 );
if ( true === bClearMerge )
{
this.Set_GridSpan( undefined );
this.SetVMerge( undefined );
}
},
Set_Pr : function(CellPr)
{
let isHavePrChange = this.HavePrChange();
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellPr(this, this.Pr, CellPr));
this.Pr = CellPr;
this.Recalc_CompiledPr();
this.private_UpdateTableGrid();
if (isHavePrChange || this.HavePrChange())
this.updateTrackRevisions();
},
Copy_Pr : function(OtherPr, bCopyOnlyVisualProps)
{
if ( true != bCopyOnlyVisualProps )
{
// GridSpan
if ( undefined === OtherPr.GridSpan )
this.Set_GridSpan( undefined );
else
this.Set_GridSpan( OtherPr.GridSpan );
}
// Shd
if (undefined === OtherPr.Shd)
{
this.Set_Shd(undefined);
}
else
{
// TODO: переделать здесь на нармальное выставление настроек
this.Set_Shd({
Value : OtherPr.Shd.Value,
Color : OtherPr.Shd.Color ? {r : OtherPr.Shd.Color.r, g : OtherPr.Shd.Color.g, b : OtherPr.Shd.Color.b} : undefined,
Fill : OtherPr.Shd.Fill ? {r : OtherPr.Shd.Fill.r, g : OtherPr.Shd.Fill.g, b : OtherPr.Shd.Fill.b} : undefined,
Unifill : OtherPr.Shd.Unifill ? OtherPr.Shd.Unifill.createDuplicate() : undefined,
ThemeFill: OtherPr.Shd.ThemeFill ? OtherPr.Shd.ThemeFill.createDuplicate() : undefined
});
}
if ( true != bCopyOnlyVisualProps )
{
// VMerge
this.SetVMerge(OtherPr.VMerge);
}
// Border Top
if ( undefined === OtherPr.TableCellBorders.Top )
this.Set_Border( undefined, 0 );
else
{
var Border_top_new = ( null === OtherPr.TableCellBorders.Top ? null : OtherPr.TableCellBorders.Top.Copy() );
this.Set_Border( Border_top_new, 0 );
}
// Border bottom
if ( undefined === OtherPr.TableCellBorders.Bottom )
this.Set_Border( undefined, 2 );
else
{
var Border_bottom_new = ( null === OtherPr.TableCellBorders.Bottom ? null : OtherPr.TableCellBorders.Bottom.Copy() );
this.Set_Border( Border_bottom_new, 2 );
}
// Border left
if ( undefined === OtherPr.TableCellBorders.Left )
this.Set_Border( undefined, 3 );
else
{
var Border_left_new = ( null === OtherPr.TableCellBorders.Left ? null : OtherPr.TableCellBorders.Left.Copy() );
this.Set_Border( Border_left_new, 3 );
}
// Border right
if ( undefined === OtherPr.TableCellBorders.Right )
this.Set_Border( undefined, 1 );
else
{
var Border_right_new = ( null === OtherPr.TableCellBorders.Right ? null : OtherPr.TableCellBorders.Right.Copy() );
this.Set_Border( Border_right_new, 1 );
}
// Margins
if (!OtherPr.TableCellMar)
{
this.Set_Margins(undefined);
}
else
{
var oMarginsNew = {};
if (OtherPr.TableCellMar.Top)
{
oMarginsNew.Top = {
W : OtherPr.TableCellMar.Top.W,
Type : OtherPr.TableCellMar.Top.Type
};
}
if (OtherPr.TableCellMar.Left)
{
oMarginsNew.Left = {
W : OtherPr.TableCellMar.Left.W,
Type : OtherPr.TableCellMar.Left.Type
};
}
if (OtherPr.TableCellMar.Bottom)
{
oMarginsNew.Bottom = {
W : OtherPr.TableCellMar.Bottom.W,
Type : OtherPr.TableCellMar.Bottom.Type
};
}
if (OtherPr.TableCellMar.Right)
{
oMarginsNew.Right = {
W : OtherPr.TableCellMar.Right.W,
Type : OtherPr.TableCellMar.Right.Type
};
}
this.Set_Margins(oMarginsNew, -1);
}
// W
if ( undefined === OtherPr.TableCellW )
this.Set_W( undefined );
else
this.Set_W( OtherPr.TableCellW.Copy() );
// VAlign
this.Set_VAlign(OtherPr.VAlign);
// TextDirection
this.Set_TextDirection(OtherPr.TextDirection);
// NoWrap
this.SetNoWrap(OtherPr.NoWrap);
},
Get_W : function()
{
var W = this.Get_CompiledPr(false).TableCellW;
return W.Copy();
},
Set_W : function(CellW)
{
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellW(this, this.Pr.TableCellW, CellW));
this.Pr.TableCellW = CellW;
this.Recalc_CompiledPr();
this.private_UpdateTableGrid();
},
Get_GridSpan : function()
{
var GridSpan = this.Get_CompiledPr(false).GridSpan;
return GridSpan;
},
Set_GridSpan : function(Value)
{
if (this.Pr.GridSpan === Value)
return;
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellGridSpan(this, this.Pr.GridSpan, Value));
this.Pr.GridSpan = Value;
this.Recalc_CompiledPr();
this.private_UpdateTableGrid();
},
GetMargins : function(isDirectTop)
{
var oCellMargins = this.Get_CompiledPr(false).TableCellMar;
var oDefaultMargins = this.Row.Table.Get_TableCellMar();
var nT = oDefaultMargins.Top;
var nB = oDefaultMargins.Bottom;
var nL = oDefaultMargins.Left;
var nR = oDefaultMargins.Right;
if (oCellMargins)
{
if (oCellMargins.Top)
nT = oCellMargins.Top;
if (oCellMargins.Bottom)
nB = oCellMargins.Bottom;
if (oCellMargins.Left)
nL = oCellMargins.Left;
if (oCellMargins.Right)
nR = oCellMargins.Right;
}
// Делаем как MSWord, верхний отступ считаем общим для всей строки
if (true !== isDirectTop && !this.Row.Table.bPresentation)
nT = new CTableMeasurement(tblwidth_Mm, this.private_GetRowTopMargin());
return {
Top : nT,
Bottom : nB,
Left : nL,
Right : nR
};
},
Is_TableMargins : function()
{
var TableCellMar = this.Get_CompiledPr(false).TableCellMar;
if ( null === TableCellMar )
return true;
else
return false;
},
Set_Margins : function(Margin, Type)
{
var OldValue = ( undefined === this.Pr.TableCellMar ? undefined : this.Pr.TableCellMar );
if (undefined === Margin || null === Margin)
{
if (Margin !== this.Pr.TableCellMar)
{
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellMargins(this, OldValue, Margin));
this.Pr.TableCellMar = undefined;
this.Recalc_CompiledPr();
this.private_UpdateTableGrid();
}
return;
}
var Margins_new;
var bNeedChange = false;
var TableMargins = this.Row.Table.Get_TableCellMar();
if (!this.Pr.TableCellMar)
{
Margins_new = {
Left : TableMargins.Left.Copy(),
Right : TableMargins.Right.Copy(),
Top : TableMargins.Top.Copy(),
Bottom : TableMargins.Bottom.Copy()
};
bNeedChange = true;
}
else
{
Margins_new = {
Left : this.Pr.TableCellMar.Left ? this.Pr.TableCellMar.Left.Copy() : TableMargins.Left.Copy(),
Right : this.Pr.TableCellMar.Right ? this.Pr.TableCellMar.Right.Copy() : TableMargins.Right.Copy(),
Bottom : this.Pr.TableCellMar.Bottom ? this.Pr.TableCellMar.Bottom.Copy() : TableMargins.Bottom.Copy(),
Top : this.Pr.TableCellMar.Top ? this.Pr.TableCellMar.Top.Copy() : TableMargins.Top.Copy()
};
}
switch (Type)
{
case -1 :
{
bNeedChange = true;
if (Margin.Top)
{
Margins_new.Top.W = Margin.Top.W;
Margins_new.Top.Type = Margin.Top.Type;
}
if (Margin.Right)
{
Margins_new.Right.W = Margin.Right.W;
Margins_new.Right.Type = Margin.Right.Type;
}
if (Margin.Bottom)
{
Margins_new.Bottom.W = Margin.Bottom.W;
Margins_new.Bottom.Type = Margin.Bottom.Type;
}
if (Margin.Left)
{
Margins_new.Left.W = Margin.Left.W;
Margins_new.Left.Type = Margin.Left.Type;
}
break;
}
case 0:
{
if (true != bNeedChange && Margins_new.Top.W != Margin.W || Margins_new.Top.Type != Margin.Type)
bNeedChange = true;
Margins_new.Top.W = Margin.W;
Margins_new.Top.Type = Margin.Type;
break;
}
case 1:
{
if (true != bNeedChange && Margins_new.Right.W != Margin.W || Margins_new.Right.Type != Margin.Type)
bNeedChange = true;
Margins_new.Right.W = Margin.W;
Margins_new.Right.Type = Margin.Type;
break;
}
case 2:
{
if (true != bNeedChange && Margins_new.Bottom.W != Margin.W || Margins_new.Bottom.Type != Margin.Type)
bNeedChange = true;
Margins_new.Bottom.W = Margin.W;
Margins_new.Bottom.Type = Margin.Type;
break;
}
case 3:
{
if (true != bNeedChange && Margins_new.Left.W != Margin.W || Margins_new.Left.Type != Margin.Type)
bNeedChange = true;
Margins_new.Left.W = Margin.W;
Margins_new.Left.Type = Margin.Type;
break;
}
}
if (true === bNeedChange)
{
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellMargins(this, OldValue, Margins_new));
this.Pr.TableCellMar = Margins_new;
this.Recalc_CompiledPr();
this.private_UpdateTableGrid();
}
},
Get_Shd : function()
{
var Shd = this.Get_CompiledPr(false).Shd;
return Shd;
},
Set_Shd : function(Shd)
{
if (undefined === Shd && undefined === this.Pr.Shd)
return;
if (undefined === Shd)
{
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellShd(this, this.Pr.Shd, undefined));
this.Pr.Shd = undefined;
this.Recalc_CompiledPr();
}
else if (undefined === this.Pr.Shd || false === this.Pr.Shd.Compare(Shd))
{
this.private_AddPrChange();
var _Shd = new CDocumentShd();
_Shd.Set_FromObject(Shd);
AscCommon.History.Add(new CChangesTableCellShd(this, this.Pr.Shd, _Shd));
this.Pr.Shd = _Shd;
this.Recalc_CompiledPr();
}
},
Get_VAlign : function()
{
var VAlign = this.Get_CompiledPr(false).VAlign;
return VAlign;
},
Set_VAlign : function(Value)
{
if (Value === this.Pr.VAlign)
return;
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellVAlign(this, this.Pr.VAlign, Value));
this.Pr.VAlign = Value;
this.Recalc_CompiledPr();
},
GetNoWrap : function()
{
return this.Get_CompiledPr(false).NoWrap;
},
SetNoWrap : function(Value)
{
if (this.Pr.NoWrap !== Value)
{
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellNoWrap(this, this.Pr.NoWrap, Value));
this.Pr.NoWrap = Value;
this.Recalc_CompiledPr();
}
},
IsVerticalText : function()
{
var TextDirection = this.Get_TextDirection();
return (textdirection_BTLR === TextDirection || textdirection_TBRL === TextDirection);
},
Get_TextDirection : function()
{
return this.Get_CompiledPr(false).TextDirection;
},
Set_TextDirection : function(Value)
{
if (Value !== this.Pr.TextDirection)
{
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellTextDirection(this, this.Pr.TextDirection, Value));
this.Pr.TextDirection = Value;
this.Recalc_CompiledPr();
}
},
Set_TextDirectionFromApi : function(TextDirection)
{
var isVerticalText = (textdirection_BTLR === TextDirection || textdirection_TBRL === TextDirection) ? true : false;
// Во время изменения направления текста меняем высоту строки, если надо и отступы и параграфов внутри ячейки.
var OldTextDirection = this.Get_TextDirection();
this.Set_TextDirection(TextDirection);
if (OldTextDirection !== TextDirection)
{
if (true === isVerticalText)
{
var Row = this.Row;
var RowH = this.Row.Get_Height();
if (Asc.linerule_Auto === RowH.HRule)
Row.Set_Height(20, Asc.linerule_AtLeast);
else if (RowH.Value < 20)
Row.Set_Height(20, RowH.HRule);
}
this.Content.Set_ParaPropsForVerticalTextInCell(isVerticalText);
}
},
Get_Borders : function()
{
return this.GetBorders();
},
// 0 - Top, 1 - Right, 2- Bottom, 3- Left
Get_Border : function(Type)
{
var TableBorders = this.Row.Table.Get_TableBorders();
var Borders = this.Get_CompiledPr(false).TableCellBorders;
var Border = null;
switch (Type)
{
case 0 :
{
if ( null != Borders.Top )
Border = Borders.Top;
else
{
if ( 0 != this.Row.Index || null != this.Row.Get_CellSpacing() )
Border = TableBorders.InsideH;
else
Border = TableBorders.Top;
}
break;
}
case 1 :
{
if ( null != Borders.Right )
Border = Borders.Right;
else
{
if ( this.Row.Content.length - 1 != this.Index || null != this.Row.Get_CellSpacing() )
Border = TableBorders.InsideV;
else
Border = TableBorders.Right;
}
break;
}
case 2 :
{
if ( null != Borders.Bottom )
Border = Borders.Bottom;
else
{
if ( this.Row.Table.Content.length - 1 != this.Row.Index || null != this.Row.Get_CellSpacing() )
Border = TableBorders.InsideH;
else
Border = TableBorders.Bottom;
}
break;
}
case 3 :
{
if ( null != Borders.Left )
Border = Borders.Left;
else
{
if ( 0 != this.Index || null != this.Row.Get_CellSpacing() )
Border = TableBorders.InsideV;
else
Border = TableBorders.Left;
}
break;
}
}
return Border;
},
// 0 - Top, 1 - Right, 2- Bottom, 3- Left
Set_Border : function(Border, Type)
{
var DstBorder = this.Pr.TableCellBorders.Top;
switch (Type)
{
case 0 :
DstBorder = this.Pr.TableCellBorders.Top;
break;
case 1 :
DstBorder = this.Pr.TableCellBorders.Right;
break;
case 2 :
DstBorder = this.Pr.TableCellBorders.Bottom;
break;
case 3 :
DstBorder = this.Pr.TableCellBorders.Left;
break;
}
if (undefined === Border || null === Border)
{
if (Border === DstBorder)
return;
this.private_AddPrChange();
switch (Type)
{
case 0:
{
AscCommon.History.Add(new CChangesTableCellBorderTop(this, this.Pr.TableCellBorders.Top, Border));
this.Pr.TableCellBorders.Top = undefined;
break;
}
case 1 :
{
AscCommon.History.Add(new CChangesTableCellBorderRight(this, this.Pr.TableCellBorders.Right, Border));
this.Pr.TableCellBorders.Right = undefined;
break;
}
case 2 :
{
AscCommon.History.Add(new CChangesTableCellBorderBottom(this, this.Pr.TableCellBorders.Bottom, Border));
this.Pr.TableCellBorders.Bottom = undefined;
break;
}
case 3 :
{
AscCommon.History.Add(new CChangesTableCellBorderLeft(this, this.Pr.TableCellBorders.Left, Border));
this.Pr.TableCellBorders.Left = undefined;
break;
}
}
this.Recalc_CompiledPr();
}
else if (null === DstBorder)
{
var NewBorder = this.Get_Border(Type).Copy();
NewBorder.Value = null != Border.Value ? Border.Value : NewBorder.Value;
NewBorder.Size = null != Border.Size ? Border.Size : NewBorder.Size;
NewBorder.Color.r = null != Border.Color ? Border.Color.r : NewBorder.Color.r;
NewBorder.Color.g = null != Border.Color ? Border.Color.g : NewBorder.Color.g;
NewBorder.Color.b = null != Border.Color ? Border.Color.b : NewBorder.Color.b;
NewBorder.Unifill = null != Border.Unifill ? Border.Unifill : NewBorder.Unifill;
this.private_AddPrChange();
switch (Type)
{
case 0:
{
AscCommon.History.Add(new CChangesTableCellBorderTop(this, this.Pr.TableCellBorders.Top, NewBorder));
this.Pr.TableCellBorders.Top = NewBorder;
break;
}
case 1 :
{
AscCommon.History.Add(new CChangesTableCellBorderRight(this, this.Pr.TableCellBorders.Right, NewBorder));
this.Pr.TableCellBorders.Right = NewBorder;
break;
}
case 2 :
{
AscCommon.History.Add(new CChangesTableCellBorderBottom(this, this.Pr.TableCellBorders.Bottom, NewBorder));
this.Pr.TableCellBorders.Bottom = NewBorder;
break;
}
case 3 :
{
AscCommon.History.Add(new CChangesTableCellBorderLeft(this, this.Pr.TableCellBorders.Left, NewBorder));
this.Pr.TableCellBorders.Left = NewBorder;
break;
}
}
this.Recalc_CompiledPr();
}
else
{
var NewBorder = new CDocumentBorder();
var DefBorder = DstBorder;
if (undefined === DefBorder)
DefBorder = new CDocumentBorder();
NewBorder.Value = null != Border.Value ? Border.Value : DefBorder.Value;
NewBorder.Size = null != Border.Size ? Border.Size : DefBorder.Size;
NewBorder.Color.r = null != Border.Color ? Border.Color.r : DefBorder.Color.r;
NewBorder.Color.g = null != Border.Color ? Border.Color.g : DefBorder.Color.g;
NewBorder.Color.b = null != Border.Color ? Border.Color.b : DefBorder.Color.b;
NewBorder.Unifill = null != Border.Unifill ? Border.Unifill : DefBorder.Unifill;
this.private_AddPrChange();
switch (Type)
{
case 0:
{
AscCommon.History.Add(new CChangesTableCellBorderTop(this, this.Pr.TableCellBorders.Top, NewBorder));
this.Pr.TableCellBorders.Top = NewBorder;
break;
}
case 1 :
{
AscCommon.History.Add(new CChangesTableCellBorderRight(this, this.Pr.TableCellBorders.Right, NewBorder));
this.Pr.TableCellBorders.Right = NewBorder;
break;
}
case 2 :
{
AscCommon.History.Add(new CChangesTableCellBorderBottom(this, this.Pr.TableCellBorders.Bottom, NewBorder));
this.Pr.TableCellBorders.Bottom = NewBorder;
break;
}
case 3 :
{
AscCommon.History.Add(new CChangesTableCellBorderLeft(this, this.Pr.TableCellBorders.Left, NewBorder));
this.Pr.TableCellBorders.Left = NewBorder;
break;
}
}
this.Recalc_CompiledPr();
}
},
SetBorderInfoTop : function(oTopInfo)
{
this.BorderInfo.Top = oTopInfo;
},
SetBorderInfoTopHeader : function(oTopInfo)
{
this.BorderInfo.TopHeader = oTopInfo;
},
Set_BorderInfo_Bottom : function(BottomInfo, BeforeCount, AfterCount)
{
this.BorderInfo.Bottom = BottomInfo;
this.BorderInfo.Bottom_BeforeCount = BeforeCount;
this.BorderInfo.Bottom_AfterCount = AfterCount;
},
Set_BorderInfo_Left : function(LeftInfo, Max)
{
this.BorderInfo.Left = LeftInfo;
this.BorderInfo.MaxLeft = Max;
},
Set_BorderInfo_Right : function(RightInfo, Max)
{
this.BorderInfo.Right = RightInfo;
this.BorderInfo.MaxRight = Max;
},
GetBorderInfo : function()
{
return this.BorderInfo;
},
GetBorderInfoLeft : function()
{
return this.BorderInfo.Left;
},
GetBorderInfoRight : function()
{
return this.BorderInfo.Right;
},
//-----------------------------------------------------------------------------------
// Undo/Redo функции
//-----------------------------------------------------------------------------------
Get_ParentObject_or_DocumentPos : function()
{
return this.Row.Table.Get_ParentObject_or_DocumentPos(this.Row.Table.Index);
},
Refresh_RecalcData : function(Data)
{
let oTable = this.GetTable();
if (!oTable)
return;
var bNeedRecalc = false;
var Type = Data.Type;
switch ( Type )
{
case AscDFH.historyitem_TableCell_GridSpan:
case AscDFH.historyitem_TableCell_Margins:
case AscDFH.historyitem_TableCell_VMerge:
case AscDFH.historyitem_TableCell_Border_Left:
case AscDFH.historyitem_TableCell_Border_Right:
case AscDFH.historyitem_TableCell_Border_Top:
case AscDFH.historyitem_TableCell_Border_Bottom:
case AscDFH.historyitem_TableCell_VAlign:
case AscDFH.historyitem_TableCell_W:
case AscDFH.historyitem_TableCell_Pr:
case AscDFH.historyitem_TableCell_TextDirection:
case AscDFH.historyitem_TableCell_NoWrap:
{
bNeedRecalc = true;
break;
}
case AscDFH.historyitem_TableCell_Shd:
{
// Пересчитывать этот элемент не надо при таких изменениях
break;
}
}
oTable.RecalcInfo.RecalcBorders();
this.Refresh_RecalcData2( 0, 0 );
},
Refresh_RecalcData2 : function(Page_Rel)
{
var oRow = this.GetRow();
var oTable = this.GetTable();
if (!oRow || !oTable)
return;
oTable.RecalcInfo.Add_Cell(this);
// Изменения в текущей ячейке могут вызвать изменения в следующей или предыдущей ячейках.
// Например, когда у нас сквозная есть нумерация внутри ячеек
var nCurCell = this.GetIndex();
var nCellsCount = oRow.GetCellsCount();
if (nCurCell > 0 && nCellsCount > 0)
{
var oPrevCell = oRow.GetCell(nCurCell <= nCellsCount ? nCurCell - 1 : nCellsCount - 1);
if (oPrevCell)
oTable.RecalcInfo.Add_Cell(oPrevCell);
}
if (nCurCell < nCellsCount - 1 && nCurCell >= 0 && nCellsCount > 0)
{
var oNextCell = oRow.GetCell(nCurCell + 1);
if (oNextCell)
oTable.RecalcInfo.Add_Cell(oRow.GetCell(nCurCell + 1));
}
var TablePr = oTable.Get_CompiledPr(false).TablePr;
if (tbllayout_AutoFit === TablePr.TableLayout)
{
if (oTable.Parent && oTable.Parent.Pages.length > 0)
{
// Если изменение внутри ячейки влечет за собой изменение сетки таблицы, тогда
// пересчитывать таблицу надо с самого начала.
AscCommon.History.Add_RecalcTableGrid(oTable.Get_Id());
}
else
{
return oTable.Refresh_RecalcData2(0, 0);
}
}
oRow.Refresh_RecalcData2(nCurCell, Page_Rel);
},
//-----------------------------------------------------------------------------------
// Функции для работы с совместным редактирования
//-----------------------------------------------------------------------------------
Write_ToBinary2 : function(Writer)
{
Writer.WriteLong( AscDFH.historyitem_type_TableCell );
// String : Id ячейки
// Variable : TableCell.Pr
// String : Id DocumentContent
Writer.WriteString2( this.Id );
this.Pr.Write_ToBinary( Writer );
Writer.WriteString2( this.Content.Get_Id() );
},
Read_FromBinary2 : function(Reader)
{
// String : Id ячейки
// Variable : TableCell.Pr
// String : Id DocumentContent
this.Id = Reader.GetString2();
this.Pr = new CTableCellPr();
this.Pr.Read_FromBinary(Reader);
this.Recalc_CompiledPr();
this.Content = AscCommon.g_oTableId.Get_ById(Reader.GetString2());
if (this.Content)
this.Content.SetParent(this);
}
};
CTableCell.prototype.constructor = CTableCell;
/**
* Доступ к содержимому ячейки
* @returns {CDocumentContent}
*/
CTableCell.prototype.GetContent = function()
{
return this.Content;
};
/**
* Функция для выставления класса содержимого ячейки (используется в совместке)
* @param {CDocumentContent} oDocumentContent
*/
CTableCell.prototype.SetDocumentContent = function(oDocumentContent)
{
this.Content = oDocumentContent;
oDocumentContent.SetParent(this);
};
/**
* Доступ к родительской строке
* @returns {null | CTableRow}
*/
CTableCell.prototype.GetRow = function()
{
return this.Row;
};
/**
* Доступ к родительской таблице
* @returns {null | CTable}
*/
CTableCell.prototype.GetTable = function()
{
var oRow = this.GetRow();
if (!oRow)
return null;
return oRow.GetTable();
};
/**
* Доступ к главному классу документа
* @returns {CDocument|null}
*/
CTableCell.prototype.GetLogicDocument = function()
{
let table = this.GetTable();
if (table)
return table.GetLogicDocument();
return null;
};
/**
* Доступ к родительскому классу для родительской таблицы
* @returns {null|*}
*/
CTableCell.prototype.GetTableParent = function()
{
var oTable = this.GetTable();
if (!oTable)
return null;
return oTable.GetParent();
};
/**
* Получаем номер данной ячейки в родительской строке
* @returns {number}
*/
CTableCell.prototype.GetIndex = function()
{
return this.Index;
};
/**
* Выставляем номер данной ячейки в родительской строке
* @param {number} nIndex
*/
CTableCell.prototype.SetIndex = function(nIndex)
{
if (nIndex != this.Index)
{
this.Index = nIndex;
this.Recalc_CompiledPr();
}
};
CTableCell.prototype.private_TransformXY = function(X, Y)
{
// TODO: Везде, где идет такой код заменить на данную функцию
var _X = X, _Y = Y;
var Transform = this.private_GetTextDirectionTransform();
if (null !== Transform)
{
Transform = global_MatrixTransformer.Invert(Transform);
_X = Transform.TransformPointX(X, Y);
_Y = Transform.TransformPointY(X, Y);
}
return {X : _X, Y : _Y};
};
CTableCell.prototype.GetTopElement = function()
{
if (this.Row && this.Row.Table)
return this.Row.Table.GetTopElement();
return null;
};
CTableCell.prototype.Is_EmptyFirstPage = function()
{
if (!this.Row || !this.Row.Table || !this.Row.Table.RowsInfo[this.Row.Index] || true === this.Row.Table.RowsInfo[this.Row.Index].FirstPage)
return true;
return false;
};
CTableCell.prototype.Get_SectPr = function()
{
if (this.Row && this.Row.Table && this.Row.Table)
return this.Row.Table.Get_SectPr();
return null;
};
CTableCell.prototype.GetDocumentPositionFromObject = function(arrPos)
{
if (!arrPos)
arrPos = [];
var oRow = this.GetRow();
if (oRow)
{
if (arrPos.length > 0)
{
arrPos.splice(0, 0, {Class : oRow, Position : this.GetIndex()});
oRow.GetDocumentPositionFromObject(arrPos);
}
else
{
oRow.GetDocumentPositionFromObject(arrPos);
arrPos.push({Class : oRow, Position : this.GetIndex()});
}
}
return arrPos;
};
CTableCell.prototype.Get_Table = function()
{
var Row = this.Row;
if (!Row)
return null;
var Table = Row.Table;
if (!Table)
return null;
return Table;
};
CTableCell.prototype.GetTopDocumentContent = function(isOneLevel)
{
if (this.Row && this.Row.Table && this.Row.Table.Parent)
return this.Row.Table.Parent.GetTopDocumentContent(isOneLevel);
return null;
};
/**
* Специальная вставка таблицы в таблицу. Данная функция вызывается из CDocumentContent
* @param oTable
*/
CTableCell.prototype.InsertTableContent = function(oTable)
{
if (!this.Row || !this.Row.Table)
return;
this.Row.Table.InsertTableContent(this.Index, this.Row.Index, oTable);
};
/**
* Получаем ширину ячейки исходя из таблицы TableGrid
* @returns {number}
*/
CTableCell.prototype.GetCalculatedW = function()
{
var oRow = this.Row,
oTable = oRow.Table;
var nCurGridStart = oRow.GetCellInfo(this.Index).StartGridCol;
var nCurGridEnd = nCurGridStart + this.Get_GridSpan() - 1;
if (oTable.TableSumGrid.length > nCurGridEnd)
return oTable.TableSumGrid[nCurGridEnd] - oTable.TableSumGrid[nCurGridStart - 1];
return 3.8; // 1.9 + 1.9 стандартные отступы справа и слева
};
/**
* Получаем количество промежутков, которое занимает данная ячейка
* @returns {number}
*/
CTableCell.prototype.GetGridSpan = function()
{
return this.Get_GridSpan();
};
/**
* Выставляем количество промежутков, которое занимает данная ячейка
* @param nGridSpan
*/
CTableCell.prototype.SetGridSpan = function(nGridSpan)
{
return this.Set_GridSpan(nGridSpan);
};
/**
* Получаем информацию о границе ячейки
* @param {number} nType - 0 - Top, 1 - Right, 2- Bottom, 3- Left
*/
CTableCell.prototype.GetBorder = function(nType)
{
return this.Get_Border(nType);
};
/**
* Выставляем заданную границу
* @poram {CDocumentBorder} oBorder
* @param {number} nType - 0 - Top, 1 - Right, 2- Bottom, 3- Left
*/
CTableCell.prototype.SetBorder = function(oBorder, nType)
{
return this.Set_Border(oBorder, nType);
};
/**
* Проверяем, является ли данная ячейка последней в строке
* @returns {boolean}
*/
CTableCell.prototype.IsLastTableCellInRow = function(isSelection)
{
if (true !== isSelection)
return !!(this.Row && this.Row.GetCellsCount() - 1 === this.Index);
if (!this.Row || !this.Row.Table)
return false;
var nCurCell = this.Index;
var nCurRow = this.Row.Index;
var oTable = this.Row.Table;
var arrSelectionArray = oTable.GetSelectionArray();
for (var nIndex = 0, nCount = arrSelectionArray.length; nIndex < nCount; ++nIndex)
{
var nRow = arrSelectionArray[nIndex].Row;
var nCell = arrSelectionArray[nIndex].Cell;
if (nRow === nCurRow && nCell > nCurCell)
return false;
}
return true;
};
/**
* Проверяем пустая ли заданная граница, если надо удаляем ее
* @param {number} nType - 0 - Top, 1 - Right, 2- Bottom, 3- Left
*/
CTableCell.prototype.CheckEmptyBorder = function(nType)
{
var oBorderNone = new CDocumentBorder();
if (nType === 0)
{
if (border_None !== this.GetBorder(nType).Value)
this.SetBorder(oBorderNone, nType);
}
else if (nType === 1 || nType === 3)
{
// Удаляем границы для всех ячеейк, учавствующих в вертикальном объединении
var oTable = this.GetTable();
var oRow = this.GetRow();
var nVMergeCount = oTable.GetVMergeCount(this.GetIndex(), oRow.GetIndex());
var nCurGridStart = oRow.GetCellInfo(this.Index).StartGridCol;
if (this.Get_Border(nType).Value != 0)
this.Set_Border(oBorderNone, nType);
if (nVMergeCount > 1)
{
for (var nIndex = oRow.GetIndex() + 1; nIndex < oRow.GetIndex() + nVMergeCount; ++nIndex)
{
var oCellInVertUnion = oTable.GetCellByStartGridCol(nIndex, nCurGridStart);
if (oCellInVertUnion && border_None !== oCellInVertUnion.GetBorder(nType).Value)
oCellInVertUnion.SetBorder(oBorderNone, nType);
}
}
}
else if (nType === 2)
{
var oTable = this.GetTable();
var oRow = this.GetRow();
var nCurGridStart = oRow.GetCellInfo(this.Index).StartGridCol;
var nVMergeCount = oTable.GetVMergeCount(this.GetIndex(), this.GetRow().GetIndex());
var oLastCellInVertUnion = oTable.GetCellByStartGridCol(oRow.GetIndex() + nVMergeCount - 1, nCurGridStart);
if (oLastCellInVertUnion && border_None !== oLastCellInVertUnion.GetBorder(nType).Value)
oLastCellInVertUnion.SetBorder(oBorderNone, nType);
}
};
/**
* Проверяем заданную границу, и если надо делаем ее не пустой
* @param {number} nType - 0 - Top, 1 - Right, 2- Bottom, 3- Left
*/
CTableCell.prototype.CheckNonEmptyBorder = function(nType)
{
var oBorder = new CDocumentBorder();
oBorder.Value = border_Single;
if (nType === 0 || nType === 2)
{
if (border_None === this.GetBorder(nType).Value)
this.SetBorder(oBorder, nType);
}
else if (nType === 1 || nType === 3)
{
var oTable = this.GetTable();
var oRow = this.GetRow();
var nVMergeCount = oTable.GetVMergeCount(this.GetIndex(), oRow.GetIndex());
var nCurGridStart = oRow.GetCellInfo(this.Index).StartGridCol;
if (this.Get_Border(nType).Value === 0)
this.Set_Border(oBorder, nType);
if (nVMergeCount > 1)
{
for (var nIndex = oRow.GetIndex() + 1; nIndex < oRow.GetIndex() + nVMergeCount; ++nIndex)
{
var oCellInVertUnion = oTable.GetCellByStartGridCol(nIndex, nCurGridStart);
if (oCellInVertUnion && border_None === oCellInVertUnion.GetBorder(nType).Value)
oCellInVertUnion.SetBorder(oBorder, nType);
}
}
}
};
/**
* Получаем скомпилированную настройку ширины ячейки
* @returns {?CTableMeasurement}
*/
CTableCell.prototype.GetW = function()
{
return this.Get_W();
};
/**
* Задаем предпочитаемую ширину ячейки
* @param {CTableMeasurement} oCellW
*/
CTableCell.prototype.SetW = function(oCellW)
{
return this.Set_W(oCellW);
};
/**
* Участвует ли в вертикальном объединении данная ячейка
* @returns {vmerge_Restart | vmerge_Continue}
*/
CTableCell.prototype.GetVMerge = function()
{
return this.Get_CompiledPr(false).VMerge;
};
/**
* Задаем настройку участия данной ячейки в вертикальном объединении
* @param {vmerge_Restart | vmerge_Continue} nType
*/
CTableCell.prototype.SetVMerge = function(nType)
{
if (nType === this.Pr.VMerge)
return;
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellVMerge(this, this.Pr.VMerge, nType));
this.Pr.VMerge = nType;
this.Recalc_CompiledPr();
};
/**
* Проверяем находится ли данная ячейка в заголовке таблицы
* @param {boolean} [isDeep=false] Если данная ячейка не в заголовке своей таблицы, то смотрим ли у родительского класса таблицы
* @returns {boolean}
*/
CTableCell.prototype.IsInHeader = function(isDeep)
{
var isInHeader = this.Row.Table.IsInHeader(this.Row.GetIndex());
if (isInHeader)
return true;
if (true === isDeep && this.Row.Table.Parent && this.Row.Table.Parent.IsTableHeader)
return this.Row.Table.Parent.IsTableHeader();
return false;
};
/**
* Получаем последний элемент в предыдущей ячейке данной строки
* @returns {?CDocumentContentElementBase}
*/
CTableCell.prototype.GetLastElementInPrevCell = function()
{
var nCurCell = this.GetIndex();
var oRow = this.GetRow();
if (!oRow)
return null;
// TODO: Разобраться, что делать в данном случае
if (0 === nCurCell)
{
var oTable = this.GetTable();
if (0 === oRow.GetIndex() && oTable)
return oTable.Get_DocumentPrev();
return null;
}
var oPrevCell = oRow.GetCell(nCurCell - 1);
var oCellContent = oPrevCell.GetContent();
var nCount = oCellContent.GetElementsCount();
if (nCount <= 0)
return null;
return oCellContent.GetElement(nCount - 1);
};
/**
* Получаем первый элемент в следующей ячейке
* @returns {?CDocumentContentElementBase}
*/
CTableCell.prototype.GetFirstElementInNextCell = function()
{
var nCurCell = this.GetIndex();
var oRow = this.GetRow();
if (!oRow)
return null;
// TODO: Разобраться, что делать в данном случае
if (nCurCell >= oRow.GetCellsCount() - 1)
return null;
var oCellContent = oRow.GetCell(nCurCell + 1).GetContent();
var nCount = oCellContent.GetElementsCount();
if (nCount <= 0)
return null;
return oCellContent.GetElement(0);
};
/**
* Получаем предыдущий параграф
* @returns {?Paragraph}
*/
CTableCell.prototype.GetPrevParagraph = function()
{
var oTable = this.GetTable();
var oRow = this.GetRow();
var nCellIndex = this.GetIndex();
if (0 === nCellIndex)
{
var nRowIndex = oRow.GetIndex();
if (0 === nRowIndex)
{
return oTable.GetPrevParagraph();
}
else
{
var oPrevRow = oTable.GetRow(nRowIndex - 1);
var oPrevCell = oPrevRow.GetCell(oPrevRow.GetCellsCount() - 1);
if (!oPrevCell)
return null;
return oPrevCell.GetContent().GetLastParagraph();
}
}
else
{
var oPrevCell = oRow.GetCell(nCellIndex - 1);
if (!oPrevCell)
return null;
return oPrevCell.GetContent().GetLastParagraph();
}
};
/**
* Участвует ли в вертикальном объединении данная ячейка
* @returns {vmerge_Restart | vmerge_Continue}
*/
CTableCell.prototype.GetHMerge = function()
{
return this.Get_CompiledPr(false).HMerge;
};
/**
* Задаем настройку участия данной ячейки в вертикальном объединении
* @param {vmerge_Restart | vmerge_Continue} nType
*/
CTableCell.prototype.SetHMerge = function(nType)
{
if (nType === this.Pr.HMerge)
return;
this.private_AddPrChange();
AscCommon.History.Add(new CChangesTableCellHMerge(this, this.Pr.HMerge, nType));
this.Pr.HMerge = nType;
this.Recalc_CompiledPr();
};
/**
* По заданной абсолютной странице получаем массив относительных страниц (относительно таблицы)
* @param nPageAbs
* @returns {Array}
*/
CTableCell.prototype.GetCurPageByAbsolutePage = function(nPageAbs)
{
var arrPages = [];
var oRow = this.GetRow();
var oTable = this.GetTable();
if (!oRow || !oTable || !oTable.RowsInfo[oRow.GetIndex()])
return arrPages;
var nStartPage = oTable.RowsInfo[oRow.GetIndex()].StartPage;
var nPagesCount = this.Content.Pages.length;
for (var nCurPage = 0; nCurPage < nPagesCount; ++nCurPage)
{
if (nPageAbs === this.GetAbsolutePage(nStartPage + nCurPage))
{
arrPages.push(nStartPage + nCurPage);
}
}
return arrPages;
};
/**
* Получаем границы ячейки
* @param nCurPage Номер страницы относительно таблицы
* @returns {CDocumentBounds}
*/
CTableCell.prototype.GetPageBounds = function(nCurPage)
{
var oTable = this.GetTable();
var oRow = this.GetRow();
if (!oRow || !oTable || !oTable.Pages[nCurPage])
return new CDocumentBounds(0, 0, 0, 0);
var nCurRow = oRow.GetIndex();
if (!oTable.RowsInfo[nCurRow] || !oTable.RowsInfo[nCurRow].Y[nCurPage] || !oTable.RowsInfo[nCurRow].H[nCurPage])
return new CDocumentBounds(0, 0, 0, 0);
var oPage = oTable.Pages[nCurPage];
var oCellInfo = oRow.GetCellInfo(this.GetIndex());
var nVMergeCountOnPage = oTable.private_GetVertMergeCountOnPage(nCurPage, oRow.GetIndex(), oCellInfo.StartGridCol, this.GetGridSpan());
if (nVMergeCountOnPage <= 0)
return new CDocumentBounds(0, 0, 0, 0);
var nL = oPage.X + oCellInfo.X_cell_start;
var nR = oPage.X + oCellInfo.X_cell_end;
var nT = oTable.RowsInfo[nCurRow].Y[nCurPage];
var nB = oTable.RowsInfo[nCurRow + nVMergeCountOnPage - 1].Y[nCurPage] + oTable.RowsInfo[nCurRow + nVMergeCountOnPage - 1].H[nCurPage];
return new CDocumentBounds(nL, nT, nR, nB);
};
/**
* Получаем колонку в виде массива ячеек
* @returns {[CTableCell]}
*/
CTableCell.prototype.GetColumn = function()
{
var oTable = this.GetTable();
if (!oTable)
return [this];
return oTable.GetColumn(this.GetIndex(), this.GetRow().GetIndex());
};
CTableCell.prototype.updateTrackRevisions = function()
{
var oTable = this.GetTable();
if (oTable)
oTable.updateTrackRevisions();
};
CTableCell.prototype.HavePrChange = function()
{
return this.Pr.HavePrChange();
};
CTableCell.prototype.AddPrChange = function()
{
if (false === this.HavePrChange())
{
this.Pr.AddPrChange();
AscCommon.History.Add(new CChangesTableCellPrChange(this, {
PrChange : undefined,
ReviewInfo : undefined
}, {
PrChange : this.Pr.PrChange,
ReviewInfo : this.Pr.ReviewInfo
}));
this.updateTrackRevisions();
}
};
CTableCell.prototype.RemovePrChange = function()
{
if (true === this.HavePrChange())
{
AscCommon.History.Add(new CChangesTableCellPrChange(this, {
PrChange : this.Pr.PrChange,
ReviewInfo : this.Pr.ReviewInfo
}, {
PrChange : undefined,
ReviewInfo : undefined
}));
this.Pr.RemovePrChange();
this.updateTrackRevisions();
}
};
CTableCell.prototype.private_AddPrChange = function()
{
var oTable = this.GetTable();
var oRow = this.GetRow();
if (oTable
&& oRow
&& oTable.LogicDocument
&& true === oTable.LogicDocument.IsTrackRevisions()
&& true !== this.HavePrChange()
&& reviewtype_Common === oRow.GetReviewType())
{
this.AddPrChange();
oTable.AddPrChange();
}
};
CTableCell.prototype.AcceptPrChange = function()
{
this.RemovePrChange();
};
CTableCell.prototype.RejectPrChange = function()
{
if (this.HavePrChange())
{
this.Set_Pr(this.Pr.PrChange);
this.RemovePrChange();
}
};
/**
* Проверяем является ли данная ячейка частью смерженной ячейки
* @returns {boolean}
*/
CTableCell.prototype.IsMergedCell = function()
{
var oTable = this.GetTable();
var nVMerge = this.GetVMerge();
if (nVMerge === vmerge_Continue && oTable)
return (oTable.GetStartMergedCell(this.GetIndex(), this.GetRow().GetIndex()) !== this);
return false;
};
/**
* Получаем границы данной ячейки
* @returns {{Top: *, Right: *, Bottom: *, Left: *}}
*/
CTableCell.prototype.GetBorders = function()
{
return {
Top : this.GetBorder(0),
Right : this.GetBorder(1),
Bottom : this.GetBorder(2),
Left : this.GetBorder(3)
};
};
CTableCell.prototype.CheckContentControlEditingLock = function()
{
if (this.Row && this.Row.Table && this.Row.Table.Parent && this.Row.Table.Parent.CheckContentControlEditingLock)
this.Row.Table.Parent.CheckContentControlEditingLock();
};
/**
* @returns {AscWord.CBorder}
*/
CTableCell.prototype.GetBottomBorder = function()
{
return this.GetBorder(2);
};
/**
* Запрашиваем пересчет сетки таблицы
*/
CTableCell.prototype.private_UpdateTableGrid = function()
{
var oTable = this.GetTable();
if (oTable)
oTable.private_UpdateTableGrid();
};
/**
* Копируем настройки текста и параграфа из заданной ячейки
* @param {CTableCell} oCell
*/
CTableCell.prototype.CopyParaPrAndTextPr = function(oCell)
{
// Копируем также текстовые настройки и настройки параграфа
var oFirstPara = oCell.GetContent().GetFirstParagraph();
if (oFirstPara)
{
var oCellContent = this.GetContent();
var arrAllParagraphs = oCellContent.GetAllParagraphs({All : true});
for (var nParaIndex = 0, nParasCount = arrAllParagraphs.length; nParaIndex < nParasCount; ++nParaIndex)
{
var oTempPara = arrAllParagraphs[nParaIndex];
oTempPara.SetDirectParaPr(oFirstPara.GetDirectParaPr(true));
oTempPara.SetDirectTextPr(oFirstPara.GetFirstRunPr(), false);
}
}
};
CTableCell.prototype.private_GetRowTopMargin = function()
{
var oRow = this.GetRow();
if (!oRow)
return 0;
var nTop = null;
for (var nCurCell = 0, nCellsCount = oRow.GetCellsCount(); nCurCell < nCellsCount; ++nCurCell)
{
var oCell = oRow.GetCell(nCurCell);
var oMargins = oCell.GetMargins(true);
if (null === nTop || nTop < oMargins.Top.W)
nTop = oMargins.Top.W;
}
return nTop;
};
CTableCell.prototype.OnContentChange = function()
{
let table = this.GetTable();
if (table)
table.OnContentChange();
};
CTableCell.prototype.PreDelete = function()
{
this.Content.PreDelete();
};
function CTableCellRecalculateObject()
{
this.BorderInfo = null;
this.Metrics = null;
this.Temp = null;
this.Content = null;
}
CTableCellRecalculateObject.prototype =
{
Save : function(Cell)
{
this.BorderInfo = Cell.BorderInfo;
this.Metrics = Cell.Metrics;
this.Temp = Cell.Temp;
this.Content = Cell.Content.SaveRecalculateObject();
},
Load : function(Cell)
{
Cell.BorderInfo = this.BorderInfo;
Cell.Metrics = this.Metrics;
Cell.Temp = this.Temp;
Cell.Content.LoadRecalculateObject( this.Content );
},
Get_DrawingFlowPos : function(FlowPos)
{
this.Content.Get_DrawingFlowPos( FlowPos );
}
};
//--------------------------------------------------------export----------------------------------------------------
window['AscCommonWord'] = window['AscCommonWord'] || {};
window['AscCommonWord'].CTableCell = CTableCell;
window['AscWord'].CTableCell = CTableCell;
window['AscWord'].TableCell = CTableCell;