Commit f41d01f1 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@54127 954022d7-b5bf-4e40-9824-e11837661b57
parent 5e4a20ef
......@@ -2958,10 +2958,19 @@ CDocument.prototype =
if ( type_Paragraph == StartType && type_Paragraph == EndType && true === bOnTextAdd )
{
// Встаем в конец параграфа и удаляем 1 элемент (чтобы соединить параграфы)
if ( true !== Debug_ParaRunMode )
{
this.Content[StartPos].CurPos.ContentPos = this.Content[StartPos].Internal_GetEndPos();
this.Remove( 1, true );
}
else
{
this.Content[StartPos].Cursor_MoveToEndPos(false, false);
this.Remove( 1, true );
}
}
else
{
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].Cursor_MoveToStartPos();
......@@ -2987,7 +2996,11 @@ CDocument.prototype =
{
// Встаем в конец параграфа
this.CurPos.ContentPos = StartPos;
if ( true !== Debug_ParaRunMode )
this.Content[StartPos].CurPos.ContentPos = this.Content[StartPos].Internal_GetEndPos();
else
this.Content[StartPos].Cursor_MoveToEndPos( false, false );
}
else if ( type_Table == StartType )
{
......@@ -3036,7 +3049,11 @@ CDocument.prototype =
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
if ( true !== Debug_ParaRunMode )
this.Content[this.CurPos.ContentPos].CurPos.ContentPos = this.Content[this.CurPos.ContentPos].Internal_GetEndPos();
else
this.Content[this.CurPos.ContentPos].Cursor_MoveToEndPos( false, false );
}
else
{
......@@ -3073,7 +3090,11 @@ CDocument.prototype =
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
if ( true !== Debug_ParaRunMode )
this.Content[this.CurPos.ContentPos].CurPos.ContentPos = this.Content[this.CurPos.ContentPos].Internal_GetEndPos();
else
this.Content[this.CurPos.ContentPos].Cursor_MoveToEndPos( false, false );
}
else
{
......
......@@ -484,6 +484,8 @@ Paragraph.prototype =
// Добавляем несколько элементов в конец параграфа.
Internal_Content_Concat : function(Items)
{
if ( true !== Debug_ParaRunMode )
{
// Добавляем только постоянные элементы параграфа
var NewItems = new Array();
......@@ -503,6 +505,23 @@ Paragraph.prototype =
History.Add( this, { Type : historyitem_Paragraph_AddItem, Pos : this.Internal_Get_ClearPos( StartPos ), EndPos : this.Internal_Get_ClearPos( this.Content.length - 1 ), Items : NewItems } );
this.RecalcInfo.Set_Type_0_Spell( pararecalc_0_Spell_All );
}
else
{
var StartPos = this.Content.length;
this.Content = this.Content.concat( Items );
History.Add( this, { Type : historyitem_Paragraph_AddItem, Pos : StartPos, EndPos : this.Content.length - 1, Items : Items } );
// Нам нужно сбросить рассчет всех добавленных элементов и выставить у них родительский класс и параграф
for ( var CurPos = StartPos; CurPos < this.Content.length; CurPos++ )
{
this.Content[CurPos].Reset_Parent( this, this );
this.Content[CurPos].Reset_RecalcInfo();
}
// TODO: Разобраться с орфографией
}
},
// Удаляем элемент из содержимого параграфа. (Здесь передвигаются все позиции
......@@ -4963,14 +4982,67 @@ Paragraph.prototype =
var ParaPos = Run.Get_SimpleChanges_ParaPos(SimpleChanges);
var Line = ParaPos.Line;
var Range = ParaPos.Range;
// Мы должны пересчитать как минимум 3 отрезка: текущий, предыдущий и следующий, потому что при удалении элемента
// или добавлении пробела первое слово в данном отрезке может убраться в предыдущем отрезке, и кроме того при
// удалении возможен вариант, когда мы неправильно определили отрезок (т.е. более ранний взяли)
if ( Range > 0 || Line > 0 )
{
var PrevLine = Line;
var PrevRange = 0;
if ( Range > 0 )
PrevRange = Range - 1;
else
{
PrevLine = Line - 1;
PrevRange = this.Lines[PrevLine].Ranges.length - 1;
}
if ( -1 === this.Recalculate_Fast_Range(PrevLine, PrevRange) )
return -1;
}
var Result = this.Recalculate_Fast_Range( Line, Range );
if ( -1 === Result )
return -1;
if ( Range < this.Lines[Line].Ranges.length - 1 || Line < this.Lines.length - 1 )
{
var NextLine = Line;
var NextRange = 0;
if ( Range < this.Lines[Line].Ranges.length - 1 )
NextRange = Range + 1;
else
{
NextLine = Line + 1;
NextRange = 0;
}
if ( -1 === this.Recalculate_Fast_Range(NextLine, NextRange) )
return -1;
}
// Во время пересчета сбрасываем привязку курсора к строке.
this.CurPos.Line = -1;
return Result;
},
Recalculate_Fast_Range : function(_Line, _Range)
{
var PRS = g_oPRSW;
var XStart, YStart, XLimit, YLimit;
// Определим номер страницы
var CurLine = ParaPos.Line;
var CurRange = ParaPos.Range;
var CurLine = _Line;
var CurRange = _Range;
var CurPage = 0;
var PagesLen = this.Pages.length;
......@@ -4985,7 +5057,7 @@ Paragraph.prototype =
}
if ( -1 === CurPage )
return -1;
return false;
if ( 0 === CurPage )//|| ( undefined != this.Get_FramePr() && this.Parent instanceof CDocument ) )
{
......@@ -5013,11 +5085,11 @@ Paragraph.prototype =
PRS.Reset_Line();
PRS.Page = 0;
PRS.Line = ParaPos.Line;
PRS.Range = ParaPos.Range;
PRS.Line = _Line;
PRS.Range = _Range;
PRS.Paragraph = Run.Paragraph;
PRS.Paragraph = this;
var RangesCount = PRS.RangesCount;
......@@ -5047,6 +5119,11 @@ Paragraph.prototype =
if ( ( true === PRS.NewRange && Pos !== EndPos ) || ( Pos === EndPos && true !== PRS.NewRange ) )
return -1;
else if ( Pos === EndPos && true === PRS.NewRange && true === PRS.MoveToLBP )
{
Item.Recalculate_Set_RangeEndPos(PRS, PRS.LineBreakPos, 1);
}
// Нам нужно проверить только строку с номером CurLine
if ( false === SavedLines[CurLine - Item.StartLine].Compare( Item.Lines[CurLine - Item.StartLine] ) )
......@@ -5076,9 +5153,6 @@ Paragraph.prototype =
if ( recalcresult_NextElement !== RecalcResultAlign )
return -1;
// Во время пересчета сбрасываем привязку курсора к строке.
this.CurPos.Line = -1;
return this.Get_StartPage_Absolute() + CurPage;
},
......@@ -7352,7 +7426,7 @@ Paragraph.prototype =
this.Content[StartPos].Remove(nCount, bOnAddText);
// Мы не удаляем последний элемент с ParaEnd
if ( StartPos !== this.Content.length - 1 && true === this.Content[StartPos].Is_Empty(false) )
if ( StartPos !== this.Content.length - 1 && true === this.Content[StartPos].Is_Empty() )
{
this.Internal_Content_Remove( StartPos );
......@@ -7365,7 +7439,7 @@ Paragraph.prototype =
this.Content[EndPos].Remove(nCount, bOnAddText);
// Мы не удаляем последний элемент с ParaEnd
if ( EndPos !== this.Content.length - 1 && true === this.Content[EndPos].Is_Empty(false) )
if ( EndPos !== this.Content.length - 1 && true === this.Content[EndPos].Is_Empty() )
{
this.Internal_Content_Remove( EndPos );
......@@ -7381,7 +7455,7 @@ Paragraph.prototype =
this.Content[StartPos].Remove(nCount, bOnAddText);
// Мы не удаляем последний элемент с ParaEnd
if ( true === this.Content[StartPos].Is_Empty(false) )
if ( true === this.Content[StartPos].Is_Empty() )
this.Internal_Content_Remove( StartPos );
}
}
......@@ -7410,7 +7484,7 @@ Paragraph.prototype =
Result = false;
else
{
if ( ContentPos !== this.Content.length - 1 && true === this.Content[ContentPos].Is_Empty(false) )
if ( ContentPos !== this.Content.length - 1 && true === this.Content[ContentPos].Is_Empty() )
{
this.Internal_Content_Remove( ContentPos );
......@@ -7476,6 +7550,19 @@ Paragraph.prototype =
}
},
Remove_ParaEnd : function()
{
var ContentLen = this.Content.length;
for ( var CurPos = ContentLen - 1; CurPos >= 0; CurPos-- )
{
var Element = this.Content[CurPos];
// Предполагаем, что para_End лежит только в ране, который лежит только на самом верхнем уровне
if ( para_Run === Element.Type && true === Element.Remove_ParaEnd() )
return;
}
},
Internal_RemoveBackward : function(bOnlyText)
{
var Line = this.Content;
......@@ -8499,7 +8586,7 @@ Paragraph.prototype =
var _CurPos = CurPos + 1;
// Пропускаем пустые раны
while ( true === this.Content[_CurPos].Is_Empty(true) && _CurPos < Count )
while ( true === this.Content[_CurPos].Is_Empty( { SkipAnchor : true } ) && _CurPos < Count )
_CurPos++;
if ( _CurPos < Count && true === this.Content[_CurPos].Is_StartFromNewLine() )
......@@ -11056,7 +11143,7 @@ Paragraph.prototype =
if ( para_Run === Element.Type )
{
if ( CurPos !== this.CurPos.ContentPos && true === Element.Is_Empty(false) )
if ( CurPos !== this.CurPos.ContentPos && true === Element.Is_Empty() )
{
this.Internal_Content_Remove( CurPos );
CurPos--;
......@@ -12978,9 +13065,23 @@ Paragraph.prototype =
// Проверяем пустой ли параграф
IsEmpty : function()
{
if ( true !== Debug_ParaRunMode )
{
var Pos = this.Internal_FindForward( 0, [para_Tab, para_Drawing, para_PageNum, para_Text, para_Space, para_NewLine, para_Math] );
return ( Pos.Found === true ? false : true );
}
else
{
var ContentLen = this.Content.length;
for ( var CurPos = 0; CurPos < ContentLen; CurPos++ )
{
if ( false === this.Content[CurPos].Is_Empty( { SkipEnd : true } ) )
return false;
}
return true;
}
},
// Проверяем, попали ли мы в текст
......@@ -15989,6 +16090,8 @@ Paragraph.prototype =
// Присоединяем контент параграфа Para к текущему параграфу
Concat : function(Para)
{
if ( true !== Debug_ParaRunMode )
{
this.DeleteCommentOnRemove = false;
this.Internal_Content_Remove2( this.Content.length - 2, 2 );
......@@ -16001,6 +16104,17 @@ Paragraph.prototype =
this.Internal_Content_Concat( Para.Content );
this.RecalcInfo.Set_Type_0(pararecalc_0_All);
}
else
{
// TODO: разобраться с комментариями
// Убираем метку конца параграфа у данного параграфа
this.Remove_ParaEnd();
// Добавляем содержимое второго параграфа к первому
this.Internal_Content_Concat( Para.Content );
}
},
// Копируем настройки параграфа и последние текстовые настройки в новый параграф
......
......@@ -73,16 +73,25 @@ ParaRun.prototype =
{
return this.Parent;
},
Reset_Parent : function(Parent, Paragraph)
{
this.Parent = Parent;
this.Paragraph = Paragraph;
},
//-----------------------------------------------------------------------------------
// Функции для работы с содержимым данного рана
//-----------------------------------------------------------------------------------
// Проверяем пустой ли ран
Is_Empty : function(SkipAnchor)
Is_Empty : function(Props)
{
var SkipAnchor = (undefined !== Props ? Props.SkipAnchor : false);
var SkipEnd = (undefined !== Props ? Props.SkipEnd : false);
var Count = this.Content.length;
if ( true !== SkipAnchor )
if ( true !== SkipAnchor && true !== SkipEnd )
{
if ( Count > 0 )
return false;
......@@ -95,7 +104,7 @@ ParaRun.prototype =
{
var Item = this.Content[CurPos];
if ( para_Drawing !== Item.Type || false !== Item.Is_Inline() )
if ( ( true !== SkipAnchor || para_Drawing !== Item.Type || false !== Item.Is_Inline() ) && ( true !== SkipEnd || para_End !== Item.Type ) )
return false;
}
......@@ -140,7 +149,7 @@ ParaRun.prototype =
for ( var CurPos = EndPos - 1; CurPos >= StartPos; CurPos-- )
{
if ( para_End !== this.Content[CurPos].Type )
this.Remove_FromContent( CurPos, 1 );
this.Remove_FromContent( CurPos, 1, true );
}
}
else
......@@ -166,7 +175,7 @@ ParaRun.prototype =
return this.Paragraph.Parent.Select_DrawingObject( this.Content[CurPos - 1].Get_Id() );
}
this.Remove_FromContent( CurPos - 1, 1 );
this.Remove_FromContent( CurPos - 1, 1, true );
this.State.ContentPos = CurPos - 1;
}
......@@ -181,7 +190,7 @@ ParaRun.prototype =
return this.Paragraph.Parent.Select_DrawingObject( this.Content[CurPos].Get_Id() );
}
this.Remove_FromContent( CurPos, 1 );
this.Remove_FromContent( CurPos, 1, true );
this.State.ContentPos = CurPos;
}
......@@ -190,6 +199,28 @@ ParaRun.prototype =
return true;
},
Remove_ParaEnd : function()
{
var Pos = -1;
var ContentLen = this.Content.length;
for ( var CurPos = 0; CurPos < ContentLen; CurPos++ )
{
if ( para_End === this.Content[CurPos].Type )
{
Pos = CurPos;
break;
}
}
if ( -1 === Pos )
return false;
this.Remove_FromContent( Pos, ContentLen - Pos );
return true;
},
// Добавляем элемент в позицию с сохранием в историю
Add_ToContent : function(Pos, Item, UpdatePosition)
{
......@@ -228,6 +259,12 @@ ParaRun.prototype =
if ( Range.EndPos > Pos )
Range.EndPos++;
}
// Особый случай, когда мы добавляем элемент в самый последний ран
if ( Pos === this.Content.length - 1 )
{
this.Lines[CurLine].Ranges[RangesCount - 1].EndPos++;
}
}
// TODO: Поиск, NearPos, SpellCheck
......@@ -576,7 +613,9 @@ ParaRun.prototype =
Get_SimpleChanges_ParaPos : function(Changes)
{
var Change = Changes[0].Data;
var Pos = ( Changes[0].Data.Type === historyitem_ParaRun_AddItem ? Change.Pos : Change.StartPos );
var Type = Changes[0].Data.Type;
//var Pos = ( Changes[0].Data.Type === historyitem_ParaRun_AddItem ? Change.Pos : Change.StartPos );
var Pos = Change.Pos;
var CurLine = 0;
var CurRange = 0;
......@@ -588,7 +627,7 @@ ParaRun.prototype =
for ( CurRange = 0; CurRange < RangesCount; CurRange++ )
{
var Range = this.Lines[CurLine].Ranges[CurRange];
if ( Pos < Range.EndPos && Pos >= Range.StartPos )
if ( ( historyitem_ParaRun_AddItem === Type && Pos < Range.EndPos && Pos >= Range.StartPos ) || ( ( historyitem_ParaRun_RemoveItem === Type && Pos <= Range.EndPos && Pos >= Range.StartPos ) ) )
return new CParaPos( ( CurLine === 0 ? CurRange + this.StartRange : CurRange ), CurLine + this.StartLine, 0, 0 );
}
}
......@@ -1880,6 +1919,11 @@ ParaRun.prototype =
{
return this.RecalcInfo;
},
Reset_RecalcInfo : function()
{
this.RecalcInfo.Reset();
},
//-----------------------------------------------------------------------------------
// Функции отрисовки
//-----------------------------------------------------------------------------------
......@@ -3932,6 +3976,13 @@ function CParaRunRecalcInfo()
CParaRunRecalcInfo.prototype =
{
Reset : function()
{
this.TextPr = true;
this.Measure = true;
this.Recalc = true;
this.RunLen = 0;
}
};
......
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