DocumentServer/OfficeWeb/sdk/Word/Math/degree.js
2015-04-28 17:59:00 +03:00

510 lines
19 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2015
*
* 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 Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* 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";
function CMathDegreePr() {
this.type = DEGREE_SUPERSCRIPT;
}
CMathDegreePr.prototype.Set_FromObject = function (Obj) {
if (DEGREE_SUPERSCRIPT === Obj.type || DEGREE_SUBSCRIPT === Obj.type) {
this.type = Obj.type;
} else {
this.type = DEGREE_SUPERSCRIPT;
}
};
CMathDegreePr.prototype.Copy = function () {
var NewPr = new CMathDegreePr();
NewPr.type = this.type;
return NewPr;
};
CMathDegreePr.prototype.Write_ToBinary = function (Writer) {
Writer.WriteLong(this.type);
};
CMathDegreePr.prototype.Read_FromBinary = function (Reader) {
this.type = Reader.GetLong(Reader);
};
function CDegreeBase(props, bInside) {
CDegreeBase.superclass.constructor.call(this, bInside);
this.upBase = 0;
this.upIter = 0;
this.Pr = new CMathDegreePr();
this.baseContent = null;
this.iterContent = null;
this.bNaryInline = false;
if (props !== null && typeof(props) !== "undefined") {
this.init(props);
}
}
Asc.extendClass(CDegreeBase, CMathBase);
CDegreeBase.prototype.init = function (props) {
this.setProperties(props);
this.setDimension(1, 2);
};
CDegreeBase.prototype.fillContent = function () {
this.setDimension(1, 2);
this.elements[0][0] = this.baseContent;
this.elements[0][1] = this.iterContent;
};
CDegreeBase.prototype.PreRecalc = function (Parent, ParaMath, ArgSize, RPI, GapsInfo) {
this.Parent = Parent;
this.ParaMath = ParaMath;
this.Set_CompiledCtrPrp(Parent, ParaMath, RPI);
this.ApplyProperties(RPI);
if (this.bInside == false) {
GapsInfo.setGaps(this, this.TextPrControlLetter.FontSize);
}
this.baseContent.PreRecalc(this, ParaMath, ArgSize, RPI);
var ArgSzDegr = ArgSize.Copy();
ArgSzDegr.decrease();
var RPIDegr = RPI.Copy();
RPIDegr.bDecreasedComp = true;
this.bNaryInline = RPI.bNaryInline;
this.iterContent.PreRecalc(this, ParaMath, ArgSzDegr, RPIDegr);
};
CDegreeBase.prototype.Resize = function (oMeasure, RPI) {
this.baseContent.Resize(oMeasure, RPI);
this.iterContent.Resize(oMeasure, RPI);
if (this.Pr.type === DEGREE_SUPERSCRIPT) {
this.recalculateSup(oMeasure);
} else {
if (this.Pr.type === DEGREE_SUBSCRIPT) {
this.recalculateSubScript(oMeasure);
}
}
};
CDegreeBase.prototype.recalculateSup = function (oMeasure) {
var base = this.elements[0][0].size,
iter = this.elements[0][1].size;
var mgCtrPrp = this.Get_TxtPrControlLetter();
this.upBase = 0;
this.upIter = 0;
var bTextElement = false,
lastElem;
if (!this.baseContent.IsJustDraw()) {
lastElem = this.baseContent.GetLastElement();
var BaseRun = lastElem.Type == para_Math_Run && mgCtrPrp.FontSize == lastElem.Get_CompiledPr(false).FontSize;
bTextElement = BaseRun || (lastElem.Type !== para_Math_Run && lastElem.IsJustDraw());
}
var PlH = 0.64 * this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
var UpBaseline = 0.75 * PlH;
if (bTextElement) {
var last = lastElem.size,
upBaseLast = 0,
upBaseIter = 0;
if ((last.ascent - UpBaseline) + (iter.height - iter.ascent) > (last.ascent - 2 / 9 * PlH)) {
upBaseLast = iter.height - (last.ascent - 2 / 9 * PlH);
} else {
if (UpBaseline + iter.ascent > last.ascent) {
upBaseLast = UpBaseline + iter.ascent - last.ascent;
} else {
upBaseIter = last.ascent - UpBaseline - iter.ascent;
}
}
if (upBaseLast + last.ascent > base.ascent) {
this.upBase = upBaseLast - (base.ascent - last.ascent);
this.upIter = upBaseIter;
} else {
this.upBase = 0;
this.upIter = (base.ascent - upBaseLast - last.ascent) + upBaseIter;
}
} else {
var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
if (iter.height - iter.ascent + shCenter > base.ascent) {
this.upBase = iter.height - (base.ascent - shCenter);
} else {
if (iter.ascent > shCenter) {
this.upBase = iter.ascent - shCenter;
} else {
this.upIter = shCenter - iter.ascent;
}
}
}
var height = this.upBase + base.height;
var ascent = this.upBase + base.ascent;
if (this.bNaryInline) {
this.dW = 0.17 * PlH;
} else {
this.dW = 0.056 * PlH;
}
var width = base.width + iter.width + this.dW;
width += this.GapLeft + this.GapRight;
this.size = {
width: width,
height: height,
ascent: ascent
};
};
CDegreeBase.prototype.recalculateSubScript = function (oMeasure) {
var base = this.elements[0][0].size,
iter = this.elements[0][1].size;
var mgCtrPrp = this.Get_TxtPrControlLetter();
var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
var bTextElement = false,
lastElem;
if (!this.baseContent.IsJustDraw()) {
lastElem = this.baseContent.GetLastElement();
var txtPrpControl = this.ParaMath.GetFirstRPrp();
var BaseRun = lastElem.Type == para_Math_Run && txtPrpControl.FontSize == lastElem.Get_CompiledPr(false).FontSize;
bTextElement = BaseRun || (lastElem.Type !== para_Math_Run && lastElem.IsJustDraw());
}
var height, ascent, descent;
var PlH = 0.64 * this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
if (bTextElement) {
var DownBaseline = 0.9 * shCenter;
if (iter.ascent - DownBaseline > 3 / 4 * PlH) {
this.upIter = 1 / 4 * PlH;
} else {
this.upIter = PlH + DownBaseline - iter.ascent;
}
if (base.ascent > PlH) {
this.upIter += base.ascent - PlH;
}
var descentBase = base.height - base.ascent,
descentIter = this.upIter + iter.height - base.ascent;
descent = descentBase > descentIter ? descentBase : descentIter;
ascent = base.ascent;
height = ascent + descent;
} else {
this.upIter = base.height + shCenter - iter.ascent;
if (base.ascent - 1.5 * shCenter > this.upIter) {
this.upIter = base.ascent - 1.5 * shCenter;
}
height = this.upIter + iter.height;
ascent = base.ascent;
}
if (this.bNaryInline) {
this.dW = 0.17 * PlH;
} else {
this.dW = 0.056 * PlH;
}
var width = base.width + iter.width + this.dW;
width += this.GapLeft + this.GapRight;
this.size = {
width: width,
height: height,
ascent: ascent
};
};
CDegreeBase.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;
}
var PosBase = new CMathPosition();
PosBase.x = this.pos.x + this.GapLeft;
PosBase.y = this.pos.y + this.upBase;
var PosIter = new CMathPosition();
PosIter.x = this.pos.x + this.GapLeft + this.elements[0][0].size.width + this.dW;
PosIter.y = this.pos.y + this.upIter;
this.elements[0][0].setPosition(PosBase, PosInfo);
this.elements[0][1].setPosition(PosIter, PosInfo);
};
CDegreeBase.prototype.getIterator = function () {
return this.iterContent;
};
CDegreeBase.prototype.getUpperIterator = function () {
return this.iterContent;
};
CDegreeBase.prototype.getLowerIterator = function () {
return this.iterContent;
};
CDegreeBase.prototype.getBase = function () {
return this.baseContent;
};
CDegreeBase.prototype.IsPlhIterator = function () {
return this.iterContent.IsPlaceholder();
};
CDegreeBase.prototype.setBase = function (base) {
this.baseContent = base;
};
CDegreeBase.prototype.setIterator = function (iterator) {
this.iterContent = iterator;
};
function CDegree(props, bInside) {
CDegree.superclass.constructor.call(this, props, bInside);
this.Id = g_oIdCounter.Get_NewId();
if (props !== null && typeof(props) !== "undefined") {
this.init(props);
}
g_oTableId.Add(this, this.Id);
}
Asc.extendClass(CDegree, CDegreeBase);
CDegree.prototype.ClassType = historyitem_type_deg;
CDegree.prototype.kind = MATH_DEGREE;
CDegree.prototype.init = function (props) {
this.Fill_LogicalContent(2);
this.setProperties(props);
this.fillContent();
};
CDegree.prototype.fillContent = function () {
this.iterContent = this.Content[1];
this.baseContent = this.Content[0];
CDegree.superclass.fillContent.apply(this, arguments);
};
CDegree.prototype.Document_UpdateInterfaceState = function (MathProps) {
MathProps.Type = c_oAscMathInterfaceType.Script;
MathProps.Pr = null;
};
function CIterators(iterUp, iterDn) {
CIterators.superclass.constructor.call(this, true);
this.lUp = 0;
this.lD = 0;
this.upper = 0;
this.iterUp = iterUp;
this.iterDn = iterDn;
}
Asc.extendClass(CIterators, CMathBase);
CIterators.prototype.init = function () {
this.setDimension(2, 1);
this.elements[0][0] = this.iterUp;
this.elements[1][0] = this.iterDn;
};
CIterators.prototype.PreRecalc = function (Parent, ParaMath, ArgSize, RPI, GapsInfo) {
this.Parent = Parent;
this.ParaMath = ParaMath;
this.ArgSize.SetValue(-1);
var ArgSzIters = ArgSize.Copy();
ArgSzIters.Merge(this.ArgSize);
this.Set_CompiledCtrPrp(Parent, ParaMath, RPI);
var RPI_ITER = RPI.Copy();
RPI_ITER.bDecreasedComp = true;
this.iterUp.PreRecalc(this, ParaMath, ArgSzIters, RPI_ITER);
this.iterDn.PreRecalc(this, ParaMath, ArgSzIters, RPI_ITER);
};
CIterators.prototype.recalculateSize = function (oMeasure, dH, ascent) {
this.dH = dH;
var iterUp = this.iterUp.size,
iterDown = this.iterDn.size;
this.size.ascent = ascent;
this.size.height = iterUp.height + dH + iterDown.height;
this.size.width = iterUp.width > iterDown.width ? iterUp.width : iterDown.width;
};
CIterators.prototype.getUpperIterator = function () {
return this.elements[0][0];
};
CIterators.prototype.getLowerIterator = function () {
return this.elements[1][0];
};
CIterators.prototype.setUpperIterator = function (iterator) {
this.elements[0][0] = iterator;
};
CIterators.prototype.setLowerIterator = function (iterator) {
this.elements[1][0] = iterator;
};
CIterators.prototype.alignIterators = function (mcJc) {
this.alignment.wdt[0] = mcJc;
};
function CMathDegreeSubSupPr() {
this.type = DEGREE_SubSup;
this.alnScr = false;
}
CMathDegreeSubSupPr.prototype.Set_FromObject = function (Obj) {
if (true === Obj.alnScr || 1 === Obj.alnScr) {
this.alnScr = true;
} else {
this.alnScr = false;
}
if (DEGREE_SubSup === Obj.type || DEGREE_PreSubSup === Obj.type) {
this.type = Obj.type;
}
};
CMathDegreeSubSupPr.prototype.Copy = function () {
var NewPr = new CMathDegreeSubSupPr();
NewPr.type = this.type;
NewPr.alnScr = this.alnScr;
return NewPr;
};
CMathDegreeSubSupPr.prototype.Write_ToBinary = function (Writer) {
Writer.WriteLong(this.type);
Writer.WriteBool(this.alnScr);
};
CMathDegreeSubSupPr.prototype.Read_FromBinary = function (Reader) {
this.type = Reader.GetLong();
this.alnScr = Reader.GetBool();
};
function CDegreeSubSupBase(props, bInside) {
CDegreeSubSupBase.superclass.constructor.call(this, bInside);
this.gapBase = 0;
this.bNaryInline = false;
this.Pr = new CMathDegreeSubSupPr();
this.baseContent = null;
this.iters = new CIterators(null, null);
if (props !== null && typeof(props) !== "undefined") {
this.init(props);
}
}
Asc.extendClass(CDegreeSubSupBase, CMathBase);
CDegreeSubSupBase.prototype.init = function (props) {
this.setProperties(props);
this.setDimension(1, 2);
};
CDegreeSubSupBase.prototype.fillContent = function () {
var oBase = this.baseContent;
var oIters = this.iters;
this.setDimension(1, 2);
oIters.init();
oIters.lUp = 0;
oIters.lD = 0;
if (this.Pr.type == DEGREE_SubSup) {
oIters.alignIterators(MCJC_LEFT);
this.addMCToContent([oBase, oIters]);
} else {
if (this.Pr.type == DEGREE_PreSubSup) {
this.addMCToContent([oIters, oBase]);
oIters.alignIterators(MCJC_RIGHT);
}
}
};
CDegreeSubSupBase.prototype.PreRecalc = function (Parent, ParaMath, ArgSize, RPI, GapsInfo) {
this.bNaryInline = RPI.bNaryInline;
CDegreeSubSupBase.superclass.PreRecalc.call(this, Parent, ParaMath, ArgSize, RPI, GapsInfo);
};
CDegreeSubSupBase.prototype.recalculateSize = function (oMeasure, RPI) {
var mgCtrPrp = this.Get_CompiledCtrPrp();
var iterUp = this.iters.iterUp.size,
iterDown = this.iters.iterDn.size,
base = this.baseContent.size;
var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
shCenter *= 1.4;
var PlH = 0.26 * this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
var height, width, ascent, descent;
var dH;
var minGap;
var TextElement = false;
if (!this.baseContent.IsJustDraw()) {
var last = this.baseContent.GetLastElement();
var BaseRun = last.Type == para_Math_Run && mgCtrPrp.FontSize >= last.Get_CompiledPr(false).FontSize;
TextElement = BaseRun || (last.Type !== para_Math_Run && last.IsJustDraw());
}
if (TextElement) {
minGap = 0.5 * PlH;
var DivBaseline = 3.034 * PlH;
var ascIters, dgrHeight;
if (DivBaseline > minGap + iterDown.ascent + (iterUp.height - iterUp.ascent)) {
dH = DivBaseline - iterDown.ascent - (iterUp.height - iterUp.ascent);
} else {
dH = minGap;
}
var GapDown = PlH;
ascIters = iterUp.height + dH + GapDown;
dgrHeight = iterDown.height + iterUp.height + dH;
ascent = ascIters > base.ascent ? ascIters : base.ascent;
var dscIter = dgrHeight - ascIters,
dscBase = base.height - base.ascent;
descent = dscIter > dscBase ? dscIter : dscBase;
height = ascent + descent;
this.iters.recalculateSize(oMeasure, dH, ascIters);
} else {
minGap = 0.7 * PlH;
var lUpBase = base.ascent - shCenter;
var lDownBase = base.height - lUpBase;
var DescUpIter = iterUp.height - iterUp.ascent + PlH;
var AscDownIter = iterDown.ascent - PlH;
var UpGap, DownGap;
if (this.bNaryInline) {
UpGap = 0;
DownGap = 0;
} else {
UpGap = lUpBase > DescUpIter ? lUpBase - DescUpIter : 0;
DownGap = lDownBase > AscDownIter ? lDownBase - AscDownIter : 0;
}
if (UpGap + DownGap > minGap) {
dH = UpGap + DownGap;
} else {
dH = minGap;
}
height = iterUp.height + dH + iterDown.height;
ascent = iterUp.height + UpGap + shCenter;
this.iters.recalculateSize(oMeasure, dH, ascent);
}
if (this.bNaryInline) {
this.dW = 0.42 * PlH;
} else {
this.dW = 0.14 * PlH;
}
width = this.iters.size.width + base.width + this.dW;
width += this.GapLeft + this.GapRight;
this.size = {
width: width,
height: height,
ascent: ascent
};
};
CDegreeSubSupBase.prototype.getBase = function () {
return this.baseContent;
};
CDegreeSubSupBase.prototype.getUpperIterator = function () {
return this.iters.iterUp;
};
CDegreeSubSupBase.prototype.getLowerIterator = function () {
return this.iters.iterDn;
};
CDegreeSubSupBase.prototype.setBase = function (base) {
this.baseContent = base;
};
CDegreeSubSupBase.prototype.setUpperIterator = function (iterator) {
this.iters.iterUp = iterator;
};
CDegreeSubSupBase.prototype.setLowerIterator = function (iterator) {
this.iters.iterDn = iterator;
};
function CDegreeSubSup(props, bInside) {
CDegreeSubSup.superclass.constructor.call(this, props, bInside);
this.Id = g_oIdCounter.Get_NewId();
if (props !== null && typeof(props) !== "undefined") {
this.init(props);
}
g_oTableId.Add(this, this.Id);
}
Asc.extendClass(CDegreeSubSup, CDegreeSubSupBase);
CDegreeSubSup.prototype.ClassType = historyitem_type_deg_subsup;
CDegreeSubSup.prototype.kind = MATH_DEGREESubSup;
CDegreeSubSup.prototype.init = function (props) {
this.Fill_LogicalContent(3);
this.setProperties(props);
this.fillContent();
};
CDegreeSubSup.prototype.fillContent = function () {
if (DEGREE_SubSup === this.Pr.type) {
this.baseContent = this.Content[0];
this.iters = new CIterators(this.Content[2], this.Content[1]);
} else {
this.baseContent = this.Content[2];
this.iters = new CIterators(this.Content[1], this.Content[0]);
}
CDegreeSubSup.superclass.fillContent.apply(this, arguments);
};
CDegreeSubSup.prototype.Document_UpdateInterfaceState = function (MathProps) {
MathProps.Type = c_oAscMathInterfaceType.Script;
MathProps.Pr = null;
};