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

1. Поправила баги на Get_CompiledTxtPrp (в том числе когда при селекте...

1. Поправила баги на Get_CompiledTxtPrp (в том числе когда при селекте учитывались текстовые настройки ранов, в которых не было заселекченных объектов, но начало или конец селекта находили в них)
2. Поправила баг Increase/Decrease FontSize http://bugzserver/show_bug.cgi?id=27183
3. Поправила баги связанные с мержом текстовых настроек ()неправильно ) http://bugzserver/show_bug.cgi?id=26969
4. Реализовала добавление EqArray/элемента в EqArray по нажатию Enter http://bugzserver/show_bug.cgi?id=27111

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@59191 954022d7-b5bf-4e40-9824-e11837661b57
parent b857ae81
......@@ -403,21 +403,34 @@ ParaMath.prototype.Apply_TextPr = function(TextPr, IncFontSize, ApplyToAll)
else
{
var content = this.GetSelectContent().Content;
var FontSize = TextPr.FontSize;
if(TextPr.FontSize !== undefined && content.IsNormalTextInRuns() == false)
if(IncFontSize == undefined)
{
var NewTextPr = new CTextPr();
NewTextPr.FontSize = FontSize;
var FontSize = TextPr.FontSize;
this.Root.Apply_TextPr(NewTextPr, IncFontSize, true);
if(TextPr.FontSize !== undefined && content.IsNormalTextInRuns() == false)
{
var NewTextPr = new CTextPr();
NewTextPr.FontSize = FontSize;
TextPr.FontSize = undefined;
}
this.Root.Apply_TextPr(NewTextPr, IncFontSize, true);
TextPr.FontSize = undefined;
}
content.Apply_TextPr(TextPr, IncFontSize, ApplyToAll);
content.Apply_TextPr(TextPr, IncFontSize, ApplyToAll);
TextPr.FontSize = FontSize;
}
else
{
if(content.IsNormalTextInRuns() == false)
this.Root.Apply_TextPr(TextPr, IncFontSize, true);
else
content.Apply_TextPr(TextPr, IncFontSize, ApplyToAll);
}
TextPr.FontSize = FontSize;
}
};
ParaMath.prototype.Clear_TextPr = function()
......@@ -574,9 +587,7 @@ ParaMath.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
this.Root.setPosition(pos);
}
else
{
this.Root.Resize_2(g_oTextMeasurer, null, this, RPI/*recalculate properties info*/, ArgSize);
}
this.NeedResize = false;
......@@ -1587,6 +1598,60 @@ ParaMath.prototype.Is_InInnerContent = function()
*/
ParaMath.prototype.Handle_AddNewLine = function()
{
var ContentPos = new CParagraphContentPos();
var CurrContent = this.GetSelectContent().Content;
CurrContent.Get_ParaContentPos(this.bSelectionUse, true, ContentPos);
var NeedRecalculate = false;
if(CurrContent.ParentElement.kind == MATH_EQ_ARRAY)
{
var NewContent = CurrContent.ParentElement.addRow();
CurrContent.SplitContent(NewContent, ContentPos, 0);
NewContent.Correct_Content(true);
CurrContent.Correct_Content(true);
NeedRecalculate = true;
}
else if(CurrContent.bRoot == false && CurrContent.ParentElement.kind !== MATH_MATRIX)
{
var ctrPrp = CurrContent.ParentElement.CtrPrp.Copy();
var props = {row: 2, ctrPrp: ctrPrp};
var EqArray = new CEqArray(props);
var FirstContent = EqArray.getElement(0),
SecondContent = EqArray.getElement(1);
CurrContent.SplitContent(SecondContent, ContentPos, 0);
CurrContent.CopyTo(FirstContent, false);
// остаим пустой Run в Content, чтобы не упала ф-ия Remove_FromContent
// первый элемент всегда Run
var Run = CurrContent.getElem(0);
Run.Remove_FromContent(0, Run.Content.length, true);
CurrContent.Remove_FromContent(1, CurrContent.content.length);
CurrContent.Add_ToContent(1, EqArray);
CurrContent.Correct_Content(true);
var CurrentContent = new CParagraphContentPos();
this.Get_ParaContentPos(false, false, CurrentContent);
var RightContentPos = new CParagraphSearchPos();
this.Get_RightPos(RightContentPos, CurrentContent, 0, true);
this.Set_ParaContentPos(RightContentPos.Pos, 0);
NeedRecalculate = true;
}
this.SetNeedResize();
return NeedRecalculate;
};
/**
......@@ -1597,14 +1662,16 @@ ParaMath.prototype.Handle_AddNewLine = function()
*/
ParaMath.prototype.Split = function (ContentPos, Depth)
{
var NewParaMath = null;
var NewParaMath = new ParaMath();
NewParaMath.Jc = this.Jc;
var Pos = ContentPos.Get(Depth);
this.Root.SplitContent(NewParaMath.Root, ContentPos, Depth);
//var Pos = ContentPos.Get(Depth);
if(this.Root.content[Pos].Type == para_Math_Run)
/*if(this.Root.content[Pos].Type == para_Math_Run)
{
NewParaMath = new ParaMath();
NewParaMath.Jc = this.Jc;
var NewRun = this.Root.content[Pos].Split(ContentPos, Depth+1);
NewParaMath.Root.Add_ToContent(0, NewRun);
......@@ -1620,7 +1687,7 @@ ParaMath.prototype.Split = function (ContentPos, Depth)
this.SetNeedResize();
NewParaMath.SetNeedResize();
}
}*/
return NewParaMath;
};
......
......@@ -4692,8 +4692,7 @@ ParaRun.prototype.Internal_Compile_Pr = function ()
if(this.IsPlaceholder())
{
/*oWPrp = this.Parent.Get_Default_TPrp();
TextPr.Merge(oWPrp);*/
TextPr.Merge(this.Parent.GetCtrPrp());
TextPr.Merge( this.Pr ); // Мержим прямые настройки данного рана
......@@ -4702,12 +4701,9 @@ ParaRun.prototype.Internal_Compile_Pr = function ()
TextPr.Italic = false;
TextPr.Bold = false;
//this.Parent.ParaMath.ApplyArgSize(TextPr, this.Parent.argSize);
}
else
{
/*oWPrp = this.Parent.Get_Default_TPrp();
TextPr.Merge(oWPrp);*/
TextPr.Merge( this.Pr ); // Мержим прямые настройки данного рана
if(!this.IsNormalText()) // math text
......@@ -4715,8 +4711,6 @@ ParaRun.prototype.Internal_Compile_Pr = function ()
var MPrp = this.MathPrp.GetTxtPrp();
TextPr.Merge(MPrp); // bold, italic
}
//this.Parent.ParaMath.ApplyArgSize(TextPr, this.Parent.argSize);
}
}
else
......@@ -5128,7 +5122,21 @@ ParaRun.prototype.Apply_Pr = function(TextPr)
this.Set_Position( null === TextPr.Position ? undefined : TextPr.Position );
if ( undefined != TextPr.RFonts )
this.Set_RFonts2( TextPr.RFonts );
{
if(this.Type == para_Math_Run && !this.IsNormalText()) // при смене Font в этом случае (даже на Cambria Math) cs, eastAsia не меняются
{
var RFonts =
{
Ascii: {Name: "Cambria Math", Index: -1},
HAnsi: {Name: "Cambria Math", Index: -1}
};
this.Set_RFonts2(RFonts);
}
else
this.Set_RFonts2(TextPr.RFonts);
}
if ( undefined != TextPr.Lang )
this.Set_Lang2( TextPr.Lang );
......@@ -7805,14 +7813,14 @@ ParaRun.prototype.Math_Draw = function(x, y, pGraphics)
FontSize : this.Parent.ParaMath.ApplyArgSize(oWPrp.FontSize, this.Parent.Compiled_ArgSz.value)
};
if(!this.IsNormalText()) // выставляем false, чтобы не применился наклон к спец символам
if(this.IsMathematicalText()) // выставляем false, чтобы не применился наклон к спец символам
{
Font.Italic = false;
Font.Bold = false;
var defaultTxtPrp = this.Parent.ParaMath.Get_Default_TPrp();
Font.FontFamily.Name = defaultTxtPrp.FontFamily.Name;
Font.FontFamily.Index = defaultTxtPrp.FontFamily.Index;
//var defaultTxtPrp = this.Parent.ParaMath.Get_Default_TPrp();
//Font.FontFamily.Name = defaultTxtPrp.FontFamily.Name;
//Font.FontFamily.Index = defaultTxtPrp.FontFamily.Index;
}
pGraphics.SetFont(Font);
......@@ -7859,14 +7867,14 @@ ParaRun.prototype.Math_Recalculate = function(oMeasure, RPI, WidthPoints)
};
if(!this.IsNormalText()) // выставляем false, чтобы не применился наклон к спец символам
if(this.IsMathematicalText()) // выставляем false, чтобы не применился наклон к спец символам
{
Font.Italic = false;
Font.Bold = false;
var defaultTxtPrp = this.Parent.ParaMath.Get_Default_TPrp();
Font.FontFamily.Name = defaultTxtPrp.FontFamily.Name;
Font.FontFamily.Index = defaultTxtPrp.FontFamily.Index;
//var defaultTxtPrp = this.Parent.ParaMath.Get_Default_TPrp();
//Font.FontFamily.Name = defaultTxtPrp.FontFamily.Name;
//Font.FontFamily.Index = defaultTxtPrp.FontFamily.Index;
}
g_oTextMeasurer.SetFont(Font);
......@@ -7966,7 +7974,14 @@ ParaRun.prototype.Math_Apply_Style = function(Value)
ParaRun.prototype.IsNormalText = function()
{
var comp_MPrp = this.MathPrp.GetCompiled_ScrStyles();
return (comp_MPrp.nor === true);
return comp_MPrp.nor === true;
}
ParaRun.prototype.IsMathematicalText = function()
{
var MathText = !this.IsNormalText();
var bMFont = this.Get_CompiledPr(false).FontFamily.Name == "Cambria Math";
return MathText && bMFont;
}
ParaRun.prototype.getPropsForWrite = function()
{
......@@ -8038,7 +8053,6 @@ ParaRun.prototype.Set_MathPr = function(MPrp)
this.Recalc_CompiledPr(true);
}
ParaRun.prototype.Set_MathTextPr2 = function(TextPr, MathPr)
{
this.Set_Pr(TextPr);
......@@ -8068,10 +8082,6 @@ ParaRun.prototype.Math_GetInfoLetter = function(Info)
else
Info.Result = false;
}
ParaRun.prototype.IsNormalText = function()
{
return this.MathPrp.nor === true;
}
ParaRun.prototype.GetMathTextPr = function()
{
var TextPr = new CTextPr();
......
......@@ -454,7 +454,7 @@ CMathBase.prototype =
{
Name: defaultTxtPrp.FontFamily.Name,
Index: defaultTxtPrp.FontFamily.Index
};
}; // Cambria Math
this.RecalcInfo.bCtrPrp = false;
......@@ -557,7 +557,6 @@ CMathBase.prototype =
//this.Parent = GapsInfo.Parent;
//this.ParaMath = GapsInfo.ParaMath;
GapsInfo.Left = GapsInfo.Current;
GapsInfo.leftRunPrp = GapsInfo.currRunPrp;
......@@ -574,6 +573,10 @@ CMathBase.prototype =
{
return false;
},
IsText: function()
{
return false;
},
GetParent: function()
{
return (this.Parent.Type !== para_Math_Composition ? this : this.Parent.GetParent());
......@@ -584,7 +587,7 @@ CMathBase.prototype =
return this.Content[pos].Get_TextPr(ContentPos, Depth+1);
},
Get_CompiledTextPr : function(Copy)
Get_CompiledTextPr_11100 : function(Copy)
{
var start_x = 0,
start_y = 0;
......@@ -624,6 +627,20 @@ CMathBase.prototype =
return TextPr;
},
Get_CompiledTextPr : function(Copy)
{
var TextPr = this.Content[0].Get_CompiledTextPr(true, true);
for(var i = 1; i < this.Content.length; i++)
{
var CurTextPr = this.Content[i].Get_CompiledTextPr(false, true);
if ( null !== CurTextPr )
TextPr = TextPr.Compare( CurTextPr );
}
return TextPr;
},
Get_CompiledPr: function(Copy)
{
return this.Get_CompiledTextPr(Copy);
......@@ -958,6 +975,14 @@ CMathBase.prototype.Select_MathContent = function(MathContent)
}
}
};
CMathBase.prototype.Test_Math_SetStyleNormal = function(Value, bAll)
{
for(var i = 0; i < this.Content.length; i++)
{
this.Content[i].Test_Math_SetStyleNormal(Value, bAll);
}
}
CMathBase.prototype.Set_SelectionContentPos = ParaHyperlink.prototype.Set_SelectionContentPos;
CMathBase.prototype.Get_LeftPos = ParaHyperlink.prototype.Get_LeftPos;
CMathBase.prototype.Get_RightPos = ParaHyperlink.prototype.Get_RightPos;
......
......@@ -420,7 +420,8 @@ CMathGapsInfo.prototype =
var leftCode;
if(this.Current.Type == para_Math_Text)
if(this.Current.IsText())
{
var currCode = this.Current.getCodeChr();
......@@ -434,7 +435,7 @@ CMathGapsInfo.prototype =
if(leftCoeff > rightCoeff)
leftCoeff -= rightCoeff;
}
else if(this.Left.Type == para_Math_Text)
else if(this.Left.IsText())
{
leftCode = this.Left.getCodeChr();
leftCoeff = COEFF_GAPS.getCoeff(currCode, leftCode, -1);
......@@ -465,7 +466,7 @@ CMathGapsInfo.prototype =
else
leftCoeff -= rightCoeff/2;
}
else if(this.Left.Type == para_Math_Text)
else if(this.Left.IsText())
{
leftCode = this.Left.getCodeChr();
rightCoeff = COEFF_GAPS.getCoeff(leftCode, -1, 1);
......@@ -748,7 +749,7 @@ CMathContent.prototype =
this.size = {width: width, height: ascent + descent, ascent: ascent};
},*/
PreRecalc: function(Parent, ParaMath, ArgSize, RPI)
PreRecalc: function(ParentElement, ParaMath, ArgSize, RPI)
{
if(ArgSize !== null && ArgSize !== undefined)
{
......@@ -757,10 +758,10 @@ CMathContent.prototype =
}
this.ParaMath = ParaMath;
if(Parent !== null)
if(ParentElement !== null)
{
this.bRoot = false;
this.Parent = Parent;
this.ParentElement = ParentElement;
}
if(ArgSize !== null && ArgSize !== undefined)
......@@ -829,7 +830,7 @@ CMathContent.prototype =
}
},
// особый случай: вызываем, когда пересчет всей формулы не нужен, а нужно выставить только Lines (Реализована, чтобы не править Resize у каждого элемента)
Resize_2: function(oMeasure, Parent, ParaMath, RPI, ArgSize)
Resize_2: function(oMeasure, ParentElement, ParaMath, RPI, ArgSize)
{
var lng = this.content.length;
for(var i = 0; i < lng; i++)
......@@ -846,7 +847,7 @@ CMathContent.prototype =
},
IsEqqArray: function()
{
return this.Parent.IsEqqArray();
return this.ParentElement.IsEqqArray();
},
Get_CompiledArgSize: function()
{
......@@ -981,9 +982,9 @@ CMathContent.prototype =
if(this.RecalcInfo.bEqqArray)
{
this.InfoPoints.GWidths = this.Parent.WidthsPoints;
this.InfoPoints.GPoints = this.Parent.Points;
this.InfoPoints.GMaxDimWidths = this.Parent.MaxDimWidths;
this.InfoPoints.GWidths = this.ParentElement.WidthsPoints;
this.InfoPoints.GPoints = this.ParentElement.Points;
this.InfoPoints.GMaxDimWidths = this.ParentElement.MaxDimWidths;
PosInfo.SetInfoPoints(this.InfoPoints);
PosInfo.ApplyAlign();
......@@ -1025,7 +1026,7 @@ CMathContent.prototype =
{
var ctrPrp = new CTextPr();
if(!this.bRoot)
ctrPrp.Merge( this.Parent.Get_CompiledCtrPrp_2() );
ctrPrp.Merge( this.ParentElement.Get_CompiledCtrPrp_2() );
return ctrPrp;
},
......@@ -1034,7 +1035,7 @@ CMathContent.prototype =
var result = false;
if(!this.bRoot)
result = this.Parent.IsAccent();
result = this.ParentElement.IsAccent();
return result;
},
......@@ -1043,7 +1044,7 @@ CMathContent.prototype =
/// For Para Math
GetParent: function()
{
return this.Parent.GetParent();
return this.ParentElement.GetParent();
},
SetArgSize: function(val)
{
......@@ -1320,7 +1321,7 @@ CMathContent.prototype =
var TextPr;
if(this.IsPlaceholder())
TextPr = this.Parent.Get_CtrPrp();
TextPr = this.ParentElement.Get_CtrPrp();
else
TextPr = this.content[pos].Get_TextPr(ContentPos, Depth + 1);
......@@ -1332,12 +1333,18 @@ CMathContent.prototype =
if(this.IsPlaceholder())
{
TextPr = this.Parent.Get_CompiledCtrPrp_2();
TextPr = this.ParentElement.Get_CompiledCtrPrp_2();
}
else if (this.Selection.Use || bAll == true)
{
var StartPos, EndPos;
if(this.Selection.Use)
if(bAll == true)
{
StartPos = 0;
EndPos = this.content.length - 1;
}
else
{
StartPos = this.Selection.Start;
EndPos = this.Selection.End;
......@@ -1348,22 +1355,31 @@ CMathContent.prototype =
EndPos = this.Selection.Start;
}
}
else
{
StartPos = 0;
EndPos = this.content.length - 1;
}
// пропускаем пустые рана только для случая, когда есть селект
while ( null === TextPr && StartPos <= EndPos )
{
TextPr = this.content[StartPos].Get_CompiledTextPr(true); // true для пустых ранов
// т.к. если пустой ран входит в селект, текстовый настройки не скопируются в ране
var bComp = this.content[StartPos].Type == para_Math_Composition,
bEmptyRun = this.content[StartPos].Type == para_Math_Run && true === this.content[StartPos].Selection_IsEmpty();
if(bComp || !bEmptyRun || bAll) //пропускаем пустые Run
TextPr = this.content[StartPos].Get_CompiledTextPr(true);
StartPos++;
}
for ( var CurPos = StartPos; CurPos <= EndPos; CurPos++ )
while(this.content[EndPos].Type == para_Math_Run && true === this.content[EndPos].Selection_IsEmpty() && StartPos < EndPos + 1 && bAll == false) //пропускаем пустые Run
{
var CurTextPr = this.content[CurPos].Get_CompiledPr(true);
EndPos--;
}
for ( var CurPos = StartPos; CurPos < EndPos + 1; CurPos++ )
{
//var CurTextPr = this.content[CurPos].Get_CompiledPr(false);
var CurTextPr = this.content[CurPos].Get_CompiledTextPr(false);
if ( null !== CurTextPr )
TextPr = TextPr.Compare( CurTextPr );
......@@ -1625,6 +1641,27 @@ CMathContent.prototype =
}
},
SplitContent: function(NewContent, ContentPos, Depth)
{
var Pos = ContentPos.Get(Depth);
if(this.content[Pos].Type == para_Math_Run)
{
var NewRun = this.content[Pos].Split(ContentPos, Depth+1);
NewContent.Add_ToContent(0, NewRun);
var len = this.content.length;
if(Pos < len - 1)
{
NewContent.Concat_ToContent( this.content.slice(Pos + 1) );
this.Remove_FromContent(Pos+1, len - Pos - 1);
}
}
this.ParaMath.SetNeedResize();
},
Add_ToContent : function(Pos, Item)
{
this.Internal_Content_Add(Pos, Item);
......@@ -3743,7 +3780,7 @@ CMathContent.prototype =
CreateElem : function (oElem, oParent)
{
oElem.Parent = oParent;
oElem.ParentElement = oParent;
var Pos = oParent.CurPos + 1;
oParent.Internal_Content_Add(Pos, oElem, true);
......
......@@ -89,11 +89,13 @@ CMathText.prototype =
{
var code = this.value;
var Compiled_MPrp = this.bJDraw ? null : this.Parent.GetCompiled_ScrStyles();
var bMathText = this.bJDraw ? null : this.Parent.IsMathematicalText();
var bNormal = this.bJDraw ? null : this.Parent.IsNormalText();
if(this.Type === para_Math_Placeholder || this.bJDraw || Compiled_MPrp.nor)
if(this.Type === para_Math_Placeholder || this.bJDraw || bNormal)
return code;
var Compiled_MPrp = this.Parent.GetCompiled_ScrStyles();
var bAccent = this.Parent.IsAccent();
var bCapitale = (code > 0x0040 && code < 0x005B),
......@@ -741,7 +743,11 @@ CMathText.prototype =
},
IsAlignPoint: function()
{
return false
return false;
},
IsText: function()
{
return true;
},
// For ParaRun
Is_Punctuation: function()
......@@ -820,7 +826,7 @@ CMathAmp.prototype =
{
this.size =
{
width: this.AmpText.size.width,
width: this.AmpText.size.width + this.GapLeft + this.GapRight,
height: this.AmpText.size.height,
ascent: this.AmpText.size.ascent
};
......@@ -833,6 +839,18 @@ CMathAmp.prototype =
this.AmpText.PreRecalc(Parent, ParaMath, ArgSize, RPI);
},
getCodeChr: function()
{
var code = null;
if(!this.bEqqArray)
code = this.AmpText.getCodeChr();
return code;
},
IsText: function()
{
return !this.bEqqArray;
},
Get_WidthVisible: function()
{
return this.size.width;
......@@ -848,7 +866,7 @@ CMathAmp.prototype =
draw: function(x, y, pGraphics)
{
if(this.bEqqArray==false)
this.AmpText.draw(x, y, pGraphics);
this.AmpText.draw(x + this.GapLeft, y, pGraphics);
else if(editor.ShowParaMarks) // показать метки выравнивания, если включена отметка о знаках параграфа
{
var X = x + this.pos.x,
......@@ -877,7 +895,7 @@ CMathAmp.prototype =
},
IsAlignPoint: function()
{
return this.Type == para_Math_Ampersand;
return this.bEqqArray;
},
Copy : function()
{
......
......@@ -640,6 +640,11 @@ CMathEqArrPr.prototype.Read_FromBinary = function(Reader)
this.row = Reader.GetLong();
};
CMathEqArrPr.prototype.DecreaseCountRow = function()
{
this.row++;
}
////
function CEqArray(props)
{
......@@ -655,6 +660,8 @@ function CEqArray(props)
this.setDefaultSpace();
this.bDecreaseRow = false;
// for ampersand in Run
this.WidthsPoints = [];
this.Points = [];
......@@ -680,6 +687,17 @@ CEqArray.prototype.init = function(props)
this.setProperties(props);
this.fillContent();
}
CEqArray.prototype.addRow = function()
{
this.Content.splice( this.CurPos + 1, 0, new CMathContent() );
this.Content[this.CurPos + 1].ParentElement = this;
this.Pr.DecreaseCountRow();
this.bDecreaseRow = true;
return this.Content[this.CurPos + 1];
}
CEqArray.prototype.fillContent = function()
{
var nRowsCount = this.Content.length;
......@@ -688,6 +706,20 @@ CEqArray.prototype.fillContent = function()
for (var nIndex = 0; nIndex < nRowsCount; nIndex++)
this.elements[nIndex][0] = this.Content[nIndex];
};
CEqArray.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI, GapsInfo)
{
if(this.bDecreaseRow)
{
this.elements.splice(this.CurPos + 1, 0, []);
this.elements[this.CurPos + 1][0] = this.Content[this.CurPos + 1];
this.alignment.hgt[this.CurPos + 1] = MCJC_CENTER;
this.nRow++;
this.bDecreaseRow = false;
}
CEqArray.superclass.PreRecalc.call(this, Parent, ParaMath, ArgSize, RPI, GapsInfo);
}
CEqArray.prototype.Resize = function(oMeasure, RPI)
{
// на случай, чтобы не затереть массив
......@@ -697,11 +729,8 @@ CEqArray.prototype.Resize = function(oMeasure, RPI)
var NewRPI = RPI.Copy();
NewRPI.bEqqArray = true;
for(var i = 0; i < this.nRow; i++)
{
this.elements[i][0].Resize(oMeasure, NewRPI);
}
this.recalculateSize(oMeasure);
}
......
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