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