Commit 847d67f7 authored by Ilya Kirillov's avatar Ilya Kirillov

Рефакторинг функции CheckTargetUpdate, CheckCurPage. Также сделана начальная...

Рефакторинг функции CheckTargetUpdate, CheckCurPage. Также сделана начальная обработка этих функций для сносок.
parent 5a92b967
......@@ -1497,7 +1497,7 @@ CDocument.prototype.On_EndLoad = function()
this.Set_FastCollaborativeEditing(true);
}
this.Footnotes.Init();
//this.Footnotes.Init();
};
CDocument.prototype.Add_TestDocument = function()
{
......@@ -3330,8 +3330,6 @@ CDocument.prototype.OnContentReDraw = function(StartPag
CDocument.prototype.CheckTargetUpdate = function()
{
// Проверим можно ли вообще пересчитывать текущее положение.
var bFlag = true;
if (this.DrawingDocument.UpdateTargetFromPaint === true)
{
if (true === this.DrawingDocument.UpdateTargetCheck)
......@@ -3339,19 +3337,7 @@ CDocument.prototype.CheckTargetUpdate = function()
this.DrawingDocument.UpdateTargetCheck = false;
}
if (docpostype_Content === this.CurPos.Type)
{
if (null != this.FullRecalc.Id && this.FullRecalc.StartIndex <= this.CurPos.ContentPos)
bFlag = false;
}
else if (docpostype_DrawingObjects === this.CurPos.Type)
{
// в автофигурах всегда можно проверять текущую позицию
}
else if (docpostype_HdrFtr === this.CurPos.Type)
{
// в колонтитуле всегда можно проверять текущую позицию
}
var bFlag = this.Controller.CanTargetUpdate();
if (true === this.NeedUpdateTarget && true === bFlag && false === this.Selection_Is_TableBorderMove())
{
......@@ -3384,26 +3370,9 @@ CDocument.prototype.Internal_CheckCurPage = function()
if (true === AscCommon.CollaborativeEditing.m_bGlobalLockSelection)
return;
if (docpostype_HdrFtr === this.CurPos.Type)
{
var CurHdrFtr = this.HdrFtr.CurHdrFtr;
if (null !== CurHdrFtr && -1 !== CurHdrFtr.RecalcInfo.CurPage)
this.CurPage = CurHdrFtr.RecalcInfo.CurPage;
}
else if (docpostype_DrawingObjects === this.CurPos.Type)
{
var ParaDrawing = this.DrawingObjects.getMajorParaDrawing();
if (null != ParaDrawing)
this.CurPage = ParaDrawing.PageNum;
}
else
{
var Pos = ( true === this.Selection.Use && selectionflag_Numbering !== this.Selection.Flag ? this.Selection.EndPos : this.CurPos.ContentPos );
if (Pos >= 0 && ( null === this.FullRecalc.Id || this.FullRecalc.StartIndex > Pos ))
{
this.CurPage = this.Content[Pos].Get_CurrentPage_Absolute();
}
}
var nCurPage = this.Controller.GetCurPage();
if (-1 !== nCurPage)
this.CurPage = nCurPage;
};
CDocument.prototype.Set_TargetPos = function(X, Y, PageNum)
{
......@@ -4462,211 +4431,7 @@ CDocument.prototype.CheckRange = function(X0, Y0, X1, Y1, _Y0, _
};
CDocument.prototype.Paragraph_Add = function(ParaItem, bRecalculate)
{
// Работаем с колонтитулом
if (docpostype_HdrFtr === this.CurPos.Type)
{
if (para_NewLine === ParaItem.Type && true === ParaItem.Is_PageOrColumnBreak())
return;
var bRetValue = this.HdrFtr.Paragraph_Add(ParaItem, bRecalculate);
this.Document_UpdateSelectionState();
this.Document_UpdateUndoRedoState();
return bRetValue;
}
else if (docpostype_DrawingObjects === this.CurPos.Type)
{
if (para_NewLine === ParaItem.Type && true === ParaItem.Is_PageOrColumnBreak())
return;
var bRetValue = this.DrawingObjects.paragraphAdd(ParaItem, bRecalculate);
this.Document_UpdateSelectionState();
this.Document_UpdateUndoRedoState();
this.Document_UpdateInterfaceState();
return bRetValue;
}
else //if ( docpostype === this.CurPos.Type )
{
if (true === this.Selection.Use)
{
var Type = ParaItem.Get_Type();
switch (Type)
{
case para_Math:
case para_NewLine:
case para_Text:
case para_Space:
case para_Tab:
case para_PageNum:
case para_Field:
case para_FootnoteReference:
case para_FootnoteRef:
case para_Separator:
case para_ContinuationSeparator:
{
// Если у нас что-то заселекчено и мы вводим текст или пробел
// и т.д., тогда сначала удаляем весь селект.
this.Remove(1, true, false, true);
break;
}
case para_TextPr:
{
switch (this.Selection.Flag)
{
case selectionflag_Common:
{
// Текстовые настройки применяем ко всем параграфам, попавшим
// в селект.
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if (EndPos < StartPos)
{
var Temp = StartPos;
StartPos = EndPos;
EndPos = Temp;
}
for (var Index = StartPos; Index <= EndPos; Index++)
{
this.Content[Index].Add(ParaItem.Copy());
}
if (false != bRecalculate)
{
// Если в TextPr только HighLight, тогда не надо ничего пересчитывать, только перерисовываем
if (true === ParaItem.Value.Check_NeedRecalc())
{
// Нам нужно пересчитать все изменения, начиная с первого элемента,
// попавшего в селект.
this.ContentLastChangePos = StartPos;
this.Recalculate();
}
else
{
// Просто перерисовываем нужные страницы
var StartPage = this.Content[StartPos].Get_StartPage_Absolute();
var EndPage = this.Content[EndPos].Get_StartPage_Absolute() + this.Content[EndPos].Pages.length - 1;
this.ReDraw(StartPage, EndPage);
}
}
break;
}
case selectionflag_Numbering:
{
// Текстовые настройки применяем к конкретной нумерации
if (null == this.Selection.Data || this.Selection.Data.length <= 0)
break;
if (undefined != ParaItem.Value.FontFamily)
{
var FName = ParaItem.Value.FontFamily.Name;
var FIndex = ParaItem.Value.FontFamily.Index;
ParaItem.Value.RFonts = new CRFonts();
ParaItem.Value.RFonts.Ascii = {Name : FName, Index : FIndex};
ParaItem.Value.RFonts.EastAsia = {Name : FName, Index : FIndex};
ParaItem.Value.RFonts.HAnsi = {Name : FName, Index : FIndex};
ParaItem.Value.RFonts.CS = {Name : FName, Index : FIndex};
}
var NumPr = this.Content[this.Selection.Data[0]].Numbering_Get();
var AbstrNum = this.Numbering.Get_AbstractNum(NumPr.NumId);
AbstrNum.Apply_TextPr(NumPr.Lvl, ParaItem.Value);
if (false != bRecalculate)
{
// Нам нужно пересчитать все изменения, начиная с первого элемента,
// попавшего в селект.
this.ContentLastChangePos = this.Selection.Data[0];
this.Recalculate();
}
break;
}
}
this.Document_UpdateSelectionState();
this.Document_UpdateUndoRedoState();
return;
}
}
}
var Item = this.Content[this.CurPos.ContentPos];
var ItemType = Item.GetType();
if (para_NewLine === ParaItem.Type && true === ParaItem.Is_PageOrColumnBreak())
{
if (type_Paragraph === ItemType)
{
if (true === Item.Cursor_IsStart())
{
this.Add_NewParagraph(undefined, true);
var CurPos = this.CurPos.ContentPos - 1;
this.Content[CurPos].Cursor_MoveToStartPos();
this.Content[CurPos].Add(ParaItem);
this.Content[CurPos].Clear_Formatting();
}
else
{
this.Add_NewParagraph(undefined, true);
this.Add_NewParagraph(undefined, true);
var CurPos = this.CurPos.ContentPos - 1;
this.Content[CurPos].Cursor_MoveToStartPos();
this.Content[CurPos].Add(ParaItem);
this.Content[CurPos].Clear_Formatting();
}
if (false != bRecalculate)
{
this.Recalculate();
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
else
{
// TODO: PageBreak в таблице не ставим
return;
}
}
else
{
Item.Add(ParaItem);
if (false != bRecalculate && type_Paragraph == Item.GetType())
{
if (para_TextPr === ParaItem.Type && false === ParaItem.Value.Check_NeedRecalc())
{
// Просто перерисовываем нужные страницы
var StartPage = Item.Get_StartPage_Absolute();
var EndPage = StartPage + Item.Pages.length - 1;
this.ReDraw(StartPage, EndPage);
}
else
{
// Нам нужно пересчитать все изменения, начиная с текущего элемента
this.Recalculate(true);
}
if (false === this.TurnOffRecalcCurPos)
{
Item.RecalculateCurPos();
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState();
}
// Специальная заглушка для функции TextBox_Put
if (true === this.Is_OnRecalculate())
this.Document_UpdateUndoRedoState();
}
this.Controller.AddToParagraph(ParaItem, bRecalculate);
};
CDocument.prototype.Paragraph_ClearFormatting = function()
{
......@@ -16525,6 +16290,13 @@ CDocument.prototype.Goto_FootnotesOnPage = function(nPageIndex)
//----------------------------------------------------------------------------------------------------------------------
// Функции, которые вызываются из CLogicDocumentController
//----------------------------------------------------------------------------------------------------------------------
CDocument.prototype.controller_CanTargetUpdate = function()
{
if (null != this.FullRecalc.Id && this.FullRecalc.StartIndex <= this.CurPos.ContentPos)
return false;
return true;
};
CDocument.prototype.controller_RecalculateCurPos = function()
{
// TODO: Если пересчет идет в большой таблице, разбитой на несколько страниц, то в ней обновление курсора не
......@@ -16536,6 +16308,14 @@ CDocument.prototype.controller_RecalculateCurPos = function()
this.Content[nPos].RecalculateCurPos();
}
};
CDocument.prototype.controller_GetCurPage = function()
{
var Pos = ( true === this.Selection.Use && selectionflag_Numbering !== this.Selection.Flag ? this.Selection.EndPos : this.CurPos.ContentPos );
if (Pos >= 0 && ( null === this.FullRecalc.Id || this.FullRecalc.StartIndex > Pos ))
return this.Content[Pos].Get_CurrentPage_Absolute();
return -1;
};
CDocument.prototype.controller_CursorMoveLeft = function(AddToSelect, Word)
{
if (this.CurPos.ContentPos < 0)
......@@ -16869,6 +16649,189 @@ CDocument.prototype.controller_CursorMoveRight = function(AddToSelect, Word, Fro
}
}
};
CDocument.prototype.controller_AddToParagraph = function(ParaItem, bRecalculate)
{
if (true === this.Selection.Use)
{
var Type = ParaItem.Get_Type();
switch (Type)
{
case para_Math:
case para_NewLine:
case para_Text:
case para_Space:
case para_Tab:
case para_PageNum:
case para_Field:
case para_FootnoteReference:
case para_FootnoteRef:
case para_Separator:
case para_ContinuationSeparator:
{
// Если у нас что-то заселекчено и мы вводим текст или пробел
// и т.д., тогда сначала удаляем весь селект.
this.Remove(1, true, false, true);
break;
}
case para_TextPr:
{
switch (this.Selection.Flag)
{
case selectionflag_Common:
{
// Текстовые настройки применяем ко всем параграфам, попавшим
// в селект.
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if (EndPos < StartPos)
{
var Temp = StartPos;
StartPos = EndPos;
EndPos = Temp;
}
for (var Index = StartPos; Index <= EndPos; Index++)
{
this.Content[Index].Add(ParaItem.Copy());
}
if (false != bRecalculate)
{
// Если в TextPr только HighLight, тогда не надо ничего пересчитывать, только перерисовываем
if (true === ParaItem.Value.Check_NeedRecalc())
{
// Нам нужно пересчитать все изменения, начиная с первого элемента,
// попавшего в селект.
this.ContentLastChangePos = StartPos;
this.Recalculate();
}
else
{
// Просто перерисовываем нужные страницы
var StartPage = this.Content[StartPos].Get_StartPage_Absolute();
var EndPage = this.Content[EndPos].Get_StartPage_Absolute() + this.Content[EndPos].Pages.length - 1;
this.ReDraw(StartPage, EndPage);
}
}
break;
}
case selectionflag_Numbering:
{
// Текстовые настройки применяем к конкретной нумерации
if (null == this.Selection.Data || this.Selection.Data.length <= 0)
break;
if (undefined != ParaItem.Value.FontFamily)
{
var FName = ParaItem.Value.FontFamily.Name;
var FIndex = ParaItem.Value.FontFamily.Index;
ParaItem.Value.RFonts = new CRFonts();
ParaItem.Value.RFonts.Ascii = {Name : FName, Index : FIndex};
ParaItem.Value.RFonts.EastAsia = {Name : FName, Index : FIndex};
ParaItem.Value.RFonts.HAnsi = {Name : FName, Index : FIndex};
ParaItem.Value.RFonts.CS = {Name : FName, Index : FIndex};
}
var NumPr = this.Content[this.Selection.Data[0]].Numbering_Get();
var AbstrNum = this.Numbering.Get_AbstractNum(NumPr.NumId);
AbstrNum.Apply_TextPr(NumPr.Lvl, ParaItem.Value);
if (false != bRecalculate)
{
// Нам нужно пересчитать все изменения, начиная с первого элемента,
// попавшего в селект.
this.ContentLastChangePos = this.Selection.Data[0];
this.Recalculate();
}
break;
}
}
this.Document_UpdateSelectionState();
this.Document_UpdateUndoRedoState();
return;
}
}
}
var Item = this.Content[this.CurPos.ContentPos];
var ItemType = Item.GetType();
if (para_NewLine === ParaItem.Type && true === ParaItem.Is_PageOrColumnBreak())
{
if (type_Paragraph === ItemType)
{
if (true === Item.Cursor_IsStart())
{
this.Add_NewParagraph(undefined, true);
var CurPos = this.CurPos.ContentPos - 1;
this.Content[CurPos].Cursor_MoveToStartPos();
this.Content[CurPos].Add(ParaItem);
this.Content[CurPos].Clear_Formatting();
}
else
{
this.Add_NewParagraph(undefined, true);
this.Add_NewParagraph(undefined, true);
var CurPos = this.CurPos.ContentPos - 1;
this.Content[CurPos].Cursor_MoveToStartPos();
this.Content[CurPos].Add(ParaItem);
this.Content[CurPos].Clear_Formatting();
}
if (false != bRecalculate)
{
this.Recalculate();
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
else
{
// TODO: PageBreak в таблице не ставим
return;
}
}
else
{
Item.Add(ParaItem);
if (false != bRecalculate && type_Paragraph == Item.GetType())
{
if (para_TextPr === ParaItem.Type && false === ParaItem.Value.Check_NeedRecalc())
{
// Просто перерисовываем нужные страницы
var StartPage = Item.Get_StartPage_Absolute();
var EndPage = StartPage + Item.Pages.length - 1;
this.ReDraw(StartPage, EndPage);
}
else
{
// Нам нужно пересчитать все изменения, начиная с текущего элемента
this.Recalculate(true);
}
if (false === this.TurnOffRecalcCurPos)
{
Item.RecalculateCurPos();
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState();
}
// Специальная заглушка для функции TextBox_Put
if (true === this.Is_OnRecalculate())
this.Document_UpdateUndoRedoState();
};
//----------------------------------------------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------------------------------------------
......
......@@ -165,14 +165,38 @@ CDocumentControllerBase.prototype.Get_ParentTextTransform = function()
{
return null;
};
/**
* Данная функция приходит из таблицы. Проверяет рассчитывается ли таблица по содержимому.
* @returns {boolean}
*/
CDocumentControllerBase.prototype.Check_AutoFit = function()
{
return false;
};
/**
* Данная функция нужна для обновления информации о предстоящем пересчете.
*/
CDocumentControllerBase.prototype.Refresh_RecalcData2 = function()
{
};
//----------------------------------------------------------------------------------------------------------------------
// Чисто виртуальные функции
//----------------------------------------------------------------------------------------------------------------------
/**
* Можно ли обновлять позицию курсора.
* @returns {boolean}
*/
CDocumentControllerBase.prototype.CanTargetUpdate = function(){return true;};
/**
* Пересчитываем текущую позицию.
*/
CDocumentControllerBase.prototype.RecalculateCurPos = function(){};
/**
* Получаем текущий номер страницы.
* @returns {number} -1 - значит, номер страницы определеить невозможно
*/
CDocumentControllerBase.prototype.GetCurPage = function(){return -1;};
/**
* Смещаем курсор влево
* @param {boolean} AddToSelect Добавлять ли к селекту смещение
......@@ -188,3 +212,9 @@ CDocumentControllerBase.prototype.Cursor_MoveLeft = function(AddToSelect, Word){
* @returns {boolean} Получилось ли перемещение, или мы достигли предела.
*/
CDocumentControllerBase.prototype.Cursor_MoveRight = function(AddToSelect, Word, FromPaste){return false;};
/**
* Добавляем элемент в параграф.
* @param oItem
* @param {boolean} bRecalculate - Пересчитывать ли после выполнения данной функции.
*/
CDocumentControllerBase.prototype.AddToParagraph = function(oItem, bRecalculate){};
......@@ -20,10 +20,22 @@ function CDrawingsController(LogicDocument, DrawingsObjects)
}
AscCommon.extendClass(CDrawingsController, CDocumentControllerBase);
CDrawingsController.prototype.CanTargetUpdate = function()
{
return true;
};
CDrawingsController.prototype.RecalculateCurPos = function()
{
this.DrawingObjects.recalculateCurPos();
};
CDrawingsController.prototype.GetCurPage = function()
{
var ParaDrawing = this.DrawingObjects.getMajorParaDrawing();
if (null !== ParaDrawing)
return ParaDrawing.PageNum;
return -1;
};
CDrawingsController.prototype.Cursor_MoveLeft = function(AddToSelect, Word)
{
return this.DrawingObjects.cursorMoveLeft(AddToSelect, Word);
......@@ -32,5 +44,15 @@ CDrawingsController.prototype.Cursor_MoveRight = function(AddToSelect, Word, Fro
{
return this.DrawingObjects.cursorMoveRight(AddToSelect, Word, FromPaste);
};
CDrawingsController.prototype.AddToParagraph = function(oItem, bRecalculate)
{
if (para_NewLine === oItem.Type && true === oItem.Is_PageOrColumnBreak())
return;
this.DrawingObjects.paragraphAdd(oItem, bRecalculate);
this.Logicdocument.Document_UpdateSelectionState();
this.Logicdocument.Document_UpdateUndoRedoState();
this.Logicdocument.Document_UpdateInterfaceState();
};
......@@ -234,11 +234,44 @@ CFootnotesController.prototype.Is_EmptyPage = function(nPageIndex)
return false;
};
CFootnotesController.prototype.Refresh_RecalcData2 = function(nRelPageIndex)
{
var nAbsPageIndex = nRelPageIndex;
if (this.LogicDocument.Pages[nAbsPageIndex])
{
var nIndex = this.LogicDocument.Pages[nAbsPageIndex].Pos;
this.LogicDocument.Refresh_RecalcData2(nIndex, nAbsPageIndex);
}
};
//----------------------------------------------------------------------------------------------------------------------
// Интерфейс CDocumentControllerBase
//----------------------------------------------------------------------------------------------------------------------
CFootnotesController.prototype.CanTargetUpdate = function()
{
return true;
};
CFootnotesController.prototype.RecalculateCurPos = function()
{
if (null !== this.CurFootnote)
this.CurFootnote.RecalculateCurPos();
};
CFootnotesController.prototype.GetCurPage = function()
{
// TODO: Доделать селект и курсор
if (true === this.Selection.Use)
{
}
else
{
if (null !== this.CurFootnote)
return this.CurFootnote.Get_StartPage_Absolute();
}
return -1;
};
CFootnotesController.prototype.Cursor_MoveLeft = function(AddToSelect, Word)
{
var bRetValue = false;
......@@ -273,6 +306,18 @@ CFootnotesController.prototype.Cursor_MoveRight = function(AddToSelect, Word, Fr
return bRetValue;
};
CFootnotesController.prototype.AddToParagraph = function(oItem, bRecalculate)
{
// TODO: Доделать селект и курсор
if (true === this.Selection.Use)
{
}
else
{
if (null !== this.CurFootnote)
this.CurFootnote.Paragraph_Add(oItem, bRecalculate);
}
};
function CFootEndnotePage()
{
......
......@@ -23,10 +23,22 @@ function CHdrFtrController(LogicDocument, HdrFtr)
}
AscCommon.extendClass(CHdrFtrController, CDocumentControllerBase);
CHdrFtrController.prototype.CanTargetUpdate = function()
{
return true;
};
CHdrFtrController.prototype.RecalculateCurPos = function()
{
this.HdrFtr.RecalculateCurPos();
};
CHdrFtrController.prototype.GetCurPage = function()
{
var CurHdrFtr = this.HdrFtr.CurHdrFtr;
if (null !== CurHdrFtr && -1 !== CurHdrFtr.RecalcInfo.CurPage)
return CurHdrFtr.RecalcInfo.CurPage;
return -1;
};
CHdrFtrController.prototype.Cursor_MoveLeft = function(AddToSelect, Word)
{
return this.HdrFtr.Cursor_MoveLeft(AddToSelect, Word);
......@@ -35,3 +47,12 @@ CHdrFtrController.prototype.Cursor_MoveRight = function(AddToSelect, Word, FromP
{
return this.HdrFtr.Cursor_MoveRight(AddToSelect, Word, FromPaste);
};
CHdrFtrController.prototype.AddToParagraph = function(oItem, bRecalculate)
{
if (para_NewLine === oItem.Type && true === oItem.Is_PageOrColumnBreak())
return;
this.HdrFtr.Paragraph_Add(oItem, bRecalculate);
this.LogicDocument.Document_UpdateSelectionState();
this.LogicDocument.Document_UpdateUndoRedoState();
};
\ No newline at end of file
......@@ -17,10 +17,18 @@ function CLogicDocumentController(LogicDocument)
}
AscCommon.extendClass(CLogicDocumentController, CDocumentControllerBase);
CLogicDocumentController.prototype.CanTargetUpdate = function()
{
return this.LogicDocument.controller_CanTargetUpdate();
};
CLogicDocumentController.prototype.RecalculateCurPos = function()
{
this.LogicDocument.controller_RecalculateCurPos();
};
CLogicDocumentController.prototype.GetCurPage = function()
{
return this.LogicDocument.controller_GetCurPage();
};
CLogicDocumentController.prototype.Cursor_MoveLeft = function(AddToSelect, Word)
{
return this.LogicDocument.controller_CursorMoveLeft(AddToSelect, Word);
......@@ -29,5 +37,8 @@ CLogicDocumentController.prototype.Cursor_MoveRight = function(AddToSelect, Word
{
return this.LogicDocument.controller_CursorMoveRight(AddToSelect, Word, FromPaste);
};
CLogicDocumentController.prototype.AddToParagraph = function(oItem)
{
this.LogicDocument.controller_AddToParagraph(oItem);
};
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