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 = ...@@ -3676,7 +3676,7 @@ ParaRun.prototype =
Result = true; 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; var Diff = SearchPos.X - SearchPos.CurX;
if ( Math.abs( Diff ) < SearchPos.DiffX + 0.001 ) if ( Math.abs( Diff ) < SearchPos.DiffX + 0.001 )
......
...@@ -971,6 +971,28 @@ CMathBase.prototype = ...@@ -971,6 +971,28 @@ CMathBase.prototype =
SearchPos.CurX += this.GapLeft + W_CurX + align.x; 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); var result = this.elements[CurrX][CurrY].Get_ParaContentPosByXY(SearchPos, Depth+2, _CurLine, _CurRange, StepEnd);
if(result) if(result)
......
...@@ -4597,7 +4597,7 @@ CMathContent.prototype = ...@@ -4597,7 +4597,7 @@ CMathContent.prototype =
var lng = this.content.length; 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; SearchPos.CurX += this.content[pos].size.width;
pos++; pos++;
...@@ -4621,7 +4621,8 @@ CMathContent.prototype = ...@@ -4621,7 +4621,8 @@ CMathContent.prototype =
// необязательно попадем непосредственно в GapLeft просто в этом случае не ищем позицию в мат объектах, // необязательно попадем непосредственно в 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; SearchPos.CurX -= this.content[pos-1].size.width;
if(this.content[pos-1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd)) if(this.content[pos-1].Get_ParaContentPosByXY(SearchPos, Depth+1, _CurLine, _CurRange, StepEnd))
...@@ -4640,30 +4641,37 @@ CMathContent.prototype = ...@@ -4640,30 +4641,37 @@ CMathContent.prototype =
} }
} }
else 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; 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; 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); SearchPos.Pos.Update(pos+1, Depth);
result = true; result = true;
} }
} /*}*/
} }
SearchPos.CurX = SearchCurX + this.size.width; SearchPos.CurX = SearchCurX + this.size.width;
......
...@@ -123,13 +123,14 @@ CMathMatrix.prototype.recalculateSize = function(oMeasure) ...@@ -123,13 +123,14 @@ CMathMatrix.prototype.recalculateSize = function(oMeasure)
this.RecalcInfo.bProps = false; this.RecalcInfo.bProps = false;
} }
var txtPrp = this.Get_CompiledCtrPrp(); var txtPrp = this.Get_CompiledCtrPrp();
var intervalCol = this.getLineGap(txtPrp); var gapsCol = this.getLineGap(txtPrp);
this.gaps.column[0] = 0;
for(var i = 0; i < this.nCol - 1; i++) 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); var intervalRow = this.getRowSpace(txtPrp);
...@@ -139,16 +140,18 @@ CMathMatrix.prototype.recalculateSize = function(oMeasure) ...@@ -139,16 +140,18 @@ CMathMatrix.prototype.recalculateSize = function(oMeasure)
var plH = 0.2743827160493827 * txtPrp.FontSize; var plH = 0.2743827160493827 * txtPrp.FontSize;
var minGp = this.spaceRow.minGap*txtPrp.FontSize*g_dKoef_pt_to_mm; var minGp = this.spaceRow.minGap*txtPrp.FontSize*g_dKoef_pt_to_mm;
minGp -= plH; minGp -= plH;
this.gaps.row[0] = 0;
for(var j = 0; j < this.nRow - 1; j++) for(var j = 0; j < this.nRow - 1; j++)
{ {
divCenter = intervalRow - (metrics.descents[j] + metrics.ascents[j + 1]); 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; 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]; width += this.gaps.column[i] + metrics.widths[i];
for(var j = 0; j < this.nRow; j++) for(var j = 0; j < this.nRow; j++)
...@@ -204,8 +207,8 @@ CMathMatrix.prototype.setPosition = function(pos) ...@@ -204,8 +207,8 @@ CMathMatrix.prototype.setPosition = function(pos)
for(var j = 0; j < this.nCol; j++) for(var j = 0; j < this.nCol; j++)
{ {
var al = this.align(i, j); var al = this.align(i, j);
NewPos.x = this.pos.x + this.GapLeft + al.x + this.gaps.column[j] + w; NewPos.x = this.pos.x + this.GapLeft + al.x + w;
NewPos.y = this.pos.y + al.y + this.gaps.row[i] + h; NewPos.y = this.pos.y + al.y + h;
this.elements[i][j].setPosition(NewPos); this.elements[i][j].setPosition(NewPos);
w += Widths[j] + this.gaps.column[j]; w += Widths[j] + this.gaps.column[j];
...@@ -213,6 +216,89 @@ CMathMatrix.prototype.setPosition = function(pos) ...@@ -213,6 +216,89 @@ CMathMatrix.prototype.setPosition = function(pos)
h += Heights[i] + this.gaps.row[i]; 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) CMathMatrix.prototype.findDisposition = function(SearchPos, Depth)
{ {
...@@ -308,10 +394,10 @@ CMathMatrix.prototype.findDistance = function() // для получения п ...@@ -308,10 +394,10 @@ CMathMatrix.prototype.findDistance = function() // для получения п
{ {
var w = 0, h = 0; var w = 0, h = 0;
//кол-во элементов gap равно кол-ву элементов в строке/столбце для удобства подсчета //кол-во элементов gap равно кол-ву элементов в строке/столбце для удобства подсчета
for(var i = 0; i <= this.CurPos_X; i++) for(var i = 0; i < this.CurPos_X; i++)
w += this.gaps.column[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]; h += this.gaps.row[j];
return {w : w, h: h }; return {w : w, h: h };
......
...@@ -3702,7 +3702,7 @@ CDelimiter.prototype.setPosition = function(position) ...@@ -3702,7 +3702,7 @@ CDelimiter.prototype.setPosition = function(position)
var PosContent = new CMathPosition(); var PosContent = new CMathPosition();
PosContent.x = x; PosContent.x = x;
PosContent.y = y + this.align(content); PosContent.y = y + this.align_2(content);
x += content.size.width; x += content.size.width;
content.setPosition(PosContent); // CMathContent content.setPosition(PosContent); // CMathContent
...@@ -3722,7 +3722,7 @@ CDelimiter.prototype.setPosition = function(position) ...@@ -3722,7 +3722,7 @@ CDelimiter.prototype.setPosition = function(position)
var NewPosContent = new CMathPosition(); var NewPosContent = new CMathPosition();
NewPosContent.x = x; NewPosContent.x = x;
NewPosContent.y = y + this.align(content); NewPosContent.y = y + this.align_2(content);
content.setPosition(NewPosContent); content.setPosition(NewPosContent);
x += content.size.width; x += content.size.width;
...@@ -3751,6 +3751,35 @@ CDelimiter.prototype.setPosition = function(position) ...@@ -3751,6 +3751,35 @@ CDelimiter.prototype.setPosition = function(position)
content.setPosition(PosContent); // CMathContent*/ 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) CDelimiter.prototype.findDisposition = function(SearchPos, Depth)
{ {
...@@ -3817,7 +3846,7 @@ CDelimiter.prototype.draw = function(x, y, pGraphics) ...@@ -3817,7 +3846,7 @@ CDelimiter.prototype.draw = function(x, y, pGraphics)
for(var j = 0; j < this.nCol; j++) for(var j = 0; j < this.nCol; j++)
this.elements[0][j].draw(x, y,pGraphics); this.elements[0][j].draw(x, y,pGraphics);
} }
CDelimiter.prototype.align = function(element) CDelimiter.prototype.align_2 = function(element)
{ {
var align = 0; var align = 0;
if(!element.IsJustDraw()) if(!element.IsJustDraw())
...@@ -3981,8 +4010,8 @@ CCharacter.prototype.setPosition = function(pos) ...@@ -3981,8 +4010,8 @@ CCharacter.prototype.setPosition = function(pos)
this.pos.x = pos.x; this.pos.x = pos.x;
this.pos.y = pos.y - this.size.ascent; this.pos.y = pos.y - this.size.ascent;
var alignOp = this.align(this.operator), var alignOp = this.align_2(this.operator),
alignCnt = this.align(this.elements[0][0]); alignCnt = this.align_2(this.elements[0][0]);
var PosOper = new CMathPosition(), var PosOper = new CMathPosition(),
PosBase = new CMathPosition(); PosBase = new CMathPosition();
...@@ -4012,7 +4041,7 @@ CCharacter.prototype.setPosition = function(pos) ...@@ -4012,7 +4041,7 @@ CCharacter.prototype.setPosition = function(pos)
this.operator.setPosition(PosOper); this.operator.setPosition(PosOper);
} }
} }
CCharacter.prototype.align = function(element) CCharacter.prototype.align_2 = function(element)
{ {
return (this.size.width - element.size.width)/2; 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