Files
DocumentServer-v-9.2.0/sdkjs/word/Math/matrix.js
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

1770 lines
50 KiB
JavaScript
Raw 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 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;