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

1. Поправила баги с выравниванием формулы, а именно, когда операторы идут в формуле подряд

2. Поправила баг : не выставлялся параметр PRS.RestartPageRecalcInfo.Object = null в связи с завязкой на прилегание формулы к картинкам (картинка привязана к предшествующему параграфу и пересекает область расположения формулы). В связи с тем, что схема пересчета в обработке этой исключительной ситуации отпала необходимость. При этом из-за этой проверки возникал баг в документе Mathematics Word2007RTFSpec9.docx

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@63990 954022d7-b5bf-4e40-9824-e11837661b57
parent 5e71bb41
......@@ -235,31 +235,29 @@ CParaMathLineWidths.prototype.UpdateWidth = function(Line, W)
this.Widths[Line].Measure = W; // присваиваем до RecalcMaxMin
if(Line !== 0)
if(bFastUpdate)
{
if(bFastUpdate)
{
bUpdMaxWidth = this.UpdateMinMax(Line);
}
else if(bNeedUpdate)
bUpdMaxWidth = this.UpdateMinMax(Line);
}
else if(bNeedUpdate)
{
var lng = this.Widths.length;
var Max = this.MaxW;
if(lng > 0)
{
var lng = this.Widths.length;
var Max = this.MaxW;
this.MaxW = this.Widths[0].Measure;
if(lng > 1)
for(var i = 1; i < lng; i++)
{
this.MaxW = this.Widths[1].Measure;
for(var i = 2; i < lng; i++)
{
this.UpdateMinMax(i);
}
this.UpdateMinMax(i);
}
bUpdMaxWidth = Math.abs(Max - this.MaxW) > 0.0001;
}
bUpdMaxWidth = Math.abs(Max - this.MaxW) > 0.0001;
}
return bUpdMaxWidth;
};
CParaMathLineWidths.prototype.UpdatePrevMaxWidth = function()
......@@ -358,6 +356,10 @@ CMathInfo.prototype.GetNumberLine = function(Line)
{
return Line - this.FirstLineOnPage;
};
CMathInfo.prototype.GetMax = function()
{
return this.LineWidths.MaxW;
};
function CMathPageInfo()
{
......@@ -383,7 +385,6 @@ CMathPageInfo.prototype.UpdateCurrentPage = function(Page, ParaLine)
var Lng = this.Info.length;
if(this.CurPage >= Lng)
{
//var FirstLineOnPage = Lng == 0 ? 0 : PrevInfo.FirstLineOnPage + PrevInfo.GetCountLines();
var FirstLineOnPage = ParaLine - this.StartLine;
this.Info[this.CurPage] = new CMathInfo();
......@@ -425,10 +426,7 @@ CMathPageInfo.prototype.SetNextWrapState = function()
CMathPageInfo.prototype.SetStateWordLarge = function(_Line, bWordLarge)
{
var Line = this.Info[this.CurPage].GetNumberLine(_Line - this.StartLine);
this.Info[this.CurPage].LineWidths.SetWordLarge(Line, bWordLarge);
//var Line = _Line - this.StartLine - this.Info[this.CurPage].FirstLineOnPage;
};
CMathPageInfo.prototype.GetWrap = function(_Page)
{
......@@ -465,7 +463,7 @@ CMathPageInfo.prototype.ReverseCurrentMaxW = function(_Line)
};
CMathPageInfo.prototype.GetCurrentMaxWidth = function()
{
return this.Info[this.CurPage].LineWidths.GetMax();
return this.Info[this.CurPage].GetMax();
};
CMathPageInfo.prototype.GetCurrentMaxWidthAllLines = function()
{
......@@ -489,11 +487,11 @@ CMathPageInfo.prototype.GetCurrentMaxWidthAllLines = function()
return MaxW;
};
CMathPageInfo.prototype.GetMaxWidthOnPage = function(_Page) // without first page
CMathPageInfo.prototype.GetMaxW = function(_Page) // without first page
{
var Page = _Page - this.StartPage;
return this.Info[Page].LineWidths.GetMax();
return this.Info[Page].GetMax();
};
CMathPageInfo.prototype.SetCurrentMaxWidth = function(MaxW)
{
......@@ -743,6 +741,7 @@ ParaMath.prototype.Add = function(Item)
// Корректируем данный контент
oContent.Correct_Content(true);
};
ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _XLimit)
{
var X = _X;
......@@ -756,10 +755,10 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
var wrap = 0;
var bFirstLine = this.Root.IsStartLine(_CurLine);
var wrapIndent = MathSettings.Get_WrapIndent(WrapState);
if(bFirstLine == false && true == MathSettings.IsWrap(WrapState))
{
var wrapIndent = MathSettings.Get_WrapIndent(WrapState);
wrap = this.Root.Get_WrapToLine(_CurLine, _CurRange, wrapIndent);
}
......@@ -782,28 +781,12 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
var Jc = this.Get_Align();
var LinesCount = this.Root.protected_GetLinesCount();
var StartLineWidth = LinesCount > 0 ? this.PageInfo.GetStarLinetWidth() : 0; // если страница не первая, то ширину первой строки формулы не учитываем
var W = 0;
var MaxW = this.PageInfo.GetMaxWidthOnPage(Page);
if( this.PageInfo.IsFirstPage(Page) ) // CurrentPage == 0
{
var bSingleLine = LinesCount == 1 && this.Root.Math_Is_End(_CurLine, _CurRange);
if(bSingleLine) // чтобы не сравнивать с wrapIndent, когда формула занимает одну строку
W = StartLineWidth;
else
W = Math.max(MaxW + wrap, StartLineWidth);
}
else
{
W = MaxW;
}
var W = this.PageInfo.GetMaxW(Page);
if(bFirstLine == true) // первая строка первой страницы, если строка разбивается на несколько отрезко, то это уже будет inline-формула
{
var StartLineWidth = this.PageInfo.GetStarLinetWidth(); // если страница не первая, то ширину первой строки формулы не учитываем
switch(Jc)
{
case align_Left: X = XStart; break;
......@@ -831,6 +814,7 @@ ParaMath.prototype.Get_AlignToLine = function(_CurLine, _CurRange, _Page, _X, _X
return X;
};
ParaMath.prototype.Remove = function(Direction, bOnAddText)
{
var oSelectedContent = this.GetSelectContent();
......@@ -1168,14 +1152,12 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.protected_UpdateSpellChecking();
}
var AbsolutePage = this.Paragraph == null ? 0 : this.Paragraph.Get_StartPage_Absolute();
this.AbsolutePage = this.Paragraph == null ? 0 : this.Paragraph.Get_StartPage_Absolute();
var Para = PRS.Paragraph;
var ParaLine = PRS.Line;
var ParaRange = PRS.Range;
var Page = AbsolutePage + PRS.Page;
this.AbsolutePage = AbsolutePage;
var Page = this.AbsolutePage + PRS.Page;
if(this.ParaMathRPI.CheckPrevLine(ParaLine, ParaRange)) // пропускаем все Range в текущей строке, пока не прийдет пересчет для стартового отрезка
{
......@@ -1248,8 +1230,13 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if(PrevLineObject == null || PrevLineObject == this)
{
PRS.RecalcResult = recalcresult_NextLine;
if(this.ParaMathRPI.bInline == true) // сделана проверка для случая с обтеканием картинки
PRS.Reset_RestartPageRecalcInfo();
//if(this.ParaMathRPI.bInline == true) // сделана проверка для случая с обтеканием картинки
//if(this.ParaMathRPI.bInternalRanges == false) // сделана проверка для случая с обтеканием картинки
// PRS.Reset_RestartPageRecalcInfo();
// попадем сюда только, когда либо нет плавающих объектов, привязанных к предыдущему параграфу,
// либо когда не получилось расположить формулу в одном Range и формула пересчитывается обычным образом
PRS.Reset_RestartPageRecalcInfo();
}
this.private_RecalculateRoot(PRS, ParaPr, Depth);
......@@ -1567,16 +1554,20 @@ ParaMath.prototype.UpdateWidthLine = function(PRS, Width)
if(PrevRecalcObject == null || PrevRecalcObject == this)
{
var W = Width - PRS.OperGapRight - PRS.OperGapLeft;
var MathSettings = Get_WordDocumentDefaultMathSettings(),
Page = this.AbsolutePage + PRS.Page;
var WrapState = this.PageInfo.GetWrap(Page), // если впоследствии State будет изменен, то пересчитаем с первой строки текущей страницы
WrapIndent = MathSettings.Get_WrapIndent(WrapState);
var wrap = PRS.Page == 0 ? this.Root.Get_WrapToLine(PRS.Line, PRS.Range, WrapIndent) : 0;
var W = Width - PRS.OperGapRight - PRS.OperGapLeft + wrap;
var bChangeMaxW = this.PageInfo.UpdateCurrentWidth(PRS.Line, W);
if(bChangeMaxW == true && this.Is_Inline() == false && align_Justify == this.Get_Align())
{
var AbsolutePage = this.Paragraph == null ? 0 : this.Paragraph.Get_StartPage_Absolute();
var Page = AbsolutePage + PRS.Page;
var Line = this.PageInfo.GetFirstLineOnPage(Page);
this.UpdateInfoForBreak(PRS, Line);
}
}
......
......@@ -2286,13 +2286,11 @@ 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(FirstItemOnLine == true)
{
bMathWordLarge = true;
}
......@@ -2316,22 +2314,22 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var bCompareWrapIndent = PRS.bFirstLine == true ? WorLenCompareOper > PRS.WrapIndent : true;
if(PRS.bPriorityOper == true && bCompareOper == true && bFirstCompareOper == true && bCompareWrapIndent == true && !(Word == false && bFirstItem == true)) // (Word == true && FirstItemOnLine == true) - не первый элемент в строке
if(PRS.bPriorityOper == true && bCompareOper == true && bFirstCompareOper == true && bCompareWrapIndent == true && !(Word == false && FirstItemOnLine === true)) // (Word == true && FirstItemOnLine == true) - не первый элемент в строке
bFirstCompareOper = false;
if(bOperBefore) // оператор "до" => оператор находится в начале строки
{
bOverXEnd = X + WordLen + SpaceLen > XEnd;
bOverXEnd = X + WordLen + SpaceLen + BrkLen > XEnd; // BrkLen прибавляем дла случая, если идут подряд Brk Operators в конце
if(bOverXEnd && bFirstItem == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
if(bOverXEnd && FirstItemOnLine === false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{
MoveToLBP = true;
NewRange = true;
}
else
{
if(bFirstItem == false)
if(FirstItemOnLine === false)
bInsideOper = true;
if(Word == true)
......@@ -2355,10 +2353,13 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if(FirstItemOnLine == false)
{
PRS.Set_LineBreakPos(Pos);
X += SpaceLen + WordLen;
SpaceLen = BrkLen;
WordLen = 0;
}
else
{
SpaceLen += BrkLen - Item.GapLeft;
SpaceLen += BrkLen;
}
}
......@@ -2368,7 +2369,7 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
bOverXEnd = X + WordLen + BrkLen - Item.GapRight > XEnd;
if(bOverXEnd && bFirstItem == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
if(bOverXEnd && FirstItemOnLine === false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{
MoveToLBP = true;
NewRange = true;
......
......@@ -3840,12 +3840,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var RangeStartPos = this.protected_AddRange(CurLine, CurRange);
var RangeEndPos = ContentLen - 1;
/*if(this.bOneLine)
{
RangeStartPos = 0;
RangeEndPos = ContentLen - 1;
}*/
if(this.RecalcInfo.bEqArray)
this.InfoPoints.SetDefault();
......@@ -3959,8 +3953,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.bInsideOper = false;
//PRS.bMath_OneLine = Type == para_Math_Composition && bOnlyForcedBreak == true;
Item.Recalculate_Range(PRS, ParaPr, Depth + 1);
PRS.bBoxOperator = Type == para_Math_Composition && Item.kind == MATH_BOX;
......@@ -3978,22 +3970,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
this.private_ForceBreakBox(PRS, BoxLen);
/*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())
{
......@@ -4001,11 +3977,11 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
PRS.X += PRS.SpaceLen + PRS.WordLen;
if(true == PRS.MathFirstItem/*PRS.FirstItemOnLine == true && PRS.Word == false*/)
if(true == PRS.MathFirstItem)
{
PRS.WordLen += BoxLen;
}
else/* if(PRS.Word == true)*/
else
{
// обновим : начало нового слова - конец предыдущего Run
PRS.bInsideOper = true;
......
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