/* * (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 MATH_MC_JC = MCJC_CENTER; function CMathMatrixColumnPr() { this.count = 1; this.mcJc = MCJC_CENTER; } CMathMatrixColumnPr.prototype.Set_FromObject = function (Obj) { if (undefined !== Obj.count && null !== Obj.count) this.count = Obj.count; else this.count = 1; if (MCJC_LEFT === Obj.mcJc || MCJC_RIGHT === Obj.mcJc || MCJC_CENTER === Obj.mcJc) this.mcJc = Obj.mcJc; else this.mcJc = MCJC_CENTER; }; CMathMatrixColumnPr.prototype.Copy = function () { var NewPr = new CMathMatrixColumnPr(); NewPr.count = this.count; NewPr.mcJc = this.mcJc; return NewPr; }; CMathMatrixColumnPr.prototype.Write_ToBinary = function (Writer) { // Long : count // Long : mcJc Writer.WriteLong(this.count); Writer.WriteLong(this.mcJc); }; CMathMatrixColumnPr.prototype.Read_FromBinary = function (Reader) { // Long : count // Long : mcJc this.count = Reader.GetLong(); this.mcJc = Reader.GetLong(); }; CMathMatrixColumnPr.fromObject = function(obj) { let pr = new CMathMatrixColumnPr(); pr.Set_FromObject(obj); return pr; }; function CMathMatrixPr(ctrPr) { this.row = 1; this.cGp = 0; this.cGpRule = 0; this.cSp = 0; this.rSp = 0; this.rSpRule = 0; this.mcs = []; this.baseJc = BASEJC_CENTER; this.plcHide = false; this.ctrPr = new CMathCtrlPr(ctrPr); } CMathMatrixPr.prototype.GetRPr = function () { return this.ctrPr.GetRPr(); }; CMathMatrixPr.prototype.Set_FromObject = function (Obj) { if (undefined !== Obj.row && null !== Obj.row) this.row = Obj.row; if (undefined !== Obj.cGp && null !== Obj.cGp) this.cGp = Obj.cGp; if (undefined !== Obj.cGpRule && null !== Obj.cGpRule) this.cGpRule = Obj.cGpRule; if (undefined !== Obj.cSp && null !== Obj.cSp) this.cSp = Obj.cSp; if (undefined !== Obj.rSpRule && null !== Obj.rSpRule) this.rSpRule = Obj.rSpRule; if (undefined !== Obj.rSp && null !== Obj.rSp) this.rSp = Obj.rSp; if (true === Obj.plcHide || 1 === Obj.plcHide) this.plcHide = true; else this.plcHide = false; if (BASEJC_CENTER === Obj.baseJc || BASEJC_TOP === Obj.baseJc || BASEJC_BOTTOM === Obj.baseJc) this.baseJc = Obj.baseJc; var nColumnsCount = 0; if (undefined !== Obj.mcs.length) { var nMcsCount = Obj.mcs.length; if (0 !== nMcsCount) { this.mcs.length = nMcsCount; for (var nMcsIndex = 0; nMcsIndex < nMcsCount; nMcsIndex++) { this.mcs[nMcsIndex] = CMathMatrixColumnPr.fromObject(Obj.mcs[nMcsIndex]); nColumnsCount += this.mcs[nMcsIndex].count; } } else if (undefined !== Obj.column) nColumnsCount = Obj.column; } this.ctrPr.SetRPr(Obj.ctrPrp); return nColumnsCount; }; CMathMatrixPr.prototype.initByContent = function (mrs) { if (!mrs) { return; } //create props by content, important before creation matrix let rowMax = mrs.length; let colMax = 0; for (let i = 0; i < mrs.length; ++i) { colMax = Math.max(colMax, mrs[i].length); } this.row = rowMax; var colMaxMc = 0; for (var i = 0; i < this.mcs.length; ++i) { colMaxMc += this.mcs[i].count; } if (colMaxMc < colMax) { this.mcs.push(CMathMatrixColumnPr.fromObject({count: colMax - colMaxMc, mcJc: MCJC_CENTER})); } }; CMathMatrixPr.prototype.Copy = function () { var NewPr = new CMathMatrixPr(); NewPr.row = this.row; NewPr.cGp = this.cGp; NewPr.cGpRule = this.cGpRule; NewPr.cSp = this.cSp; NewPr.rSp = this.rSp; NewPr.rSpRule = this.rSpRule; NewPr.baseJc = this.baseJc; NewPr.plcHide = this.plcHide; NewPr.ctrPr = this.ctrPr; var nCount = this.mcs.length; for (var nMcsIndex = 0; nMcsIndex < nCount; nMcsIndex++) { NewPr.mcs[nMcsIndex] = this.mcs[nMcsIndex].Copy(); } return NewPr; }; CMathMatrixPr.prototype.Get_ColumnsCount = function () { var nColumnsCount = 0; for (var nMcsIndex = 0, nMcsCount = this.mcs.length; nMcsIndex < nMcsCount; nMcsIndex++) { nColumnsCount += this.mcs[nMcsIndex].count; } return nColumnsCount; }; CMathMatrixPr.prototype.Get_ColumnPrPos = function (PosColumn) { var Count = 0; for (var Pos = 0, nMcsCount = this.mcs.length; Pos < nMcsCount - 1; Pos++) { if (PosColumn < Count + this.mcs[Pos].count) break; Count += this.mcs[Pos].count; } return Pos; }; CMathMatrixPr.prototype.Modify_ColumnCount = function (PosColumn, DiffCount) { var Pos = this.Get_ColumnPrPos(PosColumn); this.mcs[Pos].count += DiffCount; }; CMathMatrixPr.prototype.Get_ColumnMcJc = function (PosColumn) { var Pos = this.Get_ColumnPrPos(PosColumn); return this.mcs[Pos].mcJc; }; CMathMatrixPr.prototype.Set_Row = function (Value) { this.row = Value; }; CMathMatrixPr.prototype.Set_BaseJc = function (Value) { this.baseJc = Value; }; CMathMatrixPr.prototype.Set_ColumnJc = function (Value, PosColumn) { var Count = 0, nMcsCount = this.mcs.length; var Pos, MColumnPr; for (Pos = 0; Pos < nMcsCount - 1; Pos++) { if (PosColumn < Count + this.mcs[Pos].count) break; Count += this.mcs[Pos].count; } if (this.mcs[Pos].count == 1) { this.mcs[Pos].mcJc = Value; } else if (Count < PosColumn && PosColumn < Count + this.mcs[Pos].count) { var CountRight = this.mcs[Pos].count + Count - PosColumn - 1, CountLeft = this.mcs[Pos].count - CountRight - 1; this.mcs[Pos].count = CountLeft; var MColumnPrRight = new CMathMatrixColumnPr(); MColumnPrRight.count = CountRight; MColumnPrRight.mcJc = this.mcs[Pos].mcJc; this.mcs.splice(Pos + 1, 0, MColumnPrRight); MColumnPr = new CMathMatrixColumnPr(); MColumnPr.count = 1; MColumnPr.mcJc = Value; this.mcs.splice(Pos + 1, 0, MColumnPr); } else { this.mcs[Pos].count--; var ColumnPos = PosColumn == Count ? Pos : Pos + 1; MColumnPr = new CMathMatrixColumnPr(); MColumnPr.count = 1; MColumnPr.mcJc = Value; this.mcs.splice(ColumnPos, 0, MColumnPr); } }; CMathMatrixPr.prototype.Write_ToBinary = function (Writer) { // Long : row // Long : cGp // Long : cGpRule // Long : rSp // Long : rSpRule // Long : baseJc // Bool : plcHide // Long : count of mcs // Array : mcs (CMathMatrixColumnPr) Writer.WriteLong(this.row); Writer.WriteLong(this.cGp); Writer.WriteLong(this.cGpRule); Writer.WriteLong(this.rSp); Writer.WriteLong(this.rSpRule); Writer.WriteLong(this.baseJc); Writer.WriteBool(this.plcHide); var nMcsCount = this.mcs.length; Writer.WriteLong(nMcsCount); for (var nIndex = 0; nIndex < nMcsCount; nIndex++) { this.mcs[nIndex].Write_ToBinary(Writer); } Writer.WriteBool(true); this.ctrPr.Write_ToBinary(Writer); }; CMathMatrixPr.prototype.Read_FromBinary = function (Reader) { // Long : row // Long : cGp // Long : cGpRule // Long : rSp // Long : rSpRule // Long : baseJc // Bool : plcHide // Long : count of mcs // Array : mcs (CMColumnsPr) this.row = Reader.GetLong(); this.cGp = Reader.GetLong(); this.cGpRule = Reader.GetLong(); this.rSp = Reader.GetLong(); this.rSpRule = Reader.GetLong(); this.baseJc = Reader.GetLong(); this.plcHide = Reader.GetBool(); var nMcsCount = Reader.GetLong(); this.mcs.length = nMcsCount; for (var nIndex = 0; nIndex < nMcsCount; nIndex++) { this.mcs[nIndex] = new CMathMatrixColumnPr(); this.mcs[nIndex].Read_FromBinary(Reader); } if (Reader.GetBool()) { this.ctrPr.Read_FromBinary(Reader); } }; function CMathMatrixGapPr(Type) { this.Type = Type; this.Rule = 0; this.Gap = 0; this.MinGap = 0; } CMathMatrixGapPr.prototype.Set_DefaultSpace = function (Rule, Gap, MinGap) { this.Rule = Rule; this.Gap = Gap; this.MinGap = MinGap; }; /** * * @constructor * @extends {CMathBase} */ function CMatrixBase() { CMathBase.call(this); this.SpaceRow = new CMathMatrixGapPr(MATH_MATRIX_ROW); this.SpaceColumn = new CMathMatrixGapPr(MATH_MATRIX_COLUMN); this.gaps = { row: [], column: [] }; this.Set_DefaultSpace(); } CMatrixBase.prototype = Object.create(CMathBase.prototype); CMatrixBase.prototype.constructor = CMatrixBase; CMatrixBase.prototype.recalculateSize = function (oMeasure, RPI) { if (this.RecalcInfo.bProps) { if (this.nRow > 1) this.Set_RuleGap(this.SpaceRow, this.Pr.rSpRule, this.Pr.rSp); if (this.nCol > 1) { this.Set_RuleGap(this.SpaceColumn, this.Pr.cGpRule, this.Pr.cGp, this.Pr.cSp); } if (this.kind == MATH_MATRIX) { // выставим выравнивание для столбцов if (this.Pr.mcs !== undefined) { var lng = this.Pr.mcs.length; var col = 0; this.alignment.wdt.length = 0; for (var j = 0; j < lng; j++) { var mc = this.Pr.mcs[j], count = mc.count; for (var i = 0; i < count; i++) { this.alignment.wdt[col] = mc.mcJc; col++; } } } if (this.Pr.plcHide) this.hidePlaceholder(true); } this.RecalcInfo.bProps = false; } var FontSize = this.Get_TxtPrControlLetter().FontSize; var metrics = this.getMetrics(); if (this.nCol > 1) { var gapsCol = this.Get_ColumnGap(this.SpaceColumn, FontSize); for (var i = 0; i < this.nCol - 1; i++) this.gaps.column[i] = gapsCol; } this.gaps.column[this.nCol - 1] = 0; if (this.nRow > 1) { var intervalRow = this.Get_RowSpace(this.SpaceRow, FontSize); var divCenter = 0; var plH = 0.2743827160493827 * FontSize; var minGp = this.SpaceRow.MinGap * FontSize * g_dKoef_pt_to_mm; minGp -= plH; for (var j = 0; j < this.nRow - 1; j++) { divCenter = intervalRow - (metrics.descents[j] + metrics.ascents[j + 1]); this.gaps.row[j] = minGp > divCenter ? minGp : divCenter; } } this.gaps.row[this.nRow - 1] = 0; var height = 0, width = 0; for (var i = 0; i < this.nCol; i++) width += this.gaps.column[i] + metrics.widths[i]; for (var j = 0; j < this.nRow; j++) height += this.gaps.row[j] + metrics.ascents[j] + metrics.descents[j]; var ascent = 0; if (this.Pr.baseJc == BASEJC_TOP) { for (var j = 0; j < this.nCol; j++) ascent = this.elements[0][j].size.ascent > ascent ? this.elements[0][j].size.ascent : ascent; } else if (this.Pr.baseJc == BASEJC_BOTTOM) { var descent = 0, currDsc; for (var j = 0; j < this.nCol; j++) { currDsc = this.elements[this.nRow - 1][j].size.height - this.elements[this.nRow - 1][j].size.ascent; descent = currDsc > descent ? currDsc : descent; ascent = height - descent; } } else /*this.Pr.baseJc == 0*/ ascent = this.getAscent(oMeasure, height); width += this.GapLeft + this.GapRight; this.size.height = height; this.size.width = width; this.size.ascent = ascent; }; CMatrixBase.prototype.Set_DefaultSpace = function () { this.SpaceRow.Set_DefaultSpace(0, 0, 13 / 12); // MinGap - em this.SpaceColumn.Set_DefaultSpace(0, 0, 0); // MinGap / 20 pt }; CMatrixBase.prototype.Set_RuleGap = function (oSpace, Rule, Gap, MinGap) { var bInt = Rule == Rule - 0 && Rule == Rule ^ 0, bRule = Rule >= 0 && Rule <= 4; if (bInt && bRule) oSpace.Rule = Rule; if (Gap == Gap - 0 && Gap == Gap ^ 0) oSpace.Gap = Gap; if (MinGap == MinGap - 0 && MinGap == MinGap ^ 0) oSpace.MinGap = MinGap; }; CMatrixBase.prototype.Get_ColumnGap = function (SpaceColumn, FontSize) { var ColumnGap = this.Get_Gap(SpaceColumn, FontSize, 1); var wPlh = 0.324 * FontSize; var MinGap = SpaceColumn.MinGap / 20 * g_dKoef_pt_to_mm - wPlh; return ColumnGap > MinGap ? ColumnGap : MinGap; }; CMatrixBase.prototype.Get_RowSpace = function (SpaceRow, FontSize) { var LineGap = this.Get_Gap(SpaceRow, FontSize, 7 / 6); var MinGap = SpaceRow.MinGap * FontSize * g_dKoef_pt_to_mm; return LineGap > MinGap ? LineGap : MinGap; }; CMatrixBase.prototype.Get_Gap = function (oSpace, FontSize, coeff) { var Space, Gap; if (oSpace.Rule == 0) Space = coeff; //em else if (oSpace.Rule == 1) Space = coeff * 1.5; //em else if (oSpace.Rule == 2) Space = coeff * 2; //em else if (oSpace.Rule == 3) Space = oSpace.Gap / 20; //pt else if (oSpace.Rule == 4) Space = coeff * oSpace.Gap / 2; //em else Space = coeff; if (oSpace.Rule == 3) Gap = Space * g_dKoef_pt_to_mm; //pt else Gap = Space * FontSize * g_dKoef_pt_to_mm; //em return Gap; }; CMatrixBase.prototype.getRowsCount = function () { return this.Pr.row; }; CMatrixBase.prototype.Add_Row = function (Pos) { var Items = [], CountColumn = this.getColsCount(); for (var CurPos = 0; CurPos < CountColumn; CurPos++) { var NewContent = new CMathContent(); NewContent.Correct_Content(true); Items.push(NewContent); } AscCommon.History.Add(new CChangesMathMatrixAddRow(this, Pos, Items)); this.raw_AddRow(Pos, Items); }; CMatrixBase.prototype.raw_AddRow = function (Pos, Items) { // изменить кол-во строк в матрицы и добавить элементы новой строки нужно в одной точке истории // т.к. при добавлении, удалении элементов учитывается кол-во строк и столбцов для заполнения массива elements this.Pr.Set_Row(this.Pr.row + 1); this.raw_AddToContent(Pos, Items, true); // чтобы корректно обновить NearPos пройдемся циклом еще раз по всем позициям добавленных контентов for (var CurPos = Pos; CurPos < Pos + Items.length; CurPos++) { this.private_UpdatePosOnAdd(CurPos, true); } }; CMatrixBase.prototype.raw_RemoveRow = function (Pos, Count) { this.Pr.Set_Row(this.Pr.row - 1); this.raw_RemoveFromContent(Pos, Count); // Обновим текущую позицию if (this.CurPos > Pos + Count) this.CurPos -= Count; else if (this.CurPos > Pos) this.CurPos = Pos; this.private_CorrectCurPos(); this.private_UpdatePosOnRemove(Pos, Count); }; CMatrixBase.prototype.Remove_Row = function (RowPos) { if (this.Pr.row > 1) { var ColumnCount = this.getColsCount(); var NextPos = RowPos * ColumnCount; var Items = this.Content.slice(NextPos, NextPos + ColumnCount); AscCommon.History.Add(new CChangesMathMatrixRemoveRow(this, NextPos, Items)); this.raw_RemoveRow(NextPos, Items.length); } }; CMatrixBase.prototype.SetBaseJc = function (Value) { if (this.Pr.baseJc !== Value) { AscCommon.History.Add(new CChangesMathMatrixBaseJc(this, this.Pr.baseJc, Value)); this.raw_SetBaseJc(Value); } }; CMatrixBase.prototype.raw_SetBaseJc = function (Value) { this.Pr.Set_BaseJc(Value); }; CMatrixBase.prototype.Modify_Interval = function (Item, NewRule, NewGap) { var OldRule, OldGap; if (Item.Type == MATH_MATRIX_ROW) { OldRule = this.Pr.rSpRule; OldGap = this.Pr.rSp; } else { OldRule = this.Pr.cGpRule; OldGap = this.Pr.cGp; } if (NewRule !== OldRule || NewGap !== OldGap) { AscCommon.History.Add(new CChangesMathMatrixInterval(this, Item.Type, OldRule, OldGap, NewRule, NewGap)); this.raw_SetInterval(Item.Type, NewRule, NewGap); } }; CMatrixBase.prototype.raw_SetInterval = function (Item, Rule, Gap) { if (Item == MATH_MATRIX_ROW) { this.Pr.rSpRule = Rule; this.Pr.rSp = Gap; this.Set_RuleGap(this.SpaceRow, Rule, Gap); } else if (Item == MATH_MATRIX_COLUMN) { this.Pr.cGpRule = Rule; this.Pr.cGp = Gap; this.Set_RuleGap(this.SpaceColumn, Rule, Gap, this.Pr.cSp); } }; /** * * @param props * @constructor * @extends {CMatrixBase} */ function CMathMatrix(props) { CMatrixBase.call(this); this.Id = AscCommon.g_oIdCounter.Get_NewId(); this.Pr = new CMathMatrixPr(this.CtrPrp); this.column = 0; if (props !== null && props !== undefined) this.init(props); AscCommon.g_oTableId.Add(this, this.Id); } CMathMatrix.prototype = Object.create(CMatrixBase.prototype); CMathMatrix.prototype.constructor = CMathMatrix; CMathMatrix.prototype.ClassType = AscDFH.historyitem_type_matrix; CMathMatrix.prototype.kind = MATH_MATRIX; CMathMatrix.prototype.init = function (props) { this.setProperties(props); this.Pr.initByContent(props.mrs); this.column = this.Pr.Get_ColumnsCount(); if (props.mrs) { props.content = this.flatContent(props.mrs, this.column); } var nRowsCount = this.getRowsCount(); var nColsCount = this.getColsCount(); this.Fill_LogicalContent(nRowsCount * nColsCount, props.content); this.fillContent(); }; CMathMatrix.prototype.flatContent = function (content, cols) { let res = []; for (let i = 0; i < content.length; ++i) { let row = content[i]; for (let j = 0; j < row.length; ++j) { res[i * cols + j] = row[j]; } } return res; }; CMathMatrix.prototype.setPosition = function (pos, PosInfo) { this.pos.x = pos.x; if (this.bInside === true) this.pos.y = pos.y; else this.pos.y = pos.y - this.size.ascent; ///!!!! this.UpdatePosBound(pos, PosInfo); var maxWH = this.getWidthsHeights(); var Widths = maxWH.widths; var Heights = maxWH.heights; var NewPos = new CMathPosition(); var h = 0, w = 0; for (var i = 0; i < this.nRow; i++) { w = 0; for (var j = 0; j < this.nCol; j++) { var Item = this.elements[i][j]; var al = this.align(i, j); NewPos.x = this.pos.x + this.GapLeft + al.x + w; NewPos.y = this.pos.y + al.y + h + Item.size.ascent; Item.setPosition(NewPos, PosInfo); w += Widths[j] + this.gaps.column[j]; } h += Heights[i] + this.gaps.row[i]; } pos.x += this.size.width; }; CMathMatrix.prototype.getMetrics = function (RPI) { var Ascents = []; var Descents = []; var Widths = []; for (var i = 0; i < this.nRow; i++) { Ascents[i] = 0; Descents[i] = 0; for (var j = 0; j < this.nCol; j++) { var size = this.elements[i][j].size; Widths[j] = i > 0 && (Widths[j] > size.width) ? Widths[j] : size.width; Ascents[i] = (Ascents[i] > size.ascent) ? Ascents[i] : size.ascent; Descents[i] = (Descents[i] > size.height - size.ascent) ? Descents[i] : size.height - size.ascent; } } return {ascents: Ascents, descents: Descents, widths: Widths} }; CMathMatrix.prototype.getContentElement = function (nRowIndex, nColIndex) { return this.Content[nRowIndex * this.getColsCount() + nColIndex]; }; CMathMatrix.prototype.fillContent = function () { this.column = this.Pr.Get_ColumnsCount(); var nRowsCount = this.getRowsCount(); var nColsCount = this.getColsCount(); this.setDimension(nRowsCount, nColsCount); for (var nRowIndex = 0; nRowIndex < nRowsCount; nRowIndex++) { for (var nColIndex = 0; nColIndex < nColsCount; nColIndex++) { this.elements[nRowIndex][nColIndex] = this.getContentElement(nRowIndex, nColIndex); } } }; CMathMatrix.prototype.getColsCount = function () { return this.column; }; CMathMatrix.prototype.Get_RowPos = function (Pos) { var ColumnCount = this.getColsCount(); return Pos / ColumnCount >> 0; }; CMathMatrix.prototype.Get_ColumnPos = function (Pos) { var ColumnCount = this.getColsCount(); var RowPos = Pos / ColumnCount >> 0; // номер строки return Pos - ColumnCount * RowPos; }; CMathMatrix.prototype.Apply_MenuProps = function (Props) { if (Props.Type == Asc.c_oAscMathInterfaceType.Matrix) { var ColumnCount = this.getColsCount(), RowPos = this.Get_RowPos(this.CurPos), ColumnPos = this.Get_ColumnPos(this.CurPos); var bGapWholeNumber, bGapNumber; var NextPos; if (Props.BaseJc !== undefined) { var BaseJc = this.Pr.baseJc; if (Props.BaseJc === Asc.c_oAscMathInterfaceMatrixMatrixAlign.Center) { BaseJc = BASEJC_CENTER; } else if (Props.BaseJc === Asc.c_oAscMathInterfaceMatrixMatrixAlign.Bottom) { BaseJc = BASEJC_BOTTOM; } else if (Props.BaseJc === Asc.c_oAscMathInterfaceMatrixMatrixAlign.Top) { BaseJc = BASEJC_TOP; } this.SetBaseJc(BaseJc); } if (Props.ColumnJc !== undefined) { var CurrentMcJc = this.Pr.Get_ColumnMcJc(ColumnPos); var McJc = CurrentMcJc; if (Props.ColumnJc === Asc.c_oAscMathInterfaceMatrixColumnAlign.Center) { McJc = MCJC_CENTER; } else if (Props.ColumnJc === Asc.c_oAscMathInterfaceMatrixColumnAlign.Left) { McJc = MCJC_LEFT; } else if (Props.ColumnJc === Asc.c_oAscMathInterfaceMatrixColumnAlign.Right) { McJc = MCJC_RIGHT; } if (CurrentMcJc !== McJc) { AscCommon.History.Add(new CChangesMathMatrixColumnJc(this, CurrentMcJc, McJc, ColumnPos)); this.raw_SetColumnJc(McJc, ColumnPos); } } if (Props.RowRule !== undefined) { switch (Props.RowRule) { case c_oAscMathInterfaceMatrixRowRule.Single: { this.Modify_Interval(this.SpaceRow, 0, 0); break; } case c_oAscMathInterfaceMatrixRowRule.OneAndHalf: { this.Modify_Interval(this.SpaceRow, 1, 0); break; } case c_oAscMathInterfaceMatrixRowRule.Double: { this.Modify_Interval(this.SpaceRow, 2, 0); break; } case c_oAscMathInterfaceMatrixRowRule.Exactly: { bGapWholeNumber = Props.Gap !== undefined && Props.Gap + 0 == Props.Gap && Props.Gap >> 0 == Props.Gap; if (bGapWholeNumber == true && Props.Gap >= 0 && Props.Gap <= 31680) { this.Modify_Interval(this.SpaceRow, 3, Props.Gap * 20); } break; } case c_oAscMathInterfaceMatrixRowRule.Multiple: { bGapNumber = Props.Gap !== undefined && Props.Gap + 0 == Props.Gap; if (bGapNumber == true && Props.Gap >= 0 && Props.Gap <= 111) { var Gap = (Props.Gap * 2 + 0.5) >> 0; this.Modify_Interval(this.SpaceRow, 4, Gap); } break; } } } if (Props.ColumnRule !== undefined) { switch (Props.ColumnRule) { case c_oAscMathInterfaceMatrixColumnRule.Single: { this.Modify_Interval(this.SpaceColumn, 0, 0); break; } case c_oAscMathInterfaceMatrixColumnRule.OneAndHalf: { this.Modify_Interval(this.SpaceColumn, 1, 0); break; } case c_oAscMathInterfaceMatrixColumnRule.Double: { this.Modify_Interval(this.SpaceColumn, 2, 0); break; } case c_oAscMathInterfaceMatrixColumnRule.Exactly: { bGapWholeNumber = Props.Gap !== undefined && Props.Gap + 0 == Props.Gap && Props.Gap >> 0 == Props.Gap; if (bGapWholeNumber == true && Props.Gap >= 0 && Props.Gap <= 31680) { this.Modify_Interval(this.SpaceColumn, 3, Props.Gap * 20); } break; } case c_oAscMathInterfaceMatrixColumnRule.Multiple: { bGapNumber = Props.Gap !== undefined && Props.Gap + 0 == Props.Gap; if (bGapNumber == true && Props.Gap >= 0 && Props.Gap <= 55.87) { var Gap = (Props.Gap / 0.21163) >> 0, NextMenuGap = (((0.21163 * (Gap + 1)) * 100 + 0.5) >> 0) / 100; // учтем округление // (пример: Props.Gap = // 2.96) if (Props.Gap >= NextMenuGap) Gap++; this.Modify_Interval(this.SpaceColumn, 4, Gap); } break; } } } if (Props.Action & c_oMathMenuAction.DeleteMatrixRow && this.getRowsCount() > 1) { this.Remove_Row(RowPos); } if (Props.Action & c_oMathMenuAction.DeleteMatrixColumn && ColumnCount > 1) { this.Remove_Column(ColumnPos); } if (Props.Action & c_oMathMenuAction.InsertMatrixRow) { if (Props.Action & c_oMathMenuAction.InsertBefore) { NextPos = RowPos * ColumnCount; this.Add_Row(NextPos); } else { NextPos = (RowPos + 1) * ColumnCount; // позиция для вставки массива контентов this.Add_Row(NextPos); } } if (Props.Action & c_oMathMenuAction.InsertMatrixColumn) { if (Props.Action & c_oMathMenuAction.InsertBefore) { this.Add_Column(ColumnPos); } else { this.Add_Column(ColumnPos + 1); } } if (Props.bHidePlh !== undefined) { if (Props.bHidePlh !== this.Pr.plcHide) { AscCommon.History.Add(new CChangesMathMatrixPlh(this, this.Pr.plcHide, Props.bHidePlh)); this.raw_HidePlh(Props.bHidePlh); } } } }; CMathMatrix.prototype.Get_InterfaceProps = function () { return new CMathMenuMatrix(this); }; CMathMatrix.prototype.Add_Column = function (ColumnPos) { var Items = [], CountRow = this.getRowsCount(); for (var CurPos = 0; CurPos < CountRow; CurPos++) { var NewContent = new CMathContent(); NewContent.Correct_Content(true); Items.push(NewContent); } AscCommon.History.Add(new CChangesMathMatrixAddColumn(this, ColumnPos, Items)); this.raw_AddColumn(ColumnPos, Items); }; CMathMatrix.prototype.raw_AddColumn = function (Pos, Items) { var CountColumn = this.getColsCount(); var RowPos = this.CurPos / CountColumn >> 0; // номер строки for (var CurPos = 0; CurPos < Items.length; CurPos++) { this.Content.splice((CountColumn + 1) * CurPos + Pos, 0, Items[CurPos]); Items[CurPos].ParentElement = this; this.private_UpdatePosOnAdd((CountColumn + 1) * CurPos + Pos, true); } this.Modify_ColumnCount(this.CurPos - CountColumn * RowPos, 1); this.fillContent(); }; CMathMatrix.prototype.Remove_Column = function (ColumnPos) { var Items = [], CountRow = this.getRowsCount(), CountColumn = this.getColsCount(); for (var CurPos = 0; CurPos < CountRow; CurPos++) { Items.push(this.Content[CountColumn * CurPos + ColumnPos]); } AscCommon.History.Add(new CChangesMathMatrixRemoveColumn(this, ColumnPos, Items)); this.raw_RemoveColumn(ColumnPos, Items.length); }; CMathMatrix.prototype.raw_RemoveColumn = function (Pos, CountItems) { var CountColumn = this.getColsCount(); var RowPos = this.CurPos / CountColumn >> 0; // номер строки for (var CurPos = 0; CurPos < CountItems; CurPos++) { this.Content.splice((CountColumn - 1) * CurPos + Pos, 1); } this.Modify_ColumnCount(this.CurPos - CountColumn * RowPos, -1); this.fillContent(); // Обновим текущую позицию if (this.CurPos > Pos - RowPos) this.CurPos -= RowPos; else if (this.CurPos > Pos) this.CurPos = Pos; this.private_CorrectCurPos(); this.private_UpdatePosOnRemove(Pos, RowPos); }; CMathMatrix.prototype.Modify_ColumnCount = function (Pos, Count) { this.Pr.Modify_ColumnCount(Pos, Count); this.column = this.Pr.Get_ColumnsCount(); }; CMathMatrix.prototype.raw_SetColumnJc = function (Value, ColumnPos) { this.RecalcInfo.bProps = true; this.Pr.Set_ColumnJc(Value, ColumnPos); }; CMathMatrix.prototype.raw_HidePlh = function (Value) { this.Pr.plcHide = Value; this.hidePlaceholder(Value); }; CMathMatrix.prototype.raw_Set_MinColumnWidth = function (Value) { this.Pr.cSp = Value; this.Set_RuleGap(this.SpaceColumn, this.Pr.cGpRule, this.Pr.cGp, Value); }; CMathMatrix.prototype.Is_DeletedItem = function (Action) { var bDeleteMatrix = false; if (c_oMathMenuAction.DeleteMatrixRow == Action && 1 == this.getRowsCount()) bDeleteMatrix = true; else if (c_oMathMenuAction.DeleteMatrixColumn == Action && 1 == this.getColsCount()) bDeleteMatrix = true; return bDeleteMatrix; }; CMathMatrix.prototype.Get_DeletedItemsThroughInterface = function () { return []; }; /** * * @param {MathTextAndStyles | boolean} oMathText * @constructor */ CMathMatrix.prototype.GetTextOfElement = function (oMathText) { oMathText = new AscMath.MathTextAndStyles(oMathText); let strMatrixSymbol, oDelimiterParent; if (this.Parent instanceof CDelimiter) oDelimiterParent = this.Parent; else if (this.Parent.Parent instanceof CDelimiter) oDelimiterParent = this.Parent.Parent; let strBrackets = oDelimiterParent ? String.fromCharCode(oDelimiterParent.Pr.begChr) + String.fromCharCode(oDelimiterParent.Pr.endChr) : undefined; if (oMathText.IsLaTeX()) { // switch (strBrackets) { // case undefined: // strMatrixSymbol = "matrix"; // break; // case "()": // strMatrixSymbol = "pmatrix"; // break; // case "[]": // strMatrixSymbol = "bmatrix"; // break; // case "{}": // strMatrixSymbol = "Bmatrix"; // break; // case "||": // strMatrixSymbol = "vmatrix"; // break; // case "||": // strMatrixSymbol = "vmatrix"; // break; // case "‖‖": // strMatrixSymbol = "Vmatrix"; // break; // } strMatrixSymbol = "matrix"; // = strBrackets === "()" ? "pmatrix" : "matrix"; oMathText.AddText(new AscMath.MathText("\\begin{" + strMatrixSymbol + "}", this)) } else { oMathText.AddText(new AscMath.MathText("■(", this)); } // Word поддерживает несколько типов ввода для матриц LaTeX: // 1. Команды матриц с заданными скобками (matrix, pmatrix, bmatrix, Bmatrix, vmatrix, Vmatrix). В Word поддерживается только matrix и pmatrix. // - При получении линейного вида для матрицы pmatrix в Word мы будем получать так же pmatrix, однако если // переоткрыть документ для pmatrix. То при получении линейного вида матрица будет в формате matrix обёрнутая // в скобки. Можно ввести отдельное свойство матриц для отслеживания таких данных (без записи этих данных), // тогда поведение будет аналогичным Word. // 2. Можно обернуть команду matrix (матрица без скобок) в скобку: // \left\langle \begin{matrix} 1 & 2 & 3 \end{matrix} \right) // // На данный момент делаем получение линейного формата всегда в режиме pmatrix, если это возможно (используем обычные скобки) let oLastPos; for (let nRow = 0; nRow < this.nRow; nRow++) { for (let nCol = 0; nCol < this.nCol; nCol++) { let oPos = this.getContentElement(nRow, nCol) oLastPos = oMathText.Add(oPos, true, 0); if (nCol < this.nCol - 1) { let oText = new AscMath.MathText("&", this); oLastPos = oMathText.AddAfter(oLastPos, oText); } else if (nRow < this.nRow - 1) { let oText = new AscMath.MathText(oMathText.IsLaTeX() ? "\\\\" : '@', this); oLastPos = oMathText.AddAfter(oLastPos, oText); } } } if (oMathText.IsLaTeX()) oMathText.AddText(new AscMath.MathText("\\\\\\end{" + strMatrixSymbol + "}", this)); else oMathText.AddAfter(oLastPos,new AscMath.MathText(")", this)); return oMathText; }; /** * * @param CMathMenuMatrix * @constructor * @extends {CMathMenuBase} */ function CMathMenuMatrix(MathMatrix) { CMathMenuBase.call(this, MathMatrix); this.Type = Asc.c_oAscMathInterfaceType.Matrix; if (undefined !== MathMatrix) { var ColumnPos = MathMatrix.Get_ColumnPos(MathMatrix.CurPos); var RowRule, RowGap, ColumnRule, ColumnGap; switch (MathMatrix.SpaceRow.Rule) { default: case 0: { RowRule = c_oAscMathInterfaceMatrixRowRule.Single; break; } case 1: { RowRule = c_oAscMathInterfaceMatrixRowRule.OneAndHalf; break; } case 2: { RowRule = c_oAscMathInterfaceMatrixRowRule.Double; break; } case 3: { RowRule = c_oAscMathInterfaceMatrixRowRule.Exactly; RowGap = MathMatrix.SpaceRow.Gap / 20; break; } case 4: { RowRule = c_oAscMathInterfaceMatrixRowRule.Multiple; RowGap = MathMatrix.SpaceRow.Gap * 0.5; break; } } switch (MathMatrix.SpaceColumn.Rule) { default: case 0: { ColumnRule = c_oAscMathInterfaceMatrixColumnRule.Single; break; } case 1: { ColumnRule = c_oAscMathInterfaceMatrixColumnRule.OneAndHalf; break; } case 2: { ColumnRule = c_oAscMathInterfaceMatrixColumnRule.Double; break; } case 3: { ColumnRule = c_oAscMathInterfaceMatrixColumnRule.Exactly; ColumnGap = MathMatrix.SpaceColumn.Gap / 20; break; } case 4: { ColumnRule = c_oAscMathInterfaceMatrixColumnRule.Multiple; ColumnGap = (((0.21163 * MathMatrix.SpaceColumn.Gap) * 100 + 0.5) >> 0) / 100; break; } } var ColumnJc = MathMatrix.Pr.Get_ColumnMcJc(ColumnPos); this.BaseJc = MathMatrix.Pr.baseJc === BASEJC_CENTER ? Asc.c_oAscMathInterfaceMatrixMatrixAlign.Center : (MathMatrix.Pr.baseJc === BASEJC_BOTTOM ? Asc.c_oAscMathInterfaceMatrixMatrixAlign.Bottom : Asc.c_oAscMathInterfaceMatrixMatrixAlign.Top); this.ColumnJc = ColumnJc === MCJC_CENTER ? Asc.c_oAscMathInterfaceMatrixColumnAlign.Center : (ColumnJc === MCJC_RIGHT ? Asc.c_oAscMathInterfaceMatrixColumnAlign.Right : Asc.c_oAscMathInterfaceMatrixColumnAlign.Left); this.RowRule = RowRule; this.RowGap = RowGap; this.ColumnRule = ColumnRule; this.ColumnGap = ColumnGap; this.MinColumnWidth = MathMatrix.Pr.cSp / 20; this.bHidePlh = MathMatrix.Pr.plcHide; } else { this.BaseJc = undefined; this.ColumnJc = undefined; this.RowRule = undefined; this.RowGap = undefined; this.ColumnRule = undefined; this.ColumnGap = undefined; this.MinColumnWidth = undefined; this.bHidePlh = undefined; } } CMathMenuMatrix.prototype = Object.create(CMathMenuBase.prototype); CMathMenuMatrix.prototype.constructor = CMathMenuMatrix; CMathMenuMatrix.prototype.get_MatrixAlign = function () { return this.BaseJc; }; CMathMenuMatrix.prototype.put_MatrixAlign = function (Align) { this.BaseJc = Align; }; CMathMenuMatrix.prototype.get_ColumnAlign = function () { return this.ColumnJc; }; CMathMenuMatrix.prototype.put_ColumnAlign = function (Align) { this.ColumnJc = Align; }; CMathMenuMatrix.prototype.get_RowRule = function () { return this.RowRule; }; CMathMenuMatrix.prototype.put_RowRule = function (RowRule) { this.RowRule = RowRule; }; CMathMenuMatrix.prototype.get_RowGap = function () { return this.RowGap; }; CMathMenuMatrix.prototype.put_RowGap = function (RowGap) { this.RowGap = RowGap; }; CMathMenuMatrix.prototype.get_ColumnRule = function () { return this.ColumnRule; }; CMathMenuMatrix.prototype.put_ColumnRule = function (ColumnRule) { this.ColumnRule = ColumnRule; }; CMathMenuMatrix.prototype.get_ColumnGap = function () { return this.ColumnGap; }; CMathMenuMatrix.prototype.put_ColumnGap = function (ColumnGap) { this.ColumnGap = ColumnGap; }; CMathMenuMatrix.prototype.get_MinColumnSpace = function () { return this.MinColumnWidth; }; CMathMenuMatrix.prototype.put_MinColumnSpace = function (MinSpace) { this.MinColumnWidth = MinSpace; }; CMathMenuMatrix.prototype.get_HidePlaceholder = function () { return this.bHidePlh; }; CMathMenuMatrix.prototype.put_HidePlaceholder = function (Hide) { this.bHidePlh = Hide; }; window["CMathMenuMatrix"] = CMathMenuMatrix; CMathMenuMatrix.prototype["get_MatrixAlign"] = CMathMenuMatrix.prototype.get_MatrixAlign; CMathMenuMatrix.prototype["put_MatrixAlign"] = CMathMenuMatrix.prototype.put_MatrixAlign; CMathMenuMatrix.prototype["get_ColumnAlign"] = CMathMenuMatrix.prototype.get_ColumnAlign; CMathMenuMatrix.prototype["put_ColumnAlign"] = CMathMenuMatrix.prototype.put_ColumnAlign; CMathMenuMatrix.prototype["get_RowRule"] = CMathMenuMatrix.prototype.get_RowRule; CMathMenuMatrix.prototype["put_RowRule"] = CMathMenuMatrix.prototype.put_RowRule; CMathMenuMatrix.prototype["get_RowGap"] = CMathMenuMatrix.prototype.get_RowGap; CMathMenuMatrix.prototype["put_RowGap"] = CMathMenuMatrix.prototype.put_RowGap; CMathMenuMatrix.prototype["get_ColumnRule"] = CMathMenuMatrix.prototype.get_ColumnRule; CMathMenuMatrix.prototype["put_ColumnRule"] = CMathMenuMatrix.prototype.put_ColumnRule; CMathMenuMatrix.prototype["get_ColumnGap"] = CMathMenuMatrix.prototype.get_ColumnGap; CMathMenuMatrix.prototype["put_ColumnGap"] = CMathMenuMatrix.prototype.put_ColumnGap; CMathMenuMatrix.prototype["get_MinColumnSpace"] = CMathMenuMatrix.prototype.get_MinColumnSpace; CMathMenuMatrix.prototype["put_MinColumnSpace"] = CMathMenuMatrix.prototype.put_MinColumnSpace; CMathMenuMatrix.prototype["get_HidePlaceholder"] = CMathMenuMatrix.prototype.get_HidePlaceholder; CMathMenuMatrix.prototype["put_HidePlaceholder"] = CMathMenuMatrix.prototype.put_HidePlaceholder; function CMathPoint() { this.even = -1; this.odd = -1; } function CMathEqArrPr(ctrPr) { this.maxDist = 0; this.objDist = 0; this.rSp = 0; this.rSpRule = 0; this.baseJc = BASEJC_CENTER; this.row = 1; this.ctrPr = new CMathCtrlPr(ctrPr); } CMathEqArrPr.prototype.GetRPr = function () { return this.ctrPr.GetRPr(); } CMathEqArrPr.prototype.initByContent = function (content) { if (!content) { return; } this.row = content.length; }; CMathEqArrPr.prototype.Set_FromObject = function (Obj) { if (undefined !== Obj.maxDist && null !== Obj.maxDist) this.maxDist = Obj.maxDist; if (undefined !== Obj.objDist && null !== Obj.objDist) this.objDist = Obj.objDist; if (undefined !== Obj.rSp && null !== Obj.rSp) this.rSp = Obj.rSp; if (undefined !== Obj.rSpRule && null !== Obj.rSpRule) this.rSpRule = Obj.rSpRule; if (undefined !== Obj.baseJc && null !== Obj.baseJc) this.baseJc = Obj.baseJc; this.row = Obj.row; this.ctrPr.SetRPr(Obj.ctrPrp); }; CMathEqArrPr.prototype.Copy = function () { var NewPr = new CMathEqArrPr(); NewPr.maxDist = this.maxDist; NewPr.objDist = this.objDist; NewPr.rSp = this.rSp; NewPr.rSpRule = this.rSpRule; NewPr.baseJc = this.baseJc; NewPr.row = this.row; NewPr.ctrPr = this.ctrPr; return NewPr; }; CMathEqArrPr.prototype.Set_Row = function (Value) { this.row = Value; }; CMathEqArrPr.prototype.Set_BaseJc = function (Value) { this.baseJc = Value; }; CMathEqArrPr.prototype.Write_ToBinary = function (Writer) { // Long : maxDist // Long : objDist // Long : rSp // Long : rSpRule // Long : baseJc // Long : row Writer.WriteLong(this.maxDist); Writer.WriteLong(this.objDist); Writer.WriteLong(this.rSp); Writer.WriteLong(this.rSpRule); Writer.WriteLong(this.baseJc); Writer.WriteLong(this.row); Writer.WriteBool(true); this.ctrPr.Write_ToBinary(Writer); }; CMathEqArrPr.prototype.Read_FromBinary = function (Reader) { // Long : maxDist // Long : objDist // Long : rSp // Long : rSpRule // Long : baseJc // Long : row this.maxDist = Reader.GetLong(); this.objDist = Reader.GetLong(); this.rSp = Reader.GetLong(); this.rSpRule = Reader.GetLong(); this.baseJc = Reader.GetLong(); this.row = Reader.GetLong(); if (Reader.GetBool()) { this.ctrPr.Read_FromBinary(Reader); } }; /** * * @param props * @constructor * @extends {CMatrixBase} */ function CEqArray(props) { CMatrixBase.call(this); this.Id = AscCommon.g_oIdCounter.Get_NewId(); this.Pr = new CMathEqArrPr(this.CtrPrp); // for ampersand in Run this.WidthsPoints = []; this.Points = []; this.MaxDimWidths = []; // if (props !== null && props !== undefined) this.init(props); AscCommon.g_oTableId.Add(this, this.Id); } CEqArray.prototype = Object.create(CMatrixBase.prototype); CEqArray.prototype.constructor = CEqArray; CEqArray.prototype.ClassType = AscDFH.historyitem_type_eqArr; CEqArray.prototype.kind = MATH_EQ_ARRAY; CEqArray.prototype.init = function (props) { this.setProperties(props); this.Pr.initByContent(props.content); var nRowsCount = this.Pr.row; this.Fill_LogicalContent(nRowsCount, props.content); this.fillContent(); }; CEqArray.prototype.initPostOpen = function (mcJc) { if (mcJc) { for (var j = 0; j < this.Content.length; j++) { var oContentElem = this.Content[j]; if (oContentElem.Content.length == 0) oContentElem.SetPlaceholder(); } this.setJustificationForConversion(mcJc); } }; CEqArray.prototype.fillContent = function () { var nRowsCount = this.Content.length; this.setDimension(nRowsCount, 1); for (var nIndex = 0; nIndex < nRowsCount; nIndex++) this.elements[nIndex][0] = this.Content[nIndex]; }; CEqArray.prototype.getColsCount = function () { return 1; }; CEqArray.prototype.Resize = function (oMeasure, RPI) { var bEqArray = RPI.bEqArray; RPI.bEqArray = true; for (var i = 0; i < this.nRow; i++) this.elements[i][0].Resize(oMeasure, RPI); this.recalculateSize(oMeasure); RPI.bEqArray = bEqArray; }; CEqArray.prototype.getMetrics = function () { var AscentsMetrics = []; var DescentsMetrics = []; var WidthsMetrics = []; // нумерация начинается с нуля, поэтому все четные точки идут с нечетными номерами в массиве var EndWidths = 0; var even, // четная точка odd, // нечетная точка last; var maxDim, maxDimWidth; var Pos = 0; this.WidthsPoints.length = 0; this.Points.length = 0; this.MaxDimWidths.length = 0; WidthsMetrics[0] = 0; while (EndWidths < this.nRow) { even = 0; odd = 0; last = 0; maxDim = 0; maxDimWidth = 0; for (var i = 0; i < this.nRow; i++) { var WidthsRow = this.elements[i][0].Get_WidthPoints().Widths, len = WidthsRow.length; if (Pos < len) { if (WidthsRow[Pos].odd !== -1) { if (maxDim < WidthsRow[Pos].even || maxDim < WidthsRow[Pos].odd) { maxDim = WidthsRow[Pos].even < WidthsRow[Pos].odd ? WidthsRow[Pos].odd : WidthsRow[Pos].even; maxDimWidth = WidthsRow[Pos].even + WidthsRow[Pos].odd; } even = even > WidthsRow[Pos].even ? even : WidthsRow[Pos].even; // before "odd" odd = odd > WidthsRow[Pos].odd ? odd : WidthsRow[Pos].odd; // after "odd" } else { if (maxDim < WidthsRow[Pos].even) { maxDim = WidthsRow[Pos].even; maxDimWidth = maxDim; } last = last > WidthsRow[Pos].even ? last : WidthsRow[Pos].even; } if (Pos == len - 1) EndWidths++; } } var w = even + odd > last ? even + odd : last; var NewPoint = new CMathPoint(); NewPoint.even = even; NewPoint.odd = odd; this.WidthsPoints.push(w); this.MaxDimWidths.push(maxDimWidth); this.Points.push(NewPoint); WidthsMetrics[0] += w; Pos++; } for (var i = 0; i < this.nRow; i++) this.elements[i][0].ApplyPoints(this.WidthsPoints, this.Points, this.MaxDimWidths); for (var i = 0; i < this.nRow; i++) { var size = this.elements[i][0].size; AscentsMetrics[i] = size.ascent; DescentsMetrics[i] = size.height - size.ascent; } return {ascents: AscentsMetrics, descents: DescentsMetrics, widths: WidthsMetrics}; }; CEqArray.prototype.setPosition = function (pos, PosInfo) { this.pos.x = pos.x; if (this.bInside === true) this.pos.y = pos.y; else this.pos.y = pos.y - this.size.ascent; ///!!!! this.UpdatePosBound(pos, PosInfo); var maxWH = this.getWidthsHeights(); var Heights = maxWH.heights; var NewPos = new CMathPosition(); var h = 0; for (var i = 0; i < this.nRow; i++) { var Item = this.elements[i][0]; NewPos.x = this.pos.x + this.GapLeft; NewPos.y = this.pos.y + h + Item.size.ascent; Item.setPosition(NewPos, PosInfo); h += Heights[i] + this.gaps.row[i]; } pos.x += this.size.width; }; CEqArray.prototype.setJustificationForConversion = function (js) // эта функция должна вызываться только при конвертации, после того как у всех элементов контенты заполнены { var lng = this.Content.length; var NewElement, Run; if (js == MCJC_LEFT) { for (var i = 0; i < lng; i++) { NewElement = new CMathAmp(); Run = this.Content[i].Content[0]; Run.MoveCursorToStartPos(); Run.Add(NewElement, true); } } else if (js == MCJC_RIGHT) { for (var i = 0; i < lng; i++) { NewElement = new CMathAmp(); var EndPos = this.Content[i].Content.length - 1; Run = this.Content[i].Content[EndPos]; Run.MoveCursorToEndPos(); Run.Add(NewElement, true); } } }; CEqArray.prototype.getElement = function (num) { return this.elements[num][0]; }; CEqArray.prototype.getElementMathContent = function (Index) { return this.Content[Index]; }; CEqArray.prototype.Apply_MenuProps = function (Props) { if (Props.Type == Asc.c_oAscMathInterfaceType.EqArray) { if (Props.BaseJc !== undefined) { var BaseJc = this.Pr.baseJc; if (Props.BaseJc === Asc.c_oAscMathInterfaceEqArrayAlign.Center) { BaseJc = BASEJC_CENTER; } else if (Props.BaseJc === Asc.c_oAscMathInterfaceEqArrayAlign.Bottom) { BaseJc = BASEJC_BOTTOM; } else if (Props.BaseJc === Asc.c_oAscMathInterfaceEqArrayAlign.Top) { BaseJc = BASEJC_TOP; } this.SetBaseJc(BaseJc); } if (Props.RowRule !== undefined) { switch (Props.RowRule) { case c_oAscMathInterfaceEqArrayLineRule.Single: { this.Modify_Interval(this.SpaceRow, 0, 0); break; } case c_oAscMathInterfaceEqArrayLineRule.OneAndHalf: { this.Modify_Interval(this.SpaceRow, 1, 0); break; } case c_oAscMathInterfaceEqArrayLineRule.Double: { this.Modify_Interval(this.SpaceRow, 2, 0); break; } case c_oAscMathInterfaceEqArrayLineRule.Exactly: { var bGapWholeNumber = Props.Gap !== undefined && Props.Gap + 0 == Props.Gap && Props.Gap >> 0 == Props.Gap; if (bGapWholeNumber == true && Props.Gap >= 0 && Props.Gap <= 31680) { this.Modify_Interval(this.SpaceRow, 3, Props.Gap * 20); } break; } case c_oAscMathInterfaceEqArrayLineRule.Multiple: { var bGapNumber = Props.Gap !== undefined && Props.Gap + 0 == Props.Gap; if (bGapNumber == true && Props.Gap >= 0 && Props.Gap <= 111) { var Gap = (Props.Gap * 2 + 0.5) >> 0; this.Modify_Interval(this.SpaceRow, 4, Gap); } break; } } } if (Props.Action & c_oMathMenuAction.DeleteEquation && this.getRowsCount() > 1) { this.Remove_Row(this.CurPos); } if (Props.Action & c_oMathMenuAction.InsertEquation) { if (Props.Action & c_oMathMenuAction.InsertBefore) { this.Add_Row(this.CurPos); } else { this.Add_Row(this.CurPos + 1); } } } }; CEqArray.prototype.Get_InterfaceProps = function () { return new CMathMenuEqArray(this); }; CEqArray.prototype.Is_DeletedItem = function (Action) { return Action & c_oMathMenuAction.DeleteEquation && 1 == this.getRowsCount(); }; CEqArray.prototype.Get_DeletedItemsThroughInterface = function () { return []; }; CEqArray.prototype.IsEqArray = function () { return true; }; /** * * @param {MathTextAndStyles | boolean} oMathText * @constructor */ CEqArray.prototype.GetTextOfElement = function (oMathText) { oMathText = new AscMath.MathTextAndStyles(oMathText); if (oMathText.IsLaTeX()) { oMathText.AddText(new AscMath.MathText("\\array{", this.Content[0]), true); } else { let oMatrix = new AscMath.MathText("█(", this.Content[0]); oMathText.AddText(oMatrix, true); } for (let i = 0; i < this.Pr.row; i++) { let oItem = this.getElement(i) oMathText.Add(oItem, true, 0); if (i !== this.Pr.row - 1) { let oSep = new AscMath.MathText(oMathText.IsLaTeX() ? "\\\\" : "@", this.Content[0]); oMathText.AddText(oSep, true); } } oMathText.AddText(new AscMath.MathText(oMathText.IsLaTeX() ? "}" : ")", this.Content[0]), true); return oMathText; }; /** * * @param CMathMenuEqArray * @constructor * @extends {CMathMenuBase} */ function CMathMenuEqArray(EqArray) { CMathMenuBase.call(this, EqArray); this.Type = Asc.c_oAscMathInterfaceType.EqArray; if (undefined !== EqArray) { var RowRule, RowGap; switch (EqArray.SpaceRow.Rule) { default: case 0: { RowRule = c_oAscMathInterfaceEqArrayLineRule.Single; break; } case 1: { RowRule = c_oAscMathInterfaceEqArrayLineRule.OneAndHalf; break; } case 2: { RowRule = c_oAscMathInterfaceEqArrayLineRule.Double; break; } case 3: { RowRule = c_oAscMathInterfaceEqArrayLineRule.Exactly; RowGap = EqArray.SpaceRow.Gap / 20; break; } case 4: { RowRule = c_oAscMathInterfaceEqArrayLineRule.Multiple; RowGap = EqArray.SpaceRow.Gap * 0.5; break; } } this.BaseJc = EqArray.Pr.baseJc === BASEJC_CENTER ? Asc.c_oAscMathInterfaceEqArrayAlign.Center : (EqArray.Pr.baseJc === BASEJC_BOTTOM ? Asc.c_oAscMathInterfaceEqArrayAlign.Bottom : Asc.c_oAscMathInterfaceEqArrayAlign.Top); this.RowRule = RowRule; this.RowGap = RowGap; } else { this.BaseJc = undefined; this.RowRule = undefined; this.RowGap = undefined; } } CMathMenuEqArray.prototype = Object.create(CMathMenuBase.prototype); CMathMenuEqArray.prototype.constructor = CMathMenuEqArray; CMathMenuEqArray.prototype.get_Align = function () { return this.BaseJc; }; CMathMenuEqArray.prototype.put_Align = function (Align) { this.BaseJc = Align; }; CMathMenuEqArray.prototype.get_LineRule = function () { return this.RowRule; }; CMathMenuEqArray.prototype.put_LineRule = function (Rule) { this.RowRule = Rule; }; CMathMenuEqArray.prototype.get_LineGap = function () { return this.RowGap; }; CMathMenuEqArray.prototype.put_LineGap = function (Gap) { this.RowGap = Gap; }; //--------------------------------------------------------export---------------------------------------------------- window['AscCommonWord'] = window['AscCommonWord'] || {}; window['AscCommonWord'].CEqArray = CEqArray; window['AscCommonWord'].CMathMatrix = CMathMatrix; window['AscWord'].CMathMatrixColumnPr = CMathMatrixColumnPr; window["CMathMenuEqArray"] = CMathMenuEqArray; CMathMenuEqArray.prototype["get_Align"] = CMathMenuEqArray.prototype.get_Align; CMathMenuEqArray.prototype["put_Align"] = CMathMenuEqArray.prototype.put_Align; CMathMenuEqArray.prototype["get_LineRule"] = CMathMenuEqArray.prototype.get_LineRule; CMathMenuEqArray.prototype["put_LineRule"] = CMathMenuEqArray.prototype.put_LineRule; CMathMenuEqArray.prototype["get_LineGap"] = CMathMenuEqArray.prototype.get_LineGap; CMathMenuEqArray.prototype["put_LineGap"] = CMathMenuEqArray.prototype.put_LineGap; AscMath.EqArray = CEqArray; AscMath.Matrix = CMathMatrix;