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

Добавлен первый вариант класса CRun для нового параграфа.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@53020 954022d7-b5bf-4e40-9824-e11837661b57
parent be382ff1
......@@ -62,6 +62,8 @@ var recalcresult2_NextPage = 0x01; // Рассчет нужно продолжи
var StartTime;
var g_TestColumns = false;
function CSelectedElement(Element, SelectedAll)
{
this.Element = Element;
......@@ -661,17 +663,51 @@ CDocument.prototype =
Get_PageContentStartPos : function (PageIndex)
{
var Y = Y_Top_Field;
var YHeader = this.HdrFtr.Get_HeaderBottomPos( PageIndex );
if ( YHeader >= 0 && YHeader > Y )
Y = YHeader;
if ( true !== g_TestColumns )
{
var Y = Y_Top_Field;
var YHeader = this.HdrFtr.Get_HeaderBottomPos( PageIndex );
if ( YHeader >= 0 && YHeader > Y )
Y = YHeader;
var YLimit = Y_Bottom_Field;
var YFooter = this.HdrFtr.Get_FooterTopPos( PageIndex );
if ( YFooter >= 0 && YFooter < YLimit )
YLimit = YFooter;
return { X : X_Left_Field, Y : Y, XLimit : X_Right_Field, YLimit : YLimit };
}
else
{
if ( 0 === PageIndex % 2 )
{
var Y = Y_Top_Field;
var YHeader = this.HdrFtr.Get_HeaderBottomPos( PageIndex );
if ( YHeader >= 0 && YHeader > Y )
Y = YHeader;
var YLimit = Y_Bottom_Field;
var YFooter = this.HdrFtr.Get_FooterTopPos( PageIndex );
if ( YFooter >= 0 && YFooter < YLimit )
YLimit = YFooter;
var YLimit = Y_Bottom_Field;
var YFooter = this.HdrFtr.Get_FooterTopPos( PageIndex );
if ( YFooter >= 0 && YFooter < YLimit )
YLimit = YFooter;
return { X : X_Left_Field, Y : Y, XLimit : X_Right_Field, YLimit : YLimit };
return { X : X_Left_Field, Y : Y, XLimit : (X_Left_Field + X_Right_Field) / 2 - 10, YLimit : YLimit };
}
else
{
var Y = Y_Top_Field;
var YHeader = this.HdrFtr.Get_HeaderBottomPos( PageIndex );
if ( YHeader >= 0 && YHeader > Y )
Y = YHeader;
var YLimit = Y_Bottom_Field;
var YFooter = this.HdrFtr.Get_FooterTopPos( PageIndex );
if ( YFooter >= 0 && YFooter < YLimit )
YLimit = YFooter;
return { X : (X_Left_Field + X_Right_Field) / 2 + 10, Y : Y, XLimit : X_Right_Field, YLimit : YLimit };
}
}
},
Get_PageLimits : function(PageIndex)
......@@ -1273,14 +1309,35 @@ CDocument.prototype =
if ( true === bReDraw )
{
this.DrawingDocument.OnRecalculatePage( PageIndex, this.Pages[PageIndex] );
if ( true !== g_TestColumns )
this.DrawingDocument.OnRecalculatePage( PageIndex, this.Pages[PageIndex] );
else
{
if ( 1 === PageIndex % 2 || Index >= Count )
{
var __PageIndex = 0;
if ( 1 === PageIndex % 2 )
__PageIndex = (PageIndex - 1) / 2;
else
__PageIndex = PageIndex / 2;
this.DrawingDocument.OnRecalculatePage( __PageIndex, this.Pages[PageIndex] );
}
}
}
if ( Index >= Count )
{
this.Internal_CheckCurPage();
this.DrawingDocument.OnEndRecalculate( true );
this.DrawingObjects.onEndRecalculateDocument( this.Pages.length );
if ( true !== g_TestColumns )
this.DrawingObjects.onEndRecalculateDocument( this.Pages.length );
else
{
var _Len = ( 0 === this.Pages.length % 2 ? this.Pages.length / 2 : (this.Pages.length + 1) / 2 );
this.DrawingObjects.onEndRecalculateDocument( _Len );
}
if ( true === this.Selection.UpdateOnRecalc )
{
......@@ -1520,11 +1577,35 @@ CDocument.prototype =
this.DrawingObjects.drawBehindDoc( nPageIndex, pGraphics );
this.DrawingObjects.drawWrappingObjects( nPageIndex, pGraphics );
var Page_StartPos = this.Pages[nPageIndex].Pos;
var Page_EndPos = this.Pages[nPageIndex].EndPos;
for ( var Index = Page_StartPos; Index <= Page_EndPos; Index++ )
if ( true !== g_TestColumns )
{
this.Content[Index].Draw(nPageIndex, pGraphics);
var Page_StartPos = this.Pages[nPageIndex].Pos;
var Page_EndPos = this.Pages[nPageIndex].EndPos;
for ( var Index = Page_StartPos; Index <= Page_EndPos; Index++ )
{
this.Content[Index].Draw(nPageIndex, pGraphics);
}
}
else
{
var __PageIndex = nPageIndex * 2;
var Page_StartPos = this.Pages[__PageIndex].Pos;
var Page_EndPos = this.Pages[__PageIndex].EndPos;
for ( var Index = Page_StartPos; Index <= Page_EndPos; Index++ )
{
this.Content[Index].Draw(__PageIndex, pGraphics);
}
__PageIndex = nPageIndex * 2 + 1;
if ( undefined != this.Pages[__PageIndex] )
{
Page_StartPos = this.Pages[__PageIndex].Pos;
Page_EndPos = this.Pages[__PageIndex].EndPos;
for ( var Index = Page_StartPos; Index <= Page_EndPos; Index++ )
{
this.Content[Index].Draw(__PageIndex, pGraphics);
}
}
}
this.DrawingObjects.drawBeforeObjects( nPageIndex, pGraphics );
......@@ -9123,7 +9204,7 @@ CDocument.prototype =
if ( PageIndex < 0 )
return;
this.Update_CursorType( X, Y, PageIndex, e );
//this.Update_CursorType( X, Y, PageIndex, e );
if ( true === this.Selection.Use && true === this.Selection.Start )
{
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -40,6 +40,8 @@ var para_CommentStart = 0x0023; // Начало комментар
var para_CommentEnd = 0x0024; // Начало комментария
var para_PresentationNumbering = 0x0025; // Элемент, обозначающий нумерацию для списков в презентациях
var para_Math = 0x0026; // Формула
var para_Run = 0x0027; // Текстовый элемент
var para_Sym = 0x0028; // Символ
var break_Line = 0x01;
var break_Page = 0x02;
......@@ -326,6 +328,113 @@ ParaSpace.prototype =
}
};
function ParaSym(Char, FontFamily)
{
this.Type = para_Sym;
this.FontFamily = FontFamily;
this.Char = Char;
this.FontSlot = fontslot_ASCII;
this.FontKoef = 1;
this.Width = 0;
this.Height = 0;
this.WidthVisible = 0;
}
ParaSym.prototype =
{
Draw : function(X,Y,Context, TextPr)
{
var CurTextPr = TextPr.Copy();
switch ( this.FontSlot )
{
case fontslot_ASCII: CurTextPr.RFonts.Ascii = { Name : this.FontFamily, Index : -1 }; break;
case fontslot_CS: CurTextPr.RFonts.CS = { Name : this.FontFamily, Index : -1 }; break;
case fontslot_EastAsia: CurTextPr.RFonts.EastAsia = { Name : this.FontFamily, Index : -1 }; break;
case fontslot_HAnsi: CurTextPr.RFonts.HAnsi = { Name : this.FontFamily, Index : -1 }; break;
}
Context.SetTextPr( CurTextPr );
Context.SetFontSlot( this.FontSlot, this.FontKoef );
Context.FillText( X, Y, String.fromCharCode( this.Char ) );
Context.SetTextPr( TextPr );
},
Measure : function(Context, TextPr)
{
this.FontKoef = TextPr.Get_FontKoef();
var Hint = TextPr.RFonts.Hint;
var bCS = TextPr.CS;
var bRTL = TextPr.RTL;
var lcid = TextPr.Lang.EastAsia;
this.FontSlot = g_font_detector.Get_FontClass( this.CalcValue.charCodeAt(0), Hint, lcid, bCS, bRTL );
var CurTextPr = TextPr.Copy();
switch ( this.FontSlot )
{
case fontslot_ASCII: CurTextPr.RFonts.Ascii = { Name : this.FontFamily, Index : -1 }; break;
case fontslot_CS: CurTextPr.RFonts.CS = { Name : this.FontFamily, Index : -1 }; break;
case fontslot_EastAsia: CurTextPr.RFonts.EastAsia = { Name : this.FontFamily, Index : -1 }; break;
case fontslot_HAnsi: CurTextPr.RFonts.HAnsi = { Name : this.FontFamily, Index : -1 }; break;
}
Context.SetTextPr( CurTextPr );
Context.SetFontSlot( this.FontSlot, this.FontKoef );
var Temp = Context.Measure( this.CalcValue );
Context.SetTextPr( TextPr );
Temp.Width = Math.max( Temp.Width + TextPr.Spacing, 0 );
this.Width = Temp.Width;
this.Height = Temp.Height;
this.WidthVisible = Temp.Width;
},
Is_RealContent : function()
{
return true;
},
Can_AddNumbering : function()
{
return true;
},
Copy : function()
{
return new ParaSym( this.Char, this.FontFamily );
},
Write_ToBinary : function(Writer)
{
// Long : Type
// String : FontFamily
// Long : Char
Writer.WriteLong( this.Type );
Writer.WriteString2( this.FontFamily );
Writer.WriteLong( this.Char );
},
Read_FromBinary : function(Reader)
{
// String : FontFamily
// Long : Char
this.FontFamily = Reader.GetString2();
this.Char = Reader.GetLong();
}
};
// Класс ParaTextPr
function ParaTextPr(Props)
{
......@@ -2491,6 +2600,7 @@ function ParaNumbering()
{
this.Type = para_Numbering;
this.Pos = -1;
this.Item = undefined;
this.Internal =
{
......
/**
* User: Ilja.Kirillov
* Date: 03.12.13
* Time: 18:28
*/
function ParaRun(Document)
{
this.Id = g_oIdCounter.Get_NewId(); // Id данного элемента
this.Type = para_Run; // тип данного элемента
this.Document = Document; // Ссылка на верхний класс документа
this.Parent = undefined; // Ссылка на родительский класс
this.Pr = new CTextPr(); // Текстовые настройки данного run
this.Content = new Array(); // Содержимое данного run
this.State = new CParaRunState(); // Положение курсора и селекта в данного run
this.CompiledPr = new CTextPr(); // Скомпилированные настройки
this.RecalcInfo = new CParaRunRecalcInfo(); // Флаги для пересчета (там же флаг пересчета стиля)
this.TextAscent = 0; // текстовый ascent + linegap
this.TextDescent = 0; // текстовый descent
this.TextHeight = 0; // высота текста
this.TextAscent2 = 0; // текстовый ascent
this.Ascent = 0; // общий ascent
this.Descent = 0; // общий descent
this.YOffset = 0; // смещение по Y
this.Lines = new Array(); // Массив CParaRunLine
this.StartLine = 0; // Строка, с которой начинается данный ран
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
g_oTableId.Add( this, this.Id );
}
ParaRun.prototype =
{
//-----------------------------------------------------------------------------------
// Функции для работы с Id
//-----------------------------------------------------------------------------------
Set_Id : function(newId)
{
g_oTableId.Reset_Id( this, newId, this.Id );
this.Id = newId;
},
Get_Id : function()
{
return this.Id;
},
Set_Parent : function(Paragraph)
{
this.Parent = Paragraph;
},
Get_Parent : function()
{
return this.Parent;
},
Get_Paragraph : function()
{
return this.Parent;
},
//-----------------------------------------------------------------------------------
// Функции пересчета
//-----------------------------------------------------------------------------------
// Выставляем начальную строку и обнуляем массив строк
Recalculate_Reset : function(StartLine)
{
this.StartLine = StartLine;
this.Lines = new Array();
},
// Пересчитываем размеры всех элементов
Recalculate_MeasureContent : function()
{
if ( false === this.RecalcInfo.Measure )
return;
var Pr = this.Get_CompiledPr(false);
g_oTextMeasurer.SetTextPr( Pr );
g_oTextMeasurer.SetFontSlot( fontslot_ASCII );
// Запрашиваем текущие метрики шрифта, под TextAscent мы будем понимать ascent + linegap(которые записаны в шрифте)
this.TextHeight = g_oTextMeasurer.GetHeight();
this.TextDescent = Math.abs( g_oTextMeasurer.GetDescender() );;
this.TextAscent = TextHeight - TextDescent;
this.TextAscent2 = g_oTextMeasurer.GetAscender();
this.YOffset = Pr.Position;
var ContentLength = this.Content.length;
for ( var Pos = 0; Pos < ContentLength; Pos++ )
{
var Item = this.Content[Pos];
if ( para_Drawing === Item.Type )
{
Item.Parent = this;
Item.DocumentContent = this.Parent.Parent;
Item.DrawingDocument = this.Parent.Parent.DrawingDocument;
}
Item.Measure( g_oTextMeasurer, Pr );
}
this.RecalcInfo.Measure = false;
},
Recalculate_Range : function(PRS, ParaPr)
{
// Сначала измеряем элементы (можно вызывать каждый раз, внутри разруливается, чтобы измерялось 1 раз)
this.Recalculate_MeasureContent();
var CurLine = PRS.Line - this.StartLine;
if ( undefined === this.Lines[CurLine] )
{
this.Lines[CurLine] = new CParaRunLine();
}
var Para = PRS.Paragraph;
var RangeStartPos = 0;
var RangeEndPos = -1;
// Вычислим RangeStartPos
var CurRange = PRS.Range;
if ( 0 === CurLine )
{
if ( this.Lines[0].Ranges[CurRange - 1] instanceof CParaRunRange )
{
RangeStartPos = this.Lines[0].Ranges[CurRange - 1].EndPos;
}
else
{
RangeStartPos = 0;
}
}
else if ( 0 === CurRange )
{
var _Line = this.Lines[CurLine - 1];
RangeStartPos = _Line.Ranges[_Line.Ranges.length - 1].EndPos;
}
else
{
var _Line = this.Lines[CurLine];
RangeStartPos = Line.Ranges[CurRange - 1].EndPos;
}
var ContentLen = this.Content.length;
var Pos = RangeStartPos;
while ( Pos < ContentLen )
{
if ( false === PRS.StartWord && true === PRS.FirstItemOnLine && Math.abs( PRS.XEnd - PRS.X ) < 0.001 && PRS.RangesCount > 0 )
{
PRS.NewRange = true;
RangeEndPos = Pos;
break;
}
var Item = this.Content[Pos];
var ItemType = Item.Type;
// Проверяем, не нужно ли добавить нумерацию к данному элементу
this.Internal_Recalculate_Numbering( Item, PRS );
var bBreak = false;
switch( Item.Type )
{
case para_Sym:
case para_Text:
{
// Отмечаем, что началось слово
PRS.StartWord = true;
// Пересчитаем метрику строки относительно размера данного текста
this.Internal_Recalculate_LineMetrics( PRS, ParaPr.Spacing.LineRule );
// При проверке, убирается ли слово, мы должны учитывать ширину предшествующих пробелов.
var LetterLen = Item.Width;
if ( true !== PRS.Word )
{
// Слово только началось. Делаем следующее:
// 1) Если до него на строке ничего не было и данная строка не
// имеет разрывов, тогда не надо проверять убирается ли слово в строке.
// 2) В противном случае, проверяем убирается ли слово в промежутке.
// Если слово только началось, и до него на строке ничего не было, и в строке нет разрывов, тогда не надо проверять убирается ли оно на строке.
if ( !bFirstItemOnLine || false === Para.Internal_Check_Ranges(PRS.Line, PRS.Range) )
{
if ( PRS.X + PRS.SpaceLen + LetterLen > PRS.XEnd )
{
PRS.NewRange = true;
RangeEndPos = Pos;
}
}
if ( true !== PRS.NewRange )
{
PRS.Set_WordStart( Pos );
PRS.WordLen = Item.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(PRS.Line, PRS.Range) )
{
PRS.MovePosToWordStart = true;
PRS.NewRange = true;
}
else
{
PRS.EmptyLine = false;
PRS.X += PRS.WordLen;
PRS.NewRange = true;
RangeEndPos = Pos;
}
}
else
{
// Слово не убирается в промежутке. Переносим слово на новую строку
PRS.MovePosToWordStart = true;
PRS.NewRange = true;
}
}
if ( true !== PRS.NewRange )
{
// Мы убираемся в пределах данной строки. Прибавляем ширину буквы к ширине слова
PRS.WordLen += LetterLen;
// Если текущий символ с переносом, например, дефис, тогда на нем заканчивается слово
if ( true === Item.SpaceAfter )
{
// Добавляем длину пробелов до слова и ширину самого слова.
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Word = false;
PRS.FirstItemOnLine = false;
PRS.EmptyLine = false;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.SpacesCount = 0;
}
}
}
break;
}
case para_Space:
{
PRS.FirstItemOnLine = false;
if ( true === PRS.Word )
{
// Добавляем длину пробелов до слова + длина самого слова. Не надо проверять
// убирается ли слово, мы это проверяем при добавленнии букв.
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Word = false;
PRS.EmptyLine = false;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.SpacesCount = 1;
}
else
PRS.SpacesCount++;
// На пробеле не делаем перенос. Перенос строки или внутристрочный
// перенос делаем при добавлении любого непробельного символа
PRS.SpaceLen += Item.Width;
break;
}
case para_Drawing:
{
if ( true === Item.Is_Inline() || true === Para.Parent.Is_DrawingShape() )
{
if ( true !== Item.Is_Inline() )
Item.Set_DrawingType( drawing_Inline );
if ( true === PRS.StartWord )
PRS.FirstItemOnLine = false;
// Если до этого было слово, тогда не надо проверять убирается ли оно, но если стояли пробелы,
// тогда мы их учитываем при проверке убирается ли данный элемент, и добавляем только если
// данный элемент убирается
if ( true === PRS.Word || PRS.WordLen > 0 )
{
// Добавляем длину пробелов до слова + длина самого слова. Не надо проверять
// убирается ли слово, мы это проверяем при добавленнии букв.
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Word = false;
PRS.EmptyLine = false;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.SpacesCount = 0;
}
if ( PRS.X + PRS.SpaceLen + Item.Width > PRS.XEnd && ( false === PRS.FirstItemOnLine || false === Para.Internal_Check_Ranges( PRS.Line, PRS.Range ) ) )
{
PRS.NewRange = true;
RangeEndPos = Pos;
}
else
{
// Обновим метрики строки
if ( linerule_Exact === ParaPr.Spacing.LineRule )
{
if ( PRS.LineAscent < Item.Height )
PRS.LineAscent = Item.Height;
}
else
{
if ( PRS.LineAscent < Item.Height + this.YOffset )
PRS.LineAscent = Item.Height + this.YOffset;
if ( PRS.LineDescent < -this.YOffset )
PRS.LineDescent = -this.YOffset;
}
// Добавляем длину пробелов до автофигуры
PRS.X += PRS.SpaceLen + Item.Width;
PRS.FirstItemOnLine = false;
PRS.EmptyLine = false;
}
PRS.SpaceLen = 0;
PRS.SpacesCount = 0;
}
else
{
// TODO: переделать здесь
Para.Internal_Recalculate_1_AnchorDrawing();
/*
// Основная обработка происходит в Internal_Recalculate_2. Здесь обрабатывается единственный случай,
// когда после второго пересчета с уже добавленной картинкой оказывается, что место в параграфе, где
// идет картинка ушло на следующую страницу. В этом случае мы ставим перенос страницы перед картинкой.
var LogicDocument = Para.Parent;
var LDRecalcInfo = LogicDocument.RecalcInfo;
var DrawingObjects = LogicDocument.DrawingObjects;
if ( true === LDRecalcInfo.Check_FlowObject(Item) && true === LDRecalcInfo.Is_PageBreakBefore() )
{
LDRecalcInfo.Reset();
// Добавляем разрыв страницы. Если это первая страница, тогда ставим разрыв страницы в начале параграфа,
// если нет, тогда в начале текущей строки.
if ( null != this.Get_DocumentPrev() && true != this.Parent.Is_TableCellContent() && 0 === CurPage )
{
// Мы должны из соответствующих FlowObjects удалить все Flow-объекты, идущие до этого места в параграфе
for ( var TempPos = StartPos; TempPos < Pos; TempPos++ )
{
var TempItem = this.Content[TempPos];
if ( para_Drawing === TempItem.Type && drawing_Anchor === TempItem.DrawingType && true === TempItem.Use_TextWrap() )
{
DrawingObjects.removeById( TempItem.PageNum, TempItem.Get_Id() );
}
}
this.Pages[CurPage].Set_EndLine( -1 );
if ( 0 === CurLine )
{
this.Lines[-1] = new CParaLine(0);
this.Lines[-1].Set_EndPos( LineStart_Pos - 1, this );
}
RecalcResult = recalcresult_NextPage;
return;
}
else
{
if ( CurLine != this.Pages[CurPage].FirstLine )
{
this.Pages[CurPage].Set_EndLine( CurLine - 1 );
if ( 0 === CurLine )
{
this.Lines[-1] = new CParaLine(0);
this.Lines[-1].Set_EndPos( LineStart_Pos - 1, this );
}
RecalcResult = recalcresult_NextPage;
bBreak = true;
break;
}
else
{
Pos--;
bNewLine = true;
bForceNewPage = true;
}
}
// Если до этого было слово, тогда не надо проверять убирается ли оно
if ( bWord || nWordLen > 0 )
{
// Добавляем длину пробелов до слова
X += nSpaceLen;
// Не надо проверять убирается ли слово, мы это проверяем при добавленнии букв
X += nWordLen;
bWord = false;
nSpaceLen = 0;
nSpacesCount = 0;
nWordLen = 0;
}
}
*/
}
break;
}
case para_PageNum:
{
// Если до этого было слово, тогда не надо проверять убирается ли оно, но если стояли пробелы,
// тогда мы их учитываем при проверке убирается ли данный элемент, и добавляем только если
// данный элемент убирается
if ( true === PRS.Word || PRS.WordLen > 0 )
{
// Добавляем длину пробелов до слова + длина самого слова. Не надо проверять
// убирается ли слово, мы это проверяем при добавленнии букв.
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Word = false;
PRS.EmptyLine = false;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.SpacesCount = 0;
}
// Если на строке начиналось какое-то слово, тогда данная строка уже не пустая
if ( true === PRS.StartWord )
PRS.FirstItemOnLine = false;
this.Internal_Recalculate_LineMetrics( PRS, ParaPr.Spacing.LineRule );
if ( PRS.X + PRS.SpaceLen + Item.Width > PRS.XEnd && ( false === PRS.FirstItemOnLine || false === Para.Internal_Check_Ranges( PRS.Line, PRS.Range ) ) )
{
// TODO: отмечаем здесь конец данного отрезка
PRS.NewRange = true;
}
else
{
// Добавляем длину пробелов до слова и ширину данного элемента
PRS.X += PRS.SpaceLen + Item.Width;
PRS.FirstItemOnLine = false;
PRS.EmptyLine = false;
}
PRS.SpaceLen = 0;
PRS.SpacesCount = 0;
break;
}
case para_Tab:
{
// Сначала проверяем, если у нас уже есть таб, которым мы должны рассчитать, тогда высчитываем
// его ширину.
this.Internal_Recalculate_LastTab();
// Добавляем длину пробелов до слова + длина самого слова. Не надо проверять
// убирается ли слово, мы это проверяем при добавленнии букв.
PRS.X += PRS.SpaceLen + PRS.WordLen;
PRS.Word = false;
PRS.SpaceLen = 0;
PRS.WordLen = 0;
PRS.SpacesCount = 0;
var NewX = Para.Internal_GetTabPos(X, ParaPr);
// Если таб не левый (NewX < 0), значит он не может быть сразу рассчитан, а если левый, тогда
// рассчитываем его сразу здесь
if ( NewX < 0 )
{
PRS.LastTab.TabPos = -NewX;
PRS.LastTab.Value = Tab.Value;
PRS.LastTab.X = X;
PRS.LastTab.Item = Item;
Item.Width = 0;
Item.WidthVisible = 0;
}
else
{
if ( NewX > PRS.XEnd && ( false === PRS.FirstItemOnLine || false === Para.Internal_Check_Ranges( PRS.Line, PRS.Range ) ) )
{
PRS.WordLen = NewX - PRS.X;
// TODO: отмечаем здесь конец данного отрезка
PRS.NewRange = true;
}
else
{
Item.Width = NewX - PRS.X;
Item.WidthVisible = NewX - PRS.X;
PRS.X = NewX;
}
}
// Если перенос идет по строке, а не из-за обтекания, тогда разрываем перед табом, а если
// из-за обтекания, тогда разрываем перед последним словом, идущим перед табом
if ( PRS.RangesCount === CurRange )
{
if ( true === PRS.StartWord )
{
PRS.FirstItemOnLine = false;
PRS.EmptyLine = false;
}
}
// Считаем, что с таба начинается слово
PRS.StartWord = true;
PRS.Word = true;
PRS.Set_WordStart( Pos );
break;
}
case para_NewLine:
{
if ( break_Page === Item.BreakType )
{
// PageBreak вне самого верхнего документа не надо учитывать, поэтому мы его с радостью удаляем
if ( !(Para.Parent instanceof CDocument) )
{
this.Internal_Content_Remove( Pos );
Pos--;
break;
}
PRS.NewPage = true;
PRS.NewRange = true;
PRS.BreakPageLine = true;
}
else
{
// TODO: вставить перенос отрезка
PRS.NewRange = true;
PRS.EmptyLine = false;
}
PRS.X += PRS.WordLen;
if ( true === PRS.Word )
{
PRS.EmptyLine = false;
PRS.Word = false;
PRS.X += PRS.SpaceLen;
PRS.SpaceLen = 0;
PRS.SpacesCount = 0;
}
break;
}
case para_End:
{
if ( true === PRS.Word )
{
PRS.FirstItemOnLine = false;
PRS.EmptyLine = false;
}
// false === bExtendBoundToBottom, потому что это уже делалось для PageBreak
if ( false === PRS.ExtendBoundToBottom )
{
PRS.X += PRS.WordLen;
if ( true === PRS.Word )
{
PRS.X += PRS.SpaceLen;
PRS.SpaceLen = 0;
PRS.SpacesCount = 0;
PRS.WordLen = 0;
}
this.Internal_Recalculate_LastTab();
}
PRS.NewRange = true;
break;
}
}
Pos++;
}
this.Lines[CurLine].Add_Range( PRS.Range, RangeStartPos, RangeEndPos );
},
Internal_Recalculate_Numbering : function(Item, PRS)
{
if ( true === PRS.AddNumbering )
{
var Para = PRS.Paragraph;
if ( undefined === Para )
return;
var Pr = Para.Get_CompiledPr2( false );
var ParaPr = Pr.ParaPr;
// Проверим, возможно на текущем элементе стоит добавить нумерацию
if ( true === Item.Can_AddNumbering() )
{
var NumberingItem = Para.Numbering;
var NumberingType = Para.Numbering.Type;
if ( para_Numbering === NumberingType )
{
var NumPr = ParaPr.NumPr;
if ( undefined === NumPr || undefined === NumPr.NumId || 0 === NumPr.NumId || "0" === NumPr.NumId )
{
// Так мы обнуляем все рассчитанные ширины данного элемента
NumberingItem.Measure( g_oTextMeasurer, undefined );
}
else
{
var Numbering = Para.Parent.Get_Numbering();
var NumLvl = Numbering.Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl];
var NumSuff = NumLvl.Suff;
var NumJc = NumLvl.Jc;
var NumInfo = Para.Parent.Internal_GetNumInfo( this.Id, NumPr );
var NumTextPr = Pr.TextPr.Copy();
NumTextPr.Merge( Para.TextPr.Value );
NumTextPr.Merge( NumLvl.TextPr );
// Здесь измеряется только ширина символов нумерации, без суффикса
NumberingItem.Measure( g_oTextMeasurer, Numbering, NumInfo, NumTextPr, NumPr );
// При рассчете высоты строки, если у нас параграф со списком, то размер символа
// в списке влияет только на высоту строки над Baseline, но не влияет на высоту строки
// ниже baseline.
if ( LineAscent < NumberingItem.Height )
LineAscent = NumberingItem.Height;
switch ( NumJc )
{
case align_Right:
{
NumberingItem.WidthVisible = 0;
break;
}
case align_Center:
{
NumberingItem.WidthVisible = NumberingItem.WidthNum / 2;
PRS.X += NumberingItem.WidthNum / 2;
break;
}
case align_Left:
default:
{
NumberingItem.WidthVisible = NumberingItem.WidthNum;
PRS.X += NumberingItem.WidthNum;
break;
}
}
switch( NumSuff )
{
case numbering_suff_Nothing:
{
// Ничего не делаем
break;
}
case numbering_suff_Space:
{
var OldTextPr = g_oTextMeasurer.GetTextPr();
g_oTextMeasurer.SetTextPr( NumTextPr );
g_oTextMeasurer.SetFontSlot( fontslot_ASCII );
NumberingItem.WidthSuff = g_oTextMeasurer.Measure( " " ).Width;
g_oTextMeasurer.SetTextPr( OldTextPr );
break;
}
case numbering_suff_Tab:
{
var NewX = null;
var PageStart = Para.Parent.Get_PageContentStartPos( Para.PageNum + PRS.Page );
// Если у данного параграфа есть табы, тогда ищем среди них
var TabsCount = ParaPr.Tabs.Get_Count();
// Добавим в качестве таба левую границу
var TabsPos = new Array();
var bCheckLeft = true;
for ( var Index = 0; Index < TabsCount; Index++ )
{
var Tab = ParaPr.Tabs.Get(Index);
var TabPos = Tab.Pos + PageStart.X;
if ( true === bCheckLeft && TabPos > PageStart.X + ParaPr.Ind.Left )
{
TabsPos.push( PageStart.X + ParaPr.Ind.Left );
bCheckLeft = false;
}
if ( tab_Clear != Tab.Value )
TabsPos.push( TabPos );
}
if ( true === bCheckLeft )
TabsPos.push( PageStart.X + ParaPr.Ind.Left );
TabsCount++;
for ( var Index = 0; Index < TabsCount; Index++ )
{
var TabPos = TabsPos[Index];
if ( X < TabPos )
{
NewX = TabPos;
break;
}
}
// Если табов нет, либо их позиции левее текущей позиции ставим таб по умолчанию
if ( null === NewX )
{
if ( X < PageStart.X + ParaPr.Ind.Left )
NewX = PageStart.X + ParaPr.Ind.Left;
else
{
NewX = this.X;
while ( X >= NewX )
NewX += Default_Tab_Stop;
}
}
NumberingItem.WidthSuff = NewX - PRS.X;
break;
}
}
NumberingItem.Width = NumberingItem.WidthNum;
NumberingItem.WidthVisible += NumberingItem.WidthSuff;
PRS.X += NumberingItem.WidthSuff;
//Para.Numbering.Pos = Pos;
Para.Numbering.Item = Item;
}
}
else if ( para_PresentationNumbering === NumberingType )
{
var Bullet = Para.PresentationPr.Bullet;
if ( numbering_presentationnumfrmt_None != Bullet.Get_Type() )
{
if ( ParaPr.Ind.FirstLine < 0 )
NumberingItem.WidthVisible = Math.max( NumberingItem.Width, Para.X + ParaPr.Ind.Left + ParaPr.Ind.FirstLine - PRS.X, Para.X + ParaPr.Ind.Left - PRS.X );
else
NumberingItem.WidthVisible = Math.max( Para.X + ParaPr.Ind.Left + NumberingItem.Width - PRS.X, Para.X + ParaPr.Ind.Left + ParaPr.Ind.FirstLine - PRS.X, Para.X + ParaPr.Ind.Left - PRS.X );
}
PRS.X += NumberingItem.WidthVisible;
//Para.Numbering.Pos = Pos;
Para.Numbering.Item = Item;
}
PRS.AddNumbering = false;
}
}
},
Internal_Recalculate_LineMetrics : function(PRS, SpacingLineRule)
{
if ( PRS.LineTextAscent < this.TextAscent )
PRS.LineTextAscent = this.TextAscent;
if ( PRS.LineTextAscent2 < this.TextAscent2 )
PRS.LineTextAscent2 = this.TextAscent2;
if ( PRS.LineTextDescent < this.TextDescent )
PRS.LineTextDescent = this.TextDescent;
if ( linerule_Exact === SpacingLineRule )
{
// Смещение не учитывается в метриках строки, когда расстояние между строк точное
if ( PRS.LineAscent < this.TextAscent )
PRS.LineAscent = this.TextAscent;
if ( PRS.LineDescent < this.TextDescent )
PRS.LineDescent = this.TextDescent;
}
else
{
if ( PRS.LineAscent < this.TextAscent + this.YOffset )
PRS.LineAscent = this.TextAscent + this.YOffset;
if ( PRS.LineDescent < this.TextDescent - this.YOffset )
PRS.LineDescent = this.TextDescent - this.YOffset;
}
},
Internal_Recalculate_LastTab : function(PRS)
{
if ( -1 !== PRS.LastTab.Value )
{
var TempXPos = PRS.X;
if ( true === PRS.Word || PRS.WordLen > 0 )
TempXPos += PRS.SpaceLen + PRS.WordLen;
var TabItem = PRS.LastTab.Item;
var TabStartX = PRS.LastTab.X;
var TabRangeW = TempXPos - TabStartX;
var TabValue = PRS.LastTab.Value;
var TabPos = PRS.LastTab.TabPos;
var TabCalcW = 0;
if ( tab_Right === TabValue )
TabCalcW = Math.max( TabPos - (TabStartX + TabRangeW), 0 );
else if ( tab_Center === TabValue )
TabCalcW = Math.max( TabPos - (TabStartX + TabRangeW / 2), 0 );
if ( PRS.X + TabCalcW > PRS.XEnd )
TabCalcW = PRS.XEnd - PRS.X;
TabItem.Width = TabCalcW;
TabItem.WidthVisible = TabCalcW;
PRS.LastTab.Reset();
PRS.X += TabCalcW;
}
},
//-----------------------------------------------------------------------------------
// Функции для работы с настройками текста свойств
//-----------------------------------------------------------------------------------
Recalc_CompiledPr : function(RecalcMeasure)
{
this.RecalcInfo.TextPr = true;
// Если изменение какой-то текстовой настройки требует пересчета элементов
if ( true === RecalcMeasure )
this.RecalcInfo.Measure = true;
},
Get_CompiledPr : function(bCopy)
{
if ( true === this.RecalcInfo.TextPr )
{
this.CompiledPr = this.Internal_Compile_Pr();
this.RecalcInfo.TextPr = false;
}
if ( false === bCopy )
return this.CompiledPr;
else
return this.CompiledPr.Copy(); // Отдаем копию объекта, чтобы никто не поменял извне настройки стиля
},
Internal_Compile_Pr : function ()
{
if ( undefined === this.Parent )
{
// Сюда мы никогда не должны попадать, но на всякий случай,
// чтобы не выпадало ошибок сгенерим дефолтовые настройки
this.CompiledPr.Init_Default();
return;
}
// Получим настройки текста, для данного параграфа
var TextPr = this.Parent.Get_CompiledPr2(false).TextPr.Copy();
// Если в прямых настройках задан стиль, тогда смержим настройки стиля
if ( undefined != this.Pr.RStyle )
{
var Styles = this.Document.Get_Styles();
var StyleTextPr = Styles.Get_Pr( this.Pr.RStyle, styletype_Character ).TextPr;
TextPr.Merge( StyleTextPr );
}
// Мержим прямые настройки данного рана
TextPr.Merge( this.Pr );
// Для совместимости со старыми версиями запишем FontFamily
TextPr.FontFamily.Name = TextPr.RFonts.Ascii.Name;
TextPr.FontFamily.Index = TextPr.RFonts.Ascii.Index;
return TextPr;
},
// В данной функции мы жестко меняем настройки на те, которые пришли (т.е. полностью удаляем старые)
Set_Pr : function(TextPr)
{
var OldValue = this.Pr;
this.Pr = Value;
History.Add( this, { Type : historyitem_ParaRun_TextPr, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
},
// В данной функции мы применяем приходящие настройки поверх старых, т.е. старые не удаляем
Apply_Pr : function(TextPr)
{
if ( undefined != TextPr.Bold )
this.Set_Bold( TextPr.Bold );
if ( undefined != TextPr.Italic )
this.Set_Italic( TextPr.Italic );
if ( undefined != TextPr.Strikeout )
this.Set_Strikeout( TextPr.Strikeout );
if ( undefined != TextPr.Underline )
this.Set_Underline( TextPr.Underline );
if ( undefined != TextPr.FontSize )
this.Set_FontSize( TextPr.FontSize );
if ( undefined != TextPr.Color )
this.Set_Color( TextPr.Color );
if ( undefined != TextPr.VertAlign )
this.Set_VertAlign( TextPr.VertAlign );
if ( undefined != TextPr.HighLight )
this.Set_HighLight( TextPr.HighLight );
if ( undefined != TextPr.RStyle )
this.Set_RStyle( TextPr.RStyle );
if ( undefined != TextPr.Spacing )
this.Set_Spacing( TextPr.Spacing );
if ( undefined != TextPr.DStrikeout )
this.Set_DStrikeout( TextPr.DStrikeout );
if ( undefined != TextPr.Caps )
this.Set_Caps( TextPr.Caps );
if ( undefined != TextPr.SmallCaps )
this.Set_SmallCaps( TextPr.SmallCaps );
if ( undefined != TextPr.Position )
this.Set_Position( TextPr.Position );
if ( undefined != TextPr.RFonts )
this.Set_RFonts2( TextPr.RFonts );
if ( undefined != TextPr.Lang )
this.Set_Lang( TextPr.Lang );
},
Set_Bold : function(Value)
{
if ( Value !== this.Pr.Bold )
{
var OldValue = this.Pr.Bold;
this.Pr.Bold = Value;
History.Add( this, { Type : historyitem_ParaRun_Bold, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
}
},
Get_Bold : function()
{
return this.Get_CompiledPr(false).Bold;
},
Set_Italic : function(Value)
{
if ( Value !== this.Pr.Italic )
{
var OldValue = this.Pr.Italic;
this.Pr.Italic = Value;
History.Add( this, { Type : historyitem_ParaRun_Italic, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Get_Italic : function()
{
return this.Get_CompiledPr(false).Italic;
},
Set_Strikeout : function(Value)
{
if ( Value !== this.Pr.Strikeout )
{
var OldValue = this.Pr.Strikeout;
this.Pr.Strikeout = Value;
History.Add( this, { Type : historyitem_ParaRun_Strikeout, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( false );
}
},
Get_Strikeout : function()
{
return this.Get_CompiledPr(false).Strikeout;
},
Set_Underline : function(Value)
{
if ( Value !== this.Pr.Underline )
{
var OldValue = this.Pr.Underline;
this.Pr.Underline = Value;
History.Add( this, { Type : historyitem_ParaRun_Underline, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( false );
}
},
Get_Underline : function()
{
return this.Get_CompiledPr(false).Underline;
},
Set_FontSize : function(Value)
{
if ( Value !== this.Pr.FontSize )
{
var OldValue = this.Pr.FontSize;
this.Pr.FontSize = Value;
History.Add( this, { Type : historyitem_ParaRun_FontSize, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Get_FontSize : function()
{
return this.Get_CompiledPr(false).FontSize;
},
Set_Color : function(Value)
{
if ( ( undefined === Value && undefined !== this.Pr.Color ) || ( Value instanceof CDocumentColor && ( undefined === this.Pr.Color || false === Value.Compare(this.Pr.Color) ) ) )
{
var OldValue = this.Pr.Color;
this.Pr.Color = Value;
History.Add( this, { Type : historyitem_ParaRun_Color, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( false );
}
},
Get_Color : function()
{
return this.Get_CompiledPr(false).Color;
},
Set_VertAlign : function(Value)
{
if ( Value !== this.Pr.Value )
{
var OldValue = this.Pr.VertAlign;
this.Pr.VertAlign = Value;
History.Add( this, { Type : historyitem_ParaRun_VertAlign, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Get_VertAlign : function()
{
return this.Get_CompiledPr(false).VertAlign;
},
Set_HighLight : function(Value)
{
var OldValue = this.Pr.HighLight;
if ( (undefined === Value && undefined !== OldValue) || ( highlight_None === Value && highlight_None !== OldValue ) || ( Value instanceof CDocumentColor && ( undefined === OldValue || highlight_None === OldValue || false === Value.Compare(OldValue) ) ) )
{
this.Pr.HighLight = Value;
History.Add( this, { Type : historyitem_ParaRun_HighLight, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( false );
}
},
Get_HighLight : function()
{
return this.Get_CompiledPr(false).HighLight;
},
Set_RStyle : function(Value)
{
if ( Value !== this.Pr.RStyle )
{
var OldValue = this.Pr.RStyle;
this.Pr.RStyle = Value;
History.Add( this, { Type : historyitem_ParaRun_RStyle, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Set_Spacing : function(Value)
{
if ( Value !== this.Pr.Value )
{
var OldValue = this.Pr.Spacing;
this.Pr.Spacing = Value;
History.Add( this, { Type : historyitem_ParaRun_Spacing, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Get_Spacing : function()
{
return this.Get_CompiledPr(false).Spacing;
},
Set_DStrikeout : function(Value)
{
if ( Value !== this.Pr.Value )
{
var OldValue = this.Pr.DStrikeout;
this.Pr.DStrikeout = Value;
History.Add( this, { Type : historyitem_ParaRun_DStrikeout, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( false );
}
},
Get_DStrikeout : function()
{
return this.Get_CompiledPr(false).DStrikeout;
},
Set_Caps : function(Value)
{
if ( Value !== this.Pr.Caps )
{
var OldValue = this.Pr.Caps;
this.Pr.Caps = Value;
History.Add( this, { Type : historyitem_ParaRun_Caps, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Get_Caps : function()
{
return this.Get_CompiledPr(false).Caps;
},
Set_SmallCaps : function(Value)
{
if ( Value !== this.Pr.SmallCaps )
{
var OldValue = this.Pr.SmallCaps;
this.Pr.SmallCaps = Value;
History.Add( this, { Type : historyitem_ParaRun_SmallCaps, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
}
},
Get_SmallCaps : function()
{
return this.Get_CompiledPr(false).SmallCaps;
},
Set_Position : function(Value)
{
if ( Value !== this.Pr.Position )
{
var OldValue = this.Pr.Position;
this.Pr.Position = Value;
History.Add( this, { Type : historyitem_ParaRun_Position, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( false );
}
},
Get_Position : function()
{
return this.Get_CompiledPr(false).Position;
},
Set_RFonts : function(Value)
{
var OldValue = this.Pr.RFonts;
this.Pr.RFonts = Value;
History.Add( this, { Type : historyitem_ParaRun_RFonts, New : Value, Old : OldValue } );
this.Recalc_CompiledPr( true );
},
Get_RFonts : function()
{
return this.Get_CompiledPr(false).RFonts;
},
Set_RFonts2 : function(RFonts)
{
if ( undefined != RFonts )
{
if ( undefined != RFonts.Ascii )
this.Set_RFonts_Ascii( RFonts.Ascii );
if ( undefined != RFonts.HAnsi )
this.Set_RFonts_HAnsi( RFonts.HAnsi );
if ( undefined != RFonts.CS )
this.Set_RFonts_CS( RFonts.CS );
if ( undefined != RFonts.EastAsia )
this.Set_RFonts_EastAsia( RFonts.EastAsia );
if ( undefined != RFonts.Hint )
this.Set_RFonts_Hint( RFonts.Hint );
}
},
Set_RFonts_Ascii : function(Value)
{
if ( Value !== this.Pr.RFonts.Ascii )
{
var OldValue = this.Pr.RFonts.Ascii;
this.Pr.RFonts.Ascii = Value;
History.Add( this, { Type : historyitem_ParaRun_RFonts_Ascii, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
}
},
Set_RFonts_HAnsi : function(Value)
{
if ( Value !== this.Pr.RFonts.HAnsi )
{
var OldValue = this.Pr.RFonts.HAnsi;
this.Pr.RFonts.HAnsi = Value;
History.Add( this, { Type : historyitem_ParaRun_RFonts_HAnsi, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
}
},
Set_RFonts_CS : function(Value)
{
if ( Value !== this.Pr.RFonts.CS )
{
var OldValue = this.Pr.RFonts.CS;
this.Pr.RFonts.CS = Value;
History.Add( this, { Type : historyitem_ParaRun_RFonts_CS, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
}
},
Set_RFonts_EastAsia : function(Value)
{
if ( Value !== this.Pr.RFonts.EastAsia )
{
var OldValue = this.Pr.RFonts.EastAsia;
this.Pr.RFonts.EastAsia = Value;
History.Add( this, { Type : historyitem_ParaRun_RFonts_EastAsia, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
}
},
Set_RFonts_Hint : function(Value)
{
if ( Value !== this.Pr.RFonts.Hint )
{
var OldValue = this.Pr.RFonts.Hint;
this.Pr.RFonts.Hint = Value;
Hstory.Add( this, { Type : historyitem_ParaRun_RFonts_Hint, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(true);
}
},
Set_Lang : function(Value)
{
var OldValue = this.Pr.Lang;
this.Pr.Lang = new CLang();
if ( undefined != Value )
this.Pr.Lang.Set_FromObject( Value );
History.Add( this, { Type : historyitem_ParaRun_Lang, New : NewValue, Old : OldValue } );
this.Recalc_CompiledPr(false);
},
Set_Lang_Bidi : function(Value)
{
if ( Value !== this.Pr.Land.Bidi )
{
var OldValue = this.Pr.Lang.Bidi;
this.Pr.Lang.Bidi = Value;
History.Add( this, { Type : historyitem_ParaRun_Lang_Bidi, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(false);
}
},
Set_Lang_EastAsia : function(Value)
{
if ( Value !== this.Pr.Lang.EastAsia )
{
var OldValue = this.Pr.Lang.EastAsia;
this.Pr.Lang.EastAsia = Value;
History.Add( this, { Type : historyitem_ParaRun_Lang_EastAsia, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(false);
}
},
Set_Lang_Val : function(Value)
{
if ( Value !== this.Pr.Lang.Val )
{
var OldValue = this.Pr.Lang.Val;
this.Pr.Lang.Val = Value;
History.Add( this, { Type : historyitem_ParaRun_Lang_Val, New : Value, Old : OldValue } );
this.Recalc_CompiledPr(false);
}
},
//-----------------------------------------------------------------------------------
// Undo/Redo функции
//-----------------------------------------------------------------------------------
Undo : function(Data)
{
var Type = Data.Type;
switch ( Type )
{
}
},
Redo : function(Data)
{
var Type = Data.Type;
switch ( Type )
{
}
},
};
function CParaRunSelection()
{
this.Use = false;
this.StartPos = false;
this.EndPos = false;
}
function CParaRunState()
{
this.Selection = new CParaRunSelection();
this.ContentPos = 0;
}
function CParaRunRecalcInfo()
{
this.TextPr = true; // Нужно ли пересчитать скомпилированные настройки
this.Measure = true; // Нужно ли перемерять элементы
}
function CParaRunRange(StartPos, EndPos)
{
this.StartPos = StartPos; // Начальная позиция в контенте, с которой начинается данный отрезок
this.EndPos = EndPos; // Конечная позиция в контенте, на которой заканчивается данный отрезок (перед которой)
}
function CParaRunLine()
{
this.Ranges = new Array();
}
CParaRunLine.prototype =
{
Add : function(RangeIndex, StartPos, EndPos)
{
this.Ranges[RangeIndex] = new CParaRunRange( StartPos, EndPos );
}
};
\ No newline at end of file
......@@ -7,6 +7,7 @@
var Default_Tab_Stop = 12.5;
var Default_Heading_Font = "Arial";
var Default_Font = "Arial";
var align_Right = 0;
var align_Left = 1;
......
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