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

1. Переделала Recalculate_MinMaxContentWidth

2. Поправила падение при отрисовке линейной дроби
3. Поправила зависание документа при пересчете формулы и картинки (прикреплена к предыдущему параграфу). 
Проблема возникала из-за того, что ширина могла обновиться больше одного раза пересчет(и соответственно максимальная ширина тоже), в связи с этим обновляли значение предыдущей максимальной ширины несколько раз.
4. Поправила баг : не учитывалось умещается ли N-арный оператор в Range, как следствие, он мог отрисоваться поверх картинки
5. Поправила падение в инлайновой формуле для случая, когда картинка шла перед формулой

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@63368 954022d7-b5bf-4e40-9824-e11837661b57
parent a16f9f74
......@@ -219,8 +219,6 @@ CParaMathLineWidths.prototype.UpdateWidth = function(Line, W)
{
var bFastUpdate = false;
this.PrevMaxW = this.MaxW;
if(Line >= this.Widths.length)
{
bFastUpdate = true;
......@@ -260,6 +258,10 @@ CParaMathLineWidths.prototype.UpdateWidth = function(Line, W)
return bUpdMaxWidth;
};
CParaMathLineWidths.prototype.UpdatePrevMaxWidth = function()
{
this.PrevMaxW = this.MaxW;
};
CParaMathLineWidths.prototype.SetWordLarge = function(Line, bWordLarge)
{
if(Line >= this.Widths.length)
......@@ -442,6 +444,10 @@ CMathPageInfo.prototype.GetStarLinetWidth = function()
{
return this.Info[0].LineWidths.GetFirst();
};
CMathPageInfo.prototype.UpdatePrevMaxWidth = function()
{
this.Info[this.CurPage].LineWidths.UpdatePrevMaxWidth();
};
CMathPageInfo.prototype.UpdateCurrentWidth = function(_Line, Width)
{
var Line = this.Info[this.CurPage].GetNumberLine(_Line - this.StartLine);
......@@ -1232,13 +1238,6 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
};
ParaMath.prototype.private_InitWrapSettings = function(PRS)
{
//var ParaLine = PRS.Line;
//var ParaRange = PRS.Range;
//var bFirstRange = this.Root.IsFirstRange(ParaLine, ParaRange);
//var PrevLineObject = PRS.RestartPageRecalcInfo.Object;
//if(PrevLineObject == null && true == bFirstRange && PRS.bFastRecalculate == false && this.ParaMathRPI.bInternalRanges == false)
var XStart, XEnd, IndexRange;
if(this.ParaMathRPI.bStartRanges == true)
......@@ -1338,6 +1337,7 @@ ParaMath.prototype.private_RecalculateRangeWrap = function(PRS, ParaPr, Depth)
this.private_UpdateXLimits(PRS);
this.PageInfo.UpdatePrevMaxWidth();
this.private_RecalculateRoot(PRS, ParaPr, Depth);
if(PRS.RecalcResult == recalcresult_PrevLine && PRS.Range < PRS.Ranges.length)
......@@ -1610,35 +1610,12 @@ ParaMath.prototype.Refresh_RecalcData2 = function(Data)
ParaMath.prototype.Recalculate_MinMaxContentWidth = function(MinMax)
{
// TODO переделать
if (true === this.NeedResize)
{
var RPI = new CRPI();
RPI.MergeMathInfo(this.ParaMathRPI);
this.Root.PreRecalc(null, this, new CMathArgSize(), RPI);
this.Root.Resize(g_oTextMeasurer, RPI);
this.Width = this.Root.size.width;
}
if ( false === MinMax.bWord )
{
MinMax.bWord = true;
MinMax.nWordLen = this.Width;
}
else
{
MinMax.nWordLen += this.Width;
}
if ( MinMax.nSpaceLen > 0 )
{
MinMax.nCurMaxWidth += MinMax.nSpaceLen;
MinMax.nSpaceLen = 0;
}
var RPI = new CRPI();
RPI.MergeMathInfo(this.ParaMathRPI);
var ArgSize = new CMathArgSize();
MinMax.nCurMaxWidth += this.Width;
this.Root.PreRecalc(null, this, ArgSize, RPI);
this.Root.Recalculate_MinMaxContentWidth(MinMax);
};
ParaMath.prototype.Get_Range_VisibleWidth = function(RangeW, _CurLine, _CurRange)
......
......@@ -2230,15 +2230,21 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
if(X + SpaceLen + WordLen + LetterLen > XEnd)
{
if(true === FirstItemOnLine && true === Para.Internal_Check_Ranges(ParaLine, ParaRange))
if(true === FirstItemOnLine)
{
// Слово оказалось единственным элементом в промежутке, и, все равно,
// не умещается целиком. Делаем следующее:
//
// Для Формулы слово не разбиваем, перенос не делаем, пишем в одну строку (слово выйдет за границу как в Ворде)
bMathWordLarge = true;
if(false === Para.Internal_Check_Ranges(ParaLine, ParaRange)) // для случая, когда есть обтекание картинки
{
NewRange = true;
}
else
{
bMathWordLarge = true;
}
}
else
{
......@@ -2290,15 +2296,20 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
bNoOneBreakOperator = false;
var bFirstItem = true === FirstItemOnLine && true === Para.Internal_Check_Ranges(ParaLine, ParaRange);
if(bOperInEndContent || bLowPriority)
{
if(X + SpaceLen + WordLen + BrkLen > XEnd)
{
if(bFirstItem == true)
if(true === FirstItemOnLine)
{
bMathWordLarge = true;
if(false === Para.Internal_Check_Ranges(ParaLine, ParaRange)) // для случая, когда есть обтекание картинки
{
NewRange = true;
}
else
{
bMathWordLarge = true;
}
}
else
{
......@@ -2314,33 +2325,47 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
else
{
bInsideOper = true;
var bOperBefore = this.ParaMath.Is_BrkBinBefore() == true;
var WorLenCompareOper = WordLen + X - XRange + (bOperBefore ? SpaceLen : BrkLen);
var bOverXEnd;
if(bCompareOper && bFirstCompareOper == true && PRS.bCompareWrapIndent == true && WorLenCompareOper > PRS.WrapIndent && !(Word == false && bFirstItem == true)) // (Word == true && FirstItemOnLine == true) - не первый элемент в строке
if(bCompareOper && bFirstCompareOper == true && PRS.bCompareWrapIndent == true && WorLenCompareOper > PRS.WrapIndent && !(Word == false && true === FirstItemOnLine)) // (Word == true && FirstItemOnLine == true) - не первый элемент в строке
bFirstCompareOper = false;
if(bOperBefore) // оператор "до"
{
bOverXEnd = X + WordLen + SpaceLen > XEnd;
if(bOverXEnd && bFirstItem == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
if(X + WordLen + SpaceLen > XEnd/*&& bFirstItem == false*/) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{
MoveToLBP = true;
NewRange = true;
if(true === FirstItemOnLine)
{
if(false === Para.Internal_Check_Ranges(ParaLine, ParaRange))
{
NewRange = true;
}
else if(Word == true)
{
bMathWordLarge = true;
}
else
{
SpaceLen += BrkLen - Item.GapLeft;
}
}
else
{
MoveToLBP = true;
NewRange = true;
}
}
else
{
if(Word == true)
{
if(bOverXEnd) // FirstItemOnLine == true
bMathWordLarge = true;
/*if(bOverXEnd) // FirstItemOnLine == true
bMathWordLarge = true;*/
X += SpaceLen + WordLen;
PRS.Set_LineBreakPos(Pos);
......@@ -2355,7 +2380,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if(SpaceLen !== 0)
FirstItemOnLine = false;
if(bFirstItem == false)
if(FirstItemOnLine == false)
{
PRS.Set_LineBreakPos(Pos);
}
......@@ -2369,25 +2394,39 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
else // оператор "после"
{
bOverXEnd = X + WordLen + BrkLen - Item.GapRight > XEnd;
/*bOverXEnd = X + WordLen + BrkLen - Item.GapRight > XEnd;*/
if(bOverXEnd && bFirstItem == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
if(X + WordLen + BrkLen - Item.GapRight > XEnd/* && bFirstItem == false*/) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{
MoveToLBP = true;
NewRange = true;
if(true === FirstItemOnLine)
{
if(false === Para.Internal_Check_Ranges(ParaLine, ParaRange))
{
NewRange = true;
}
else
{
bMathWordLarge = true;
}
}
else
{
MoveToLBP = true;
NewRange = true;
if(Word == false)
PRS.Set_LineBreakPos(Pos);
if(Word == false)
PRS.Set_LineBreakPos(Pos);
}
}
else
{
// осуществляем здесь, чтобы не изменить GapRight в случае, когда новое слово не убирается на break_Operator
OperGapRight = Item.GapRight;
if(bOverXEnd) // FirstItemOnLine == true
/*if(bOverXEnd) // FirstItemOnLine == true
{
bMathWordLarge = true;
}
}*/
X += BrkLen + WordLen;
......@@ -3584,7 +3623,25 @@ ParaRun.prototype.Recalculate_MinMaxContentWidth = function(MinMax)
break;
}
case para_Math_Text:
case para_Math_Ampersand:
case para_Math_Placeholder:
{
var ItemWidth = Item.Get_Width() / TEXTWIDTH_DIVIDER;
if ( false === bWord )
{
bWord = true;
nWordLen = ItemWidth;
}
else
{
nWordLen += ItemWidth;
}
nCurMaxWidth += ItemWidth;
break;
}
case para_Space:
{
if ( true === bWord )
......@@ -3603,6 +3660,21 @@ ParaRun.prototype.Recalculate_MinMaxContentWidth = function(MinMax)
break;
}
case para_Math_BreakOperator:
{
if ( true === bWord )
{
if ( nMinWidth < nWordLen )
nMinWidth = nWordLen;
bWord = false;
nWordLen = 0;
}
nCurMaxWidth += Item.Get_Width() / TEXTWIDTH_DIVIDER;
break;
}
case para_Drawing:
{
......
......@@ -112,7 +112,7 @@ CFraction.prototype.drawSkewedFraction = function(PDSE)
{
var mgCtrPrp = this.Get_TxtPrControlLetter();
var penW = mgCtrPrp.FontSize/12.5*g_dKoef_pix_to_mm;
var penW = mgCtrPrp.FontSize*0.0211;
var gap = this.dW/2 - penW/7.5;
var plh = 9.877777777777776 * mgCtrPrp.FontSize / 36;
......@@ -219,7 +219,7 @@ CFraction.prototype.drawLinearFraction = function(PDSE)
y2 = Y + this.size.height;
var mgCtrPrp = this.Get_TxtPrControlLetter();
var penW = mgCtrPrp.FontSize/12.5*g_dKoef_pix_to_mm;
var penW = mgCtrPrp.FontSize*0.0211;
PDSE.Graphics.SetFont(mgCtrPrp);
PDSE.Graphics.p_width(penW*1000);
......
......@@ -237,7 +237,7 @@ CMathFunc.prototype.GetFirstElement = function()
};
CMathFunc.prototype.setDistance = function()
{
this.dW = this.Get_TxtPrControlLetter().FontSize/6*g_dKoef_pt_to_mm;
this.dW = this.Get_TxtPrControlLetter().FontSize*0.044;
};
CMathFunc.prototype.getFName = function()
{
......
......@@ -3661,48 +3661,6 @@ CMathContent.prototype.Select_All = function(Direction)
this.Content[nPos].Select_All(Direction);
}
};
CMathContent.prototype.old_Selection_DrawRange = function(_CurLine, _CurRange, SelectionDraw)
{
var Start = this.Selection.Start;
var End = this.Selection.End;
if(Start > End)
{
Start = this.Selection.End;
End = this.Selection.Start;
}
SelectionDraw.StartX += this.pos.x;
var PointsInfo = new CMathPointInfo();
PointsInfo.SetInfoPoints(this.InfoPoints);
var bDrawSelection = false;
for(var nPos = 0, nCount = this.Content.length; nPos < nCount; nPos++)
{
bDrawSelection = nPos >= Start && nPos <= End ? true : false;
if(para_Math_Run === this.Content[nPos].Type)
this.Content[nPos].Selection_DrawRange(_CurLine, _CurRange, SelectionDraw, PointsInfo);
else
{
if(true === bDrawSelection)
{
SelectionDraw.W += this.Content[nPos].size.width;
SelectionDraw.FindStart = false;
}
else if(true === SelectionDraw.FindStart)
SelectionDraw.StartX += this.Content[nPos].size.width;
}
}
// Выставляем высоту селекта. В верхнем контенте высота задается параграфом
if(true !== this.bRoot)
{
SelectionDraw.StartY = this.ParaMath.Y + this.pos.y;
SelectionDraw.H = this.size.height;
}
};
CMathContent.prototype.Selection_DrawRange = function(_CurLine, _CurRange, SelectionDraw)
{
var SelectionStartPos = this.Selection.Start;
......@@ -3885,7 +3843,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var Brk_Before = this.ParaMath.Is_BrkBinBefore();
// для внутристроковой формулы : начало формулы - начало нового слова
if(this.bRoot && bInline && RangeStartPos == 0)
if(this.bRoot && bInline && true == this.IsFirstRange(PRS.Line, PRS.Range))
{
PRS.Update_CurPos(0, Depth);
PRS.Update_CurPos(0, Depth+1); // нулевой элемент всегда Run
......@@ -3946,6 +3904,8 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var PrevLastPos = PRS.PosEndRun.Get(_Depth-1),
LastPos = PRS.PosEndRun.Get(_Depth);
var PrevWord = PRS.Word;
Item.Recalculate_Range(PRS, ParaPr, Depth + 1);
PRS.bBoxOperator = Type == para_Math_Composition && Item.kind == MATH_BOX;
......@@ -4018,7 +3978,8 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var bInsideOperator = Item.bOneLine == false && PRS.bInsideOper == true;
// обновляем BreakPos на конец Run, т.к. внутри мат объекта BreakPos может измениться на if(true !== Word)
if(Brk_Before == false && bNoOneBreakOperator == false && bInsideOperator == false)
// обновляем только в том случае, если Word = false, иначе можем здесь перебить корректный LineBreakPos
if(PrevWord == false && Brk_Before == false && bNoOneBreakOperator == false && bInsideOperator == false)
{
// обновим : начало нового слова - конец предыдущего Run
......
......@@ -477,7 +477,6 @@ CNary.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var RangeStartPos = this.protected_AddRange(CurLine, CurRange),
RangeEndPos = 2;
//this.VerifyWordLen(PRS);
if(CurLine == 0 && CurRange == 0)
{
......@@ -509,6 +508,19 @@ CNary.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.WordLen += this.dW;
if(PRS.X + PRS.SpaceLen + PRS.WordLen > PRS.XEnd)
{
var _Depth = PRS.PosEndRun.Depth;
var PrevLastPos = PRS.PosEndRun.Get(_Depth-1),
LastPos = PRS.PosEndRun.Get(_Depth);
PRS.Update_CurPos(PrevLastPos, _Depth-1);
PRS.Set_LineBreakPos(LastPos);
PRS.MoveToLBP = true;
PRS.NewRange = true;
return;
}
this.Arg.Recalculate_Reset(PRS.Range, PRS.Line, PRS); // обновим StartLine и StartRange
}
......
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