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

1. Переделала пересчет степени с верхним и нижним итераторами, поправила баги,...

1. Переделала пересчет степени с верхним и нижним итераторами, поправила баги, связанные с их пересчетом
2. Поправила баг с расчетом вложенных дробей
(когда текстовые настройки для управляющих элементов отличались от текстовых настроек для Run в контентах) 
3. Поправила баг  для плейсхолдеров до и после мат объекта выставляются те же текстовые настройки, что и для ctrPrp
4. Поправила баг для совместного редактирования в delimiters с круглыми скобками, неправильно записывались свойства в бинарник, из-за чего у второго пользователя не отображались скобки
5. Поправила применение текстовых настроек для мат. элементов, добаляемых из меню. 
К контентам вложенных формул (CLimit например)  не применялись текствоые настройки. 
Т.к. elements заполняется на Resize, а применение настроек происходит раньше при вставке из меню (в функции Add в ParaMath)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@60374 954022d7-b5bf-4e40-9824-e11837661b57
parent bc753f09
......@@ -182,8 +182,10 @@ ParaMath.prototype.Add = function(Item)
if(oContent.bRoot == false && Run.IsPlaceholder())
{
var ctrPrp = oContent.Parent.Get_CtrPrp(); // копия ctrPrp
Run.Apply_TextPr(ctrPrp, undefined, true);
//Run.Apply_TextPr();
}
if(Item.Value == 38)
......@@ -616,7 +618,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.Root.Set_ParaMath(this, null);
this.Root.PreRecalc(null, this, ArgSize, RPI);
this.Root.Resize(g_oTextMeasurer, RPI/*recalculate properties info*/);
// когда формула будеат разбиваться на строки, Position придется перерасчитывать
// когда формула будет разбиваться на строки, Position придется перерасчитывать
var pos = new CMathPosition();
pos.x = 0;
pos.y = 0;
......@@ -1185,7 +1187,6 @@ ParaMath.prototype.GetFirstRPrp = function()
{
return this.Root.getFirstRPrp(this);
};
ParaMath.prototype.GetShiftCenter = function(oMeasure, font)
{
oMeasure.SetFont(font);
......@@ -1193,6 +1194,18 @@ ParaMath.prototype.GetShiftCenter = function(oMeasure, font)
return 0.6*metrics.Height;
};
ParaMath.prototype.GetPlh = function(oMeasure, font)
{
oMeasure.SetFont(font);
return oMeasure.Measure2Code(0x2B1A).Height;
};
ParaMath.prototype.GetA = function(oMeasure, font)
{
oMeasure.SetFont(font);
return oMeasure.Measure2Code(0x61).Height;
};
ParaMath.prototype.SetMathProperties = function(props)
{
......
......@@ -4685,7 +4685,7 @@ ParaRun.prototype.Get_CompiledPr = function(bCopy)
this.RecalcInfo.TextPr = false;
this.CompiledPr = this.Internal_Compile_Pr();
}
if ( false === bCopy )
return this.CompiledPr;
else
......@@ -5074,7 +5074,7 @@ ParaRun.prototype.Split_Run = function(Pos)
ParaRun.prototype.Clear_TextPr = function()
{
// Данная функция вызывается пока только при изменении стиля параграфа. Оставляем в этой ситуации язык неизмененным.
// Данная функция вызывается пока только при изменении стиля параграфа. Оставляем в этой ситуации язык неизмененным.
var NewTextPr = new CTextPr();
NewTextPr.Lang = this.Pr.Lang.Copy();
this.Set_Pr( NewTextPr );
......@@ -7675,13 +7675,13 @@ CRunCollaborativeMarks.prototype =
else if ( PosS >= Range.PosS && PosS <= Range.PosE && PosE >= Range.PosS && PosE <= Range.PosE )
{
if ( true !== Color.Compare(Range.Color) )
{
{
var _PosE = Range.PosE;
Range.PosE = PosS;
this.Ranges.splice( Index + 1, 0, new CRunCollaborativeRange(PosS, PosE, Color) );
this.Ranges.splice( Index + 2, 0, new CRunCollaborativeRange(PosE, _PosE, Range.Color) );
this.Ranges.splice( Index + 2, 0, new CRunCollaborativeRange(PosE, _PosE, Range.Color) );
}
return;
}
else if ( PosE < Range.PosS )
......@@ -7705,7 +7705,7 @@ CRunCollaborativeMarks.prototype =
Range.PosS = PosE;
this.Ranges.splice( Index, 0, new CRunCollaborativeRange(PosS, PosE, Color) );
}
return;
}
else //if ( PosS >= Range.PosS && PosE > Range.Pos.E )
......@@ -7717,7 +7717,7 @@ CRunCollaborativeMarks.prototype =
Range.PosE = PosS;
this.Ranges.splice( Index + 1, 0, new CRunCollaborativeRange(PosS, PosE, Color) );
}
return;
}
}
......@@ -7894,10 +7894,8 @@ ParaRun.prototype.Math_Recalculate = function(oMeasure, RPI, WidthPoints)
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText();
//var NewMathTextPr = GetMathModifiedFont(MathFont_ForMathText, oWPrp, this);
//g_oTextMeasurer.SetTextPr( NewMathTextPr, Theme );
g_oTextMeasurer.SetTextPr( oWPrp, Theme );
// argSize
g_oTextMeasurer.SetTextPr(oWPrp,Theme);
var InfoMathText = new CMathInfoTextPr_2(oWPrp, ArgSize, bNormalText);
......
......@@ -569,7 +569,7 @@ CAccent.prototype.draw = function(x, y, pGraphics, PDSE)
};
CAccent.prototype.GetLastElement = function()
{
return this.elements[0][0].GetLastElement();
return this.Content[0].GetLastElement();
};
CAccent.prototype.Document_UpdateInterfaceState = function(MathProps)
{
......
......@@ -457,7 +457,8 @@ CMathBase.prototype =
if(this.bInside == true)
{
var TxtPr = Parent.Get_TxtPrControlLetter(RPI);
var TxtPr = Parent.Get_TxtPrControlLetter(RPI); // чтобы применился ArgSize Parent
FontSize = TxtPr.FontSize;
FontSize *= MatGetKoeffArgSize(FontSize, this.ArgSize.value);
}
......@@ -720,10 +721,15 @@ CMathBase.prototype =
if(!this.elements[i][j].IsJustDraw())
this.elements[i][j].Apply_TextPr(TextPr, IncFontSize, ApplyToAll);
/*for(var i = 0 ; i < this.Content.length; i++)
// такая ситуация может возникнуть при добавлении элементов из меню, и чтобы применились текстовые настройки при вставке нужно пройтись по контентам
// a Resize произойдет позже, после вставки = > массив this.elements заполнится позднее
if(this.nRow == 0 && this.nCol == 0)
{
this.Content[i].Apply_TextPr(TextPr, IncFontSize, ApplyToAll);
}*/
for(var i = 0 ; i < this.Content.length; i++)
{
this.Content[i].Apply_TextPr(TextPr, IncFontSize, ApplyToAll);
}
}
},
GetMathTextPrForMenu: function(ContentPos, Depth)
......
......@@ -107,37 +107,68 @@ CDegreeBase.prototype.recalculateSup = function(oMeasure)
iter = this.elements[0][1].size;
var mgCtrPrp = this.Get_TxtPrControlLetter();
var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
//var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
this.upBase = 0;
this.upIter = 0;
var oBase = this.elements[0][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 bOneLineText = oBase.IsJustDraw() ? false : oBase.IsOneLineText();
var PlH = 0.64*this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
//var UpBaseline = 1.65*shCenter; // расстояние от baseline основания до бейзлайна итератора
var UpBaseline = 0.75*PlH; // расстояние от baseline основания до бейзлайна итератора
if(bOneLineText)
if(bTextElement)
{
var UpBaseline = 1.65*shCenter; // baseline итератора
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(iter.height - UpBaseline - iter.ascent + base.ascent > 2/3 * base.ascent)
this.upBase = iter.height - 2/3*base.ascent;
else if(UpBaseline + iter.ascent > base.ascent)
this.upBase = UpBaseline + iter.ascent - base.ascent;
if(upBaseLast + last.ascent > base.ascent)
{
this.upBase = upBaseLast - (base.ascent - last.ascent);
this.upIter = upBaseIter;
}
else
this.upIter = base.ascent - UpBaseline - iter.ascent;
{
this.upBase = 0;
this.upIter = (base.ascent - upBaseLast - last.ascent) + upBaseIter;
}
}
else
{
this.upBase = iter.ascent - 1.2*shCenter;
var ascBase = base.ascent - shCenter > 0.27*mgCtrPrp.FontSize ? base.ascent - shCenter : 2/3*base.ascent;
var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
// ограничение для случая, когда дескент итератора >> высоты основания
if(iter.height - this.upBase > ascBase)
this.upBase = iter.height - ascBase;
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;
......@@ -163,36 +194,64 @@ CDegreeBase.prototype.recalculateSubScript = function(oMeasure)
var width = base.width + iter.width + this.dW;
width += this.GapLeft + this.GapRight;
var oBase = this.elements[0][0];
var bOneLineText = oBase.IsJustDraw() ? false : oBase.IsOneLineText();
//var oBase = this.elements[0][0];
//var bOneLineText = oBase.IsJustDraw() ? false : oBase.IsOneLineText();
var bTextElement = false,
lastElem;
if(bOneLineText)
if(!this.baseContent.IsJustDraw())
{
lastElem = this.baseContent.GetLastElement();
var txtPrpControl = this.ParaMath.GetFirstRPrp();// нам нужен текстовые настройки для управляющих элементов без учета ArgSize, а это как раз будут текстовые настройки первого рана
// если учтем ArgSize, то для вложенных дробей эта проверка на Run не сработает
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;
if(bTextElement)
{
//var last = lastElem.size;
var DownBaseline = 0.9*shCenter;
if(iter.ascent - DownBaseline > 3/4*base.ascent)
this.upIter = 1/4*base.ascent;
var PlH = 0.64*this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
if(iter.ascent - DownBaseline > 3/4*PlH)
this.upIter = 1/4*PlH;
else
this.upIter = base.ascent + DownBaseline - iter.ascent;
this.upIter = PlH + DownBaseline - iter.ascent;
if(base.ascent > PlH)
{
this.upIter += base.ascent - PlH;
}
//this.upIter = base.ascent + DownBaseline - iter.ascent;
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 + 0.9*shCenter - iter.ascent;
/*if(base.ascent - shCenter > this.upIter)
this.upIter = base.height - base.ascent + shCenter;*/
this.upIter = base.height + shCenter - iter.ascent;
// ограничение для случая, когда аскент итератора >> высоты основания
/*if(base.ascent - shCenter > this.upIter)
this.upIter = base.ascent - shCenter;*/
if(base.ascent - 1.5*shCenter > this.upIter)
this.upIter = base.ascent - 1.5*shCenter;
if(base.ascent - 2*shCenter > this.upIter)
this.upIter = base.ascent - 2*shCenter;
height = this.upIter + iter.height;
ascent = base.ascent;
}
var height = this.upIter + iter.height;
var ascent = base.ascent;
this.size = {width: width, height: height, ascent: ascent};
};
CDegreeBase.prototype.setPosition = function(pos, PosInfo)
......@@ -461,7 +520,9 @@ CDegreeSubSupBase.prototype.recalculateSize = function(oMeasure, RPI)
shCenter *= 1.4;
var ctrPrpIter = this.iters.Get_TxtPrControlLetter();
var shIter = this.ParaMath.GetShiftCenter(oMeasure, ctrPrpIter); //смещение
//var shIter = this.ParaMath.GetShiftCenter(oMeasure, ctrPrpIter); //смещение
var PlH = 0.26*this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
var height, width, ascent, descent;
......@@ -483,22 +544,21 @@ CDegreeSubSupBase.prototype.recalculateSize = function(oMeasure, RPI)
if(TextElement)
{
minGap = 0.5*shIter;
minGap = 0.5*PlH;
var DivBaseline = 3.034*shIter;
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 = shIter;
var GapDown = PlH;
ascIters = iterUp.height + dH + GapDown;
dgrHeight = iterDown.height + iterUp.height + dH;
......@@ -515,14 +575,14 @@ CDegreeSubSupBase.prototype.recalculateSize = function(oMeasure, RPI)
}
else
{
minGap = 0.7*shIter;
minGap = 0.7*PlH;
var lUpBase = base.ascent - shCenter; // center of base
var lDownBase = base.height - lUpBase; // height - center of base
var DescUpIter = iterUp.height - iterUp.ascent + shIter;
var AscDownIter = iterDown.ascent - shIter;
var DescUpIter = iterUp.height - iterUp.ascent + PlH;
var AscDownIter = iterDown.ascent - PlH;
var UpGap, DownGap;
......
......@@ -216,6 +216,10 @@ CMathFunc.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI, GapsInf
CMathFunc.superclass.PreRecalc.call(this, Parent, ParaMath, ArgSize, NewRPI, GapsInfo);
};
CMathFunc.prototype.GetLastElement = function()
{
return this.Content[1].GetLastElement();
};
CMathFunc.prototype.setDistance = function()
{
this.dW = this.Get_TxtPrControlLetter().FontSize/6*g_dKoef_pt_to_mm;
......@@ -239,5 +243,3 @@ CMathFunc.prototype.Document_UpdateInterfaceState = function(MathProps)
MathProps.Type = c_oAscMathInterfaceType.Function;
MathProps.Pr = null;
};
......@@ -1104,13 +1104,12 @@ CMathContent.prototype =
{
return this.Id;
},
private_CorrectContent : function()
private_CorrectContent: function()
{
var len = this.Content.length;
var current = null;
var emptyRun, ctrPrp, mathPrp;
var emptyRun;
var currPos = 0;
......@@ -1118,34 +1117,35 @@ CMathContent.prototype =
{
current = this.Content[currPos];
if(currPos < len && para_Math_Run === current.Type)
current.Math_Correct_Content();
var bLeftRun = currPos > 0 ? this.Content[currPos-1].Type == para_Math_Run : false,
bRightRun = currPos < len - 1 ? this.Content[currPos + 1].Type === para_Math_Run : false;
var bCurrComp = current.Type == para_Math_Composition,
bCurrEmptyRun = current.Type == para_Math_Run && current.Is_Empty();
var bLeftEmptyRun = bLeftRun ? this.Content[currPos-1].Is_Empty() : false;
var bCurrComp = current.Type == para_Math_Composition,
bCurrEmptyRun = current.Type == para_Math_Run && current.Is_Empty();
var bDeleteEmptyRun = bCurrEmptyRun && (bLeftRun || bRightRun);
if(bCurrComp && !bLeftRun) // добавление пустого Run перед мат объектом
if(bCurrComp && !bLeftRun)
{
emptyRun = new ParaRun(null, true);
emptyRun.Set_RFont_ForMathRun();
ctrPrp = current.Get_CtrPrp();
mathPrp = new CMPrp();
mathPrp.SetStyle(ctrPrp.Bold, ctrPrp.Italic);
emptyRun.Set_MathPr(mathPrp);
ctrPrp.Bold = undefined;
ctrPrp.Italic = undefined;
emptyRun.Set_Pr(ctrPrp);
this.Apply_TextPrForRunEmpty(emptyRun, current);
this.Internal_Content_Add(currPos, emptyRun);
currPos += 2;
}
else if(bCurrComp && bLeftEmptyRun)
{
emptyRun = this.Content[currPos-1];
this.Apply_TextPrForRunEmpty(emptyRun, current);
currPos++;
}
else if(bDeleteEmptyRun)
{
......@@ -1169,30 +1169,46 @@ CMathContent.prototype =
currPos++;
len = this.Content.length;
}
}
if(len > 0 && this.Content[len - 1].Type == para_Math_Composition)
if(len > 1)
{
emptyRun = new ParaRun(null, true);
emptyRun.Set_RFont_ForMathRun();
var bLastComp = this.Content[len - 1].Type == para_Math_Composition,
bLastRunEmpty = this.Content[len - 2].Type == para_Math_Composition && this.Content[len - 1].Type == para_Math_Run && this.Content[len-1].Is_Empty();
ctrPrp = current.Get_CtrPrp();
if(bLastComp)
{
emptyRun = new ParaRun(null, true);
emptyRun.Set_RFont_ForMathRun();
this.Apply_TextPrForRunEmpty(emptyRun, this.Content[len - 1]);
this.Internal_Content_Add(currPos, emptyRun);
}
else if(bLastRunEmpty)
{
emptyRun = this.Content[len-1];
this.Apply_TextPrForRunEmpty(emptyRun, this.Content[len - 2]);
}
}
},
Apply_TextPrForRunEmpty: function(emptyRun, Composition)
{
var ctrPrp = Composition.Get_CtrPrp();
mathPrp = new CMPrp();
mathPrp.SetStyle(ctrPrp.Bold, ctrPrp.Italic);
var mathPrp = new CMPrp();
emptyRun.Set_MathPr(mathPrp);
mathPrp.SetStyle(ctrPrp.Bold, ctrPrp.Italic);
ctrPrp.Bold = undefined;
ctrPrp.Italic = undefined;
emptyRun.Set_MathPr(mathPrp);
emptyRun.Set_Pr(ctrPrp);
ctrPrp.Bold = undefined;
ctrPrp.Italic = undefined;
this.Internal_Content_Add(len, emptyRun);
}
emptyRun.Set_Pr(ctrPrp);
},
Correct_Content : function(bInnerCorrection)
{
if (true === bInnerCorrection)
......@@ -1207,7 +1223,7 @@ CMathContent.prototype =
this.private_CorrectContent();
// Удаляем лишние пустые раны
for (var nPos = 0, nLen = this.Content.length; nPos < nLen - 1; nPos++)
/*for (var nPos = 0, nLen = this.Content.length; nPos < nLen - 1; nPos++)
{
var oCurrElement = this.Content[nPos];
var oNextElement = this.Content[nPos + 1];
......@@ -1229,7 +1245,7 @@ CMathContent.prototype =
if(para_Math_Run === oCurrElement.Type)
oCurrElement.Math_Correct_Content();
}
}*/
// Если в контенте ничего нет, тогда добавляем пустой ран
if (this.Content.length < 1)
......
......@@ -3290,37 +3290,37 @@ CMathDelimiterPr.prototype.Write_ToBinary = function(Writer)
Writer.Skip(4);
var Flags = 0;
if (undefined !== this.begChr)
if (undefined !== this.begChr && this.begChr !== null)
{
Writer.WriteLong(this.begChr);
Flags |= 1;
}
if (undefined !== this.begChrType)
if (undefined !== this.begChrType && this.begChrType !== null)
{
Writer.WriteLong(this.begChrType);
Flags |= 2;
}
if (undefined !== this.endChr)
if (undefined !== this.endChr && this.endChr !== null)
{
Writer.WriteLong(this.endChr);
Flags |= 4;
}
if (undefined !== this.endChrType)
if (undefined !== this.endChrType && this.endChrType !== null)
{
Writer.WriteLong(this.endChrType);
Flags |= 8;
}
if (undefined !== this.sepChr)
if (undefined !== this.sepChr && this.sepChr !== null)
{
Writer.WriteLong(this.sepChr);
Flags |= 16;
}
if (undefined !== this.sepChrType)
if (undefined !== this.sepChrType && this.sepChrType !== null)
{
Writer.WriteLong(this.sepChrType);
Flags |= 32;
......@@ -3399,6 +3399,7 @@ function CDelimiter(props)
this.sepOper = new COperator (OPER_SEPARATOR);
this.Pr = new CMathDelimiterPr();
this.TextInContent = true;
if(props !== null && typeof(props) !== "undefined")
this.init(props);
......@@ -3518,13 +3519,16 @@ CDelimiter.prototype.Resize = function(oMeasure, RPI)
var shCenter = this.ParaMath.GetShiftCenter(oMeasure, mgCtrPrp);
var maxAD = ascentG - shCenter > descentG + shCenter ? ascentG - shCenter: descentG + shCenter;
var plH = 9.877777777777776 * mgCtrPrp.FontSize/36;
var plH = this.ParaMath.GetPlh(oMeasure, mgCtrPrp);
//var plH = 10.8 * mgCtrPrp.FontSize/36;
//var bTextContent = ascentG < plH || descentG < plH ; // для текста операторы в случае центрирования не увеличиваем
var bTextContent = ascentG < plH && heightG < 1.5*plH; // для текста операторы в случае центрирования не увеличиваем
var bTextContent = ascentG < 1.01*plH && (heightG - ascentG) < 0.4*plH; // для текста операторы в случае центрирования не увеличиваем
var bCentered = this.Pr.shp == DELIMITER_SHAPE_CENTERED,
b2Max = bCentered && (2*maxAD - heightG > 0.001);
this.TextInContent = bTextContent;
var heightStretch = b2Max && !bTextContent ? 2*maxAD : ascentG + descentG;
......@@ -3755,7 +3759,11 @@ CDelimiter.prototype.GetLastElement = function()
{
var Result;
if(this.endOper.typeOper !== OPERATOR_EMPTY && this.Pr.grow == false || this.endOper.typeOper == OPERATOR_TEXT)
var IsEndOper = this.endOper.typeOper !== OPERATOR_EMPTY;
var growLast = IsEndOper && this.Pr.grow == true && this.TextInContent,
smallLast = IsEndOper && this.Pr.grow == false;
if(growLast || smallLast || this.endOper.typeOper == OPERATOR_TEXT)
{
Result = this.endOper;
}
......
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