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

1. Поправила баг : если степень находилась внутри объекта, который разбивается...

1. Поправила баг : если степень находилась внутри объекта, который разбивается на строки, то за счет обновления LineBreakPos в позицию конца Run основания степени (из-за этого итератор мог перенестись на следующую строку отдельно от основания)
2. Добавила еще один флаг BoxOperator в PRS для лучшей читаемости и  чтобы избежать соответствующих багов на проверке необходимости метки для переноса (LineBreakPos)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@62848 954022d7-b5bf-4e40-9824-e11837661b57
parent c5e78a6e
...@@ -1138,6 +1138,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -1138,6 +1138,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if(bStartLine == false) if(bStartLine == false)
{ {
PRS.X += WrapIndent; PRS.X += WrapIndent;
PRS.bCompareWrapIndent = false;
} }
else else
{ {
......
...@@ -2184,8 +2184,8 @@ function CParagraphRecalculateStateWrap(Para) ...@@ -2184,8 +2184,8 @@ function CParagraphRecalculateStateWrap(Para)
}; };
// for ParaMath // for ParaMath
this.bMath_OneLine = false; // for ParaMath this.bMath_OneLine = false;
this.bMathWordLarge = false; // for ParaMath this.bMathWordLarge = false;
this.bEndRunToContent = false; this.bEndRunToContent = false;
this.PosEndRun = new CParagraphContentPos(); this.PosEndRun = new CParagraphContentPos();
...@@ -2196,9 +2196,10 @@ function CParagraphRecalculateStateWrap(Para) ...@@ -2196,9 +2196,10 @@ function CParagraphRecalculateStateWrap(Para)
// у "крайних" в строке операторов/мат объектов сооответствующий Gap равен нулю // у "крайних" в строке операторов/мат объектов сооответствующий Gap равен нулю
this.OperGapRight = 0; this.OperGapRight = 0;
this.OperGapLeft = 0; this.OperGapLeft = 0;
this.bNoOneBreakOperator = true; // прежде чем обновлять позицию в контент Run, учтем были ли до этого операторы (проверки на Word == false не достаточно, т.к. формула мб инлайновая и тогда не нужно обновлять позицию) //this.bNoOneBreakOperator = true; // прежде чем обновлять позицию в контент Run, учтем были ли до этого операторы (проверки на Word == false не достаточно, т.к. формула мб инлайновая и тогда не нужно обновлять позицию)
this.bInsideOper = false; // учитываем есть ли разбивка внутри мат объекта, чтобы случайно не вставить в конец пред оператора (при Brk_Before == false) this.bInsideOper = false; // учитываем есть ли разбивка внутри мат объекта, чтобы случайно не вставить в конец пред оператора (при Brk_Before == false)
this.bFastRecalculate = false; this.bFastRecalculate = false;
this.bBoxOperator = false;
} }
CParagraphRecalculateStateWrap.prototype = CParagraphRecalculateStateWrap.prototype =
...@@ -2235,6 +2236,7 @@ CParagraphRecalculateStateWrap.prototype = ...@@ -2235,6 +2236,7 @@ CParagraphRecalculateStateWrap.prototype =
this.bNoOneBreakOperator = true; this.bNoOneBreakOperator = true;
this.bFastRecalculate = false; this.bFastRecalculate = false;
this.bCompareWrapIndent = false; this.bCompareWrapIndent = false;
this.bBoxOperator = false;
}, },
// Обнуляем некоторые параметры перед новым отрезком // Обнуляем некоторые параметры перед новым отрезком
...@@ -2270,6 +2272,7 @@ CParagraphRecalculateStateWrap.prototype = ...@@ -2270,6 +2272,7 @@ CParagraphRecalculateStateWrap.prototype =
this.bNoOneBreakOperator = true; this.bNoOneBreakOperator = true;
this.bFastRecalculate = false; this.bFastRecalculate = false;
this.bCompareWrapIndent = false; this.bCompareWrapIndent = false;
this.bBoxOperator = false;
}, },
Reset_PrevLineRecalcInfo : function() Reset_PrevLineRecalcInfo : function()
......
...@@ -2051,6 +2051,11 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2051,6 +2051,11 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var OperGapRight = PRS.OperGapRight; var OperGapRight = PRS.OperGapRight;
var OperGapLeft = PRS.OperGapLeft; var OperGapLeft = PRS.OperGapLeft;
var bInsideOper = PRS.bInsideOper;
var bFirstCompareOper = PRS.bFirstCompareOper;
var bEndRunToContent = PRS.bEndRunToContent;
var bNoOneBreakOperator = PRS.bNoOneBreakOperator;
var Pos = RangeStartPos; var Pos = RangeStartPos;
var ContentLen = this.Content.length; var ContentLen = this.Content.length;
...@@ -2268,10 +2273,10 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2268,10 +2273,10 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var bCompareOper = Item.Is_CompareOperator(); var bCompareOper = Item.Is_CompareOperator();
var bOperInEndContent = PRS.bEndRunToContent == true && Pos == ContentLen - 1 && Word == true, // необходимо для того, чтобы у контентов мат объектов (к-ые могут разбиваться на строки) не было отметки Set_LineBreakPos, иначе скобка (или GapLeft), перед которой стоит break_Operator, перенесется на следующую строку (без текста !) var bOperInEndContent = bEndRunToContent == true && Pos == ContentLen - 1 && Word == true, // необходимо для того, чтобы у контентов мат объектов (к-ые могут разбиваться на строки) не было отметки Set_LineBreakPos, иначе скобка (или GapLeft), перед которой стоит break_Operator, перенесется на следующую строку (без текста !)
bLowPriority = bCompareOper == false && PRS.bFirstCompareOper == false; bLowPriority = bCompareOper == false && bFirstCompareOper == false;
PRS.bNoOneBreakOperator = false; bNoOneBreakOperator = false;
if(bOperInEndContent || bLowPriority) if(bOperInEndContent || bLowPriority)
{ {
...@@ -2296,24 +2301,20 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2296,24 +2301,20 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
else else
{ {
PRS.bInsideOper = true; bInsideOper = true;
var bOperBefore = this.ParaMath.Is_BrkBinBefore() == true; var bOperBefore = this.ParaMath.Is_BrkBinBefore() == true;
var WorLenCompareOper = WordLen + X - XRange + (bOperBefore ? SpaceLen : BrkLen); var WorLenCompareOper = WordLen + X - XRange + (bOperBefore ? SpaceLen : BrkLen);
var bOverXEnd; var bOverXEnd;
if(bCompareOper && PRS.bFirstCompareOper == true && PRS.bCompareWrapIndent == true && WorLenCompareOper > PRS.WrapIndent && !(Word == false && FirstItemOnLine == true)) // (Word == true && FirstItemOnLine == true) - не первый элемент в строке if(bCompareOper && bFirstCompareOper == true && PRS.bCompareWrapIndent == true && WorLenCompareOper > PRS.WrapIndent && !(Word == false && FirstItemOnLine == true)) // (Word == true && FirstItemOnLine == true) - не первый элемент в строке
PRS.bFirstCompareOper = false; bFirstCompareOper = false;
if(bOperBefore) // оператор "до" if(bOperBefore) // оператор "до"
{ {
bOverXEnd = X + WordLen + SpaceLen > XEnd; bOverXEnd = X + WordLen + SpaceLen > XEnd;
/*if(Word == false) // слово только началось
{
OperGapLeft = Item.GapLeft;
}*/
if(bOverXEnd && FirstItemOnLine == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок if(bOverXEnd && FirstItemOnLine == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{ {
...@@ -2710,8 +2711,8 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2710,8 +2711,8 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
} }
else else
{ {
// для пустого Run, обновляем LineBreakPos на случай, если пустой Run находится между break_operator и мат объектом // для пустого Run, обновляем LineBreakPos на случай, если пустой Run находится между break_operator (мат. объект) и мат объектом
if(this.Content.length == 0 && this.ParaMath.Is_BrkBinBefore() == false && Word == false && FirstItemOnLine == false) if(this.Content.length == 0 && this.ParaMath.Is_BrkBinBefore() == false && Word == false && PRS.bBoxOperator == true)
{ {
PRS.Set_LineBreakPos(Pos); PRS.Set_LineBreakPos(Pos);
X += SpaceLen; X += SpaceLen;
...@@ -2721,6 +2722,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2721,6 +2722,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
// запоминаем конец Run // запоминаем конец Run
PRS.PosEndRun = PRS.CurPos.Copy(); PRS.PosEndRun = PRS.CurPos.Copy();
PRS.PosEndRun.Update2(this.Content.length, Depth); PRS.PosEndRun.Update2(this.Content.length, Depth);
} }
} }
...@@ -2745,6 +2747,11 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -2745,6 +2747,11 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.X = X; PRS.X = X;
PRS.XEnd = XEnd; PRS.XEnd = XEnd;
PRS.bInsideOper = bInsideOper;
PRS.bFirstCompareOper = bFirstCompareOper;
PRS.bEndRunToContent = bEndRunToContent;
PRS.bNoOneBreakOperator = bNoOneBreakOperator;
if ( Pos >= ContentLen ) if ( Pos >= ContentLen )
{ {
......
...@@ -3942,11 +3942,18 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -3942,11 +3942,18 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{ {
var bNoOneBreakOperator = PRS.bNoOneBreakOperator; var bNoOneBreakOperator = PRS.bNoOneBreakOperator;
// запомним позицию конца Run перед тем как зайдем во внутр мат объект (конечная позиция Run может измениться при пересчете внутр мат объекта)
var _Depth = PRS.PosEndRun.Depth;
var PrevLastPos = PRS.PosEndRun.Get(_Depth-1),
LastPos = PRS.PosEndRun.Get(_Depth);
Item.Recalculate_Range(PRS, ParaPr, Depth + 1); Item.Recalculate_Range(PRS, ParaPr, Depth + 1);
PRS.bBoxOperator = Type == para_Math_Composition && Item.kind == MATH_BOX;
if(Type == para_Math_Composition) if(Type == para_Math_Composition)
{ {
// перед мат объектом идет break_operator и он не является первым элементом в строке // перед мат объектом идет box break_operator и он не является первым элементом в строке
if(Item.kind == MATH_BOX) if(Item.kind == MATH_BOX)
{ {
var BoxLen = Item.size.width, var BoxLen = Item.size.width,
...@@ -3961,19 +3968,15 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -3961,19 +3968,15 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{ {
// обновим : начало нового слова - конец предыдущего Run // обновим : начало нового слова - конец предыдущего Run
PRS.FirstItemOnLine = false; PRS.FirstItemOnLine = false;
var _Depth = PRS.PosEndRun.Depth;
PRS.Update_CurPos(PRS.PosEndRun.Get(_Depth-1), _Depth-1); PRS.Update_CurPos(PrevLastPos, _Depth-1);
PRS.Set_LineBreakPos(PRS.PosEndRun.Get(_Depth)); PRS.Set_LineBreakPos(LastPos);
PRS.SpaceLen = BoxLen; PRS.SpaceLen = BoxLen;
} }
PRS.WordLen = 0; PRS.WordLen = 0;
if(PRS.Word)
PRS.FirstItemOnLine = false;
PRS.Word = true; PRS.Word = true;
} }
else else
...@@ -4015,15 +4018,16 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -4015,15 +4018,16 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var bInsideOperator = Item.bOneLine == false && PRS.bInsideOper == true; var bInsideOperator = Item.bOneLine == false && PRS.bInsideOper == true;
if(Brk_Before == false && bNoOneBreakOperator == false/*Word == false*/ && bInsideOperator == false) // обновляем BreakPos на конец Run, т.к. внутри мат объекта BreakPos может измениться на if(true !== Word)
if(Brk_Before == false && bNoOneBreakOperator == false && bInsideOperator == false)
{ {
// обновим : начало нового слова - конец предыдущего Run // обновим : начало нового слова - конец предыдущего Run
var _Depth = PRS.PosEndRun.Depth;
PRS.Update_CurPos(PRS.PosEndRun.Get(_Depth-1), _Depth-1); PRS.Update_CurPos(PrevLastPos, _Depth-1);
PRS.Set_LineBreakPos(PRS.PosEndRun.Get(_Depth)); PRS.Set_LineBreakPos(LastPos);
} }
PRS.Word = true; PRS.Word = true;
} }
...@@ -4048,6 +4052,8 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -4048,6 +4052,8 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
} }
} }
if ( true === PRS.NewRange ) if ( true === PRS.NewRange )
{ {
RangeEndPos = Pos; RangeEndPos = Pos;
......
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