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

Math для ParaRun

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@55162 954022d7-b5bf-4e40-9824-e11837661b57
parent dac65d5a
......@@ -102,7 +102,7 @@ ParaMath.prototype =
}
},
AddText : function(oElem, sText, props)
old_AddText : function(oElem, sText, props)
{
if(sText)
{
......@@ -128,6 +128,50 @@ ParaMath.prototype =
}
}
},
AddText : function(oElem, sText, props)
{
if(sText)
{
var MathRun = new ParaRun();
for (var Pos=0; Pos < sText.length; Pos++)
{
var oText = new CMathText();
oText.addTxt(sText[Pos]);
MathRun.Content.splice( Pos, 0, oText );
}
MathRun.bMathRun = true;
MathRun.typeObj = MATH_PARA_RUN;
oElem.addElementToContent(MathRun);
}
/*if(sText)
{
var rPr = new CTextPr();
var oMRun = new CMathRunPrp();
if (props)
oMRun.setMathRunPrp(props);
oMRun.setTxtPrp(rPr);
if (oElem)
{
oElem.addElementToContent(oMRun);
for (var i=0;i<sText.length;i++)
{
*//*text[i].replace("&", "&amp;");
text[i].Replace("'", "&apos;");
text[i].Replace("<", "&lt;");
text[i].Replace(">", "&gt;");
text[i].Replace("\"", "&quot;");*//*
oText = new CMathText();
oText.addTxt(sText[i]);
oElem.addElementToContent(oText);
}
}
}*/
},
CreateElem : function (oElem, oParent, props)
{
......@@ -276,6 +320,172 @@ ParaMath.prototype =
this.LinesLength = 0;
},
old_Recalculate_Range : function(ParaPr, Depth)
{
// TODO: Пока у нас контент здесь состоит из 1 элемента (всего элемента Math). Поэтому у нас в данном
// контенте есть 2 позиции 0 и 1, т.е. до или после Math.
var PRS = g_oPRSW;
if ( this.Paragraph !== PRS.Paragraph )
{
this.Paragraph = PRS.Paragraph;
this.Paragraph.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
}
var CurLine = PRS.Line - this.StartLine;
var CurRange = ( 0 === CurLine ? PRS.Range - this.StartRange : PRS.Range );
var Para = PRS.Paragraph;
var ParaLine = PRS.Line;
var ParaRange = PRS.Range;
var TextPr = new CTextPr();
TextPr.Init_Default();
this.Math.RecalculateComposition(g_oTextMeasurer, TextPr);
var Size = this.Math.Size;
this.Width = Size.Width;
this.Height = Size.Height;
this.WidthVisible = Size.WidthVisible;
this.Ascent = Size.Ascent;
this.Descent = Size.Descent;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// TODO: ParaMath.Recalculate_Range
// Пока логика пересчета здесь аналогична логике пересчета отдельного символа в ParaRun. В будущем надо будет
// переделать с разбиванием на строки.
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Если это первый отрезок в данной строке, тогда нам надо добавить строку (первую строку не добавляем,
// т.к. она всегда есть)
if ( 0 === CurRange )
{
if ( 0 !== CurLine )
{
this.Lines[CurLine] = new CParaRunLine();
this.LinesLength = CurLine + 1;
}
else
{
this.LinesLength = CurLine + 1;
}
}
// Отмечаем, что началось слово
PRS.StartWord = true;
// При проверке, убирается ли слово, мы должны учитывать ширину предшествующих пробелов.
var LetterLen = Size.Width;
if ( true !== PRS.Word )
{
// Слово только началось. Делаем следующее:
// 1) Если до него на строке ничего не было и данная строка не
// имеет разрывов, тогда не надо проверять убирается ли слово в строке.
// 2) В противном случае, проверяем убирается ли слово в промежутке.
// Если слово только началось, и до него на строке ничего не было, и в строке нет разрывов, тогда не надо проверять убирается ли оно на строке.
if ( true !== PRS.FirstItemOnLine || false === Para.Internal_Check_Ranges(ParaLine, ParaRange) )
{
if ( PRS.X + PRS.SpaceLen + LetterLen > PRS.XEnd )
{
PRS.NewRange = true;
}
}
if ( true !== PRS.NewRange )
{
// Отмечаем начало нового слова
PRS.Set_LineBreakPos( 0 );
PRS.WordLen = this.Width;
PRS.Word = true;
}
}
else
{
if ( PRS.X + PRS.SpaceLen + PRS.WordLen + LetterLen > PRS.XEnd )
{
if ( true === PRS.FirstItemOnLine )
{
// Слово оказалось единственным элементом в промежутке, и, все равно,
// не умещается целиком. Делаем следующее:
//
// 1) Если у нас строка без вырезов, тогда ставим перенос строки на
// текущей позиции.
// 2) Если у нас строка с вырезом, и данный вырез не последний, тогда
// ставим перенос внутри строки в начале слова.
// 3) Если у нас строка с вырезом и вырез последний, тогда ставим перенос
// строки в начале слова.
if ( false === Para.Internal_Check_Ranges(ParaLine, ParaRange) )
{
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
PRS.MoveToLBP = true;
PRS.NewRange = true; // перенос на новую строку
}
else
{
PRS.EmptyLine = false;
PRS.X += WordLen;
// Слово не убирается в отрезке, но, поскольку, слово 1 на строке и отрезок тоже 1,
// делим слово в данном месте
PRS.NewRange = true; // перенос на новую строку
}
}
else
{
// Слово не убирается в отрезке. Переносим слово в следующий отрезок
PRS.MoveToLBP = true;
PRS.NewRange = true;
}
}
if ( true !== PRS.NewRange )
{
// Мы убираемся в пределах данной строки. Прибавляем ширину буквы к ширине слова
PRS.WordLen += LetterLen;
}
}
var RangeStartPos = 0;
var RangeEndPos = 0;
if ( true !== PRS.NewRange )
{
RangeEndPos = this.RootComposition.content.length; // RangeEndPos = 1; to RangeEndPos = this.Content.length;
// Удаляем лишние строки, оставшиеся после предыдущего пересчета в самом конце
if ( this.Lines.length > this.LinesLength )
this.Lines.length = this.LinesLength;
// Обновляем метрику строки
if ( PRS.LineAscent < this.Ascent )
PRS.LineAscent = this.Ascent;
if ( PRS.LineDescent < this.Descent )
PRS.LineDescent = this.Descent;
}
if ( 0 === CurLine && 0 === CurRange )
{
this.Range.StartPos = RangeStartPos;
this.Range.EndPos = RangeEndPos;
/*this.Lines[0].RangesLength = 1;
this.Lines[0].Ranges.length = this.Content.length - 1;*/
this.Lines[0].RangesLength = 1;
if ( this.Lines[0].Ranges.length > 1 )
this.Lines[0].Ranges.length = 1;
}
else
this.Lines[CurLine].Add_Range( CurRange, RangeStartPos, RangeEndPos );
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
},
Recalculate_Range : function(ParaPr, Depth)
{
// TODO: Пока у нас контент здесь состоит из 1 элемента (всего элемента Math). Поэтому у нас в данном
......@@ -818,7 +1028,7 @@ ParaMath.prototype =
var Pos = ContentPos.Get(Depth);
this.State.ContentPos = Pos;
this.CurrentContent = this.SelectContent = this.RootComposition.set_ParaContentPos(ContentPos, Depth);
this.RootComposition.set_ParaContentPos(ContentPos, Depth);
},
Get_PosByElement : function(Class, ContentPos, Depth, UseRange, Range, Line)
{
......@@ -889,7 +1099,6 @@ ParaMath.prototype =
this.SelectContent = this.RootComposition;
switch (StartFlag)
{
case 1:
......@@ -917,6 +1126,9 @@ ParaMath.prototype =
break;
}
if(!this.SelectContent.selectUse())
this.CurrentContent = this.SelectContent;
this.bSelectionUse = true;
},
......
......@@ -6364,3 +6364,69 @@ function CRunCollaborativeRange(PosS, PosE)
this.PosS = PosS;
this.PosE = PosE;
}
ParaRun.prototype.Math_SetPosition = function(pos)
{
for(var i = 0; i < this.Content.length; i++)
{
this.Content[i].setPosition(pos);
}
}
ParaRun.prototype.Math_Draw = function(x, y, pGraphics)
{
if(this.bMathRun)
{
var X = x;
var Y = y + this.size.ascent;
pGraphics.b_color1(0,0,0,255);
for(var i=1; i < this.Content.length;i++)
{
var oWPrp = this.Get_CompiledPr(false);
g_oTextMeasurer.SetFont(oWPrp);
X += this.Content[i].size.width;
this.Content[i].draw(X, Y, pGraphics);
}
}
}
ParaRun.prototype.Math_Recalculate = function()
{
var RangeStartPos = 0;
var RangeEndPos = this.Content.length;
this.Lines[0].Add_Range( 0, RangeStartPos, RangeEndPos );
var width = 0,
ascent = 0, descent = 0;
for (var Pos = 0 ; Pos < this.Content.length; Pos++ )
{
// var oWPrp = new CTextPr();
// oWPrp.Merge(this.Parent.Composition.DEFAULT_RUN_PRP);
var oWPrp = this.Get_CompiledPr(false);
oWPrp.Merge(this.Parent.Composition.DEFAULT_RUN_PRP.getTxtPrp());
g_oTextMeasurer.SetFont(oWPrp);
this.Content[Pos].Resize(g_oTextMeasurer);
var oSize = this.Content[Pos].size;
//var gps = this.Content[Pos].gaps;
//width += oSize.width + gps.left + gps.right;
width += oSize.width;
ascent = ascent > oSize.ascent ? ascent : oSize.ascent;
var oDescent = oSize.height - oSize.ascent;
descent = descent < oDescent ? oDescent : descent;
}
this.size = {width: width, height: ascent + descent, ascent: ascent};
}
\ No newline at end of file
......@@ -687,7 +687,8 @@ CMathContent.prototype =
addElementToContent: function(obj) //for "read"
{
var element = new mathElem(obj);
obj.relate(this);
//obj.relate(this);
obj.Parent = this;
if(obj.typeObj === MATH_COMP)
obj.setComposition(this.Composition);
......@@ -703,9 +704,6 @@ CMathContent.prototype =
if(obj.typeObj == MATH_COMP)
obj.setArgSize(this.argSize);
//this.length = this.content.length;
},
addToContent: function(obj, shift) // for "edit", letters
{
......@@ -4836,6 +4834,10 @@ CMathContent.prototype =
this.content[i].value.Resize(oMeasure);
}
}
else if(type == MATH_PARA_RUN)
{
this.content[i].value.Math_Recalculate();
}
}
this.recalculateSize();
......@@ -5375,6 +5377,11 @@ CMathContent.prototype =
this.content[i].value.draw(x, y, pGraphics);
}
else if(this.content[i].value.typeObj == MATH_PARA_RUN)
{
var PSDE = {X: x, Y: y, Graphics: pGraphics};
this.content[i].value.Math_Draw(x, y, pGraphics);
}
else
this.content[i].value.draw(x, y, pGraphics);
......@@ -6190,6 +6197,9 @@ CMathContent.prototype =
y: this.pos.y + this.size.ascent //baseline
};
if(this.content[i].value.typeObj == MATH_PARA_RUN)
this.content[i].value.Math_SetPosition(pos);
else
this.content[i].value.setPosition(t);
}
},
......@@ -7194,10 +7204,20 @@ CMathContent.prototype =
},
get_ParaContentPos: function(bSelection, bStart, ContentPos)
{
if( bSelection && this.RealSelect.startPos !== this.RealSelect.endPos )
if( bSelection )
{
var pos = bStart ? this.RealSelect.startPos : this.RealSelect.endPos;
ContentPos.Add(pos);
if(this.RealSelect.startPos == this.RealSelect.endPos)
{
var blen = this.RealSelect.startPos < this.content.length;
var bComp = blen ? this.content[this.RealSelect.startPos].value.typeObj == MATH_COMP : false;
if(bComp)
this.content[this.RealSelect.startPos].value.get_ParaContentPos(bSelection, bStart, ContentPos);
}
}
else
{
......@@ -7266,9 +7286,9 @@ CMathContent.prototype =
{
var pos = ContentPos.Get(Depth);
Depth++;
this.LogicalSelect.start = this.LogicalSelect.end = pos;
this.LogicalSelect.start = pos;
if(this.RealSelect.startPos === this.RealSelect.endPos && this.content[pos].value.typeObj === MATH_COMP)
if(pos < this.content.length && this.RealSelect.startPos === this.RealSelect.endPos && this.content[pos].value.typeObj === MATH_COMP)
this.content[pos].value.set_StartSelectContent(ContentPos, Depth);
}
},
......@@ -7291,9 +7311,11 @@ CMathContent.prototype =
this.LogicalSelect.end = posEnd;
Depth++;
//var blen = this.RealSelect.startPos < this.content.length;
//селект внутри мат. объекта
if(posStart === posEnd && this.content[posEnd].value.typeObj === MATH_COMP)
if(posStart < this.content.length && posStart === posEnd && this.content[posEnd].value.typeObj === MATH_COMP)
{
var result = this.content[posEnd].value.set_EndSelectContent(ContentPos, Depth);
this.setStartPos_Selection(posStart-1);
......@@ -7312,8 +7334,9 @@ CMathContent.prototype =
SelectContent = this;
var direction = (posStart < posEnd) ? 1 : -1;
if( this.content[posStart].value.typeObj === MATH_COMP )
if(posStart < this.content.length)
{
if(this.content[posStart].value.typeObj === MATH_COMP )
{
if( direction == 1 )
this.setStartPos_Selection( posStart - 1);
......@@ -7322,9 +7345,11 @@ CMathContent.prototype =
}
else
this.setStartPos_Selection(posStart);
}
if( this.content[posEnd].value.typeObj === MATH_COMP )
if(posEnd < this.content.length)
{
if(this.content[posEnd].value.typeObj === MATH_COMP )
{
if( direction == 1 )
this.setEndPos_Selection(posEnd + 1);
......@@ -7335,6 +7360,10 @@ CMathContent.prototype =
this.setEndPos_Selection(posEnd);
}
}
return {state: state, SelectContent: SelectContent};
},
drawSelect: function(SelectionDraw)
......
......@@ -237,7 +237,6 @@ CMathText.prototype =
// rasterOffsetX
// rasterOffsetY
var letter = this.getCode();
var metricsTxt = oMeasure.Measure2Code(letter);
......@@ -424,6 +423,8 @@ CMathText.prototype =
setComposition: function() // заглушка
{},
setReferenceComposition: function() // заглушка
{},
Write_ToBinary: function()
{}
/*draw2: function()
......
......@@ -150,6 +150,7 @@ var MATH_RUN_PRP = 1;
var MATH_COMP = 2;
var MATH_EMPTY = 3;
var MATH_PLACEHOLDER = 4;
var MATH_PARA_RUN = 5;
////////////////////////////////////////
......
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