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

Переделала Recalculate_Range: исправлены многочисленные баги, связанные с...

Переделала Recalculate_Range: исправлены многочисленные баги, связанные с разбивкой формул на строки

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@61229 954022d7-b5bf-4e40-9824-e11837661b57
parent 0736a948
......@@ -44,7 +44,7 @@ function CMathPropertiesSettings()
}
CMathPropertiesSettings.prototype.SetDefaultPr = function()
{
this.brkBin = BREAK_BEFORE;
this.brkBin = BREAK_AFTER;
this.defJc = align_Justify;
this.dispDef = true;
this.intLim = NARY_SubSup;
......@@ -874,6 +874,9 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
PRS.XRange = PRS.X;
PRS.RecalcResult = recalcresult_NextLine;
PRS.PrevLineRecalcInfo.Object = null;
this.Root.Recalculate_Range(PRS, ParaPr, Depth);
if(bFirstPage && PRS.bMathWordLarge && this.State !== ALIGN_EMPTY)
......@@ -885,7 +888,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
if(PRS.NewRange == false)
{
var WidthLine = PRS.X - PRS.XRange + PRS.SpaceLen + PRS.WordLen;
this.UpdateMaxWidthLine(PRS, WidthLine);
this.UpdateWidthLine(PRS, WidthLine);
}
this.ParaMathRPI.ClearRecalculate();
......@@ -900,14 +903,14 @@ ParaMath.prototype.UpdateInfoForBreak = function(PRS)
ParaMath.prototype.Recalculate_Reset = function(CurRange, CurLine)
{
this.Root.Recalculate_Reset(CurRange, CurLine); // обновим StartLine и StartRange только для Root (в CParagraphContentWithContentBase), для внутренних элементов обновится на Recalculate_Range
}
};
ParaMath.prototype.Recalculate_Set_RangeEndPos = function(PRS, PRP, Depth)
{
this.Root.Recalculate_Set_RangeEndPos(PRS, PRP, Depth);
};
ParaMath.prototype.Recalculate_LineMetrics = function(PRS, ParaPr, _CurLine, _CurRange)
{
this.Root.Recalculate_LineMetrics(PRS, ParaPr, _CurLine, _CurRange);
};
ParaMath.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
{
......@@ -918,7 +921,7 @@ ParaMath.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
var CurLine = _CurLine - this.Root.StartLine;
this.LinesWidths[CurLine] = W;
};
ParaMath.prototype.UpdateMaxWidthLine = function(PRS, Width)
ParaMath.prototype.UpdateWidthLine = function(PRS, Width)
{
var MaxW = this.CurPageInfo.MaxLineW,
CurLine = PRS.Line - this.Root.StartLine;
......@@ -1077,10 +1080,6 @@ ParaMath.prototype.Recalculate_MinMaxContentWidth = function(MinMax)
RPI.NeedResize = true;
RPI.PRS = this.Paragraph.m_oPRSW;
//RPI.bInline = this.bInline;
//RPI.bChangeInline = this.bChangeInline;
this.Root.PreRecalc(null, this, new CMathArgSize(), RPI);
this.Root.Resize(g_oTextMeasurer, RPI);
......
......@@ -2169,6 +2169,7 @@ function CParagraphRecalculateStateWrap(Para)
this.bMath_OneLine = false; // for ParaMath
this.bMathWordLarge = false; // for ParaMath
this.PosEndRun = new CParagraphContentPos();
}
CParagraphRecalculateStateWrap.prototype =
......
......@@ -633,7 +633,7 @@ ParaRun.prototype.Get_CurrentParaPos = function()
EndPos = this.protected_GetRangeEndPos(Line, Range);
// учтем, что в одной строке в формуле может быть только один Range
while(StartPos == EndPos && Line >= 0) // == this.Content.length, т.к. последний Range
while(StartPos == EndPos && Line > 0 && this.Content.length !== 0) // == this.Content.length, т.к. последний Range
{
Line--;
StartPos = this.protected_GetRangeStartPos(Line, Range);
......@@ -1647,8 +1647,6 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var Pos = RangeStartPos;
var ContentLen = this.Content.length;
var WidthLine = PRS.XEnd - PRS.X;
var XRange = PRS.XRange;
if (false === StartWord && true === FirstItemOnLine && XEnd - X < 0.001 && RangesCount > 0)
......@@ -1801,55 +1799,49 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
case para_Math_BreakOperator:
{
var bCurrWord = Word;
if (true === Word)
{
// Добавляем длину пробелов до слова + длина самого слова. Не надо проверять
// убирается ли слово, мы это проверяем при добавленнии букв.
X += SpaceLen + WordLen;
Word = false;
EmptyLine = false;
SpaceLen = 0;
WordLen = 0;
}
// На пробеле не делаем перенос. Перенос строки или внутристрочный
// перенос делаем при добавлении любого непробельного символа
SpaceLen += Item.Width / TEXTWIDTH_DIVIDER;//SpaceLen += Item.Get_Width();
if(this.ParaMath.Is_BrkBinBefore() == true)
{
if(bCurrWord == true)
if(Word == true)
{
X += SpaceLen + WordLen;
PRS.Set_LineBreakPos(Pos);
WordLen = SpaceLen;
EmptyLine = false;
WordLen = Item.Width/TEXTWIDTH_DIVIDER;
SpaceLen = 0;
Word = true;
FirstItemOnLine = false;
}
else
{
SpaceLen += Item.Width / TEXTWIDTH_DIVIDER;//SpaceLen += Item.Get_Width();
}
}
else
{
if(X + SpaceLen > XEnd && FirstItemOnLine == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
SpaceLen = Item.Width / TEXTWIDTH_DIVIDER;
if(X + WordLen + SpaceLen > XEnd && FirstItemOnLine == false) // Слово не убирается в отрезке. Переносим слово в следующий отрезок
{
MoveToLBP = true;
NewRange = true;
if(bCurrWord == false)
{
if(Word == false)
PRS.Set_LineBreakPos(Pos);
SpaceLen = Item.Width / TEXTWIDTH_DIVIDER;
}
}
else
{
X += SpaceLen + WordLen;
EmptyLine = false;
SpaceLen = 0;
WordLen = 0;
if(Word == true)
FirstItemOnLine = false;
Word = false;
}
}
break;
......@@ -2153,19 +2145,34 @@ ParaRun.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
}
if(true === Word)
{
WidthLine = X - XRange;
}
if (true === NewRange)
break;
}
}
if(this.Type == para_Math_Run && true === NewRange)
if(this.Type == para_Math_Run)
{
this.ParaMath.UpdateMaxWidthLine(PRS, WidthLine);
if(true === NewRange)
{
var WidthLine = X - XRange;
if(this.ParaMath.Is_BrkBinBefore() == false)
WidthLine += SpaceLen;
this.ParaMath.UpdateWidthLine(PRS, WidthLine);
}
// для пустого Run, обновляем LineBreakPos на случай, если пустой Run находится между break_operator и мат объектом
else if(this.Content.length == 0 && this.ParaMath.Is_BrkBinBefore() == false && Word == false && FirstItemOnLine == false)
{
PRS.Set_LineBreakPos(Pos);
X += SpaceLen;
SpaceLen = 0;
}
// запоминаем конец Run
PRS.PosEndRun = PRS.CurPos.Copy();
PRS.PosEndRun.Update2(this.Content.length, Depth);
}
PRS.MoveToLBP = MoveToLBP;
......@@ -8251,85 +8258,6 @@ ParaRun.prototype.Recalculate_Range_OneLine = function(PRS, ParaPr, Depth)
this.bEqArray = true;
this.Recalculate_MeasureContent(WidthPoints);
};*/
ParaRun.prototype.new_Math_Recalculate = function(oMeasure, WidthPoints)
{
// ParaText (ParagraphContent.js)
// для настройки TextPr
// Measure
// FontClassification.js
// Get_FontClass
var RangeStartPos = 0;
var RangeEndPos = this.Content.length;
// обновляем позиции start и end для Range
//this.Lines[0].Add_Range(0, RangeStartPos, RangeEndPos);
this.protected_AddRange(0, 0);
this.protected_FillRange(0, 0, RangeStartPos, RangeEndPos);
var oWPrp = this.Get_CompiledPr(false);
var Theme = this.Paragraph.Get_Theme();
var ArgSize = this.Parent.Compiled_ArgSz.value,
bNormalText = this.IsNormalText();
// argSize
g_oTextMeasurer.SetTextPr(oWPrp,Theme);
var InfoMathText = new CMathInfoTextPr_2(oWPrp, ArgSize, bNormalText);
//this.bEqArray = RPI.bEqArray;
this.size.SetZero();
var ascent = 0, descent = 0;
var Lng = this.Content.length;
for (var i = 0 ; i < Lng; i++)
{
this.Content[i].Measure(oMeasure, oWPrp, InfoMathText);
var oSize = this.Content[i].size;
this.size.width += oSize.width;
var oDescent = oSize.height - oSize.ascent;
ascent = ascent > oSize.ascent ? ascent : oSize.ascent;
descent = descent < oDescent ? oDescent : descent;
if(this.Parent.IsEqArray())
{
if(this.Content[i].Type !== para_Math_Ampersand)
WidthPoints.UpdatePoint(oSize.width);
else
WidthPoints.AddNewAlignRange();
}
this.size.ascent = ascent;
this.size.height = ascent + descent;
// Запрашиваем текущие метрики шрифта, под TextAscent мы будем понимать ascent + linegap(которые записаны в шрифте)
/*this.TextHeight = g_oTextMeasurer.GetHeight();
this.TextDescent = Math.abs( g_oTextMeasurer.GetDescender() );
this.TextAscent = this.TextHeight - this.TextDescent;
this.TextAscent2 = g_oTextMeasurer.GetAscender();*/
}
// Пересчитаем метрику строки относительно размера данного текста
/*if (RPI.PRS.LineTextAscent < this.TextAscent)
RPI.PRS.LineTextAscent = this.TextAscent;
if (RPI.PRS.LineTextAscent2 < this.TextAscent2)
RPI.PRS.LineTextAscent2 = this.TextAscent2;
if (RPI.PRS.LineTextDescent < this.TextDescent)
RPI.PRS.LineTextDescent = this.TextDescent;*/
};
ParaRun.prototype.Math_Apply_Style = function(Value)
{
if(Value !== this.MathPrp.sty)
......@@ -8511,7 +8439,7 @@ ParaRun.prototype.ApplyPoints = function(PointsInfo)
}
}
};
ParaRun.prototype.Update_LineBreakPos = function(PRS, bAfterRun)
/*ParaRun.prototype.Update_LineBreakPos = function(PRS, bAfterRun)
{
if(bAfterRun)
{
......@@ -8521,7 +8449,7 @@ ParaRun.prototype.Update_LineBreakPos = function(PRS, bAfterRun)
{
PRS.Set_LineBreakPos(0);
}
};
};*/
ParaRun.prototype.Get_TextForAutoCorrect = function(AutoCorrectEngine, RunPos)
{
var ActionElement = AutoCorrectEngine.Get_ActionElement();
......
......@@ -1647,6 +1647,14 @@ CMathBase.prototype.Recalculate_Range_OneLine = function(PRS, ParaPr, Depth)
{
this.Recalculate_Range(PRS, ParaPr, Depth);
};
CMathBase.prototype.Recalculate_LineMetrics = function(PRS, ParaPr, _CurLine, _CurRange)
{
if ( PRS.LineAscent < this.size.ascent )
PRS.LineAscent = this.size.ascent;
if ( PRS.LineDescent < this.size.height - this.size.ascent )
PRS.LineDescent = this.size.height - this.size.ascent;
};
CMathBase.prototype.Recalculate_Reset = function()
{
//TODO
......
......@@ -510,16 +510,20 @@ CBox.prototype.init = function(props)
this.setProperties(props);
this.fillContent();
}
};
CBox.prototype.fillContent = function()
{
this.setDimension(1, 1);
this.elements[0][0] = this.getBase();
}
};
CBox.prototype.getBase = function()
{
return this.Content[0];
}
};
CBox.prototype.Update_WordLen = function(PRS, WordLen)
{
PRS.WordLen = WordLen;
};
function CMathBarPr()
......
......@@ -3985,14 +3985,13 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
var ascent = 0, descent = 0;
this.size.width = 0;
var bInline = this.ParaMath.Is_Inline();
var Brk_Before = this.ParaMath.Is_BrkBinBefore();
var LineAscent = PRS.LineAscent, LineDescent = PRS.LineDescent,
LastPos = ContentLen;
// для внутристроковой формулы : начало формулы - начало нового слова
if(this.bRoot && bInline && RangeStartPos == 0)
{
PRS.Update_CurPos(0, Depth);
this.Content[0].Update_LineBreakPos(PRS, false); // обновим : начало нового слова - конец предыдущего Run
PRS.Update_CurPos(0, Depth+1); // нулевой элемент всегда Run
if(PRS.Word == true)
{
......@@ -4012,7 +4011,7 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
Type = Item.Type;
// для однострочных мат объектов обновляем CurLine и CurRange, Run в этом случае не могут разбиваться на несколько строк
if ( this.bMath_OneLine || (0 === Pos && 0 === CurLine && 0 === CurRange ) || Pos !== RangeStartPos)
if (this.bMath_OneLine || (0 === Pos && 0 === CurLine && 0 === CurRange ) || Pos !== RangeStartPos)
Item.Recalculate_Reset( PRS.Range, PRS.Line );
PRS.Update_CurPos( Pos, Depth );
......@@ -4039,47 +4038,39 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
Item.Recalculate_Range(PRS, ParaPr, Depth + 1);
// обновляем LineAscent и LineDescent для мат объектов только тогда, когда встретили новое слово:
// LastPos < PRS.LineBreakPos.Get(Depth) - новое слово в Run
// (Type == para_Math_Composition && bInline && PRS.Word == false) - мат объект, перед ним break_operator => новое слово в конце предыдущего Run
// иначе LastPos текцщего мат объекта перетрет предыдущий и не будут учтены метрики предшествующих мат объектов (из предыдущего слова)
// для крайнего случая (в контенте не осталось больше элементов проверяем после цикла)
if(Type == para_Math_Composition )
if(Type == para_Math_Composition)
{
// перед мат объектом идет break_operator и он не является первым элементом в строке
if(Item.kind == MATH_BOX )
{
var BoxLen = Item.size.width;
// перед мат объектом идет break_operator (то есть перед мат объектом начинается слово)
// или мат оператор (при этом мат объект не является первым элементом в строке)
if((PRS.Word == false || (Item.kind == MATH_BOX && PRS.Word == true)))
if(Brk_Before == true) // break_operator должен идти в начале слова
{
if(PRS.Word == true)
{
// обновим : начало нового слова - конец предыдущего Run
PRS.FirstItemOnLine = false;
}
PRS.Word = true;
PRS.Update_CurPos(PRS.PosEndRun.Get(Depth), Depth);
PRS.Set_LineBreakPos(PRS.PosEndRun.Get(Depth + 1));
LastPos = Pos - 1;
if(bInline || Item.kind == MATH_BOX)
{
PRS.Update_CurPos(LastPos, Depth);
this.Content[LastPos].Update_LineBreakPos(PRS, true); // обновим : начало нового слова - конец предыдущего Run
//PRS.Update_CurPos(Pos - 1, Depth);
//this.Content[Pos - 1].Update_LineBreakPos(PRS, true);
}
// новое слово => обновляем метрики
if (PRS.LineAscent < LineAscent)
PRS.LineAscent = LineAscent;
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.SpaceLen = BoxLen;
PRS.WordLen = 0;
if (PRS.LineDescent < LineDescent)
PRS.LineDescent = LineDescent;
if(PRS.Word)
PRS.FirstItemOnLine = false;
PRS.Word = true;
}
else
{
LastPos = PRS.LineBreakPos.Get(Depth);
}
PRS.SpaceLen += BoxLen;
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
// FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос
......@@ -4087,26 +4078,46 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
PRS.MoveToLBP = true;
PRS.NewRange = true;
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
}
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
if( LineAscent < Item.size.ascent )
LineAscent = Item.size.ascent;
PRS.Word = false;
PRS.FirstItemOnLine = false;
}
}
else
{
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
// FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос
if (PRS.FirstItemOnLine == false && PRS.X + PRS.SpaceLen + PRS.WordLen > PRS.XEnd)
{
PRS.MoveToLBP = true;
PRS.NewRange = true;
if( LineDescent < Item.size.height - Item.size.ascent )
LineDescent = Item.size.height - Item.size.ascent;
this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange);
}
else if(LastPos < PRS.LineBreakPos.Get(Depth)) // Run, новое слово обновляем метрики
if(Brk_Before == false && PRS.Word == false)
{
if (PRS.LineAscent < LineAscent)
PRS.LineAscent = LineAscent;
// Отмечаем начало нового слова
//PRS.Update_CurPos(Pos - 1, Depth);
//this.Content[Pos - 1].Update_LineBreakPos(PRS, true); // обновим : начало нового слова - конец предыдущего Run
if (PRS.LineDescent < LineDescent)
PRS.LineDescent = LineDescent;
// обновим : начало нового слова - конец предыдущего Run
PRS.Update_CurPos(PRS.PosEndRun.Get(Depth), Depth);
PRS.Set_LineBreakPos(PRS.PosEndRun.Get(Depth + 1));
}
PRS.Word = true;
LastPos = ContentLen;
}
}
if ( true === PRS.NewRange )
{
......@@ -4116,16 +4127,6 @@ CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
}
}
if(PRS.NewRange == false) // элементы в контенте закончились, перехода на новую строчку нет => обновляем LineAscent и LineDescent
{
if (PRS.LineAscent < LineAscent)
PRS.LineAscent = LineAscent;
if (PRS.LineDescent < LineDescent)
PRS.LineDescent = LineDescent;
}
if ( Pos >= ContentLen )
{
RangeEndPos = Pos - 1;
......@@ -4140,7 +4141,6 @@ CMathContent.prototype.IsFirstLine = function(Line)
var CurLine = Line - this.StartLine;
return CurLine == 0;
};
CMathContent.prototype.Get_SelectionDirection = function()
{
if (true !== this.Selection.Use)
......
......@@ -858,7 +858,7 @@ CMathText.prototype =
},
Can_AddNumbering: function()
{
return false;
return true;
},
////
Copy: function()
......
......@@ -1034,17 +1034,12 @@ COperatorParenthesis.prototype.calcCoord = function(stretch)
}
// X
var DistW = [];
for(var j= 0; j< 5; j++)
DistW[j] = X[18-j] - X[9+j];
for(var i=0; i< 5; i++)
DistW[i] = X[9-j] - X[j];
var DistW = X[4] - X[5];
for(var i=5; i<10; i++ )
{
X[i] = X[i]*RX;
X[9-i] = X[i] + DistW[9-i];
X[9-i] = X[i] + DistW;
}
var XX = [],
......
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