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