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 = ...@@ -1072,6 +1072,10 @@ ParaComment.prototype =
{ {
}, },
Check_MathPara : function(Checker)
{
},
Check_BreakPageInRange : function(_CurLine, _CurRange) Check_BreakPageInRange : function(_CurLine, _CurRange)
{ {
return false; return false;
......
...@@ -11221,6 +11221,11 @@ CDocument.prototype = ...@@ -11221,6 +11221,11 @@ CDocument.prototype =
else else
this.Content[this.CurPos.ContentPos].Document_UpdateInterfaceState(); this.Content[this.CurPos.ContentPos].Document_UpdateInterfaceState();
} }
else
{
// Если выделено больше 1 элемента отключаем рамку формул
this.DrawingDocument.Update_MathTrack(false);
}
} }
// Сообщаем, что список составлен // Сообщаем, что список составлен
...@@ -11231,6 +11236,7 @@ CDocument.prototype = ...@@ -11231,6 +11236,7 @@ CDocument.prototype =
this.Document_UpdateSectionPr(); this.Document_UpdateSectionPr();
}, },
// Обновляем линейки // Обновляем линейки
Document_UpdateRulersState : function() Document_UpdateRulersState : function()
{ {
......
...@@ -1152,6 +1152,37 @@ ParaHyperlink.prototype = ...@@ -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) Check_BreakPageInRange : function(_CurLine, _CurRange)
{ {
var CurLine = _CurLine - this.StartLine; var CurLine = _CurLine - this.StartLine;
......
...@@ -14,8 +14,8 @@ function ParaMath() ...@@ -14,8 +14,8 @@ function ParaMath()
this.Id = g_oIdCounter.Get_NewId(); this.Id = g_oIdCounter.Get_NewId();
this.Type = para_Math; this.Type = para_Math;
this.ParaMath = true; // false - внутристроковая формула, true - формула на отдельной строке (w:oMath/w:oMathPara) this.MathPara = true; // false - внутристроковая формула, true - формула на отдельной строке (w:oMath/w:oMathPara)
this.Jc = undefined; this.Jc = undefined;
//this.Math = new CMathComposition(); //this.Math = new CMathComposition();
//this.Math.Parent = this; //this.Math.Parent = this;
//this.Root = this.Math.Root; //this.Root = this.Math.Root;
...@@ -804,6 +804,12 @@ ParaMath.prototype = ...@@ -804,6 +804,12 @@ ParaMath.prototype =
Checker.Math = this; Checker.Math = this;
}, },
Check_MathPara : function(Checker)
{
Checker.Found = true;
Checker.Result = false;
},
Check_BreakPageInRange : function(_CurLine, _CurRange) Check_BreakPageInRange : function(_CurLine, _CurRange)
{ {
return false; return false;
......
...@@ -74,7 +74,7 @@ function Paragraph(DrawingDocument, Parent, PageNum, X, Y, XLimit, YLimit, bFrom ...@@ -74,7 +74,7 @@ function Paragraph(DrawingDocument, Parent, PageNum, X, Y, XLimit, YLimit, bFrom
Line : 0, Line : 0,
Range : 0 Range : 0
}; //new ParaEnd(); }; //new ParaEnd();
this.CurPos = this.CurPos =
{ {
X : 0, X : 0,
...@@ -1029,6 +1029,12 @@ Paragraph.prototype = ...@@ -1029,6 +1029,12 @@ Paragraph.prototype =
for ( ;Pos < ContentLen; Pos++ ) for ( ;Pos < ContentLen; Pos++ )
{ {
var Item = this.Content[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 ) if ( ( 0 === Pos && 0 === CurLine && 0 === CurRange ) || Pos !== StartPos )
{ {
...@@ -1722,9 +1728,14 @@ Paragraph.prototype = ...@@ -1722,9 +1728,14 @@ Paragraph.prototype =
// Если данный отрезок содержит только формулу, тогда прилегание данного отрезка определяется формулой // Если данный отрезок содержит только формулу, тогда прилегание данного отрезка определяется формулой
var ParaMath = this.Check_Range_OnlyMath(CurRange, CurLine); 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 else
{ {
...@@ -1848,9 +1859,9 @@ Paragraph.prototype = ...@@ -1848,9 +1859,9 @@ Paragraph.prototype =
break; break;
} }
if (true !== Checker.Result) if ( true !== Checker.Result || null === Checker.Math || true !== Checker.Math.MathPara )
return null; return null;
return Checker.Math; return Checker.Math;
}, },
...@@ -1859,7 +1870,43 @@ Paragraph.prototype = ...@@ -1859,7 +1870,43 @@ Paragraph.prototype =
if (undefined === this.Content[MathPos] || para_Math !== this.Content[MathPos].Type) if (undefined === this.Content[MathPos] || para_Math !== this.Content[MathPos].Type)
return false; 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() Get_EndInfo : function()
...@@ -2504,6 +2551,12 @@ Paragraph.prototype = ...@@ -2504,6 +2551,12 @@ Paragraph.prototype =
{ {
var Item = this.Content[Pos]; var Item = this.Content[Pos];
if ( para_Math === Item.Type )
{
// TODO: Надо бы перенести эту проверку на изменение контента параграфа
Item.MathPara = this.Check_MathPara(Pos);
}
PRS.Update_CurPos( Pos, 0 ); PRS.Update_CurPos( Pos, 0 );
var SavedLines = Item.Save_RecalculateObject(true); var SavedLines = Item.Save_RecalculateObject(true);
...@@ -5864,6 +5917,7 @@ Paragraph.prototype = ...@@ -5864,6 +5917,7 @@ Paragraph.prototype =
if ( true != bBefore ) if ( true != bBefore )
ContentPos.Data[ContentPos.Depth - 1]++; ContentPos.Data[ContentPos.Depth - 1]++;
this.Selection_Remove();
this.Set_ParaContentPos(ContentPos, false, -1, -1); this.Set_ParaContentPos(ContentPos, false, -1, -1);
this.RecalculateCurPos(); this.RecalculateCurPos();
...@@ -9360,7 +9414,7 @@ Paragraph.prototype = ...@@ -9360,7 +9414,7 @@ Paragraph.prototype =
if ( this.Selection.StartPos === this.Selection.EndPos && para_Hyperlink === this.Content[this.Selection.StartPos].Type ) if ( this.Selection.StartPos === this.Selection.EndPos && para_Hyperlink === this.Content[this.Selection.StartPos].Type )
HyperPos = this.Selection.StartPos; 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]; Math = this.Content[this.Selection.EndPos];
} }
else else
...@@ -9384,7 +9438,7 @@ Paragraph.prototype = ...@@ -9384,7 +9438,7 @@ Paragraph.prototype =
editor.sync_HyperlinkPropCallback( HyperProps ); editor.sync_HyperlinkPropCallback( HyperProps );
} }
if (null !== Math) if ( null !== Math )
{ {
var PixelError = editor.WordControl.m_oLogicDocument.DrawingDocument.GetMMPerDot(1) * 3; 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()); 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 = ...@@ -9878,7 +9932,7 @@ Paragraph.prototype =
// конца выделения, кроме этого в буквицу добавляем все табы идущие в начале. // конца выделения, кроме этого в буквицу добавляем все табы идущие в начале.
var DropCapText = new CParagraphGetDropCapText(); 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 SelSP = this.Get_ParaContentPos( true, true );
var SelEP = this.Get_ParaContentPos( true, false ); var SelEP = this.Get_ParaContentPos( true, false );
...@@ -14358,4 +14412,11 @@ function CParagraphMathRangeChecker() ...@@ -14358,4 +14412,11 @@ function CParagraphMathRangeChecker()
{ {
this.Math = null; // Искомый элемент this.Math = null; // Искомый элемент
this.Result = true; // Если есть отличные от Math элементы, тогда false, если нет, тогда true 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 = ...@@ -2694,7 +2694,7 @@ ParaRun.prototype =
{ {
var Item = this.Content[Pos]; 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; continue;
else else
{ {
...@@ -2705,6 +2705,27 @@ ParaRun.prototype = ...@@ -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) Check_BreakPageInRange : function(_CurLine, _CurRange)
{ {
var CurLine = _CurLine - this.StartLine; 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