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

Сделано, чтобы ссылку можно было разбить на 2(баг 24423). Исправлен баг со...

Сделано, чтобы ссылку можно было разбить на 2(баг 24423). Исправлен баг со снятием выделения с таблицы (баг 24450). Исправлен баг с работой функции IncDecFontSize в таблицах (баг 24448). Исправлен баг с пересчетом заголовока в таблицах (баг 24446).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@56458 954022d7-b5bf-4e40-9824-e11837661b57
parent c2550a7d
......@@ -810,6 +810,106 @@ ParaHyperlink.prototype =
return;
}
},
Split : function (ContentPos, Depth)
{
var NewHyperlink = new ParaHyperlink();
NewHyperlink.Set_Value( this.Value );
NewHyperlink.Set_ToolTip( this.ToolTip );
var CurPos = ContentPos.Get(Depth);
var TextPr = this.Get_TextPr(ContentPos, Depth);
// Разделяем текущий элемент (возвращается правая, отделившаяся часть, если она null, тогда заменяем
// ее на пустой ран с заданными настройками).
var NewElement = this.Content[CurPos].Split( ContentPos, Depth + 1 );
if ( null === NewElement )
{
NewElement = new ParaRun();
NewElement.Set_Pr( TextPr.Copy() );
}
// Теперь делим на три части:
// 1. До элемента с номером CurPos включительно (оставляем эту часть в исходном параграфе)
// 2. После элемента с номером CurPos (добавляем эту часть в новый параграф)
// 3. Новый элемент, полученный после разделения элемента с номером CurPos, который мы
// добавляем в начало нового параграфа.
var NewContent = this.Content.slice( CurPos + 1 );
this.Remove_FromContent( CurPos + 1, this.Content.length - CurPos - 1, false );
// Добавляем в новую гиперссылку Right элемент и NewContent
var Count = NewContent.length;
for ( var Pos = 0; Pos < Count; Pos++ )
NewHyperlink.Add_ToContent( Pos, NewContent[Pos], false );
NewHyperlink.Add_ToContent( 0, NewElement, false );
return NewHyperlink;
},
Split2 : function(CurPos)
{
// Создаем новый ран
var NewRun = new ParaRun(this.Paragraph);
// Копируем настройки
NewRun.Set_Pr( this.Pr.Copy() );
// TODO: Как только избавимся от para_End переделать тут
// Проверим, если наш ран содержит para_End, тогда мы должны para_End переметить в правый ран
var CheckEndPos = -1;
var CheckEndPos2 = Math.min( CurPos, this.Content.length );
for ( var Pos = 0; Pos < CheckEndPos2; Pos++ )
{
if ( para_End === this.Content[Pos].Type )
{
CheckEndPos = Pos;
break;
}
}
if ( -1 !== CheckEndPos )
CurPos = CheckEndPos;
// Разделяем содержимое по ранам
NewRun.Concat_ToContent( this.Content.slice(CurPos) );
this.Remove_FromContent( CurPos, this.Content.length - CurPos, true );
// Если были точки орфографии, тогда переместим их в новый ран
var SpellingMarksCount = this.SpellingMarks.length;
for ( var Index = 0; Index < SpellingMarksCount; Index++ )
{
var Mark = this.SpellingMarks[Index];
var MarkPos = ( true === Mark.Start ? Mark.Element.StartPos.Get(Mark.Depth) : Mark.Element.EndPos.Get(Mark.Depth) );
if ( MarkPos >= CurPos )
{
var MarkElement = Mark.Element;
if ( true === Mark.Start )
{
MarkElement.ClassesS[Mark.Depth] = NewRun;
MarkElement.StartPos.Data[Mark.Depth] -= CurPos;
}
else
{
MarkElement.ClassesE[Mark.Depth] = NewRun;
MarkElement.EndPos.Data[Mark.Depth] -= CurPos;
}
NewRun.SpellingMarks.push( Mark );
this.SpellingMarks.splice( Index, 1 );
SpellingMarksCount--;
Index--;
}
}
return NewRun;
},
//-----------------------------------------------------------------------------------
// Функции пересчета
//-----------------------------------------------------------------------------------
......@@ -1117,7 +1217,7 @@ ParaHyperlink.prototype =
{
this.Content[CurPos].Shift_Range(Dx, Dy, _CurLine, _CurRange);
}
},
},
//-----------------------------------------------------------------------------------
// Функции отрисовки
//-----------------------------------------------------------------------------------
......
......@@ -5243,6 +5243,11 @@ Paragraph.prototype =
var Line = ParaPos.Line;
var Range = ParaPos.Range;
// TODO: Отключаем это ускорение в таблицах, т.к. в таблицах и так есть свое ускорение. Но можно и это ускорение
// подключить, для этого надо проверять изменились ли MinMax ширины и набираем ли мы в строке заголовков.
if ( undefined === this.Parent || true === this.Parent.Is_TableCellContent() )
return -1;
// Если мы находимся в строке, которая была полностью перенесена из-за обтекания, и мы добавляем пробел, или
// удаляем символ, тогда нам запускать обычный пересчет, т.к. первое слово может начать убираться в промежутках
......@@ -8258,7 +8263,7 @@ Paragraph.prototype =
for ( var CurPos = 0; CurPos < ContentLen; CurPos++ )
{
this.Content[CurPos].Apply_TextPr( undefined, bIncrease, false );
this.Content[CurPos].Apply_TextPr( undefined, bIncrease, true );
}
}
else
......@@ -16978,121 +16983,68 @@ Paragraph.prototype =
// Разделяем данный параграф
Split : function(NewParagraph, Pos)
{
if ( true !== Debug_ParaRunMode )
{
if ( "undefined" === typeof(Pos) || null === Pos )
Pos = this.CurPos.ContentPos;
// Копируем контент, начиная с текущей позиции в параграфе до конца параграфа,
// в новый параграф (первым элементом выставляем настройки текста, рассчитанные
// для текущей позиции). Проверим, находится ли данная позиция внутри гиперссылки,
// если да, тогда в текущем параграфе закрываем гиперссылку, а в новом создаем ее копию.
var Hyperlink = this.Check_Hyperlink2( Pos, false );
NewParagraph.DeleteCommentOnRemove = false;
this.DeleteCommentOnRemove = false;
var TextPr = this.Internal_CalculateTextPr( Pos );
NewParagraph.DeleteCommentOnRemove = false;
NewParagraph.Internal_Content_Remove2(0, NewParagraph.Content.length);
NewParagraph.Internal_Content_Concat( this.Content.slice( Pos ) );
NewParagraph.Internal_Content_Add( 0, new ParaTextPr( TextPr ) );
NewParagraph.Set_ContentPos( 0 );
NewParagraph.DeleteCommentOnRemove = true;
NewParagraph.TextPr.Value = this.TextPr.Value.Copy();
if ( null != Hyperlink )
NewParagraph.Internal_Content_Add( 1, Hyperlink.Copy() );
// Обнулим селект и курсор
this.Selection_Remove();
NewParagraph.Selection_Remove();
// Удаляем все элементы после текущей позиции и добавляем признак окончания параграфа.
this.DeleteCommentOnRemove = false;
this.Internal_Content_Remove2( Pos, this.Content.length - Pos );
this.Internal_Remove_CollaborativeMarks(false);
this.DeleteCommentOnRemove = true;
// Переносим контент, идущий с текущей позиции в параграфе и до конца параграфа,
// в новый параграф.
if ( null != Hyperlink )
{
// Добавляем конец гиперссылки и пустые текстовые настройки
this.Internal_Content_Add( this.Content.length, new ParaHyperlinkEnd() );
this.Internal_Content_Add( this.Content.length, new ParaTextPr() );
}
var ContentPos = this.Get_ParaContentPos(false, false);
var CurPos = ContentPos.Get(0);
this.Internal_Content_Add( this.Content.length, new ParaEnd() );
this.Internal_Content_Add( this.Content.length, new ParaEmpty() );
var TextPr = this.Get_TextPr(ContentPos);
// Копируем все настройки в новый параграф. Делаем это после того как определили контент параграфов.
this.CopyPr( NewParagraph );
// Разделяем текущий элемент (возвращается правая, отделившаяся часть, если она null, тогда заменяем
// ее на пустой ран с заданными настройками).
var NewElement = this.Content[CurPos].Split( ContentPos, 1 );
this.RecalcInfo.Set_Type_0(pararecalc_0_All);
NewParagraph.RecalcInfo.Set_Type_0(pararecalc_0_All);
}
else
if ( null === NewElement )
{
// TODO: Обработать здесь гиперссылки
NewParagraph.DeleteCommentOnRemove = false;
this.DeleteCommentOnRemove = false;
// Обнулим селект и курсор
this.Selection_Remove();
NewParagraph.Selection_Remove();
// Переносим контент, идущий с текущей позиции в параграфе и до конца параграфа,
// в новый параграф.
var ContentPos = this.Get_ParaContentPos(false, false);
var CurPos = ContentPos.Get(0);
var TextPr = this.Get_TextPr(ContentPos);
// Разделяем текущий элемент (возвращается правая, отделившаяся часть, если она null, тогда заменяем
// ее на пустой ран с заданными настройками).
var NewElement = this.Content[CurPos].Split( ContentPos, 1 );
if ( null === NewElement )
{
NewElement = new ParaRun( NewParagraph );
NewElement.Set_Pr( TextPr.Copy() );
}
NewElement = new ParaRun( NewParagraph );
NewElement.Set_Pr( TextPr.Copy() );
}
// Теперь делим наш параграф на три части:
// 1. До элемента с номером CurPos включительно (оставляем эту часть в исходном параграфе)
// 2. После элемента с номером CurPos (добавляем эту часть в новый параграф)
// 3. Новый элемент, полученный после разделения элемента с номером CurPos, который мы
// добавляем в начало нового параграфа.
// Теперь делим наш параграф на три части:
// 1. До элемента с номером CurPos включительно (оставляем эту часть в исходном параграфе)
// 2. После элемента с номером CurPos (добавляем эту часть в новый параграф)
// 3. Новый элемент, полученный после разделения элемента с номером CurPos, который мы
// добавляем в начало нового параграфа.
var NewContent = this.Content.slice( CurPos + 1 );
this.Internal_Content_Remove2( CurPos + 1, this.Content.length - CurPos - 1 );
var NewContent = this.Content.slice( CurPos + 1 );
this.Internal_Content_Remove2( CurPos + 1, this.Content.length - CurPos - 1 );
// В старый параграф добавим ран с концом параграфа
var EndRun = new ParaRun( this );
EndRun.Add_ToContent( 0, new ParaEnd() );
// В старый параграф добавим ран с концом параграфа
var EndRun = new ParaRun( this );
EndRun.Add_ToContent( 0, new ParaEnd() );
this.Internal_Content_Add( this.Content.length, EndRun );
this.Internal_Content_Add( this.Content.length, EndRun );
// Очищаем новый параграф и добавляем в него Right элемент и NewContent
NewParagraph.Internal_Content_Remove2( 0, NewParagraph.Content.length );
NewParagraph.Internal_Content_Concat( NewContent );
NewParagraph.Internal_Content_Add( 0, NewElement );
// Очищаем новый параграф и добавляем в него Right элемент и NewContent
NewParagraph.Internal_Content_Remove2( 0, NewParagraph.Content.length );
NewParagraph.Internal_Content_Concat( NewContent );
NewParagraph.Internal_Content_Add( 0, NewElement );
// Копируем все настройки в новый параграф. Делаем это после того как определили контент параграфов.
NewParagraph.TextPr.Value = this.TextPr.Value.Copy();
this.CopyPr( NewParagraph );
// Копируем все настройки в новый параграф. Делаем это после того как определили контент параграфов.
NewParagraph.TextPr.Value = this.TextPr.Value.Copy();
this.CopyPr( NewParagraph );
// Если на данном параграфе заканчивалась секция, тогда переносим конец секции на новый параграф
var SectPr = this.Get_SectionPr();
if ( undefined !== SectPr )
{
this.Set_SectionPr( undefined );
NewParagraph.Set_SectionPr( SectPr );
}
// Если на данном параграфе заканчивалась секция, тогда переносим конец секции на новый параграф
var SectPr = this.Get_SectionPr();
if ( undefined !== SectPr )
{
this.Set_SectionPr( undefined );
NewParagraph.Set_SectionPr( SectPr );
}
this.Cursor_MoveToEndPos( false, false );
NewParagraph.Cursor_MoveToStartPos( false );
this.Cursor_MoveToEndPos( false, false );
NewParagraph.Cursor_MoveToStartPos( false );
NewParagraph.DeleteCommentOnRemove = true;
this.DeleteCommentOnRemove = true;
}
NewParagraph.DeleteCommentOnRemove = true;
this.DeleteCommentOnRemove = true;
},
// Присоединяем контент параграфа Para к текущему параграфу
......
......@@ -4334,6 +4334,40 @@ ParaRun.prototype =
this.Set_FontSize( FontSize_IncreaseDecreaseValue( IncFontSize, CurTextPr.FontSize ) );
}
// Дополнительно проверим, если у нас para_End лежит в данном ране и попадает в выделение, тогда
// применим заданные настроки к символу конца параграфа
// TODO: Возможно, стоит на этапе пересчета запонимать, лежит ли para_End в данном ране. Чтобы в каждом
// ране потом не бегать каждый раз по всему массиву в поисках para_End.
var bEnd = false;
var Count = this.Content.length;
for ( var Pos = 0; Pos < Count; Pos++ )
{
if ( para_End === this.Content[Pos].Type )
{
bEnd = true;
break;
}
}
if ( true === bEnd )
{
if ( undefined === IncFontSize )
this.Paragraph.TextPr.Apply_TextPr( TextPr );
else
{
var Para = this.Paragraph;
// Выставляем настройки для символа параграфа
var EndTextPr = Para.Get_CompiledPr2(false).TextPr.Copy();
EndTextPr.Merge( Para.TextPr.Value );
// TODO: Как только перенесем историю изменений TextPr в сам класс CTextPr, переделать тут
Para.TextPr.Set_FontSize( FontSize_IncreaseDecreaseValue( IncFontSize, EndTextPr.FontSize ) );
}
}
}
else
{
......
......@@ -8385,7 +8385,20 @@ CTable.prototype =
}
}
else
{
this.CurCell.Content.Remove(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd);
if ( false === this.CurCell.Content.Is_SelectionUse() )
{
var Cell = this.CurCell;
this.Selection.Use = false;
this.Selection.Start = false;
this.Selection.StartPos.Pos = { Row : Cell.Row.Index, Cell : Cell.Index };
this.Selection.EndPos.Pos = { Row : Cell.Row.Index, Cell : Cell.Index };
}
}
},
Cursor_GetPos : function()
......
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