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