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

1. Реализовала alnAt для свойства brk (для Box и для m:rPrp)

2. Поправила баг: для инлайн формул игнорируется принудительный перенос
3. Дополнила таблицу break Operator

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@64057 954022d7-b5bf-4e40-9824-e11837661b57
parent 24600ebc
......@@ -554,6 +554,8 @@ function ParaMath()
this.Ascent = 0;
this.Descent = 0;
this.DispositionOpers = [];
this.DefaultTextPr = new CTextPr();
this.DefaultTextPr.FontFamily = {Name : "Cambria Math", Index : -1 };
......@@ -752,16 +754,15 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
var Page = AbsolutePage + _Page;
var WrapState = this.PageInfo.GetWrap(Page);
var wrap = 0;
var bFirstLine = this.Root.IsStartLine(_CurLine);
/*var wrap = 0;
var wrapIndent = MathSettings.Get_WrapIndent(WrapState);
if(bFirstLine == false && true == MathSettings.IsWrap(WrapState))
{
wrap = this.Root.Get_WrapToLine(_CurLine, _CurRange, wrapIndent);
}
}*/
var XStart, XEnd;
......@@ -783,8 +784,13 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
var W = this.PageInfo.GetMaxW(Page);
if(bFirstLine == true) // первая строка первой страницы, если строка разбивается на несколько отрезко, то это уже будет inline-формула
{
var alignBrk = this.Root.GetAlignBrk(_CurLine, _CurRange);
var DispLng = this.DispositionOpers.length;
var bAlignAt = WrapState === ALIGN_MARGIN_WRAP && DispLng > 0 && bFirstLine === false && alignBrk > 0;
if(bFirstLine == true || bAlignAt == true) // первая строка первой страницы, если строка разбивается на несколько отрезков, то это уже будет inline-формула => ф-ия Get_AlignToLine не будет вызвана
{ // bAlignAt == true - учтем выравниевание первой строки + прибавим смещение для alnAt
var StartLineWidth = this.PageInfo.GetStarLinetWidth(); // если страница не первая, то ширину первой строки формулы не учитываем
switch(Jc)
......@@ -798,9 +804,23 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
break;
}
}
if(bAlignAt == true)
{
var PosAln = alignBrk < DispLng ? alignBrk -1 : DispLng - 1;
X += this.DispositionOpers[PosAln];
}
}
else
{
var wrap = 0;
var wrapIndent = MathSettings.Get_WrapIndent(WrapState);
if(true == MathSettings.IsWrap(WrapState))
{
wrap = this.Root.Get_WrapToLine(_CurLine, _CurRange, wrapIndent);
}
if(Jc == align_Justify)
{
X = XEnd - XStart > W ? XStart + (XEnd - XStart - W)/2 + wrap : XStart;
......@@ -1186,6 +1206,12 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.ParaMathRPI.ResetInfoRanges();
}
if(true == this.NeedDispOperators(PRS))
{
this.DispositionOpers.length = 0;
PRS.DispositionOpers = this.DispositionOpers;
}
if(bUpdateWrapMath == true && this.ParaMathRPI.bInternalRanges == false && PRS.bFastRecalculate == false)
{
this.ParaMathRPI.bInternalRanges = true;
......@@ -1218,8 +1244,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
//здесь обновляем WrapState, исходя из этого параметра будем считать WrapIndent
this.PageInfo.UpdateCurrentWrap(DispDef, bInline);
if(this.ParaMathRPI.Wrap !== WRAP_MATH_EMPTY && this.ParaMathRPI.bStartRanges == true)
if(this.ParaMathRPI.Wrap !== WRAP_MATH_EMPTY && this.ParaMathRPI.bStartRanges == true) // картинка в параграфе перед формулой
{
this.private_RecalculateRangeWrap(PRS, ParaPr, Depth);
}
......@@ -1241,7 +1266,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.private_RecalculateRoot(PRS, ParaPr, Depth);
if(PRS.bMathWordLarge && this.ParaMathRPI.bInline == true && PRS.Ranges.length > 0)
if(PRS.bMathWordLarge == true && this.ParaMathRPI.bInline == true && PRS.Ranges.length > 0)
{
this.Root.Math_Set_EmptyRange(PRS);
PRS.bMathWordLarge = false;
......@@ -1709,6 +1734,10 @@ ParaMath.prototype.Is_Inline = function()
//return this.ParaMathRPI.bInline;
return this.ParaMathRPI.bInline == true || (this.ParaMathRPI.bInternalRanges == true && this.ParaMathRPI.bStartRanges == false);
};
ParaMath.prototype.NeedDispOperators = function(PRS)
{
return false === this.Is_Inline() && true == this.Root.IsStartLine(PRS.Line);
};
ParaMath.prototype.Get_Align = function()
{
var Jc;
......
......@@ -2192,15 +2192,17 @@ function CParagraphRecalculateStateWrap(Para)
this.WrapIndent = 0; // WrapIndent нужен для сравнения с длиной слова (когда слово разбивается по Compare Oper): ширина первой строки формулы не должна быть меньше WrapIndent
this.bFirstCompareOper = true;
this.bFirstLine = false;
this.MathFirstItem = true;
this.MathFirstItem = true; // параметр необходим для принудительного переноса
this.bPriorityOper = true;
// у "крайних" в строке операторов/мат объектов сооответствующий Gap равен нулю
this.OperGapRight = 0;
this.OperGapLeft = 0;
this.bNoOneBreakOperator = true; // прежде чем обновлять позицию в контент Run, учтем были ли до этого операторы (проверки на Word == false не достаточно, т.к. формула мб инлайновая и тогда не нужно обновлять позицию)
this.bNoOneBreakOperator = true; // прежде чем обновлять позицию в контент Run, учтем были ли до этого break-операторы (проверки на Word == false не достаточно, т.к. формула мб инлайновая и тогда не нужно обновлять позицию)
this.DispositionOpers = [];
this.BreakBox = false;
this.bInsideOper = false; // учитываем есть ли разбивка внутри мат объекта, чтобы случайно не вставить в конец пред оператора (при Brk_Before == false)
this.bOnlyForcedBreak = false; // учитывается, если возможна разбивка только по операторам выше уровням => в этом случае можно сделать принуительный разрыв во внутреннем контенте
this.bOnlyForcedBreak = false; // учитывается, если возможна разбивка только по операторам выше уровням => в этом случае можно сделать принудительный разрыв во внутреннем контенте
this.bFastRecalculate = false;
this.bBoxOperator = false;
}
......@@ -2241,6 +2243,8 @@ CParagraphRecalculateStateWrap.prototype =
this.bNoOneBreakOperator = true;
this.bFastRecalculate = false;
this.bBoxOperator = false;
this.BreakBox = false;
this.DispositionOpers = []; // выставляем ссылку на новый массив ! length нельзя обнулять, т.к. при пересчете передаем ссылку на массив из ParaMath, чтобы после не пришлось копировать элементы массива
},
// Обнуляем некоторые параметры перед новым отрезком
......@@ -2275,6 +2279,7 @@ CParagraphRecalculateStateWrap.prototype =
this.bInsideOper = false;
this.bOnlyForcedBreak = false;
this.bNoOneBreakOperator = true;
this.BreakBox = false;
this.bFastRecalculate = false;
this.bBoxOperator = false;
},
......
......@@ -2068,6 +2068,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var bFirstCompareOper = PRS.bFirstCompareOper;
var bEndRunToContent = PRS.bEndRunToContent;
var bNoOneBreakOperator = PRS.bNoOneBreakOperator;
var BreakBox = PRS.BreakBox;
var Pos = RangeStartPos;
......@@ -2211,6 +2212,12 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
NewRange = true;
RangeEndPos = Pos;
}
else if(BreakBox == true)
{
MoveToLBP = true;
NewRange = true;
PRS.Set_LineBreakPos(Pos);
}
}
if(true !== NewRange)
......@@ -2286,7 +2293,29 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
bNoOneBreakOperator = false;
if(bOperInEndContent || bLowPriority)
if(Pos == 0 && true === this.MathPrp.IsBreak())
{
if(FirstItemOnLine === true)
{
WordLen += BrkLen;
}
else
{
if(bOperBefore)
{
X += SpaceLen + WordLen;
NewRange = true;
RangeEndPos = Pos;
}
else
{
Word = false;
BreakBox = true;
}
}
}
else if(bOperInEndContent || bLowPriority)
{
if(X + SpaceLen + WordLen + BrkLen > XEnd)
{
......@@ -2321,7 +2350,6 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
bOverXEnd = X + WordLen + SpaceLen + BrkLen > XEnd; // BrkLen прибавляем дла случая, если идут подряд Brk Operators в конце
if(bOverXEnd && FirstItemOnLine === false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{
MoveToLBP = true;
......@@ -2400,9 +2428,19 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
FirstItemOnLine = false;
Word = false;
}
}
}
if(PRS.NewRange == false && true === this.ParaMath.NeedDispOperators(PRS))
{
var W = X - XRange + Item.GapLeft;
if(bOperBefore == false)
W -= BrkLen
PRS.DispositionOpers.push(W);
}
break;
......@@ -2738,6 +2776,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.bFirstCompareOper = bFirstCompareOper;
PRS.bEndRunToContent = bEndRunToContent;
PRS.bNoOneBreakOperator = bNoOneBreakOperator;
PRS.BreakBox = BreakBox;
if(this.Type == para_Math_Run)
......@@ -9169,7 +9208,6 @@ ParaRun.prototype.Math_RecalculateContent = function(PRS)
if (descent < size.height - size.ascent)
descent = size.height - size.ascent;
if(this.bEqArray)
{
if(Type !== para_Math_Ampersand)
......@@ -9231,7 +9269,7 @@ ParaRun.prototype.IsNormalText = function()
ParaRun.prototype.getPropsForWrite = function()
{
var wRPrp = this.Pr.Copy(),
mathRPrp = this.MathPrp.getPropsForWrite();
mathRPrp = this.MathPrp.Copy();
return {wRPrp: wRPrp, mathRPrp: mathRPrp};
};
......@@ -9365,9 +9403,9 @@ ParaRun.prototype.OnlyOnePlaceholder = function()
ParaRun.prototype.Set_MathPr = function(MPrp)
{
var OldValue = this.MathPrp;
this.MathPrp = MPrp;
this.MathPrp.Set_Pr(MPrp);
History.Add( this, { Type : historyitem_ParaRun_MathPrp, New : MPrp, Old : OldValue } );
History.Add( this, { Type : historyitem_ParaRun_MathPrp, New : this.MathPrp, Old : OldValue } );
this.Recalc_CompiledPr(true);
};
......@@ -9388,6 +9426,14 @@ ParaRun.prototype.IsEqArray = function()
{
return this.Parent.IsEqArray();
};
ParaRun.prototype.IsBreak = function()
{
return this.MathPrp.IsBreak();
};
ParaRun.prototype.Get_AlignBrk = function()
{
return this.MathPrp.Get_AlignBrk();
};
ParaRun.prototype.Math_Is_InclineLetter = function()
{
var result = false;
......
......@@ -2031,10 +2031,6 @@ CMathBase.prototype.MeasureJustDraw = function(Item)
Item.Measure(g_oTextMeasurer);
};
CMathBase.prototype.Math_GetWidth = function(_CurLine, _CurRange)
{
return this.size.width;
};
CMathBase.prototype.UpdatePRS_OneLine = function(PRS, WordLen)
{
if(this.bInside == false)
......
......@@ -2,29 +2,33 @@
function CMathBreak()
{
this.AlnAt = undefined;
this.alnAt = undefined;
}
CMathBreak.prototype.Set_FromObject = function(Obj)
{
if(Obj.AlnAt !== undefined && Obj.AlnAt !== null && Obj.AlnAt - 0 == Obj.AlnAt)
if(Obj.alnAt !== undefined && Obj.alnAt !== null && Obj.alnAt - 0 == Obj.alnAt)
{
if(Obj.AlnAt >= 1 && Obj.AlnAt <= 255)
this.AlnAt = Obj.AlnAt;
if(Obj.alnAt >= 1 && Obj.alnAt <= 255)
this.alnAt = Obj.alnAt;
}
};
CMathBreak.prototype.Copy = function()
{
var NewMBreak = new CMathBreak();
NewMBreak.AlnAt = this.AlnAt;
NewMBreak.alnAt = this.alnAt;
return NewMBreak;
};
CMathBreak.prototype.Get_AlignBrk = function()
{
return this.alnAt !== undefined ? this.alnAt : 0;
};
CMathBreak.prototype.Write_ToBinary = function(Writer)
{
if(this.AlnAt !== undefined)
if(this.alnAt !== undefined)
{
Writer.WriteBool(false);
Writer.WriteLong(this.AlnAt);
Writer.WriteLong(this.alnAt);
}
else
{
......@@ -35,14 +39,15 @@ CMathBreak.prototype.Read_FromBinary = function(Reader)
{
if(Reader.GetBool() == false)
{
this.AlnAt = Reader.GetLong();
this.alnAt = Reader.GetLong();
}
else
{
this.AlnAt = undefined;
this.alnAt = undefined;
}
};
function CMathBorderBoxPr()
{
this.hideBot = false;
......@@ -419,6 +424,10 @@ CMathBoxPr.prototype.Set_FromObject = function(Obj)
else
this.opEmu = false;
};
CMathBoxPr.prototype.Get_AlignBrk = function()
{
return this.brk !== undefined ? this.brk.Get_AlignBrk() : 0;
};
CMathBoxPr.prototype.Copy = function()
{
var NewPr = new CMathBoxPr();
......@@ -531,9 +540,13 @@ CBox.prototype.IsOperatorEmulator = function()
{
return this.Pr.opEmu == true;
};
CBox.prototype.IsBreak = function()
CBox.prototype.IsBreak = function(bInline)
{
return bInline == false && this.Pr.opEmu == true && this.Pr.brk !== undefined;
};
CBox.prototype.Get_AlignBrk = function()
{
return this.Pr.opEmu == true && this.Pr.brk !== undefined;
return this.Pr.Get_AlignBrk();
};
......
......@@ -519,7 +519,7 @@ function CMPrp()
this.lit = undefined;
// Default
/*this.sty = STY_ITALIC;
/*this.sty = STY_ITALIC;
this.scr = TXT_ROMAN;
this.nor = false;
......@@ -540,19 +540,28 @@ function CMPrp()
}
CMPrp.prototype =
{
getPropsForWrite: function()
Set_Pr: function(Pr)
{
var props =
{
aln: this.aln,
brk: this.brk,
lit: this.lit,
nor: this.nor,
sty: this.sty,
scr: this.scr
};
if(Pr.sty !== undefined)
this.sty = Pr.sty;
if(Pr.scr !== undefined)
this.scr = Pr.scr;
if(Pr.nor !== undefined)
this.nor = Pr.nor;
return props;
if(Pr.aln !== undefined)
this.aln = Pr.aln;
if(Pr.lit !== undefined)
this.lit = Pr.lit;
if(Pr.brk !== undefined)
{
this.brk = new CMathBreak();
this.brk.Set_FromObject(Pr.brk);
}
},
GetTxtPrp: function()
{
......@@ -587,6 +596,14 @@ CMPrp.prototype =
return NewMPrp;
},
IsBreak: function()
{
return this.brk !== undefined;
},
Get_AlignBrk: function()
{
return this.brk !== undefined ? this.brk.Get_AlignBrk() : 0;
},
GetCompiled_ScrStyles : function()
{
var nor = this.nor == undefined ? false : this.nor;
......@@ -642,7 +659,6 @@ function CMathContent()
this.Type = para_Math_Content;
this.CurPos = 0;
this.WidthToElement = [];
this.pos = new CMathPosition(); // относительная позиция
// Properties
......@@ -819,22 +835,6 @@ CMathContent.prototype.Get_WidthPoints = function()
{
return this.InfoPoints.ContentPoints;
};
CMathContent.prototype.GetWidthLine = function(_CurLine, _CurRange)
{
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange);
var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange);
var W = 0;
for(var i = StartPos; i <= EndPos; i++)
{
W += this.Content[i].Math_GetWidth(_CurLine, _CurRange);
}
return W;
};
CMathContent.prototype.ShiftPage = function(Dx)
{
this.Bounds.ShiftPage(Dx);
......@@ -3846,7 +3846,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var ascent = 0, descent = 0;
this.size.width = 0;
var bInline = this.ParaMath.Is_Inline();
var Brk_Before = this.ParaMath.Is_BrkBinBefore();
var bOperBefore = this.ParaMath.Is_BrkBinBefore(); // true - оператор находится в начале строки, false - оператор находится в конце строки
// для внутристроковой формулы : начало формулы - начало нового слова
if(this.bRoot && bInline && true == this.IsFirstRange(PRS.Line, PRS.Range))
......@@ -3873,7 +3873,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var bInternalOper = false,
bCurInsideOper = false;
var BoxLen, BoxGapLeft, BoxGapRight;
var BoxLen, BoxGapRight;
for(var Pos = RangeStartPos; Pos < ContentLen; Pos++)
{
......@@ -3918,7 +3918,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
BoxLen = Item.size.width;
BoxGapRight = Item.GapRight;
var WWordLen = Brk_Before == true ? PRS.X + PRS.WordLen + PRS.SpaceLen : PRS.X + PRS.SpaceLen + PRS.WordLen + BoxLen - BoxGapRight;
var WWordLen = bOperBefore == true ? PRS.X + PRS.WordLen + PRS.SpaceLen : PRS.X + PRS.SpaceLen + PRS.WordLen + BoxLen - BoxGapRight;
if(WWordLen > PRS.XEnd)
{
......@@ -3927,7 +3927,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
else if(Item.kind == MATH_BOX)
{
if(true == Item.IsBreak())
if(true == Item.IsBreak(bInline))
{
this.private_ForceBreakBox(PRS, Item.size.width);
}
......@@ -3963,68 +3963,15 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if(Item.kind == MATH_BOX)
{
BoxLen = Item.size.width;
BoxGapLeft = Item.GapLeft;
BoxGapRight = Item.GapRight;
if(true == Item.IsBreak())
if(true == Item.IsBreak(bInline))
{
this.private_ForceBreakBox(PRS, BoxLen);
this.private_ForceBreakBox(PRS, Item, _Depth, PrevLastPos, LastPos); // _Depth, PrevLastPos, LastPos запоминаем до пересчета, поэтому передаем эти параметры в функцию
}
else if(true == Item.IsOperatorEmulator())
{
if(Brk_Before == true) // break_operator должен идти в начале слова
{
PRS.X += PRS.SpaceLen + PRS.WordLen;
if(true == PRS.MathFirstItem)
{
PRS.WordLen += BoxLen;
}
else
{
// обновим : начало нового слова - конец предыдущего 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;
PRS.OperGapRight = BoxGapRight;
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
// FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос
if(PRS.FirstItemOnLine == false && bOverXEnd)
{
PRS.MoveToLBP = true;
PRS.NewRange = true;
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
}
else
{
PRS.bInsideOper = true;
}
PRS.X += PRS.SpaceLen + PRS.WordLen + BoxLen;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.Word = false;
PRS.FirstItemOnLine = false;
}
this.private_BoxOperEmulator(PRS, Item, _Depth, PrevLastPos, LastPos); // _Depth, PrevLastPos, LastPos запоминаем до пересчета, поэтому передаем эти параметры в функцию
}
else
{
......@@ -4040,7 +3987,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
// FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос
if(PRS.X + PRS.SpaceLen + PRS.WordLen > PRS.XEnd)
{
if (PRS.FirstItemOnLine == false)
......@@ -4059,7 +4005,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
// обновляем BreakPos на конец Run, т.к. внутри мат объекта BreakPos может измениться на if(true !== Word)
// обновляем только в том случае, если Word = false, иначе можем здесь перебить корректный LineBreakPos
if(bCurInsideOper == true && PrevWord == false && Brk_Before == false && bNoOneBreakOperator == false && PRS.bInsideOper == false)
if(bCurInsideOper == true && PrevWord == false && bOperBefore == false && bNoOneBreakOperator == false && PRS.bInsideOper == false)
{
// обновим : начало нового слова - конец предыдущего Run
......@@ -4109,7 +4055,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
bCurInsideOper = bCurInsideOper || PRS.bInsideOper;
if ( true === PRS.NewRange )
{
RangeEndPos = Pos;
......@@ -4127,10 +4072,11 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
this.protected_FillRange(CurLine, CurRange, RangeStartPos, RangeEndPos);
};
CMathContent.prototype.Get_WrapToLine = function(_CurLine, _CurRange, WrapIndent)
{
// Get_WrapToLine может прийти до Recalculate_Range
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
......@@ -4142,9 +4088,10 @@ CMathContent.prototype.Get_WrapToLine = function(_CurLine, _CurRange, WrapIndent
{
while(Pos < ContentLen)
{
var bInline = this.ParaMath.Is_Inline();
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();
var bEmptyRun = Item.Type == para_Math_Run && true == Item.Math_EmptyRange(_CurLine, _CurRange);
var bBoxBreak = Item.Type == para_Math_Composition && Item.kind == MATH_BOX && true == Item.IsBreak(bInline);
if(Item.Type == para_Math_Composition)
{
......@@ -4161,7 +4108,8 @@ CMathContent.prototype.Get_WrapToLine = function(_CurLine, _CurRange, WrapIndent
}
else if(bEmptyRun == false)
{
Wrap = WrapIndent;
if(false === Item.IsBreak())
Wrap = WrapIndent;
break;
}
......@@ -4171,11 +4119,9 @@ CMathContent.prototype.Get_WrapToLine = function(_CurLine, _CurRange, WrapIndent
return Wrap;
};
CMathContent.prototype.private_ForceBreakBox = function(PRS, BoxLen)
CMathContent.prototype.private_ForceBreakBox = function(PRS, Box, _Depth, PrevLastPos, LastPos)
{
var _Depth = PRS.PosEndRun.Depth;
var PrevLastPos = PRS.PosEndRun.Get(_Depth-1),
LastPos = PRS.PosEndRun.Get(_Depth);
var BoxLen = Box.size.width;
if(true == PRS.MathFirstItem)
{
......@@ -4183,15 +4129,78 @@ CMathContent.prototype.private_ForceBreakBox = function(PRS, BoxLen)
}
else
{
//PRS.bInsideOper = true;
if(true === this.ParaMath.Is_BrkBinBefore())
{
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
{
PRS.Word = false;
PRS.BreakBox = true;
}
}
};
CMathContent.prototype.private_BoxOperEmulator = function(PRS, Box, _Depth, PrevLastPos, LastPos)
{
var BoxLen = Box.size.width,
BoxGapRight = Box.GapRight;
if(true === this.ParaMath.Is_BrkBinBefore()) // break_operator должен идти в начале слова
{
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Update_CurPos(PrevLastPos, _Depth-1);
PRS.Set_LineBreakPos(LastPos);
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
if(true == PRS.MathFirstItem)
{
PRS.WordLen += BoxLen;
}
else
{
// обновим : начало нового слова - конец предыдущего Run
PRS.bInsideOper = true;
PRS.FirstItemOnLine = false;
PRS.MoveToLBP = true;
PRS.NewRange = true;
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;
PRS.OperGapRight = BoxGapRight;
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
// FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос
if(PRS.FirstItemOnLine == false && bOverXEnd)
{
PRS.MoveToLBP = true;
PRS.NewRange = true;
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
}
else
{
PRS.bInsideOper = true;
}
PRS.X += PRS.SpaceLen + PRS.WordLen + BoxLen;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.Word = false;
PRS.FirstItemOnLine = false;
}
};
CMathContent.prototype.Math_Set_EmptyRange = function(PRS)
......@@ -4506,19 +4515,53 @@ CMathContent.prototype.IsStartLine = function(Line)
{
return Line == this.StartLine;
};
CMathContent.prototype.IsFirstRange = function(Line, Range)
{
return Line - this.StartLine == 0 && Range - this.StartRange == 0;
};
CMathContent.prototype.IsFirstMCompInContent = function(Class)
CMathContent.prototype.GetAlignBrk = function(_CurLine, _CurRange)
{
var result = false;
if(this.Content[0].Type == para_Math_Run && this.Content[0].Is_Empty())
var CurLine = _CurLine - this.StartLine;
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
var AlnAt = 0;
if(CurLine !== 0)
{
result = this.Content[1] == Class;
if(true == this.ParaMath.Is_BrkBinBefore())
{
var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange);
while(this.Content[StartPos].Type == para_Math_Run && true == this.Content[StartPos].Is_EmptyRange(_CurLine, _CurRange))
{
StartPos++;
}
if(this.Content[StartPos].Type == para_Math_Run || this.Content[StartPos].kind == MATH_BOX)
{
AlnAt = this.Content[StartPos].Get_AlignBrk();
}
}
else
{
var RangesCount = this.protected_GetRangesCount(CurLine - 1);
var EndtPos = this.protected_GetRangeEndPos(CurLine - 1, RangesCount - 1);
var Range = CurLine - 1 == 0 ? this.StartRange + RangesCount - 1 : RangesCount - 1;
while(EndtPos > 0 && this.Content[EndtPos].Type == para_Math_Run && true == this.Content[EndtPos].Is_EmptyRange(_CurLine - 1, Range))
{
EndtPos--;
}
if(this.Content[EndtPos].Type == para_Math_Run || this.Content[EndtPos].kind == MATH_BOX)
{
AlnAt = this.Content[EndtPos].Get_AlignBrk();
}
}
}
return result;
return AlnAt;
};
CMathContent.prototype.IsFirstRange = function(Line, Range)
{
return Line - this.StartLine == 0 && Range - this.StartRange == 0;
};
CMathContent.prototype.Get_SelectionDirection = function()
{
......
......@@ -1216,14 +1216,16 @@ var q_Math_Apostrophe =
var q_Math_BreakOperators =
{
0x002A: 1, 0x002B: 1, 0x002D: 1, 0x002F: 1,0x003C: 2, 0x003D: 2,
0x003E: 2, 0x005C: 1, 0x2190: 2, 0x2191: 2, 0x2192: 2, 0x2193: 2,
0x003E: 2, 0x005C: 1, 0x00B1: 1, 0x2190: 2, 0x2191: 2, 0x2192: 2,
0x2193: 2,
0x2194: 2, 0x2195: 2, 0x2196: 2, 0x2197: 2,0x2198: 2, 0x2199: 2,
0x219A: 2, 0x219B: 2, 0x219C: 2, 0x219D: 2,0x219E: 2,0x219F: 2,
0x219A: 2, 0x219B: 2, 0x219C: 2, 0x219D: 2,0x219E: 2, 0x219F: 2,
0x21A0: 2, 0x21A1: 2, 0x21A2: 2, 0x21A3: 2, 0x21A4: 2, 0x21A5: 2,
0x21A6: 2, 0x21A7: 2, 0x21A8: 2, 0x21A9: 2, 0x21AA: 2, 0x21AB: 2,
0x21AC: 2, 0x21AD: 2, 0x21AE: 2, 0x21AF: 2, 0x21B0: 2, 0x21B1: 2,
0x21B2: 2, 0x21B3: 2, 0x21B4: 2, 0x21B5: 2, 0x21B6: 2, 0x21B7: 2,
0x21BA: 2, 0x21BB: 2, 0x21BC: 2, 0x21BD: 2,
0x21B2: 2, 0x21B3: 2,
// check
0x21B6: 2, 0x21B7: 2, 0x21BA: 2, 0x21BB: 2, 0x21BC: 2, 0x21BD: 2,
0x21BE: 2, 0x21BF: 2, 0x21C0: 2, 0x21C1: 2, 0x21C2: 2, 0x21C3: 2,
0x21C4: 2, 0x21C5: 2, 0x21C6: 2, 0x21C7: 2, 0x21C8: 2, 0x21C9: 2,
0x21CA: 2, 0x21CB: 2, 0x21CC: 2, 0x21CD: 2, 0x21CE: 2, 0x21CF: 2,
......@@ -1253,12 +1255,30 @@ var q_Math_BreakOperators =
0x2282: 2, 0x2283: 2, 0x2284: 2, 0x2285: 2, 0x2286: 2, 0x2287: 2,
0x2288: 2, 0x2289: 2, 0x228A: 2, 0x228B: 2, 0x228C: 1, 0x228D: 1,
0x228E: 1, 0x228F: 2, 0x2290: 2, 0x2291: 2, 0x2292: 2, 0x2293: 1,
0x2294: 1, 0x22D0: 2, 0x22D1: 2, 0x22D2: 1, 0x22D3: 1, 0x22D4: 2,
0x2294: 1, 0x2295: 1, 0x2296: 1, 0x2297: 1, 0x2298: 1, 0x2299: 1,
0x229A: 1, 0x229B: 1, 0x229C: 1, 0x229D: 1, 0x229E: 1, 0x229F: 1,
0x22A0: 1, 0x22A1: 1, 0x22A2: 2, 0x22A3: 2, 0x22A5: 2, 0x22A6: 2,
0x22A7: 2, 0x22A8: 2, 0x22A9: 2, 0x22AA: 2, 0x22AB: 2, 0x22AC: 2,
0x22AD: 2, 0x22AE: 2, 0x22AF: 2, 0x22B0: 2, 0x22B1: 2, 0x22B2: 2,
0x22B3: 2, 0x22B4: 2, 0x22B5: 2, 0x22B6: 2, 0x22B7: 2, 0x22B8: 2,
0x22B9: 2, 0x22BA: 1, 0x22BB: 1, 0x22BC: 1, 0x22BD: 1, 0x22C4: 1,
0x22C5: 1, 0x22C6: 1, 0x22C7: 1, 0x22C8: 2, 0x22C9: 1, 0x22CA: 1,
0x22CB: 1, 0x22CC: 1, 0x22CD: 2, 0x22CE: 1, 0x22CF: 1, 0x22D0: 2,
0x22D1: 2, 0x22D2: 1, 0x22D3: 1, 0x22D4: 2,
0x22D5: 2, 0x22D6: 2, 0x22D7: 2, 0x22D8: 2, 0x22D9: 2, 0x22DA: 2,
0x22DB: 2, 0x22DC: 2, 0x22DD: 2, 0x22DE: 2, 0x22DF: 2, 0x22E0: 2,
0x22E1: 2, 0x22E2: 2, 0x22E3: 2, 0x22E4: 2, 0x22E5: 2, 0x22E6: 2,
0x22E7: 2, 0x22E8: 2, 0x22E9: 2, 0x233F: 2, 0x233D: 1, 0x23B0: 2,
0x23B1: 2, 0x27DC: 2, 0x27DD: 2, 0x27DE: 2,
0x22E7: 2, 0x22E8: 2, 0x22E9: 2, 0x22EA: 2, 0x22EB: 2, 0x22EC: 2,
0x22ED: 2, 0x22EE: 2, 0x22EF: 2, 0x22F0: 2, 0x22F1: 2, 0x22F2: 2,
0x22F3: 2, 0x22F4: 2, 0x22F5: 2, 0x22F6: 2, 0x22F7: 2, 0x22F8: 2,
0x22F9: 2, 0x22FA: 2, 0x22FB: 2, 0x22FC: 2, 0x22FD: 2, 0x22FE: 2,
0x22FF: 2, 0x2305: 1, 0x2306: 1, 0x2322: 2, 0x2323: 2, 0x233D: 1,
0x233F: 2, 0x23B0: 2, 0x23B1: 2, 0x25B3: 1, 0x25CA: 1, 0x25CB: 1,
0x27D1: 1, 0x27D2: 2, 0x27D3: 2, 0x27D4: 2, 0x27DA: 2, 0x27DB: 2,
0x27DC: 2, 0x27DD: 2, 0x27DE: 2, 0x27DF: 2, 0x27E0: 1, 0x27E1: 1,
0x27E2: 1, 0x27E3: 1, 0x27E4: 1, 0x27E5: 1, 0x27F0: 2, 0x27F1: 2,
0x27F2: 2, 0x27F3: 2, 0x27F4: 2,
//end check
0x27F5: 2, 0x27F6: 2, 0x27F7: 2, 0x27F8: 2, 0x27F9: 2, 0x27FA: 2,
0x27FB: 2, 0x27FC: 2, 0x27FD: 2, 0x27FE: 2, 0x27FF: 2, 0x2900: 2,
0x2901: 2, 0x2902: 2, 0x2903: 2, 0x2904: 2, 0x2905: 2, 0x2906: 2,
......
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