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

1. Переделала поиск позиции, Get_ParaContentPosByXY, для матриц, Nary, Delimiters, GroupCharacters

2. Поправила баги в связи с тем, что переделываю Get_ParaContentPosByXY (теперь есть возможность встать после bar fraction, когда дробь идет в конце формулы; поиск позиции более грамотный: в случае когда в конце и/мли в начале идут JustDraw элементы)


git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@57671 954022d7-b5bf-4e40-9824-e11837661b57
parent cd73f170
......@@ -3676,7 +3676,7 @@ ParaRun.prototype =
Result = true;
}
if (this.Type == para_Math_Run && this.Is_Empty())
if (this.Type == para_Math_Run /*&& this.Is_Empty()*/) // не только для пустых Run, но и для проверки на конец Run (т.к. Diff не обновляется)
{
var Diff = SearchPos.X - SearchPos.CurX;
if ( Math.abs( Diff ) < SearchPos.DiffX + 0.001 )
......
......@@ -971,6 +971,28 @@ CMathBase.prototype =
SearchPos.CurX += this.GapLeft + W_CurX + align.x;
/*if(SearchPos.CurX + this.GapLeft < SearchPos.X )
{
SearchPos.CurX += this.GapLeft;
for(var j = 0; j < CurrY; j++)
{
if(SearchPos.CurX + Widths[j] + this.dW > SearchPos.X)
{
if(SearchPos.CurX + Widths[j] < SearchPos.X)
SearchPos.CurX += Widths[j];
break;
}
SearchPos.CurX += Widths[j] + this.dW;
if(j == CurrY-1 && SearchPos.CurX + align.x < SearchPos.X)
SearchPos.CurX += align.x;
}
}*/
var result = this.elements[CurrX][CurrY].Get_ParaContentPosByXY(SearchPos, Depth+2, _CurLine, _CurRange, StepEnd);
if(result)
......
......@@ -4597,7 +4597,7 @@ CMathContent.prototype =
var lng = this.content.length;
while( pos < lng - 1 && SearchPos.X > SearchPos.CurX + this.content[pos].size.width)
while( pos < lng - 1 && SearchPos.CurX + this.content[pos].size.width < SearchPos.X)
{
SearchPos.CurX += this.content[pos].size.width;
pos++;
......@@ -4621,7 +4621,8 @@ CMathContent.prototype =
// необязательно попадем непосредственно в GapLeft просто в этом случае не ищем позицию в мат объектах,
// это избавит от ошибок, связанных с тем что расстояния до мат объекта и до пустого рана совпадают
// если же ран не пустой, то также должны встать в ран (в конец), а не в мат объект
if(SearchPos.X < SearchPos.CurX + this.content[pos].GapLeft)
/*if(SearchPos.X < SearchPos.CurX + this.content[pos].GapLeft)
{
SearchPos.CurX -= this.content[pos-1].size.width;
if(this.content[pos-1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd))
......@@ -4640,30 +4641,37 @@ CMathContent.prototype =
}
}
else
{
SearchPos.CurX -= this.content[pos-1].size.width;
{*/
// Для случая с Just-Draw элементами
if( this.content[pos-1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd) )
if( this.content[pos].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd) )
{
SearchPos.Pos.Update(pos-1, Depth);
SearchPos.Pos.Update(pos, Depth);
result = true;
}
if( this.content[pos].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd) )
SearchPos.CurX -= this.content[pos-1].size.width + this.content[pos].size.width;
//SearchPos.InText == false - проверка для случая, если позиция по X начала Run после мат объекта совпадает с концом Run внутри мат объекта (N-арный оператор в конце формулы)
// Для случая с Just-Draw элементами
if(SearchPos.InText == false && this.content[pos-1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd) )
{
SearchPos.Pos.Update(pos, Depth);
SearchPos.Pos.Update(pos-1, Depth);
result = true;
}
if( this.content[pos+1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd) )
SearchPos.CurX += this.content[pos].size.width;
if(SearchPos.InText == false && this.content[pos+1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd) )
{
SearchPos.Pos.Update(pos+1, Depth);
result = true;
}
}
/*}*/
}
SearchPos.CurX = SearchCurX + this.size.width;
......
......@@ -123,13 +123,14 @@ CMathMatrix.prototype.recalculateSize = function(oMeasure)
this.RecalcInfo.bProps = false;
}
var txtPrp = this.Get_CompiledCtrPrp();
var intervalCol = this.getLineGap(txtPrp);
this.gaps.column[0] = 0;
var gapsCol = this.getLineGap(txtPrp);
for(var i = 0; i < this.nCol - 1; i++)
this.gaps.column[i + 1] = intervalCol;
this.gaps.column[i] = gapsCol;
this.gaps.column[this.nCol - 1] = 0;
var intervalRow = this.getRowSpace(txtPrp);
......@@ -139,16 +140,18 @@ CMathMatrix.prototype.recalculateSize = function(oMeasure)
var plH = 0.2743827160493827 * txtPrp.FontSize;
var minGp = this.spaceRow.minGap*txtPrp.FontSize*g_dKoef_pt_to_mm;
minGp -= plH;
this.gaps.row[0] = 0;
for(var j = 0; j < this.nRow - 1; j++)
{
divCenter = intervalRow - (metrics.descents[j] + metrics.ascents[j + 1]);
this.gaps.row[j + 1] = minGp > divCenter ? minGp : divCenter;
this.gaps.row[j] = minGp > divCenter ? minGp : divCenter;
}
this.gaps.row[this.nRow - 1] = 0;
var height = 0, width = 0;
for(var i = 0; i< this.nCol; i++)
for(var i = 0; i < this.nCol; i++)
width += this.gaps.column[i] + metrics.widths[i];
for(var j = 0; j < this.nRow; j++)
......@@ -204,8 +207,8 @@ CMathMatrix.prototype.setPosition = function(pos)
for(var j = 0; j < this.nCol; j++)
{
var al = this.align(i, j);
NewPos.x = this.pos.x + this.GapLeft + al.x + this.gaps.column[j] + w;
NewPos.y = this.pos.y + al.y + this.gaps.row[i] + h;
NewPos.x = this.pos.x + this.GapLeft + al.x + w;
NewPos.y = this.pos.y + al.y + h;
this.elements[i][j].setPosition(NewPos);
w += Widths[j] + this.gaps.column[j];
......@@ -213,6 +216,89 @@ CMathMatrix.prototype.setPosition = function(pos)
h += Heights[i] + this.gaps.row[i];
}
}
CMathMatrix.prototype.Get_ParaContentPosByXY = function(SearchPos, Depth, _CurLine, _CurRange, StepEnd)
{
var maxWH = this.getWidthsHeights();
var Widths = maxWH.widths;
var Heights = maxWH.heights;
var X = this.ParaMath.X + this.pos.x + this.GapLeft, // this.ParaMath.X + this.pos.x совпадает с SearchPos.CurX
Y = this.ParaMath.Y + this.pos.y;
var CurrX, CurrY,
W_CurX,
Diff = 100000000;
var W = 0, H = 0;
var rX, rY,
minR;
for(var i=0; i < this.nRow; i++)
{
for(var j=0; j < this.nCol; j++)
{
if(!this.elements[i][j].IsJustDraw())
{
var x1 = SearchPos.X - X - W,
x2 = SearchPos.X - X - W - Widths[j],
y1 = SearchPos.Y - Y - H,
y2 = SearchPos.Y - Y - H - Heights[i];
var bInY = 0 < y1 && y2 < 0,
bInX = 0 < x1 && x2 < 0;
rX = x1*x1 < x2*x2 ? x1 : x2;
rY = y1*y1 < y2*y2 ? y1 : y2;
if(bInY && bInX)
minR = 0;
else if(!bInY && !bInX)
minR = rX*rX + rY*rY;
else if(bInY)
minR = rX*rX;
else
minR = rY*rY;
if(Diff > minR)
{
Diff = minR;
CurrX = i;
CurrY = j;
W_CurX = W;
}
}
W += Widths[j] + this.gaps.column[j];
}
W = 0;
H += Heights[i] + this.gaps.row[i];
}
var SearchCurX = SearchPos.CurX;
var align = this.align(CurrX, CurrY);
SearchPos.CurX += this.GapLeft + W_CurX + align.x;
var result = this.elements[CurrX][CurrY].Get_ParaContentPosByXY(SearchPos, Depth+2, _CurLine, _CurRange, StepEnd);
if(result)
{
SearchPos.Pos.Update(CurrX, Depth);
SearchPos.Pos.Update(CurrY, Depth + 1);
}
SearchPos.CurX = SearchCurX + this.size.width;
return result;
}
CMathMatrix.prototype.findDisposition = function(SearchPos, Depth)
{
......@@ -308,10 +394,10 @@ CMathMatrix.prototype.findDistance = function() // для получения п
{
var w = 0, h = 0;
//кол-во элементов gap равно кол-ву элементов в строке/столбце для удобства подсчета
for(var i = 0; i <= this.CurPos_X; i++)
for(var i = 0; i < this.CurPos_X; i++)
w += this.gaps.column[i];
for(var j = 0; j <= this.CurPos_Y; j++)
for(var j = 0; j < this.CurPos_Y; j++)
h += this.gaps.row[j];
return {w : w, h: h };
......
......@@ -3702,7 +3702,7 @@ CDelimiter.prototype.setPosition = function(position)
var PosContent = new CMathPosition();
PosContent.x = x;
PosContent.y = y + this.align(content);
PosContent.y = y + this.align_2(content);
x += content.size.width;
content.setPosition(PosContent); // CMathContent
......@@ -3722,7 +3722,7 @@ CDelimiter.prototype.setPosition = function(position)
var NewPosContent = new CMathPosition();
NewPosContent.x = x;
NewPosContent.y = y + this.align(content);
NewPosContent.y = y + this.align_2(content);
content.setPosition(NewPosContent);
x += content.size.width;
......@@ -3751,6 +3751,35 @@ CDelimiter.prototype.setPosition = function(position)
content.setPosition(PosContent); // CMathContent*/
}
CDelimiter.prototype.Get_ParaContentPosByXY = function(SearchPos, Depth, _CurLine, _CurRange, StepEnd)
{
var begWidth = this.begOper.size.width,
sepWidth = this.sepOper.size.width,
endWidth = this.endOper.size.width;
SearchPos.Pos.Update(0, Depth);
SearchPos.CurX += begWidth + this.GapLeft;
var result;
for(var j = 0; j < this.nCol; j++)
{
if(this.elements[0][j].Get_ParaContentPosByXY(SearchPos, Depth+2, _CurLine, _CurRange, StepEnd))
{
SearchPos.Pos.Update(j, Depth+1);
result = true;
}
if(j < this.nCol - 1)
SearchPos.CurX += sepWidth;
}
SearchPos.CurX += endWidth + this.GapRight;
return result;
}
CDelimiter.prototype.findDisposition = function(SearchPos, Depth)
{
......@@ -3817,7 +3846,7 @@ CDelimiter.prototype.draw = function(x, y, pGraphics)
for(var j = 0; j < this.nCol; j++)
this.elements[0][j].draw(x, y,pGraphics);
}
CDelimiter.prototype.align = function(element)
CDelimiter.prototype.align_2 = function(element)
{
var align = 0;
if(!element.IsJustDraw())
......@@ -3981,8 +4010,8 @@ CCharacter.prototype.setPosition = function(pos)
this.pos.x = pos.x;
this.pos.y = pos.y - this.size.ascent;
var alignOp = this.align(this.operator),
alignCnt = this.align(this.elements[0][0]);
var alignOp = this.align_2(this.operator),
alignCnt = this.align_2(this.elements[0][0]);
var PosOper = new CMathPosition(),
PosBase = new CMathPosition();
......@@ -4012,7 +4041,7 @@ CCharacter.prototype.setPosition = function(pos)
this.operator.setPosition(PosOper);
}
}
CCharacter.prototype.align = function(element)
CCharacter.prototype.align_2 = function(element)
{
return (this.size.width - element.size.width)/2;
}
......
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