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

1. Реализовала свойства у Box : opEmu (в случае если true, то Box выступает в...

1. Реализовала свойства у Box : opEmu  (в случае если true, то Box выступает в качестве break operator, если false, то нет), noBreak, также сделаа первую версию принудительного разрыва (break)
2. Для дроби : после отрисовки глифа сделала beginPath у pGraphics (для того чтобы каждый глиф отрисовывался один раз на Draw)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@63780 954022d7-b5bf-4e40-9824-e11837661b57
parent d7957837
......@@ -134,6 +134,10 @@ CMathSettings.prototype.Get_WrapIndent = function(WrapState)
return wrapIndent;
};
CMathSettings.prototype.IsWrap = function(WrapState)
{
return WrapState == ALIGN_MARGIN_WRAP || WrapState == ALIGN_WRAP;
};
CMathSettings.prototype.Get_LeftMargin = function(WrapState)
{
this.SetCompiledPr();
......@@ -748,7 +752,15 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
var WrapState = this.PageInfo.GetWrap(Page);
var wrap = 0;
var bFirstLine = this.Root.IsStartLine(_CurLine);
if(bFirstLine == false && true == MathSettings.IsWrap(WrapState))
{
var wrapIndent = MathSettings.Get_WrapIndent(WrapState);
wrap = this.Root.Get_WrapToLine(_CurLine, _CurRange, wrapIndent);
}
var XStart, XEnd;
......@@ -781,14 +793,14 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
if(bSingleLine) // чтобы не сравнивать с wrapIndent, когда формула занимает одну строку
W = StartLineWidth;
else
W = Math.max(MaxW + wrapIndent, StartLineWidth);
W = Math.max(MaxW + wrap, StartLineWidth);
}
else
{
W = MaxW;
}
if(this.Root.IsStartLine(_CurLine)) // первая строка первой страницы, если строка разбивается на несколько отрезко, то это уже будет inline-формула
if(bFirstLine == true) // первая строка первой страницы, если строка разбивается на несколько отрезко, то это уже будет inline-формула
{
switch(Jc)
{
......@@ -806,11 +818,11 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
{
if(Jc == align_Justify)
{
X = XEnd - XStart > W ? XStart + (XEnd - XStart - W)/2 + wrapIndent : XStart;
X = XEnd - XStart > W ? XStart + (XEnd - XStart - W)/2 + wrap : XStart;
}
else
{
X = XEnd - XStart > W ? XStart + wrapIndent : XStart;
X = XEnd - XStart > W ? XStart + wrap : XStart;
}
}
......@@ -1453,17 +1465,16 @@ ParaMath.prototype.private_UpdateXLimits = function(PRS)
PRS.X += MathSettings.Get_LeftMargin(WrapState);
PRS.XEnd -= MathSettings.Get_RightMargin(WrapState);
var WrapIndent = MathSettings.Get_WrapIndent(WrapState);
PRS.WrapIndent = WrapIndent;
PRS.WrapIndent = MathSettings.Get_WrapIndent(WrapState);
PRS.bPriorityOper = this.ParaMathRPI.bInline == false;
var bFirstLine = this.Root.IsStartLine(PRS.Line);
PRS.bFirstLine = bFirstLine;
if(bFirstLine == false)
if(bFirstLine == false && true == MathSettings.IsWrap(WrapState))
{
PRS.X += WrapIndent;
PRS.X += this.Root.Get_WrapToLine(PRS.Line, PRS.Range, PRS.WrapIndent);
}
PRS.XRange = PRS.X;
......
......@@ -157,6 +157,14 @@ CParagraphContentWithContentBase.prototype.Is_UseInDocument = function(Id)
return false;
};
CParagraphContentWithContentBase.prototype.protected_GetPrevRangeEndPos = function(LineIndex, RangeIndex)
{
var RangeCount = this.protected_GetRangesCount(LineIndex - 1);
var RangeOffset = this.protected_GetRangeOffset(LineIndex - 1, RangeCount - 1);
return LineIndex == 0 && RangeIndex == 0 ? 0 : this.Lines[RangeOffset + 1];
};
//----------------------------------------------------------------------------------------------------------------------
// Класс CParagraphContentWithContentBase
// Это базовый класс для элементов параграфа, которые сами по себе могут содержать элементы параграфа.
......
......@@ -2192,6 +2192,7 @@ function CParagraphRecalculateStateWrap(Para)
this.WrapIndent = 0; // WrapIndent нужен для сравнения с длиной слова (когда слово разбивается по Compare Oper): ширина первой строки формулы не должна быть меньше WrapIndent
this.bFirstCompareOper = true;
this.bFirstLine = false;
this.MathFirstItem = true;
this.bPriorityOper = true;
// у "крайних" в строке операторов/мат объектов сооответствующий Gap равен нулю
......@@ -2232,6 +2233,7 @@ CParagraphRecalculateStateWrap.prototype =
this.OperGapRight = 0;
this.OperGapLeft = 0;
this.WrapIndent = 0;
this.MathFirstItem = true;
this.bFirstCompareOper = true;
this.bInsideOper = false;
this.bNoOneBreakOperator = true;
......
......@@ -3445,6 +3445,7 @@ ParaRun.prototype.Is_EmptyRange = function(_CurLine, _CurRange)
return false;
};
ParaRun.prototype.Check_Range_OnlyMath = function(Checker, _CurRange, _CurLine)
{
var CurLine = _CurLine - this.StartLine;
......@@ -9250,6 +9251,21 @@ ParaRun.prototype.Math_PreRecalc = function(Parent, ParaMath, ArgSize, RPI, Gaps
}
};
ParaRun.prototype.Math_EmptyRange = function(_CurLine, _CurRange) // до пересчета нужно узнать будет ли данный Run пустым или нет в данном Range, необходимо для того, чтобы выставить wrapIndent
{
var bEmptyRange = true;
var Lng = this.Content.length;
if(Lng > 0)
{
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
bEmptyRange = this.protected_GetPrevRangeEndPos(CurLine, CurRange) >= Lng;
}
return bEmptyRange;
};
ParaRun.prototype.Math_UpdateGaps = function(_CurLine, _CurRange, GapsInfo)
{
var CurLine = _CurLine - this.StartLine;
......
......@@ -1808,7 +1808,7 @@ CMathBase.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.recalculateSize(g_oTextMeasurer);
this.Update_WordLen(PRS, WordLen);
this.UpdatePRS_OneLine(PRS, WordLen);
this.Bounds.SetWidth(0, 0, this.size.width);
this.Bounds.UpdateMetrics(0, 0, this.size);
}
......@@ -1878,6 +1878,22 @@ CMathBase.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.bMath_OneLine = bOneLine;
};
CMathBase.prototype.Get_WrapToLine = function(_CurLine, _CurRange, WrapIndent)
{
var Wrap = 0;
if(this.bOneLine)
{
Wrap = WrapIndent;
}
else
{
var Pos = this.NumBreakContent;
Wrap = this.Content[Pos].Get_WrapToLine(_CurLine, _CurRange, WrapIndent);
}
return Wrap;
};
CMathBase.prototype.Recalculate_MinMaxContentWidth = function(MinMax)
{
var bOneLine = MinMax.bMath_OneLine;
......@@ -1992,12 +2008,12 @@ CMathBase.prototype.Math_GetWidth = function(_CurLine, _CurRange)
{
return this.size.width;
};
CMathBase.prototype.Update_WordLen = function(PRS, WordLen)
CMathBase.prototype.UpdatePRS_OneLine = function(PRS, WordLen)
{
if(this.bInside == false)
{
PRS.WordLen = WordLen + this.size.width;
PRS.MathFirstItem = false;
}
};
CMathBase.prototype.Recalculate_Range_OneLine = function(PRS, ParaPr, Depth)
......
......@@ -54,7 +54,6 @@ function CMathBorderBoxPr()
this.strikeTLBR = false;
this.strikeV = false;
}
CMathBorderBoxPr.prototype.Set_FromObject = function(Obj)
{
if (undefined !== Obj.hideBot && null !== Obj.hideBot)
......@@ -81,7 +80,6 @@ CMathBorderBoxPr.prototype.Set_FromObject = function(Obj)
if (undefined !== Obj.strikeV && null !== Obj.strikeV)
this.strikeV = Obj.strikeV;
};
CMathBorderBoxPr.prototype.Copy = function()
{
var NewPr = new CMathBorderBoxPr();
......@@ -96,7 +94,6 @@ CMathBorderBoxPr.prototype.Copy = function()
return NewPr;
};
CMathBorderBoxPr.prototype.Write_ToBinary = function(Writer)
{
// Bool : hideBot
......@@ -117,7 +114,6 @@ CMathBorderBoxPr.prototype.Write_ToBinary = function(Writer)
Writer.WriteBool(this.strikeTLBR);
Writer.WriteBool(this.strikeV);
};
CMathBorderBoxPr.prototype.Read_FromBinary = function(Reader)
{
// Bool : hideBot
......@@ -155,7 +151,6 @@ function CBorderBox(props)
g_oTableId.Add(this, this.Id);
}
Asc.extendClass(CBorderBox, CMathBase);
CBorderBox.prototype.ClassType = historyitem_type_borderBox;
CBorderBox.prototype.kind = MATH_BORDER_BOX;
CBorderBox.prototype.init = function(props)
......@@ -396,7 +391,6 @@ function CMathBoxPr()
this.noBreak = false;
this.opEmu = false;
}
CMathBoxPr.prototype.Set_FromObject = function(Obj)
{
if(true === Obj.aln || 1 === Obj.aln)
......@@ -420,12 +414,15 @@ CMathBoxPr.prototype.Set_FromObject = function(Obj)
else
this.noBreak = false;
if(true === Obj.opEmu || 1 === Obj.opEmu)
if(true === Obj.opEmu || 1 === Obj.opEmu || Obj.opEmu == null) // null - val attribute is absent
this.opEmu = true;
else
this.opEmu = false;
};
/*CMathBoxPr.prototype.IsBreak = function()
{
return this.brk ! == undefined;
};*/
CMathBoxPr.prototype.Copy = function()
{
var NewPr = new CMathBoxPr();
......@@ -440,7 +437,6 @@ CMathBoxPr.prototype.Copy = function()
return NewPr;
};
CMathBoxPr.prototype.Write_ToBinary = function(Writer)
{
// Bool : aln
......@@ -504,10 +500,8 @@ function CBox(props)
g_oTableId.Add( this, this.Id );
}
Asc.extendClass(CBox, CMathBase);
CBox.prototype.ClassType = historyitem_type_box;
CBox.prototype.kind = MATH_BOX;
CBox.prototype.init = function(props)
{
this.Fill_LogicalContent(1);
......@@ -517,6 +511,15 @@ CBox.prototype.init = function(props)
};
CBox.prototype.fillContent = function()
{
if(this.Pr.opEmu == false && this.Pr.noBreak == false)
{
this.NeedBreakContent(0);
}
else
{
this.bCanBreak == false;
}
this.setDimension(1, 1);
this.elements[0][0] = this.getBase();
};
......@@ -524,25 +527,17 @@ CBox.prototype.getBase = function()
{
return this.Content[0];
};
CBox.prototype.Update_WordLen = function(PRS, WordLen)
CBox.prototype.UpdatePRS_OneLine = function(PRS, WordLen)
{
PRS.WordLen = WordLen;
};
// TO DO передела в base.js
CBox.prototype.UpdateOperators____2 = function(_CurLine, _CurRange)
CBox.prototype.IsOperatorEmulator = function()
{
if(true == this.ParaMath.Is_BrkBinBefore())
{
this.GapLeft = 0;
}
else
{
this.GapRight = 0;
}
this.size.width = this.Content[0].size.width + this.GapLeft + this.GapRight;
return this.Pr.opEmu == true;
};
CBox.prototype.IsBreak = function()
{
return this.Pr.opEmu == true && this.Pr.brk !== undefined;
};
......@@ -555,20 +550,17 @@ CMathBarPr.prototype.Set_FromObject = function(Obj)
if(LOCATION_TOP === Obj.pos || LOCATION_BOT === Obj.pos)
this.pos = Obj.pos;
};
CMathBarPr.prototype.Copy = function()
{
var NewPr = new CMathBarPr();
NewPr.pos = this.pos;
return NewPr;
};
CMathBarPr.prototype.Write_ToBinary = function(Writer)
{
// Long : pos
Writer.WriteLong(this.pos);
};
CMathBarPr.prototype.Read_FromBinary = function(Reader)
{
// Long : pos
......@@ -591,10 +583,8 @@ function CBar(props)
g_oTableId.Add( this, this.Id );
}
Asc.extendClass(CBar, CCharacter);
CBar.prototype.ClassType = historyitem_type_bar;
CBar.prototype.kind = MATH_BAR;
CBar.prototype.init = function(props)
{
this.Fill_LogicalContent(1);
......@@ -650,7 +640,6 @@ function CMathPhantomPr()
this.zeroDesc = false;
this.zeroWid = false;
}
CMathPhantomPr.prototype.Set_FromObject = function(Obj)
{
if (true === Obj.show || 1 === Obj.show)
......@@ -678,7 +667,6 @@ CMathPhantomPr.prototype.Set_FromObject = function(Obj)
else
this.zeroWid = false;
};
CMathPhantomPr.prototype.Copy = function()
{
var NewPr = new CMathPhantomPr();
......@@ -691,7 +679,6 @@ CMathPhantomPr.prototype.Copy = function()
return NewPr;
};
CMathPhantomPr.prototype.Write_ToBinary = function(Writer)
{
// Bool : show
......@@ -706,7 +693,6 @@ CMathPhantomPr.prototype.Write_ToBinary = function(Writer)
Writer.WriteBool(this.zeroDesc);
Writer.WriteBool(this.zeroWid);
};
CMathPhantomPr.prototype.Read_FromBinary = function(Reader)
{
// Bool : show
......@@ -736,10 +722,8 @@ function CPhantom(props)
g_oTableId.Add( this, this.Id );
}
Asc.extendClass(CPhantom, CMathBase);
CPhantom.prototype.ClassType = historyitem_type_phant;
CPhantom.prototype.kind = MATH_PHANTOM;
CPhantom.prototype.init = function(props)
{
this.Fill_LogicalContent(1);
......
......@@ -202,6 +202,8 @@ CFraction.prototype.drawSkewedFraction = function(PDSE)
PDSE.Graphics._l(xx2, yy2);
PDSE.Graphics.ds();
PDSE.Graphics._s();
CFraction.superclass.Draw_Elements.call(this, PDSE);
};
CFraction.prototype.drawLinearFraction = function(PDSE)
......@@ -231,6 +233,8 @@ CFraction.prototype.drawLinearFraction = function(PDSE)
PDSE.Graphics._l(x2, y2);
PDSE.Graphics.ds();
PDSE.Graphics._s();
CFraction.superclass.Draw_Elements.call(this, PDSE);
};
CFraction.prototype.getNumerator = function()
......
......@@ -2254,7 +2254,7 @@ CMathContent.prototype.private_LoadFromMenuFraction = function(Type, Pr)
case c_oAscMathType.FractionHorizontal : this.Add_Fraction({ctrPrp : Pr.ctrPrp, type : LINEAR_FRACTION}, null, null); break;
case c_oAscMathType.FractionSmall:
var oBox = new CBox(Pr);
this.Add_Element(oBox)
this.Add_Element(oBox);
var BoxMathContent = oBox.getBase();
BoxMathContent.Add_Fraction(Pr, null, null);
break;
......@@ -3926,8 +3926,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
Item.Recalculate_Range(PRS, ParaPr, Depth + 1);
bCurInsideOper = bCurInsideOper || PRS.bInsideOper;
PRS.bBoxOperator = Type == para_Math_Composition && Item.kind == MATH_BOX;
if(Type == para_Math_Composition)
......@@ -3939,25 +3937,51 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
BoxGapLeft = Item.GapLeft,
BoxGapRight = Item.GapRight;
if(true == Item.IsBreak())
{
if(true == PRS.MathFirstItem)
{
PRS.WordLen += BoxLen;
}
else
{
PRS.bInsideOper = true;
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Update_CurPos(PrevLastPos, _Depth-1);
PRS.Set_LineBreakPos(LastPos);
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
PRS.MoveToLBP = true;
PRS.NewRange = true;
}
}
else if(true == Item.IsOperatorEmulator())
{
if(Brk_Before == true) // break_operator должен идти в начале слова
{
PRS.X += PRS.SpaceLen + PRS.WordLen;
if(PRS.Word == true)
if(true == PRS.MathFirstItem/*PRS.FirstItemOnLine == true && PRS.Word == false*/)
{
PRS.WordLen += BoxLen;
}
else/* if(PRS.Word == true)*/
{
// обновим : начало нового слова - конец предыдущего Run
PRS.bInsideOper = true;
PRS.FirstItemOnLine = false;
PRS.Update_CurPos(PrevLastPos, _Depth-1);
PRS.Set_LineBreakPos(LastPos);
PRS.SpaceLen = BoxLen;
}
PRS.WordLen = 0;
PRS.Word = true;
}
}
else
{
var bOverXEnd = PRS.X + PRS.SpaceLen + PRS.WordLen + BoxLen - BoxGapRight > PRS.XEnd;
......@@ -3973,6 +3997,10 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
}
else
{
PRS.bInsideOper = true;
}
PRS.X += PRS.SpaceLen + PRS.WordLen + BoxLen;
PRS.SpaceLen = 0;
......@@ -3981,6 +4009,15 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.Word = false;
PRS.FirstItemOnLine = false;
}
}
else
{
PRS.WordLen += BoxLen;
}
PRS.MathFirstItem = false;
}
else
{
......@@ -4035,12 +4072,19 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
else
{
if(PRS.MathFirstItem == true && false == Item.Is_EmptyRange(PRS.Line, PRS.Range))
{
PRS.MathFirstItem = false;
}
if(PRS.bPriorityOper == true && PRS.bInsideOper == true && PRS.X - PRS.XRange > PRS.WrapIndent)
{
bNoBreakMObj = true;
}
}
bCurInsideOper = bCurInsideOper || PRS.bInsideOper;
if ( true === PRS.NewRange )
{
......@@ -4060,6 +4104,45 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.protected_FillRange(CurLine, CurRange, RangeStartPos, RangeEndPos);
};
CMathContent.prototype.Get_WrapToLine = function(_CurLine, _CurRange, WrapIndent)
{
var Pos = this.protected_GetPrevRangeEndPos(_CurLine, _CurRange);
var ContentLen = this.Content.length;
var Wrap = 0;
if(false == this.IsStartLine(_CurLine, _CurRange))
{
while(Pos < ContentLen)
{
var Item = this.Content[Pos];
var bEmptyRun = Item.Type == para_Math_Run && true == Item.Math_EmptyRange(_CurLine, _CurRange); // Get_WrapToLine может прийти до Recalculate_Range
var bBoxBreak = Item.Type == para_Math_Composition && Item.kind == MATH_BOX && true == Item.IsBreak();
if(Item.Type == para_Math_Composition)
{
if(bBoxBreak == true)
{
Wrap = 0;
}
else
{
Wrap = Item.Get_WrapToLine(_CurLine, _CurRange, WrapIndent);
}
break;
}
else if(bEmptyRun == false)
{
Wrap = WrapIndent;
break;
}
Pos++;
}
}
return Wrap;
};
CMathContent.prototype.Math_Set_EmptyRange = function(PRS)
{
var CurLine = PRS.Line - this.StartLine;
......
......@@ -70,135 +70,6 @@ CGlyphOperator.prototype.fixSize = function(stretch)
this.size.ascent = ascent;
this.size.height = height;
};
CGlyphOperator.prototype.draw_other = function() // с выравниванием к краю (относительно аргумента)
{
var coord = this.calcCoord(this.stretch);
var X = coord.XX, Y = coord.YY,
W = this.size.width, H = this.size.height,
glW, glH;
var a1, a2, b1, b2, c1, c2;
var bHor = this.loc == 0 || this.loc == 1;
if(bHor)
{
glW = coord.W;
glH = coord.H;
}
else
{
glW = coord.H;
glH = coord.W;
}
var shW = (W - glW)/ 2, // выравниваем глиф по длине
shH = (H - glH)/2; // при повороте на 90 градусовы
if(this.loc == 0)
{
a1 = 1; b1 = 0; c1 = shW;
a2 = 0; b2 = 1; c2 = 0;
}
else if(this.loc == 1)
{
a1 = 1; b1 = 0; c1 = shW;
a2 = 0; b2 = 1; c2 = H - glH;
}
else if(this.loc == 2)
{
a1 = 0; b1 = 1; c1 = 0;
a2 = 1; b2 = 0; c2 = shH;
}
else if(this.loc == 3)
{
a1 = 0; b1 = 1; c1 = W - glW;
a2 = 1; b2 = 0; c2 = shH;
}
else if(this.loc == 4)
{
a1 = 0; b1 = 1; c1 = shW;
a2 = 1; b2 = 0; c2 = 0;
}
if(this.turn == 1)
{
a1 *= -1; b1 *= -1; c1 += glW;
}
else if(this.turn == 2)
{
a2 *= -1; b2 *= -1; c2 += glH;
}
else if(this.turn == 3)
{
a1 *= -1; b1 *= -1; c1 += glW;
a2 *= -1; b2 *= -1; c2 += glH;
}
// A*x + B*y + C = 0
if(bHor)
{
a1 = 1; b1 = 0; c1 = shW;
a2 = 0; b2 = 1; c2 = 0;
}
else
{
a1 = 0; b1 = 1; c1 = 0;
a2 = 1; b2 = 0; c2 = shH;
}
if(this.turn == 1)
{
a1 *= -1; b1 *= -1; c1 = W;
}
else if(this.turn == 2)
{
a2 *= -1; b2 *= -1; c2 = H;
}
else if(this.turn == 3)
{
a1 *= -1; b1 *= -1; c1 = W;
a2 *= -1; b2 *= -1; c2 = H;
}
// смещение
var gpX = 0,
gpY = 0;
if(this.loc == 1)
gpY = this.penW*25.4/96;
if(this.loc == 3)
gpX = - this.penW*25.4/96;
var XX = [],
YY = [];
var x = this.pos.x,
y = this.pos.y;
for(var i = 0; i < X.length; i++)
{
XX[i] = x + X[i]*a1 + Y[i]*b1 + c1 + gpX;
YY[i] = y + X[i]*a2 + Y[i]*b2 + c2 + gpY;
}
var intGrid = MathControl.pGraph.GetIntegerGrid();
MathControl.pGraph.SetIntegerGrid(false);
MathControl.pGraph.p_width(this.penW*1000);
MathControl.pGraph.b_color1(0,0,0, 255);
MathControl.pGraph._s();
this.drawPath(XX,YY);
MathControl.pGraph.df();
MathControl.pGraph.SetIntegerGrid(intGrid);
};
CGlyphOperator.prototype.getCoordinateGlyph = function()
{
var coord = this.calcCoord(this.stretch);
......
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