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

1. Поправила баг с зависанием : возникал из-за того, что перезаписывалась max...

1. Поправила баг с зависанием : возникал из-за того, что перезаписывалась max ширина для нулевой строкию Такая ситуация возникало из-за того, что сначала пересчет происходит без учета Range, потом для этой же строки приходит пересчет с Range. И в момент когда PRS.Ranges.length = 0 считалось, что формула нах-ся именно в этом отрезке, пересчитывалась макс ширина.
2. Добавила, чтобы учитывался ParaPr.Ind.Left для случая, когда формула находится между картинками
3. Не учитывался wrapIndent, когда формула переносилась под картинки (т.к. ф-ия private_UpdateXLimits(PRS) вызывалась до корректировки PRS.X и  PRS.XEnd для неинлайновых формул this.ParaMathRPI.XStart и this.ParaMathRPI.XEnd)

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@64836 954022d7-b5bf-4e40-9824-e11837661b57
parent 5befcf39
...@@ -318,10 +318,10 @@ CParaMathLineWidths.prototype.GetMax = function() ...@@ -318,10 +318,10 @@ CParaMathLineWidths.prototype.GetMax = function()
{ {
return this.MaxW; return this.MaxW;
}; };
CParaMathLineWidths.prototype.ReverseMaxW = function() /*CParaMathLineWidths.prototype.ReverseMaxW = function()
{ {
this.MaxW = this.PrevMaxW; this.MaxW = this.PrevMaxW;
}; };*/
CParaMathLineWidths.prototype.UpdateMinMax = function(Pos) CParaMathLineWidths.prototype.UpdateMinMax = function(Pos)
{ {
var bUpdMaxWidth = false; var bUpdMaxWidth = false;
...@@ -419,6 +419,10 @@ CMathPageInfo.prototype.UpdateCurrentWrap = function(DispDef, bInline) ...@@ -419,6 +419,10 @@ CMathPageInfo.prototype.UpdateCurrentWrap = function(DispDef, bInline)
this.WPages[this.CurPage].NeedUpdateWrap = false; this.WPages[this.CurPage].NeedUpdateWrap = false;
} }
}; };
CMathPageInfo.prototype.SetNeedUpdateWrap = function()
{
this.WPages[this.CurPage].NeedUpdateWrap = true;
};
CMathPageInfo.prototype.SetCurrentWrapState = function(WrapState) CMathPageInfo.prototype.SetCurrentWrapState = function(WrapState)
{ {
this.WPages[this.CurPage].WrapState = WrapState; this.WPages[this.CurPage].WrapState = WrapState;
...@@ -462,11 +466,11 @@ CMathPageInfo.prototype.UpdateCurrentWidth = function(_Line, Width) ...@@ -462,11 +466,11 @@ CMathPageInfo.prototype.UpdateCurrentWidth = function(_Line, Width)
return this.WPages[this.CurPage].UpdateWidth(Line, Width); return this.WPages[this.CurPage].UpdateWidth(Line, Width);
}; };
CMathPageInfo.prototype.ReverseCurrentMaxW = function(_Line) /*CMathPageInfo.prototype.ReverseCurrentMaxW = function(_Line)
{ {
var Line = this.WPages[this.CurPage].GetNumberLine(_Line - this.StartLine); var Line = this.WPages[this.CurPage].GetNumberLine(_Line - this.StartLine);
this.WPages[this.CurPage].ReverseMaxW(Line); this.WPages[this.CurPage].ReverseMaxW(Line);
}; };*/
CMathPageInfo.prototype.GetCurrentMaxWidthAllLines = function() CMathPageInfo.prototype.GetCurrentMaxWidthAllLines = function()
{ {
var MaxW = 0; var MaxW = 0;
...@@ -1271,6 +1275,15 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -1271,6 +1275,15 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.Set_EmptyRange(PRS); this.Set_EmptyRange(PRS);
this.private_UpdateRangeY(PRS, this.ParaMathRPI.ShiftY); this.private_UpdateRangeY(PRS, this.ParaMathRPI.ShiftY);
} }
else if(false === this.ParaMathRPI.CheckRangesInfo(PRS))
{
PRS.EmptyLine = false;
PRS.RecalcResult = recalcresult_NextLine;
PRS.RestartPageRecalcInfo.Object = this;
PRS.NewRange = true;
}
else else
{ {
this.Root.Set_Paragraph(Para); this.Root.Set_Paragraph(Para);
...@@ -1291,6 +1304,8 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -1291,6 +1304,8 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.ParaMathRPI.bInternalRanges = true; this.ParaMathRPI.bInternalRanges = true;
PRS.EmptyLine = false; PRS.EmptyLine = false;
this.private_SetRestartRecalcInfo(PRS); this.private_SetRestartRecalcInfo(PRS);
this.ParaMathRPI.UpdateInfoLine(PRS);
} }
else if(UpdWrap == MATH_UPDWRAP_UNDERFLOW) else if(UpdWrap == MATH_UPDWRAP_UNDERFLOW)
{ {
...@@ -1315,7 +1330,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -1315,7 +1330,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.PageInfo.UpdateCurrentWrap(DispDef, bInline); this.PageInfo.UpdateCurrentWrap(DispDef, bInline);
// для неинлайновых формул не учитываем отступ первой строки // для неинлайновых формул не учитываем отступ первой строки
if(PRS.UseFirstLine === true && this.ParaMathRPI.bInline == false) if(this.ParaMathRPI.bInline == false && true === PRS.UseFirstLine && 0 !== ParaRange && true === PRS.EmptyLine)
{ {
PRS.X -= ParaPr.Ind.FirstLine; PRS.X -= ParaPr.Ind.FirstLine;
} }
...@@ -1336,7 +1351,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) ...@@ -1336,7 +1351,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
} }
}; };
ParaMath.prototype.private_UpdateWrapSettings = function(PRS, ParaPr) ParaMath.prototype.private_UpdateWrapSettings = function(PRS)
{ {
// запомним PRS.Ranges.Y для смещения, чтобы выставить потом смещение, т.к. возможен случай, что картинка, под которой нужно расположить формулу, будет не первой, которая встретиться, пр первом пересчете, или же будет отсутствовать в текущем пересчете // запомним PRS.Ranges.Y для смещения, чтобы выставить потом смещение, т.к. возможен случай, что картинка, под которой нужно расположить формулу, будет не первой, которая встретиться, пр первом пересчете, или же будет отсутствовать в текущем пересчете
// (т.к. надо расположить под картинков), отсюда проще запомнить смещение, чем гонять пересчет до конкретной строки, чтобы private_RecalculateLineCheckRangeY вернула нужное значение // (т.к. надо расположить под картинков), отсюда проще запомнить смещение, чем гонять пересчет до конкретной строки, чтобы private_RecalculateLineCheckRangeY вернула нужное значение
...@@ -1393,9 +1408,14 @@ ParaMath.prototype.private_UpdateWrapSettings = function(PRS, ParaPr) ...@@ -1393,9 +1408,14 @@ ParaMath.prototype.private_UpdateWrapSettings = function(PRS, ParaPr)
{ {
XStart = Ranges[LngR - 1].X1; XStart = Ranges[LngR - 1].X1;
XEnd = XLimit; XEnd = XLimit;
} }
// учтем Ind.Left
// если впоследствии Ind.Left в word не будет учитываться, то нужно пересмотреть схему => в каких случаях и с какими параметрами рассчитыывать в Range
XStart += this.ParaMathRPI.IndLeft;
// в конце сравним с текущим отрезком, т.к. может произойти например след ситуация : // в конце сравним с текущим отрезком, т.к. может произойти например след ситуация :
// 2 плавающих объекта находятся в различных строках +> PRS.Ranges.length <=1 // 2 плавающих объекта находятся в различных строках +> PRS.Ranges.length <=1
// при этом формула должна расположится в макс по ширине из отрезков, образованными обоими плавающими мат объектами // при этом формула должна расположится в макс по ширине из отрезков, образованными обоими плавающими мат объектами
...@@ -1454,10 +1474,10 @@ ParaMath.prototype.private_UpdateWrapSettings = function(PRS, ParaPr) ...@@ -1454,10 +1474,10 @@ ParaMath.prototype.private_UpdateWrapSettings = function(PRS, ParaPr)
}; };
ParaMath.prototype.private_RecalculateRangeInsideInterval = function(PRS, ParaPr, Depth) ParaMath.prototype.private_RecalculateRangeInsideInterval = function(PRS, ParaPr, Depth)
{ {
if(this.ParaMathRPI.CheckRangesInLine(PRS)) /*if(this.ParaMathRPI.CheckRangesInLine(PRS))
{ {
this.PageInfo.ReverseCurrentMaxW(PRS.Line); this.PageInfo.ReverseCurrentMaxW(PRS.Line);
} }*/
var bInsideRange = PRS.X - 0.001 < this.ParaMathRPI.XStart && this.ParaMathRPI.XEnd < PRS.XEnd + 0.001; var bInsideRange = PRS.X - 0.001 < this.ParaMathRPI.XStart && this.ParaMathRPI.XEnd < PRS.XEnd + 0.001;
var bNextRangeSide = this.ParaMathRPI.IntervalState == MATH_INTERVAL_ON_SIDE && bInsideRange == false; // пересчитываем только в том отрезке, в котором находится формула var bNextRangeSide = this.ParaMathRPI.IntervalState == MATH_INTERVAL_ON_SIDE && bInsideRange == false; // пересчитываем только в том отрезке, в котором находится формула
...@@ -1490,16 +1510,12 @@ ParaMath.prototype.private_RecalculateRangeInsideInterval = function(PRS, ParaPr ...@@ -1490,16 +1510,12 @@ ParaMath.prototype.private_RecalculateRangeInsideInterval = function(PRS, ParaPr
PRS.RestartPageRecalcInfo.Object = this; PRS.RestartPageRecalcInfo.Object = this;
} }
this.ParaMathRPI.UpdateInfoLine(PRS);
}; };
ParaMath.prototype.private_RecalculateRangeWrap = function(PRS, ParaPr, Depth) ParaMath.prototype.private_RecalculateRangeWrap = function(PRS, ParaPr, Depth)
{ {
// попадем сюда только, когда либо нет плавающих объектов, привязанных к другому параграфу, нежели формула // попадем сюда только, когда либо нет плавающих объектов, привязанных к другому параграфу, нежели формула
// либо когда не получилось расположить формулу в Range и формула пересчитывается обычным образом // либо когда не получилось расположить формулу в Range и формула пересчитывается обычным образом
this.private_UpdateXLimits(PRS);
var PrevLineObject = PRS.RestartPageRecalcInfo.Object; var PrevLineObject = PRS.RestartPageRecalcInfo.Object;
if(PrevLineObject == null || PrevLineObject == this) if(PrevLineObject == null || PrevLineObject == this)
...@@ -1520,6 +1536,8 @@ ParaMath.prototype.private_RecalculateRangeWrap = function(PRS, ParaPr, Depth) ...@@ -1520,6 +1536,8 @@ ParaMath.prototype.private_RecalculateRangeWrap = function(PRS, ParaPr, Depth)
PRS.XEnd = this.ParaMathRPI.XEnd; PRS.XEnd = this.ParaMathRPI.XEnd;
} }
this.private_UpdateXLimits(PRS);
this.private_RecalculateRoot(PRS, ParaPr, Depth); this.private_RecalculateRoot(PRS, ParaPr, Depth);
var WrapState = this.PageInfo.GetCurrentWrapState(); var WrapState = this.PageInfo.GetCurrentWrapState();
...@@ -1617,6 +1635,7 @@ ParaMath.prototype.private_UpdateRangeY = function(PRS, RY) ...@@ -1617,6 +1635,7 @@ ParaMath.prototype.private_UpdateRangeY = function(PRS, RY)
}; };
ParaMath.prototype.private_SetShiftY = function(PRS, RY) ParaMath.prototype.private_SetShiftY = function(PRS, RY)
{ {
this.PageInfo.SetNeedUpdateWrap();
this.ParaMathRPI.UpdateShiftY(RY); this.ParaMathRPI.UpdateShiftY(RY);
this.ParaMathRPI.Reset_WrapSettings(); this.ParaMathRPI.Reset_WrapSettings();
this.private_SetRestartRecalcInfo(PRS); this.private_SetRestartRecalcInfo(PRS);
...@@ -3686,43 +3705,25 @@ function CMathRecalculateInfo() ...@@ -3686,43 +3705,25 @@ function CMathRecalculateInfo()
this.IntervalState = MATH_INTERVAL_EMPTY; this.IntervalState = MATH_INTERVAL_EMPTY;
this.XStart = 0; this.XStart = 0;
this.XEnd = 0; this.XEnd = 0;
this.XRange = 0;
this.XLimit = 0;
this.IndLeft = 0;
//this.bUnderFlowObj = false;
this.bInternalRanges = false; this.bInternalRanges = false;
this.RangeY = null; // max среди нижних границ плавающих объектов this.RangeY = null; // max среди нижних границ плавающих объектов
this.ShiftY = 0; this.ShiftY = 0;
// кол-во Range, тк может получится так, что Ranges есть на пересчете, но не учтен Range под которым нужно расположить формулу
// он будет учтен на следующем пересчете (прийдет строка с тем же номером, но с уже выставленными правильно Ranges)
//this.CountRanges = 0;
// если RangeY граница одного из Ranges текущей строки и при пересчете
// запоминаем длину отрезка, в котором не получилось разместить формулу,
// чтобы впоследствии если получится отрезок меньший данного и RangeY граница одного из Ranges текущей строки, то сразу же выставить параметры разместить формулу под картинкой
// при проверке изменился отрезок для пересчета => ф-ия private_UpdateWrapSettings
//this.MinWRange = 0;
this.InfoLine = new CMathInfoLines(); this.InfoLine = new CMathInfoLines();
} }
CMathRecalculateInfo.prototype.Reset = function(PRS, ParaPr) CMathRecalculateInfo.prototype.Reset = function(PRS, ParaPr)
{ {
this.XRange = PRS.XStart + ParaPr.Ind.Left; this.XRange = PRS.XStart + ParaPr.Ind.Left;
this.XLimit = PRS.XLimit; this.XLimit = PRS.XLimit;
this.IndLeft = ParaPr.Ind.Left;
this.ShiftY = 0; this.ShiftY = 0;
this.Reset_WrapSettings(); this.Reset_WrapSettings();
/*this.IntervalState = MATH_INTERVAL_EMPTY;
this.XStart = this.XRange;
this.XEnd = this.XLimit;
//this.bUnderFlowObj = false;
this.bInternalRanges = false;*/
}; };
CMathRecalculateInfo.prototype.Reset_WrapSettings = function() CMathRecalculateInfo.prototype.Reset_WrapSettings = function()
{ {
...@@ -3734,6 +3735,7 @@ CMathRecalculateInfo.prototype.Reset_WrapSettings = function() ...@@ -3734,6 +3735,7 @@ CMathRecalculateInfo.prototype.Reset_WrapSettings = function()
this.XStart = this.XRange; this.XStart = this.XRange;
this.XEnd = this.XLimit; this.XEnd = this.XLimit;
this.InfoLine.Reset();
}; };
CMathRecalculateInfo.prototype.UpdateShiftY = function(RY) CMathRecalculateInfo.prototype.UpdateShiftY = function(RY)
{ {
...@@ -3747,27 +3749,53 @@ CMathRecalculateInfo.prototype.ClearRecalculate = function() ...@@ -3747,27 +3749,53 @@ CMathRecalculateInfo.prototype.ClearRecalculate = function()
}; };
CMathRecalculateInfo.prototype.UpdateInfoLine = function(PRS) CMathRecalculateInfo.prototype.UpdateInfoLine = function(PRS)
{ {
this.InfoLine.Line = PRS.Line; this.InfoLine.Update(PRS);
this.InfoLine.Range = PRS.Range;
this.InfoLine.CountRanges = PRS.Ranges.length;
}; };
CMathRecalculateInfo.prototype.CheckRangesInLine = function(PRS) CMathRecalculateInfo.prototype.CheckRangesInfo = function(PRS)
{ {
var bSameLine = this.InfoLine.Line == PRS.Line && this.InfoLine.Range == PRS.Range; return this.InfoLine.CheckRangesInfo(PRS);
return bSameLine && (this.InfoLine.CountRanges !== PRS.Ranges.length);
}; };
function CMathInfoLines() function CMathInfoLines()
{ {
this.Line = -1; this.InfoRanges = [];
this.Range = -1;
this.CountRanges = 0;
} }
CMathInfoLines.prototype.Reset = function() CMathInfoLines.prototype.Reset = function()
{ {
this.Line = -1; this.InfoRanges.length = 0;
this.Range = -1; };
this.CountRanges = 0; CMathInfoLines.prototype.Update = function(PRS)
{
var Lng = this.InfoRanges.length;
if(PRS.Line < Lng)
{
if(this.InfoRanges[PRS.Line] < PRS.Ranges.length)
this.InfoRanges[PRS.Line] = PRS.Ranges.length;
}
else
{
this.InfoRanges[PRS.Line] = PRS.Ranges.length;
}
};
CMathInfoLines.prototype.CheckRangesInfo = function(PRS)
{
var bResult = true;
if(this.InfoRanges.length > 0)
{
var Line = PRS.Line,
Lng = PRS.Ranges.length;
var LineInfo = this.InfoRanges[Line];
/// если Lng > LineInfo[Line], то при изменнии отрезка, в котором вычисляется формула, этот параметр будет изменен
// если пришло кол-во Ranges больше, чем установленное не меняем ход событий, делаем рассчет дальше, т.к. это означает, что добавился еще один Range
if(LineInfo !== null && LineInfo !== undefined && Lng < LineInfo)
bResult = false;
}
return bResult;
}; };
function CMathRecalculateObject() function CMathRecalculateObject()
......
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