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

Доработана функция Increase/Decrease FontSize в новом варианте параграфа.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@54337 954022d7-b5bf-4e40-9824-e11837661b57
parent 76afe519
......@@ -8715,6 +8715,8 @@ Paragraph.prototype =
},
IncDec_FontSize : function(bIncrease)
{
if ( true !== Debug_ParaRunMode )
{
this.RecalcInfo.Set_Type_0(pararecalc_0_All);
var StartTextPr = this.Get_CompiledPr().TextPr;
......@@ -8900,6 +8902,91 @@ Paragraph.prototype =
}
}
return true;
}
}
else
{
// Удалим все лишние пустые раны из параграфа
this.Remove_EmptyRuns();
if ( true === this.ApplyToAll )
{
// Применяем настройки ко всем элементам параграфа
var ContentLen = this.Content.length;
for ( var CurPos = 0; CurPos < ContentLen; CurPos++ )
{
this.Content[CurPos].Apply_TextPr( undefined, bIncrease );
}
// Выставляем настройки для символа параграфа
this.TextPr.Apply_TextPr( TextPr );
}
else
{
if ( true === this.Selection.Use )
{
this.Apply_TextPr( undefined, bIncrease );
}
else
{
var CurParaPos = this.Get_ParaContentPos( false, false );
var CurPos = CurParaPos.Get(0);
// Сначала посмотрим на элемент слева и справа(текущий)
var SearchLPos = new CParagraphSearchPos();
this.Get_LeftPos( SearchLPos, CurParaPos );
var RItem = this.Get_RunElementByPos( CurParaPos );
var LItem = ( false === SearchLPos.Found ? null : this.Get_RunElementByPos( SearchLPos.Pos ) );
// 1. Если мы находимся в конце параграфа, тогда применяем заданную настройку к знаку параграфа
// и добавляем пустой ран с заданными настройками.
// 2. Если мы находимся в середине слова (справа и слева текстовый элемент, причем оба не пунктуация),
// тогда меняем настройки для данного слова.
// 3. Во всех остальных случаях вставляем пустой ран с заданными настройкми и переносим курсор в этот
// ран, чтобы при последующем наборе текст отрисовывался с нужными настройками.
if ( null === RItem || para_End === RItem.Type )
{
this.Apply_TextPr( undefined, bIncrease );
// Выставляем настройки для символа параграфа
var EndTextPr = this.Get_CompiledPr2( false).TextPr.Copy();
EndTextPr.Merge( this.TextPr.Value );
// TODO: Как только перенесем историю изменений TextPr в сам класс CTextPr, переделать тут
this.TextPr.Set_FontSize( FontSize_IncreaseDecreaseValue( bIncrease, EndTextPr.FontSize ) );
}
else if ( null !== RItem && null !== LItem && para_Text === RItem.Type && para_Text === LItem.Type && false === RItem.Is_Punctuation() && false === LItem.Is_Punctuation() )
{
var SearchSPos = new CParagraphSearchPos();
var SearchEPos = new CParagraphSearchPos();
this.Get_WordStartPos( SearchSPos, CurParaPos );
this.Get_WordEndPos( SearchEPos, CurParaPos );
// Такого быть не должно, т.к. мы уже проверили, что справа и слева точно есть текст
if ( true !== SearchSPos.Found || true !== SearchEPos.Found )
return;
// Выставим временно селект от начала и до конца слова
this.Selection.Use = true;
this.Set_SelectionContentPos( SearchSPos.Pos, SearchEPos.Pos );
this.Apply_TextPr( undefined, bIncrease );
// Убираем селект
this.Selection_Remove();
}
else
{
this.Apply_TextPr( undefined, bIncrease );
}
}
}
return true;
}
},
......@@ -11593,7 +11680,7 @@ Paragraph.prototype =
}
},
Apply_TextPr : function(TextPr)
Apply_TextPr : function(TextPr, IncFontSize)
{
// Данная функция работает по следующему принципу: если задано выделение, тогда применяем настройки к
// выделенной части, а если выделения нет, тогда в текущее положение вставляем пустой ран с заданными настройками
......@@ -11606,7 +11693,7 @@ Paragraph.prototype =
if ( StartPos === EndPos )
{
var NewElements = this.Content[EndPos].Apply_TextPr( TextPr );
var NewElements = this.Content[EndPos].Apply_TextPr( TextPr, IncFontSize );
if ( para_Run === this.Content[EndPos].Type )
{
......@@ -11636,15 +11723,15 @@ Paragraph.prototype =
for ( var CurPos = StartPos + 1; CurPos < EndPos; CurPos++ )
{
this.Content[CurPos].Apply_TextPr( TextPr );
this.Content[CurPos].Apply_TextPr( TextPr, IncFontSize );
}
var NewElements = this.Content[EndPos].Apply_TextPr( TextPr );
var NewElements = this.Content[EndPos].Apply_TextPr( TextPr, IncFontSize );
if ( para_Run === this.Content[EndPos].Type )
this.Internal_ReplaceRun( EndPos, NewElements );
var NewElements = this.Content[StartPos].Apply_TextPr( TextPr );
var NewElements = this.Content[StartPos].Apply_TextPr( TextPr, IncFontSize );
if ( para_Run === this.Content[StartPos].Type )
this.Internal_ReplaceRun( StartPos, NewElements );
......@@ -11656,7 +11743,7 @@ Paragraph.prototype =
{
var Pos = this.CurPos.ContentPos;
var Element = this.Content[Pos];
var NewElements = Element.Apply_TextPr( TextPr );
var NewElements = Element.Apply_TextPr( TextPr, IncFontSize );
if ( para_Run === Element.Type )
{
......
......@@ -3105,7 +3105,7 @@ ParaRun.prototype =
this.Recalc_CompiledPr(true);
},
Apply_TextPr : function(TextPr)
Apply_TextPr : function(TextPr, IncFontSize)
{
var Result = [];
var LRun = this, CRun = null, RRun = null;
......@@ -3143,7 +3143,16 @@ ParaRun.prototype =
LRun.Selection_Remove();
CRun.Select_All();
if ( undefined === IncFontSize )
CRun.Apply_Pr( TextPr );
else
{
var _TextPr = new CTextPr();
var CurTextPr = this.Get_CompiledPr( false );
CRun.Set_FontSize( FontSize_IncreaseDecreaseValue( IncFontSize, CurTextPr.FontSize ) );
}
if ( null !== RRun )
RRun.Selection_Remove();
......@@ -3184,7 +3193,19 @@ ParaRun.prototype =
CRun.Selection_Remove();
CRun.Cursor_MoveToStartPos();
if ( undefined === IncFontSize )
{
CRun.Apply_Pr( TextPr );
}
else
{
var _TextPr = new CTextPr();
var CurTextPr = this.Get_CompiledPr( false );
CRun.Set_FontSize( FontSize_IncreaseDecreaseValue( IncFontSize, CurTextPr.FontSize ) );
}
if ( null !== RRun )
RRun.Selection_Remove();
......@@ -3877,3 +3898,68 @@ function CParaRunCollaborativeMark(Pos, Type)
this.Pos = Pos;
this.Type = Type;
}
function FontSize_IncreaseDecreaseValue(bIncrease, Value)
{
// Закон изменения размеров :
// 1. Если значение меньше 8, тогда мы увеличиваем/уменьшаем по 1 (от 1 до 8)
// 2. Если значение больше 72, тогда мы увеличиваем/уменьшаем по 10 (от 80 до бесконечности
// 3. Если значение в отрезке [8,72], тогда мы переходим по следующим числам 8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72
var Sizes = [8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72];
var NewValue = Value;
if ( true === bIncrease )
{
if ( Value < Sizes[0] )
{
if ( Value >= Sizes[0] - 1 )
NewValue = Sizes[0];
else
NewValue = Math.floor(Value + 1);
}
else if ( Value >= Sizes[Sizes.length - 1] )
{
NewValue = Math.min( 300, Math.floor( Value / 10 + 1 ) * 10 );
}
else
{
for ( var Index = 0; Index < Sizes.length; Index++ )
{
if ( Value < Sizes[Index] )
{
NewValue = Sizes[Index];
break;
}
}
}
}
else
{
if ( Value <= Sizes[0] )
{
NewValue = Math.max( Math.floor( Value - 1 ), 1 );
}
else if ( Value > Sizes[Sizes.length - 1] )
{
if ( Value <= Math.floor( Sizes[Sizes.length - 1] / 10 + 1 ) * 10 )
NewValue = Sizes[Sizes.length - 1];
else
NewValue = Math.floor( Math.ceil(Value / 10) - 1 ) * 10;
}
else
{
for ( var Index = Sizes.length - 1; Index >= 0; Index-- )
{
if ( Value > Sizes[Index] )
{
NewValue = Sizes[Index];
break;
}
}
}
}
return NewValue;
}
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