Commit 6190c79f authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander.Trofimov

Исправлен баг с падением при работе с автофигурами и диаграммами (баги 25393,...

Исправлен баг с падением при работе с автофигурами и диаграммами (баги 25393, 25327). Улучшен алгоритм определения является ли формула внутристроковой или нет 

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@57287 954022d7-b5bf-4e40-9824-e11837661b57
parent 48198cc5
......@@ -1072,6 +1072,10 @@ ParaComment.prototype =
{
},
Check_MathPara : function(Checker)
{
},
Check_BreakPageInRange : function(_CurLine, _CurRange)
{
return false;
......
......@@ -11221,6 +11221,11 @@ CDocument.prototype =
else
this.Content[this.CurPos.ContentPos].Document_UpdateInterfaceState();
}
else
{
// Если выделено больше 1 элемента отключаем рамку формул
this.DrawingDocument.Update_MathTrack(false);
}
}
// Сообщаем, что список составлен
......@@ -11231,6 +11236,7 @@ CDocument.prototype =
this.Document_UpdateSectionPr();
},
// Обновляем линейки
Document_UpdateRulersState : function()
{
......
......@@ -1152,6 +1152,37 @@ ParaHyperlink.prototype =
}
},
Check_MathPara : function(Checker)
{
var Count = this.Content.length;
if ( Checker.Direction > 0 )
{
for ( var CurPos = 0; CurPos < Count; CurPos++ )
{
if ( this.Content[CurPos].Check_MathPara )
{
this.Content[CurPos].Check_MathPara( MathParaChecker );
if ( false !== MathParaChecker.Found )
break;
}
}
}
else
{
for ( var CurPos = Count - 1; CurPos >= 0; CurPos-- )
{
if ( this.Content[CurPos].Check_MathPara )
{
this.Content[CurPos].Check_MathPara( MathParaChecker );
if ( false !== MathParaChecker.Found )
break;
}
}
}
},
Check_BreakPageInRange : function(_CurLine, _CurRange)
{
var CurLine = _CurLine - this.StartLine;
......
......@@ -14,8 +14,8 @@ function ParaMath()
this.Id = g_oIdCounter.Get_NewId();
this.Type = para_Math;
this.ParaMath = true; // false - внутристроковая формула, true - формула на отдельной строке (w:oMath/w:oMathPara)
this.Jc = undefined;
this.MathPara = true; // false - внутристроковая формула, true - формула на отдельной строке (w:oMath/w:oMathPara)
this.Jc = undefined;
//this.Math = new CMathComposition();
//this.Math.Parent = this;
//this.Root = this.Math.Root;
......@@ -804,6 +804,12 @@ ParaMath.prototype =
Checker.Math = this;
},
Check_MathPara : function(Checker)
{
Checker.Found = true;
Checker.Result = false;
},
Check_BreakPageInRange : function(_CurLine, _CurRange)
{
return false;
......
......@@ -74,7 +74,7 @@ function Paragraph(DrawingDocument, Parent, PageNum, X, Y, XLimit, YLimit, bFrom
Line : 0,
Range : 0
}; //new ParaEnd();
this.CurPos =
{
X : 0,
......@@ -1029,6 +1029,12 @@ Paragraph.prototype =
for ( ;Pos < ContentLen; Pos++ )
{
var Item = this.Content[Pos];
if ( para_Math === Item.Type )
{
// TODO: Надо бы перенести эту проверку на изменение контента параграфа
Item.MathPara = this.Check_MathPara(Pos);
}
if ( ( 0 === Pos && 0 === CurLine && 0 === CurRange ) || Pos !== StartPos )
{
......@@ -1722,9 +1728,14 @@ Paragraph.prototype =
// Если данный отрезок содержит только формулу, тогда прилегание данного отрезка определяется формулой
var ParaMath = this.Check_Range_OnlyMath(CurRange, CurLine);
if (null !== ParaMath)
if ( null !== ParaMath )
{
X = Math.max(Range.X + (RangeWidth - ParaMath.Width) / 2, Range.X);
var Math_Jc = ParaMath.Jc;
var Math_X = ( 1 === RangesCount ? this.Pages[CurPage].X : Range.X );
var Math_XLimit = ( 1 === RangesCount ? this.Pages[CurPage].XLimit : Range.XEnd );
X = Math.max( Math_X + (Math_XLimit + Math_X - ParaMath.Width) / 2, Math_X );
}
else
{
......@@ -1848,9 +1859,9 @@ Paragraph.prototype =
break;
}
if (true !== Checker.Result)
if ( true !== Checker.Result || null === Checker.Math || true !== Checker.Math.MathPara )
return null;
return Checker.Math;
},
......@@ -1859,7 +1870,43 @@ Paragraph.prototype =
if (undefined === this.Content[MathPos] || para_Math !== this.Content[MathPos].Type)
return false;
var MathParaChecker = new CParagraphMathParaChecker();
// Нам надо пробежаться впереди назад и найти ближайшие элементы.
MathParaChecker.Direction = -1;
for ( var CurPos = MathPos - 1; CurPos >= 0; CurPos-- )
{
if ( this.Content[CurPos].Check_MathPara )
{
this.Content[CurPos].Check_MathPara( MathParaChecker );
if ( false !== MathParaChecker.Found )
break;
}
}
if ( true !== MathParaChecker.Result )
return false;
MathParaChecker.Direction = 1;
MathParaChecker.Found = false;
var Count = this.Content.length;
for ( var CurPos = MathPos + 1; CurPos < Count; CurPos++ )
{
if ( this.Content[CurPos].Check_MathPara )
{
this.Content[CurPos].Check_MathPara( MathParaChecker );
if ( false !== MathParaChecker.Found )
break;
}
}
if ( true !== MathParaChecker.Result )
return false;
return true;
},
Get_EndInfo : function()
......@@ -2504,6 +2551,12 @@ Paragraph.prototype =
{
var Item = this.Content[Pos];
if ( para_Math === Item.Type )
{
// TODO: Надо бы перенести эту проверку на изменение контента параграфа
Item.MathPara = this.Check_MathPara(Pos);
}
PRS.Update_CurPos( Pos, 0 );
var SavedLines = Item.Save_RecalculateObject(true);
......@@ -5864,6 +5917,7 @@ Paragraph.prototype =
if ( true != bBefore )
ContentPos.Data[ContentPos.Depth - 1]++;
this.Selection_Remove();
this.Set_ParaContentPos(ContentPos, false, -1, -1);
this.RecalculateCurPos();
......@@ -9360,7 +9414,7 @@ Paragraph.prototype =
if ( this.Selection.StartPos === this.Selection.EndPos && para_Hyperlink === this.Content[this.Selection.StartPos].Type )
HyperPos = this.Selection.StartPos;
if (this.Selection.StartPos === this.Selection.EndPos && para_Math === this.Content[this.Selection.EndPos].Type)
if (this.Selection.StartPos === this.Selection.EndPos && para_Math === this.Content[this.Selection.EndPos].Type )
Math = this.Content[this.Selection.EndPos];
}
else
......@@ -9384,7 +9438,7 @@ Paragraph.prototype =
editor.sync_HyperlinkPropCallback( HyperProps );
}
if (null !== Math)
if ( null !== Math )
{
var PixelError = editor.WordControl.m_oLogicDocument.DrawingDocument.GetMMPerDot(1) * 3;
this.Parent.DrawingDocument.Update_MathTrack(true, Math.X - PixelError, Math.Y - PixelError, Math.Width + 2 * PixelError, Math.Height + 2 * PixelError, this.CurPos.PagesPos + this.Get_StartPage_Absolute());
......@@ -9878,7 +9932,7 @@ Paragraph.prototype =
// конца выделения, кроме этого в буквицу добавляем все табы идущие в начале.
var DropCapText = new CParagraphGetDropCapText();
if ( true == this.Selection.Use && true === this.Parent.Selection_Is_OneElement() )
if ( true == this.Selection.Use && 0 === this.Parent.Selection_Is_OneElement() )
{
var SelSP = this.Get_ParaContentPos( true, true );
var SelEP = this.Get_ParaContentPos( true, false );
......@@ -14358,4 +14412,11 @@ function CParagraphMathRangeChecker()
{
this.Math = null; // Искомый элемент
this.Result = true; // Если есть отличные от Math элементы, тогда false, если нет, тогда true
}
function CParagraphMathParaChecker()
{
this.Found = false;
this.Result = true;
this.Direction = 0;
}
\ No newline at end of file
......@@ -2694,7 +2694,7 @@ ParaRun.prototype =
{
var Item = this.Content[Pos];
if (para_End === Item.Type || (para_Drawing === Item.Type && true !== Item.Is_Inline()))
if ( para_End === Item.Type || para_NewLine === Item.Type || ( para_Drawing === Item.Type && true !== Item.Is_Inline() ) )
continue;
else
{
......@@ -2705,6 +2705,27 @@ ParaRun.prototype =
}
},
Check_MathPara : function(Checker)
{
var Count = this.Content.length;
if ( Count <= 0 )
return;
var Item = ( Checker.Direction > 0 ? this.Content[0] : this.Content[Count - 1] );
var ItemType = Item.Type
if ( para_End === ItemType || para_NewLine === ItemType )
{
Checker.Result = true;
Checker.Found = true;
}
else
{
Checker.Result = false;
Checker.Found = true;
}
},
Check_BreakPageInRange : function(_CurLine, _CurRange)
{
var CurLine = _CurLine - this.StartLine;
......
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