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

Исправлены баги с Drag-n-drop в колонтитулах. Исправлен баг с рассчетом...

Исправлены баги с Drag-n-drop в колонтитулах. Исправлен баг с рассчетом начальной точки пересчета после добавления разрыва секции и добавления колонтитула первой страницы у секции. Исправлен баг с быстрым пересчетом.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@55628 954022d7-b5bf-4e40-9824-e11837661b57
parent eb1b053f
......@@ -782,6 +782,8 @@ CDocument.prototype =
var Res = Para.Recalculate_Fast( SimpleChanges );
if ( -1 !== Res )
{
//console.log( "Fast Recalc " + Res );
// Если изменения произошли на последней странице параграфа, и за данным параграфом следовал
// пустой параграф с новой секцией, тогда его тоже надо пересчитать.
if ( Res === Para.Get_StartPage_Absolute() + Para.Pages.length - 1 )
......@@ -12735,11 +12737,18 @@ CDocument.prototype =
// В данном месте мы ставим разрыв секции. Чтобы до текущего места ничего не изменилось, мы у новой
// для новой секции копируем все настройки из старой, а в старую секцию выставляем приходящий тип
// разрыва секций.
// разрыва секций. Заметим, что поскольку мы делаем все так, чтобы до текущей страницы ничего не
// изменилось, надо сохранить эту информацию для пересчета, для этого мы помечаем все следующие изменения
// как не влияющие на пересчет.
History.MinorChanges = true;
SectPr.Copy( CurSectPr );
CurSectPr.Set_Type( SectionBreakType );
CurSectPr.Clear_AllHdrFtr();
History.MinorChanges = false;
Element.Set_SectionPr(SectPr);
Element.Refresh_RecalcData2(0, 0);
......@@ -13034,6 +13043,11 @@ CDocumentSectionsInfo.prototype =
{
this.Elements.push( new CDocumentSectionsInfoElement( SectPr, Index ) );
},
Get_SectionsCount : function()
{
return this.Elements.length;
},
Clear : function()
{
......
......@@ -273,8 +273,6 @@ CHeaderFooter.prototype =
if ( -1 === PageIndex )
return;
this.Set_Page( PageIndex );
this.Parent.CurHdrFtr = this;
this.Parent.WaitMouseDown = true;
......@@ -285,6 +283,8 @@ CHeaderFooter.prototype =
if ( true === bUpdateStates )
{
this.Set_Page( PageIndex );
this.LogicDocument.Document_UpdateInterfaceState();
this.LogicDocument.Document_UpdateRulersState();
this.LogicDocument.Document_UpdateSelectionState();
......@@ -890,7 +890,7 @@ CHeaderFooter.prototype =
Selection_Check : function(X, Y, Page_Abs, NearPos)
{
var HdrFtrPage = this.Content.Get_StartPage_Absolute();
if ( HdrFtrPage === Page_Abs )
if ( undefined !== NearPos || HdrFtrPage === Page_Abs )
return this.Content.Selection_Check( X, Y, Page_Abs, NearPos );
return false;
......
......@@ -27,6 +27,7 @@ function CHistory(Document)
};
this.TurnOffHistory = false;
this.MinorChanges = false; // Данный параметр нужен, чтобы определить влияют ли добавленные изменения на пересчет
this.BinaryWriter = new CMemory();
}
......@@ -183,7 +184,9 @@ CHistory.prototype =
{
Pos : Binary_Pos,
Len : Binary_Len
}
},
NeedRecalc : !this.MinorChanges
};
this.Points[this.Index].Items.push( Item );
......@@ -403,7 +406,9 @@ CHistory.prototype =
for ( var Index = 0; Index < Point.Items.length; Index++ )
{
var Item = Point.Items[Index];
Item.Class.Refresh_RecalcData( Item.Data );
if ( true === Item.NeedRecalc )
Item.Class.Refresh_RecalcData( Item.Data );
}
}
}
......
......@@ -5290,7 +5290,8 @@ Paragraph.prototype =
// Если у нас отрезок, в котором произошли изменения является отрезком с нумерацией, тогда надо запустить
// обычный пересчет.
if ( null !== this.Numbering.Item && ( Line < this.Numbering.Line || ( Line === this.Numbering.Line && Range <= this.Numbering.Range ) ) )
var NumPr = this.Get_CompiledPr2(false).ParaPr.NumPr;
if ( null !== this.Numbering.Item && ( Line < this.Numbering.Line || ( Line === this.Numbering.Line && Range <= this.Numbering.Range ) ) && ( undefined !== NumPr && undefined !== NumPr.NumId && 0 !== NumPr.NumId && "0" !== NumPr.NumId ) )
{
// TODO: Сделать проверку на само изменение, переместилась ли нумерация
return -1;
......
......@@ -2377,11 +2377,8 @@ ParaRun.prototype =
Save_RecalculateObject : function(Copy)
{
var RecalcObj = new CRunRecalculateObject(this.StartLine, this.StartRange);
RecalcObj.Save_Lines( this );
RecalcObj.Save_RunContent( this );
// TODO: Разобраться с картинками
RecalcObj.Save_Lines( this, Copy );
RecalcObj.Save_RunContent( this, Copy );
return RecalcObj;
},
......
......@@ -789,17 +789,53 @@ CSectionPr.prototype =
if ( -1 === Index )
return;
if ( 0 === Index )
// Здесь есть 1 исключение: когда мы добавляем колонтитул для первой страницы, может так получиться, что
// у данной секции флаг TitlePage = False, а значит пересчет надо запускать с места где данный колонтитул
// первый раз начнет использоваться, а не с текущей секции.
if ( (historyitem_Section_Header_First === Data.Type || historyitem_Section_Footer_First === Data.Type) && false === this.TitlePage )
{
// Первая секция, значит мы должны пересчитать начиная с самого начала документа
this.LogicDocument.Refresh_RecalcData2(0, 0);
var bHeader = historyitem_Section_Header_First === Data.Type ? true : false
var SectionsCount = this.LogicDocument.SectionsInfo.Get_SectionsCount();
while ( Index < SectionsCount - 1 )
{
Index++;
var TempSectPr = this.LogicDocument.SectionsInfo.Get_SectPr2(Index).SectPr;
// Если в следующей секции свой колонтитул, тогда наш добавленный колонтитул вообще ни на что не влияет
if ( (true === bHeader && null !== TempSectPr.Get_Header_First()) || (true !== bHeader && null !== TempSectPr.Get_Footer_First()) )
break;
// Если в следующей секции есть титульная страница, значит мы нашли нужную секцию
if ( true === TempSectPr.Get_TitlePage() )
{
if ( 0 === Index )
{
this.LogicDocument.Refresh_RecalcData2(0, 0);
}
else
{
var DocIndex = this.LogicDocument.SectionsInfo.Elements[Index - 1].Index + 1;
this.LogicDocument.Refresh_RecalcData2( DocIndex, 0 );
}
}
}
}
else
{
// Ищем номер элемента, на котором закончилась предыдущая секция, начиная со следующего после него элемента
// и пересчитываем документ.
var DocIndex = this.LogicDocument.SectionsInfo.Elements[Index - 1].Index + 1;
this.LogicDocument.Refresh_RecalcData2( DocIndex, 0 );
if ( 0 === Index )
{
// Первая секция, значит мы должны пересчитать начиная с самого начала документа
this.LogicDocument.Refresh_RecalcData2(0, 0);
}
else
{
// Ищем номер элемента, на котором закончилась предыдущая секция, начиная со следующего после него элемента
// и пересчитываем документ.
var DocIndex = this.LogicDocument.SectionsInfo.Elements[Index - 1].Index + 1;
this.LogicDocument.Refresh_RecalcData2( DocIndex, 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