Commit 721812f9 authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander.Trofimov

Исправлен баг с неправильным пересчетом параграфа с прилеганием по ширине....

Исправлен баг с неправильным пересчетом параграфа с прилеганием по ширине. Улучшен алгоритм рассчета таких параграфов.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@58467 954022d7-b5bf-4e40-9824-e11837661b57
parent 9f6c1b94
...@@ -684,12 +684,12 @@ ParaMath.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -684,12 +684,12 @@ ParaMath.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
if ( EndPos >= 1 ) if ( EndPos >= 1 )
{ {
PRSC.Range.Letters++; PRSC.Letters++;
if ( true !== PRSC.Word ) if ( true !== PRSC.Word )
{ {
PRSC.Word = true; PRSC.Word = true;
PRSC.Range.Words++; PRSC.Words++;
} }
PRSC.Range.W += this.Width; PRSC.Range.W += this.Width;
...@@ -698,10 +698,10 @@ ParaMath.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -698,10 +698,10 @@ ParaMath.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
PRSC.SpaceLen = 0; PRSC.SpaceLen = 0;
// Пробелы перед первым словом в строке не считаем // Пробелы перед первым словом в строке не считаем
if ( PRSC.Range.Words > 1 ) if (PRSC.Words > 1)
PRSC.Range.Spaces += PRSC.SpacesCount; PRSC.Spaces += PRSC.SpacesCount;
else else
PRSC.Range.SpacesSkip += PRSC.SpacesCount; PRSC.SpacesSkip += PRSC.SpacesCount;
PRSC.SpacesCount = 0; PRSC.SpacesCount = 0;
} }
......
...@@ -435,7 +435,6 @@ Paragraph.prototype.private_RecalculateFastRange = function(CurRange, CurL ...@@ -435,7 +435,6 @@ Paragraph.prototype.private_RecalculateFastRange = function(CurRange, CurL
} }
// TODO: Здесь пересчеты идут целиком для строки, а не для конкретного отрезка. // TODO: Здесь пересчеты идут целиком для строки, а не для конкретного отрезка.
this.private_RecalculateLineWidth(CurLine, CurPage, PRS);
if (recalcresult_NextElement !== this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, true)) if (recalcresult_NextElement !== this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, true))
return -1; return -1;
...@@ -736,12 +735,7 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa ...@@ -736,12 +735,7 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 7. Пересчитываем ширину строки // 7. Пересчитываем сдвиги элементов внутри параграфа и видимые ширины пробелов, в зависимости от align.
//-------------------------------------------------------------------------------------------------------------
this.private_RecalculateLineWidth(CurLine, CurPage, PRS, ParaPr);
//-------------------------------------------------------------------------------------------------------------
// 8. Пересчитываем сдвиги элементов внутри параграфа и видимые ширины пробелов, в зависимости от align.
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, false); this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, false);
}; };
...@@ -1333,30 +1327,6 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa ...@@ -1333,30 +1327,6 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa
return true; return true;
}; };
Paragraph.prototype.private_RecalculateLineWidth = function(CurLine, CurPage, PRS, ParaPr)
{
var Line = this.Lines[CurLine];
var PRSC = this.m_oPRSC;
var RangesCount = Line.Ranges.length;
for (var CurRange = 0; CurRange < RangesCount; CurRange++)
{
var Range = Line.Ranges[CurRange];
var StartPos = Range.StartPos;
var EndPos = Range.EndPos;
PRSC.Reset( this, Range );
if ( true === this.Numbering.Check_Range(CurRange, CurLine) )
PRSC.Range.W += this.Numbering.WidthVisible;
for ( var Pos = StartPos; Pos <= EndPos; Pos++ )
{
var Item = this.Content[Pos];
Item.Recalculate_Range_Width( PRSC, CurLine, CurRange );
}
}
};
Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPage, PRS, ParaPr, Fast) Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPage, PRS, ParaPr, Fast)
{ {
// Здесь мы пересчитываем ширину пробелов (и в особенных случаях дополнительное // Здесь мы пересчитываем ширину пробелов (и в особенных случаях дополнительное
...@@ -1382,6 +1352,7 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1382,6 +1352,7 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
// промежутке, увеличиваем их на столько, чтобы правая граница последнего // промежутке, увеличиваем их на столько, чтобы правая граница последнего
// слова совпала с правой границей промежутка // слова совпала с правой границей промежутка
var PRSW = PRS; var PRSW = PRS;
var PRSC = this.m_oPRSC;
var PRSA = this.m_oPRSA; var PRSA = this.m_oPRSA;
PRSA.Paragraph = this; PRSA.Paragraph = this;
PRSA.LastW = 0; PRSA.LastW = 0;
...@@ -1396,6 +1367,21 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1396,6 +1367,21 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
{ {
var Range = Line.Ranges[CurRange]; var Range = Line.Ranges[CurRange];
var StartPos = Range.StartPos;
var EndPos = Range.EndPos;
PRSC.Reset( this, Range );
PRSC.Range.W = 0;
if ( true === this.Numbering.Check_Range(CurRange, CurLine) )
PRSC.Range.W += this.Numbering.WidthVisible;
for ( var Pos = StartPos; Pos <= EndPos; Pos++ )
{
var Item = this.Content[Pos];
Item.Recalculate_Range_Width( PRSC, CurLine, CurRange );
}
var JustifyWord = 0; var JustifyWord = 0;
var JustifySpace = 0; var JustifySpace = 0;
var RangeWidth = Range.XEnd - Range.X; var RangeWidth = Range.XEnd - Range.X;
...@@ -1437,15 +1423,15 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1437,15 +1423,15 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
{ {
X = Range.X; X = Range.X;
if ( 1 == Range.Words ) if (1 == PRSC.Words)
{ {
if ( 1 == RangesCount && this.Lines.length > 1 ) if (1 == RangesCount && !(Line.Info & paralineinfo_End))
{ {
// Либо слово целиком занимает строку, либо не целиком, но разница очень мала // Либо слово целиком занимает строку, либо не целиком, но разница очень мала
if ( RangeWidth - Range.W <= 0.05 * RangeWidth && Range.Letters > 1 ) if (RangeWidth - Range.W <= 0.05 * RangeWidth && PRSC.Letters > 1)
JustifyWord = (RangeWidth - Range.W) / (Range.Letters - 1); JustifyWord = (RangeWidth - Range.W) / (PRSC.Letters - 1);
} }
else if ( 0 == CurRange || ( CurLine == this.Lines.length - 1 && CurRange == RangesCount - 1 ) ) else if (0 == CurRange || (Line.Info & paralineinfo_End && CurRange == RangesCount - 1))
{ {
// Ничего не делаем (выравниваем текст по левой границе) // Ничего не делаем (выравниваем текст по левой границе)
} }
...@@ -1463,8 +1449,8 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1463,8 +1449,8 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
// TODO: Переделать проверку последнего отрезка в последней строке (нужно выставлять флаг когда пришел PRS.End в отрезке) // TODO: Переделать проверку последнего отрезка в последней строке (нужно выставлять флаг когда пришел PRS.End в отрезке)
// Последний промежуток последней строки не надо растягивать по ширине. // Последний промежуток последней строки не надо растягивать по ширине.
if ( Range.Spaces > 0 && ( CurLine != this.Lines.length - 1 || CurRange != this.Lines[CurLine].Ranges.length - 1 ) ) if (PRSC.Spaces > 0 && (!(Line.Info & paralineinfo_End) || CurRange != Line.Ranges.length - 1))
JustifySpace = (RangeWidth - Range.W) / Range.Spaces; JustifySpace = (RangeWidth - Range.W) / PRSC.Spaces;
else else
JustifySpace = 0; JustifySpace = 0;
} }
...@@ -1479,7 +1465,7 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1479,7 +1465,7 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
} }
// В последнем отрезке последней строки не делаем текст "по ширине" // В последнем отрезке последней строки не делаем текст "по ширине"
if ( CurLine === this.ParaEnd.Line && CurRange === this.ParaEnd.Range ) if (CurLine === this.ParaEnd.Line && CurRange === this.ParaEnd.Range)
{ {
JustifyWord = 0; JustifyWord = 0;
JustifySpace = 0; JustifySpace = 0;
...@@ -1491,9 +1477,9 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1491,9 +1477,9 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
PRSA.XEnd = Range.XEnd; PRSA.XEnd = Range.XEnd;
PRSA.JustifyWord = JustifyWord; PRSA.JustifyWord = JustifyWord;
PRSA.JustifySpace = JustifySpace; PRSA.JustifySpace = JustifySpace;
PRSA.SpacesCounter = Range.Spaces; PRSA.SpacesCounter = PRSC.Spaces;
PRSA.SpacesSkip = Range.SpacesSkip; PRSA.SpacesSkip = PRSC.SpacesSkip;
PRSA.LettersSkip = Range.LettersSkip; PRSA.LettersSkip = PRSC.LettersSkip;
PRSA.RecalcResult = recalcresult_NextElement; PRSA.RecalcResult = recalcresult_NextElement;
this.Lines[CurLine].Ranges[CurRange].XVisible = X; this.Lines[CurLine].Ranges[CurRange].XVisible = X;
...@@ -1501,9 +1487,6 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa ...@@ -1501,9 +1487,6 @@ Paragraph.prototype.private_RecalculateLineAlign = function(CurLine, CurPa
if ( 0 === CurRange ) if ( 0 === CurRange )
this.Lines[CurLine].X = X - PRSW.XStart; this.Lines[CurLine].X = X - PRSW.XStart;
var StartPos = Range.StartPos;
var EndPos = Range.EndPos;
if ( true === this.Numbering.Check_Range(CurRange, CurLine) ) if ( true === this.Numbering.Check_Range(CurRange, CurLine) )
PRSA.X += this.Numbering.WidthVisible; PRSA.X += this.Numbering.WidthVisible;
...@@ -1863,15 +1846,6 @@ function CParaLineRange(X, XEnd) ...@@ -1863,15 +1846,6 @@ function CParaLineRange(X, XEnd)
this.StartPos = 0; // Позиция в контенте параграфа, с которой начинается данный отрезок this.StartPos = 0; // Позиция в контенте параграфа, с которой начинается данный отрезок
this.EndPos = 0; // Позиция в контенте параграфа, на которой заканчиваетсяданный отрезок this.EndPos = 0; // Позиция в контенте параграфа, на которой заканчиваетсяданный отрезок
this.W = 0; this.W = 0;
this.Words = 0;
this.Spaces = 0;
this.Letters = 0;
this.SpacesSkip = 0;
this.LettersSkip = 0;
this.SpacePos = -1; // Позиция, с которой начинаем считать пробелы
} }
CParaLineRange.prototype = CParaLineRange.prototype =
...@@ -1883,16 +1857,6 @@ CParaLineRange.prototype = ...@@ -1883,16 +1857,6 @@ CParaLineRange.prototype =
this.XVisible += Dx; this.XVisible += Dx;
}, },
Reset_Width : function()
{
this.W = 0;
this.Words = 0;
this.Spaces = 0;
this.Letters = 0;
this.SpacesSkip = 0;
this.LettersSkip = 0;
},
Copy : function() Copy : function()
{ {
var NewRange = new CParaLineRange(); var NewRange = new CParaLineRange();
...@@ -1900,19 +1864,9 @@ CParaLineRange.prototype = ...@@ -1900,19 +1864,9 @@ CParaLineRange.prototype =
NewRange.X = this.X; NewRange.X = this.X;
NewRange.XVisible = this.XVisible; NewRange.XVisible = this.XVisible;
NewRange.XEnd = this.XEnd; NewRange.XEnd = this.XEnd;
NewRange.W = this.W;
NewRange.Words = this.Words;
NewRange.Spaces = this.Spaces;
NewRange.Letters = this.Letters;
NewRange.SpacesSkip = this.SpacesSkip;
NewRange.LettersSkip = this.LettersSkip;
NewRange.StartPos = this.StartPos; NewRange.StartPos = this.StartPos;
NewRange.EndPos = this.EndPos; NewRange.EndPos = this.EndPos;
NewRange.W = this.W;
NewRange.SpacePos = this.SpacePos;
return NewRange; return NewRange;
} }
...@@ -2183,6 +2137,12 @@ function CParagraphRecalculateStateCounter() ...@@ -2183,6 +2137,12 @@ function CParagraphRecalculateStateCounter()
this.Word = false; this.Word = false;
this.SpaceLen = 0; this.SpaceLen = 0;
this.SpacesCount = 0; this.SpacesCount = 0;
this.Words = 0;
this.Spaces = 0;
this.Letters = 0;
this.SpacesSkip = 0;
this.LettersSkip = 0;
} }
CParagraphRecalculateStateCounter.prototype = CParagraphRecalculateStateCounter.prototype =
...@@ -2194,6 +2154,12 @@ CParagraphRecalculateStateCounter.prototype = ...@@ -2194,6 +2154,12 @@ CParagraphRecalculateStateCounter.prototype =
this.Word = false; this.Word = false;
this.SpaceLen = 0; this.SpaceLen = 0;
this.SpacesCount = 0; this.SpacesCount = 0;
this.Words = 0;
this.Spaces = 0;
this.Letters = 0;
this.SpacesSkip = 0;
this.LettersSkip = 0;
} }
}; };
......
...@@ -2181,12 +2181,12 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2181,12 +2181,12 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
case para_Sym: case para_Sym:
case para_Text: case para_Text:
{ {
PRSC.Range.Letters++; PRSC.Letters++;
if ( true !== PRSC.Word ) if ( true !== PRSC.Word )
{ {
PRSC.Word = true; PRSC.Word = true;
PRSC.Range.Words++; PRSC.Words++;
} }
PRSC.Range.W += Item.Width / TEXTWIDTH_DIVIDER;//Item.Get_Width(); PRSC.Range.W += Item.Width / TEXTWIDTH_DIVIDER;//Item.Get_Width();
...@@ -2195,10 +2195,10 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2195,10 +2195,10 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
PRSC.SpaceLen = 0; PRSC.SpaceLen = 0;
// Пробелы перед первым словом в строке не считаем // Пробелы перед первым словом в строке не считаем
if ( PRSC.Range.Words > 1 ) if (PRSC.Words > 1)
PRSC.Range.Spaces += PRSC.SpacesCount; PRSC.Spaces += PRSC.SpacesCount;
else else
PRSC.Range.SpacesSkip += PRSC.SpacesCount; PRSC.SpacesSkip += PRSC.SpacesCount;
PRSC.SpacesCount = 0; PRSC.SpacesCount = 0;
...@@ -2226,13 +2226,13 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2226,13 +2226,13 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
} }
case para_Drawing: case para_Drawing:
{ {
PRSC.Range.Words++; PRSC.Words++;
PRSC.Range.W += PRSC.SpaceLen; PRSC.Range.W += PRSC.SpaceLen;
if ( PRSC.Range.Words > 1 ) if (PRSC.Words > 1)
PRSC.Range.Spaces += PRSC.SpacesCount; PRSC.Spaces += PRSC.SpacesCount;
else else
PRSC.Range.SpacesSkip += PRSC.SpacesCount; PRSC.SpacesSkip += PRSC.SpacesCount;
PRSC.Word = false; PRSC.Word = false;
PRSC.SpacesCount = 0; PRSC.SpacesCount = 0;
...@@ -2245,13 +2245,13 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2245,13 +2245,13 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
} }
case para_PageNum: case para_PageNum:
{ {
PRSC.Range.Words++; PRSC.Words++;
PRSC.Range.W += PRSC.SpaceLen; PRSC.Range.W += PRSC.SpaceLen;
if ( PRSC.Range.Words > 1 ) if (PRSC.Words > 1)
PRSC.Range.Spaces += PRSC.SpacesCount; PRSC.Spaces += PRSC.SpacesCount;
else else
PRSC.Range.SpacesSkip += PRSC.SpacesCount; PRSC.SpacesSkip += PRSC.SpacesCount;
PRSC.Word = false; PRSC.Word = false;
PRSC.SpacesCount = 0; PRSC.SpacesCount = 0;
...@@ -2268,12 +2268,12 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2268,12 +2268,12 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
// Учитываем только слова и пробелы, идущие после последнего таба // Учитываем только слова и пробелы, идущие после последнего таба
PRSC.Range.LettersSkip += PRSC.Range.Letters; PRSC.LettersSkip += PRSC.Letters;
PRSC.Range.SpacesSkip += PRSC.Range.Spaces; PRSC.SpacesSkip += PRSC.Spaces;
PRSC.Range.Words = 0; PRSC.Words = 0;
PRSC.Range.Spaces = 0; PRSC.Spaces = 0;
PRSC.Range.Letters = 0; PRSC.Letters = 0;
PRSC.SpaceLen = 0; PRSC.SpaceLen = 0;
PRSC.SpacesCount = 0; PRSC.SpacesCount = 0;
...@@ -2284,8 +2284,8 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2284,8 +2284,8 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
case para_NewLine: case para_NewLine:
{ {
if ( true === PRSC.Word && PRSC.Range.Words > 1 ) if (true === PRSC.Word && PRSC.Words > 1)
PRSC.Range.Spaces += PRSC.SpacesCount; PRSC.Spaces += PRSC.SpacesCount;
PRSC.SpacesCount = 0; PRSC.SpacesCount = 0;
PRSC.Word = false; PRSC.Word = false;
...@@ -2295,7 +2295,7 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) ...@@ -2295,7 +2295,7 @@ ParaRun.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange)
case para_End: case para_End:
{ {
if ( true === PRSC.Word ) if ( true === PRSC.Word )
PRSC.Range.Spaces += PRSC.SpacesCount; PRSC.Spaces += PRSC.SpacesCount;
break; break;
} }
......
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