Commit fff66acd authored by Anna.Pavlova's avatar Anna.Pavlova Committed by Alexander.Trofimov

Переписала пересчет степени DegreeSubSup : поправлены баги для случая, когда в...

Переписала пересчет степени DegreeSubSup : поправлены баги для случая, когда в основании текст, и размер шрифта, относяшийся к нему, отличается от размера ctrPrp. Также, когда и в основании, и в итераторах текст, реализовано, чтобы итераторы располагались на том же уровне, когда в основании текст различный по высоте (например "a", "g"; шрифт текста совпадает с ctrPrp).
Также реализовано, чтобы выравнивание итераторов было по высоте последнего текстового элемента (если в конце контента текст, JustDraw элемент, или мат объект Accent). Для остальных случаев выравнивание, как и раньше, будет по высоте всего контента.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@60185 954022d7-b5bf-4e40-9824-e11837661b57
parent a0bbd7e0
......@@ -567,6 +567,10 @@ CAccent.prototype.draw = function(x, y, pGraphics, PDSE)
this.operator.draw(x, y, pGraphics, PDSE);
};
CAccent.prototype.GetLastElement = function()
{
return this.elements[0][0].GetLastElement();
};
CAccent.prototype.Document_UpdateInterfaceState = function(MathProps)
{
MathProps.Type = c_oAscMathInterfaceType.Accent;
......
......@@ -1420,7 +1420,11 @@ CMathBase.prototype.Recalc_RunsCompiledPr = function()
{
this.RecalcInfo.bCtrPrp = true;
ParaHyperlink.prototype.Recalc_RunsCompiledPr.call(this);
}
};
CMathBase.prototype.GetLastElement = function()
{
return this;
};
CMathBase.prototype.private_UpdatePosOnAdd = CMathContent.prototype.private_UpdatePosOnAdd;
CMathBase.prototype.private_UpdatePosOnRemove = CMathContent.prototype.private_UpdateOnRemove;
......
......@@ -318,6 +318,18 @@ CIterators.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI, GapsIn
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];
......@@ -437,108 +449,111 @@ CDegreeSubSupBase.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI,
};
CDegreeSubSupBase.prototype.recalculateSize = function(oMeasure, RPI)
{
//var mgCtrPrp = this.Get_TxtPrControlLetter();
var mgCtrPrp = this.Get_CompiledCtrPrp(); // Get_CompiledCtrPrp - чтобы итераторы не разъезжались
// половину ascent брать нельзя, т.к. черта дроби будет разделительной для верхнего и нижнего итератора => соответственно
// если числитель меньше/больше знаменателя расположение итераторов у степени будет неправильным
// половину ascent брать нельзя, т.к. черта дроби будет разделительной для верхнего и нижнего итератора => соответственно
// если числитель меньше/больше знаменателя расположение итераторов у степени будет неправильным
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 iters, base;
var ctrPrpIter = this.iters.Get_TxtPrControlLetter();
var shIter = this.ParaMath.GetShiftCenter(oMeasure, ctrPrpIter); //смещение
if(this.Pr.type == DEGREE_SubSup)
var height, width, ascent, descent;
var dH; // of Iterators
var minGap;
var TextElement = false;
if(!this.baseContent.IsJustDraw())
{
iters = this.elements[0][1];
base = this.elements[0][0];
var last = this.baseContent.GetLastElement();
var BaseRun = last.Type == para_Math_Run && mgCtrPrp.FontSize >= last.Get_CompiledPr(false).FontSize;
TextElement = BaseRun || last.IsJustDraw();
}
else if(this.Pr.type == DEGREE_PreSubSup)
//var BaseText = last.Type == para_Math_Run && !this.baseContent.IsJustDraw(),
// TextElement = BaseText && mgCtrPrp.FontSize >= last.Get_CompiledPr(false).FontSize;
if(TextElement)
{
iters = this.elements[0][0];
base = this.elements[0][1];
}
minGap = 0.5*shIter;
// distance for iterators
var DivBaseline = 3.034*shIter;
var ascIters, dgrHeight;
var iterUp = iters.elements[0][0].size,
iterDown = iters.elements[1][0].size;
if(DivBaseline > minGap + iterDown.ascent + (iterUp.height - iterUp.ascent))
{
dH = DivBaseline - iterDown.ascent - (iterUp.height - iterUp.ascent);
var lUp = base.size.ascent - shCenter; // center of base
//var lUp = base.size.height/2; // center of base
var lDown = base.size.height - lUp; // height - center of base
}
else
{
dH = minGap;
}
var ctrPrpIter = iters.Get_TxtPrControlLetter();
var shIter = this.ParaMath.GetShiftCenter(oMeasure, ctrPrpIter); //смещение
var GapDown = shIter;
var minGap = 0.7*shIter;
ascIters = iterUp.height + dH + GapDown;
dgrHeight = iterDown.height + iterUp.height + dH;
var up, down;
ascent = ascIters > base.ascent ? ascIters : base.ascent;
if(this.bNaryInline)
{
up = down = 0;
var dscIter = dgrHeight - ascIters,
dscBase = base.height - base.ascent;
descent = dscIter > dscBase ? dscIter : dscBase;
height = ascent + descent;
this.iters.recalculateSize(oMeasure, dH, ascIters /*ascent of Iterators*/);
}
else
{
var upDesc = 0,
downAsc = 0;
minGap = 0.7*shIter;
var lUpBase = base.ascent - shCenter; // center of base
var lDownBase = base.height - lUpBase; // height - center of base
if(!base.IsJustDraw() && base.IsOneLineText())
var DescUpIter = iterUp.height - iterUp.ascent + shIter;
var AscDownIter = iterDown.ascent - shIter;
var UpGap, DownGap;
if(this.bNaryInline)
{
upDesc = 1.5*shIter;
downAsc = 1.2*shIter;
UpGap = 0;
DownGap = 0;
}
else
{
upDesc = iterUp.height - iterUp.ascent + shIter;
downAsc = iterDown.ascent - shIter;
UpGap = lUpBase > DescUpIter ? lUpBase - DescUpIter : 0; // расстояние от центра основания до верхнего итератора
DownGap = lDownBase > AscDownIter ? lDownBase - AscDownIter : 0; // расстояние от центра основания до нижнего итератора
}
up = lUp > upDesc ? lUp - upDesc : 0; // расстояние от центра основания до верхнего итератора
down = lDown > downAsc ? lDown - downAsc : 0; // расстояние от центра основания до нижнего итератора
}
if(UpGap + DownGap > minGap)
dH = UpGap + DownGap;
else
dH = minGap;
height = iterUp.height + dH + iterDown.height;
ascent = iterUp.height + UpGap + shCenter;
if(up + down > minGap)
{
this.gapBase = iterUp.height + up - lUp;
iters.dH = up + down;
}
else
{
iters.dH = minGap;
this.gapBase = iterUp.height - lUp + minGap/2;
this.iters.recalculateSize(oMeasure, dH, ascent/*ascent of Iterators*/);
}
iters.recalculateSize(oMeasure);
var width = iters.size.width + base.size.width + this.dW;
width = this.iters.size.width + base.width + this.dW;
width += this.GapLeft + this.GapRight;
var height = iters.size.height;
var ascent = base.size.ascent + this.gapBase;
this.size = {width: width, height: height, ascent: ascent};
};
CDegreeSubSupBase.prototype.align = function(x, y)
{
var _x = 0, _y = 0;
if(this.Pr.type == DEGREE_SubSup)
{
if(x == 0 && y == 0)
_y = this.gapBase;
}
else
{
if(x == 0 && y == 1)
_y = this.gapBase;
}
return {x: _x, y: _y};
};
}
CDegreeSubSupBase.prototype.getBase = function()
{
return this.baseContent;
......@@ -564,6 +579,7 @@ CDegreeSubSupBase.prototype.setLowerIterator = function(iterator)
this.iters.iterDn = iterator;
};
function CDegreeSubSup(props, bInside)
{
CDegreeSubSup.superclass.constructor.call(this, props, bInside);
......@@ -576,10 +592,8 @@ function CDegreeSubSup(props, bInside)
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);
......@@ -587,7 +601,6 @@ CDegreeSubSup.prototype.init = function(props)
this.setProperties(props);
this.fillContent();
};
CDegreeSubSup.prototype.fillContent = function()
{
if (DEGREE_SubSup === this.Pr.type)
......
......@@ -1817,6 +1817,19 @@ CMathContent.prototype =
return result;
},
GetLastElement: function()
{
var pos = this.Content.length - 1;
while(this.Content[pos].Type == para_Math_Run && this.Content[pos].Is_Empty() && pos > 0)
{
pos--;
}
var last = this.Content[pos].Type == para_Math_Run ? this.Content[pos] : this.Content[pos].GetLastElement();
return last;
},
////////////////////////////////////////////////////////////////
......
......@@ -1134,7 +1134,6 @@ function CMathInfoTextPr_2(TextPr, ArgSize, bNormalText)
this.CurrType = -1; // в первый раз Font всегда выставляем
this.TextPr = TextPr;
this.ArgSize = ArgSize;
//this.CurrentTextPr = new CTextPr();
this.Font =
{
FontFamily: {Name: "Cambria Math", Index : -1},
......@@ -1183,97 +1182,6 @@ CMathInfoTextPr_2.prototype.NeedUpdateFont = function(code, fontSlot, IsPlacehol
return NeedUpdateFont;
};
CMathInfoTextPr_2.prototype.NeedUpdateFont_2 = function(code, fontSlot, IsPlaceholder)
{
var NeedUpdateFont = false;
var bMathText = this.bNormalText == false || IsPlaceholder;
var Type;
if(bMathText && (this.RFontsCompare[fontSlot] == true || IsPlaceholder))
Type = MathTextInfo_MathText;
else if(bMathText && this.RFontsCompare[fontSlot] == false && this.IsSpecilalOperator(code))
Type = MathTextInfo_SpecialOperator;
else
Type = MathTextInfo_NormalText;
if(this.CurrType !== Type)
{
if(Type == MathTextInfo_MathText)
{
this.Font.Italic = false;
this.Font.Bold = false;
NeedUpdateFont = true;
}
else if(Type == MathTextInfo_SpecialOperator)
{
// FontFamily Cambria Math !
if(fontSlot !== fontslot_CS)
{
this.Font.Italic = this.TextPr.Italic;
this.Font.Bold = this.TextPr.Bold;
}
else
{
this.Font.Italic = this.TextPr.ItalicCS;
this.Font.Bold = this.TextPr.BoldCS;
}
NeedUpdateFont = true;
}
if(NeedUpdateFont)
{
this.Font.FontSize = fontSlot !== fontslot_CS ? this.TextPr.FontSize : this.TextPr.FontSizeCS;
this.Font.FontSize *= this.GetFontKoef(fontSlot);
}
this.CurrType = Type;
}
return NeedUpdateFont;
};
CMathInfoTextPr_2.prototype.NeedSetFont_2 = function(code, fontSlot, IsPlaceholder)
{
var NeedSetFont = false;
// IsMathematicalText || Placeholder ?
if(this.bNormalText == false || IsPlaceholder)
{
if(this.RFontsCompare[fontSlot] == true || IsPlaceholder) // Cambria Math
{
this.Font.Italic = false;
this.Font.Bold = false;
NeedSetFont = true;
}
else if(this.IsSpecilalOperator(code))
{
// FontFamily Cambria Math !
if(fontSlot !== fontslot_CS)
{
this.Font.Italic = this.TextPr.Italic;
this.Font.Bold = this.TextPr.Bold;
}
else
{
this.Font.Italic = this.TextPr.ItalicCS;
this.Font.Bold = this.TextPr.BoldCS;
}
NeedSetFont = true;
}
if(NeedSetFont)
{
this.Font.FontSize = fontSlot !== fontslot_CS ? this.TextPr.FontSize : this.TextPr.FontSizeCS;
this.Font.FontSize *= this.GetFontKoef(fontSlot);
}
}
return NeedSetFont;
};
CMathInfoTextPr_2.prototype.GetFontKoef = function(fontSlot)
{
var FontSize = fontSlot == fontslot_CS ? this.TextPr.FontSizeCS : this.TextPr.FontSize;
......
......@@ -3751,6 +3751,19 @@ CDelimiter.prototype.Document_UpdateInterfaceState = function(MathProps)
MathProps.Type = c_oAscMathInterfaceType.Delimiter;
MathProps.Pr = null;
};
CDelimiter.prototype.GetLastElement = function()
{
var Result;
if(this.endOper.typeOper !== OPERATOR_EMPTY && this.Pr.grow == false || this.endOper.typeOper == OPERATOR_TEXT)
{
Result = this.endOper;
}
else
Result = this;
return Result;
};
function CCharacter()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment