Files
Yajbir Singh f1b860b25c
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

3612 lines
103 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
/**
* Класс, работающий с концевыми сносками документа
* @param {CDocument} oLogicDocument - Ссылка на главный документ.
* @constructor
* @extends {CDocumentControllerBase}
*/
function CEndnotesController(oLogicDocument)
{
CDocumentControllerBase.call(this, oLogicDocument);
this.Id = oLogicDocument.GetIdCounter().Get_NewId();
this.EndnotePr = new AscWord.FootnotePr(); // Глобальные настройки для сносок
this.EndnotePr.InitDefaultEndnotePr();
this.Endnote = {};
this.Pages = [];
this.Sections = {};
// Специальные сноски
this.ContinuationNotice = null;
this.ContinuationSeparator = null;
this.Separator = null;
this.Selection = {
Use : false,
Start : {
Endnote : null,
Index : 0,
Section : 0,
Page : 0,
Column : 0,
EndnotePageIndex : 0
},
End : {
Endnote : null,
Index : 0,
Section : 0,
Page : 0,
Column : 0,
EndnotePageIndex : 0
},
Endnotes : {},
Direction : 0
};
this.CurEndnote = null;
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
oLogicDocument.GetTableId().Add(this, this.Id);
}
CEndnotesController.prototype = Object.create(CDocumentControllerBase.prototype);
CEndnotesController.prototype.constructor = CEndnotesController;
/**
* Получаем Id данного класса
*/
CEndnotesController.prototype.Get_Id = function()
{
return this.Id;
};
/**
* Получаем Id данного класса
*/
CEndnotesController.prototype.GetId = function()
{
return this.Id;
};
/**
* Начальная инициализация после загрузки
*/
CEndnotesController.prototype.ResetSpecialEndnotes = function()
{
var oSeparator = new CFootEndnote(this);
oSeparator.AddToParagraph(new AscWord.CRunSeparator(), false);
var oParagraph = oSeparator.GetElement(0);
oParagraph.Set_Spacing({After : 0, Line : 1, LineRule : Asc.linerule_Auto}, false);
this.SetSeparator(oSeparator);
var oContinuationSeparator = new CFootEndnote(this);
oContinuationSeparator.AddToParagraph(new AscWord.CRunContinuationSeparator(), false);
oParagraph = oContinuationSeparator.GetElement(0);
oParagraph.Set_Spacing({After : 0, Line : 1, LineRule : Asc.linerule_Auto}, false);
this.SetContinuationSeparator(oContinuationSeparator);
this.SetContinuationNotice(null);
};
/**
* Создаем новую сноску
* @returns {CFootEndnote}
*/
CEndnotesController.prototype.CreateEndnote = function()
{
var oEndnote = new CFootEndnote(this);
this.Endnote[oEndnote.GetId()] = oEndnote;
this.LogicDocument.GetHistory().Add(new CChangesEndnotesAddEndnote(this, oEndnote.GetId()));
return oEndnote;
};
/**
* Добавляем сноску (функция для открытия файла)
* @param {CFootEndnote} oEndnote
*/
CEndnotesController.prototype.AddEndnote = function(oEndnote)
{
this.Endnote[oEndnote.GetId()] = oEndnote;
oEndnote.SetParent(this);
this.LogicDocument.GetHistory().Add(new CChangesEndnotesAddEndnote(this, oEndnote.GetId()));
};
CEndnotesController.prototype.RemoveEndnote = function(oEndnote)
{
delete this.Endnote[oEndnote.GetId()];
this.LogicDocument.GetHistory().Add(new CChangesEndnotesRemoveEndnote(this, oEndnote.GetId()));
};
CEndnotesController.prototype.SetSeparator = CFootnotesController.prototype.SetSeparator;
CEndnotesController.prototype.SetContinuationSeparator = CFootnotesController.prototype.SetContinuationSeparator;
CEndnotesController.prototype.SetContinuationNotice = CFootnotesController.prototype.SetContinuationNotice;
CEndnotesController.prototype.IsSpecialEndnote = CFootnotesController.prototype.IsSpecialFootnote;
CEndnotesController.prototype.SetEndnotePrNumFormat = function(nFormatType)
{
if (undefined !== nFormatType && this.EndnotePr.NumFormat !== nFormatType)
{
this.LogicDocument.GetHistory().Add(new AscDFH.CChangesSectionEndnoteNumFormat(this, this.EndnotePr.NumFormat, nFormatType));
this.EndnotePr.NumFormat = nFormatType;
}
};
CEndnotesController.prototype.SetEndnotePrPos = function(nPos)
{
if (undefined !== nPos && this.EndnotePr.Pos !== nPos)
{
this.LogicDocument.GetHistory().Add(new AscDFH.CChangesSectionEndnotePos(this, this.EndnotePr.Pos, nPos));
this.EndnotePr.Pos = nPos;
}
};
CEndnotesController.prototype.SetEndnotePrNumStart = function(nStart)
{
if (undefined !== nStart && this.EndnotePr.NumStart !== nStart)
{
this.LogicDocument.GetHistory().Add(new AscDFH.CChangesSectionEndnoteNumStart(this, this.EndnotePr.NumStart, nStart));
this.EndnotePr.NumStart = nStart;
}
};
CEndnotesController.prototype.SetEndnotePrNumRestart = function(nRestartType)
{
if (undefined !== nRestartType && this.EndnotePr.NumRestart !== nRestartType)
{
this.LogicDocument.GetHistory().Add(new AscDFH.CChangesSectionEndnoteNumRestart(this, this.EndnotePr.NumRestart, nRestartType));
this.EndnotePr.NumRestart = nRestartType;
}
};
CEndnotesController.prototype.GetEndnotePrPos = function()
{
return this.EndnotePr.Pos;
};
/**
* Проверяем, используется заданная сноска в документе.
* @param {string} sEndnoteId
* @param {CFootEndnote.array} arrEndnotesList
* @returns {boolean}
*/
CEndnotesController.prototype.IsUseInDocument = function(sEndnoteId, arrEndnotesList)
{
if (!arrEndnotesList)
arrEndnotesList = this.private_GetEndnotesLogicRange(null, null);
var oEndnote = null;
for (var nIndex = 0, nCount = arrEndnotesList.length; nIndex < nCount; ++nIndex)
{
var oTempEndnote = arrEndnotesList[nIndex];
if (oTempEndnote.GetId() === sEndnoteId)
{
oEndnote = oTempEndnote;
break;
}
}
if (this.Endnote[sEndnoteId] === oEndnote)
return true;
return false;
};
/**
* Проверяем является ли данная сноска текущей.
* @param oEndnote
* return {boolean}
*/
CEndnotesController.prototype.IsThisElementCurrent = function(oEndnote)
{
if (oEndnote === this.CurEndnote && docpostype_Endnotes === this.LogicDocument.GetDocPosType())
return true;
return false;
};
/**
* Есть ли сноски на заданной странице
* @param {number} nPageAbs
* @returns {boolean}
*/
CEndnotesController.prototype.IsEmptyPage = function(nPageAbs)
{
var oPage = this.Pages[nPageAbs];
if (!oPage)
return true;
for (var nIndex = 0, nCount = oPage.Sections.length; nIndex < nCount; ++nIndex)
{
var oSection = this.Sections[oPage.Sections[nIndex]];
if (!oSection)
continue;
var oSectionPage = oSection.Pages[nPageAbs];
if (!oSectionPage)
continue;
for (var nColumnIndex = 0, nColumnsCount = oSectionPage.Columns.length; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
if (!this.IsEmptyPageColumn(nPageAbs, nColumnIndex, oPage.Sections[nIndex]))
return false;
}
}
return true;
};
CEndnotesController.prototype.IsEmptyPageColumn = function(nPageIndex, nColumnIndex, nSectionIndex)
{
var oColumn = this.private_GetPageColumn(nPageIndex, nColumnIndex, nSectionIndex);
if (!oColumn || oColumn.Elements.length <= 0)
return true;
return false;
};
CEndnotesController.prototype.GetPageBounds = function(nPageAbs, nColumnAbs, nSectionAbs)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs, nSectionAbs);
if (!oColumn)
return new CDocumentBounds(0, 0, 0, 0);
return new CDocumentBounds(oColumn.X, oColumn.Y, oColumn.XLimit, oColumn.Y + oColumn.Height);
};
CEndnotesController.prototype.Refresh_RecalcData = function(Data)
{
};
CEndnotesController.prototype.Refresh_RecalcData2 = function(nRelPageIndex)
{
var nAbsPageIndex = nRelPageIndex;
if (this.LogicDocument.Pages[nAbsPageIndex])
{
var nIndex = this.LogicDocument.Pages[nAbsPageIndex].Pos;
if (nIndex >= this.LogicDocument.Content.length)
{
History.RecalcData_Add({
Type : AscDFH.historyitem_recalctype_NotesEnd,
PageNum : nAbsPageIndex
});
}
else
{
this.LogicDocument.Refresh_RecalcData2(nIndex, nAbsPageIndex);
}
}
};
CEndnotesController.prototype.GetColumnContentFrame = function(nPageAbs, nColumnAbs, nSectionAbs)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs, nSectionAbs);
if (!oColumn)
return {X : 0, Y : 0, XLimit : 0, YLimit : 0};
return {X : oColumn.X, Y : oColumn.Y + oColumn.Height, XLimit : oColumn.XLimit, YLimit : oColumn.YLimit};
};
CEndnotesController.prototype.OnContentReDraw = function(StartPageAbs, EndPageAbs)
{
this.LogicDocument.OnContentReDraw(StartPageAbs, EndPageAbs);
};
CEndnotesController.prototype.GetEndnoteNumberOnPage = function(nPageAbs, nColumnAbs, oSectPr, oCurEndnote)
{
var nNumRestart = section_footnote_RestartContinuous;
var nNumStart = 1;
if (oSectPr)
{
nNumRestart = oSectPr.GetEndnoteNumRestart();
nNumStart = oSectPr.GetEndnoteNumStart();
}
// NumStart никак не влияет в случае RestartEachSect. Влияет только на случай RestartContinuous:
// к общему количеству сносок добавляется данное значение, взятое для текущей секции, этоже значение из предыдущих
// секций не учитывается.
if (section_footnote_RestartEachSect === nNumRestart)
{
for (var nPageIndex = nPageAbs; nPageIndex >= 0; --nPageIndex)
{
var oPage = this.Pages[nPageIndex];
if (oPage && oPage.Endnotes.length > 0)
{
if (oEndnote === oCurEndnote)
return oEndnote.GetNumber();
var oEndnote = oPage.Endnotes[oPage.Endnotes.length - 1];
if (oEndnote.GetReferenceSectPr() !== oSectPr)
return 1;
return oPage.Endnotes[oPage.Endnotes.length - 1].GetNumber() + 1;
}
}
}
else// if (section_footnote_RestartContinuous === nNumRestart)
{
// Здесь нам надо считать, сколько сносок всего в документе до данного момента, отталкиваться от предыдущей мы
// не можем, потому что Word считает общее количество сносок, а не продолжает нумерацию с предыдущей секции,
// т.е. после последнего номера 4 в старой секции, в новой секции может идти уже, например, 9.
var nEndnotesCount = 0;
for (var nPageIndex = nPageAbs; nPageIndex >= 0; --nPageIndex)
{
var oPage = this.Pages[nPageIndex];
if (oPage && oPage.Endnotes.length > 0)
{
for (var nEndnoteIndex = 0, nTempCount = oPage.Endnotes.length; nEndnoteIndex < nTempCount; ++nEndnoteIndex)
{
var oEndnote = oPage.Endnotes[nEndnoteIndex];
if (oEndnote === oCurEndnote)
return oEndnote.GetNumber();
if (oEndnote && true !== oEndnote.IsCustomMarkFollows())
nEndnotesCount++;
}
}
}
return nEndnotesCount + nNumStart;
}
return 1;
};
/**
* Сбрасываем расчетные данные с заданного места
* @param nPageIndex
* @param nSectionIndex
* @param nColumnIndex
*/
CEndnotesController.prototype.Reset = function(nPageIndex, nSectionIndex, nColumnIndex)
{
if (0 === nSectionIndex && 0 === nColumnIndex)
{
this.Pages.length = nPageIndex;
if (!this.Pages[nPageIndex])
this.Pages[nPageIndex] = new CEndnotePage();
}
else
{
this.Pages[nPageIndex].ResetColumn(nSectionIndex, nColumnIndex);
}
};
/**
* Регистрируем сноски на заданной странице
* @param nPageAbs
* @param arrEndnotes
*/
CEndnotesController.prototype.RegisterEndnotes = function(nPageAbs, arrEndnotes)
{
if (!this.Pages[nPageAbs])
return;
this.Pages[nPageAbs].AddEndnotes(arrEndnotes);
};
/**
* Проверяем, есть ли сноски, которые нужно пересчитать в конце заданной секции
* @param oSectPr {AscWord.SectPr} секция, в конце которой мы расчитываем сноски
* @param isFinal {boolean} последняя ли это секция документа
* @returns {boolean}
*/
CEndnotesController.prototype.HaveEndnotes = function(oSectPr, isFinal)
{
var nEndnotesPos = this.GetEndnotePrPos();
if (isFinal && Asc.c_oAscEndnotePos.DocEnd === nEndnotesPos)
{
for (var nCurPage = 0, nPagesCount = this.Pages.length; nCurPage < nPagesCount; ++nCurPage)
{
if (this.Pages[nCurPage].Endnotes.length > 0)
return true;
}
}
else if (Asc.c_oAscEndnotePos.SectEnd === nEndnotesPos)
{
// Мы должны найти просто ссылку на самую последнюю сноску, и если она привязана не данной секции, значит
// в данной секции и не было никаких сносок
for (var nCurPage = this.Pages.length - 1; nCurPage >= 0; --nCurPage)
{
var oPage = this.Pages[nCurPage];
if (oPage.Endnotes.length > 0)
{
return (oSectPr === oPage.Endnotes[oPage.Endnotes.length - 1].GetReferenceSectPr());
}
}
}
return false;
};
CEndnotesController.prototype.ClearSection = function(nSectionIndex)
{
this.Sections.length = nSectionIndex;
this.Sections[nSectionIndex] = new CEndnoteSection();
};
CEndnotesController.prototype.FillSection = function(nPageAbs, nColumnAbs, oSectPr, nSectionIndex, isFinal)
{
var oSection = this.private_UpdateSection(oSectPr, nSectionIndex, isFinal, nPageAbs);
if (oSection.Endnotes.length <= 0)
return recalcresult2_End;
oSection.StartPage = nPageAbs;
oSection.StartColumn = nColumnAbs;
};
CEndnotesController.prototype.Recalculate = function(X, Y, XLimit, YLimit, nPageAbs, nColumnAbs, nColumnsCount, oSectPr, nSectionIndex, isFinal)
{
var oSection = this.Sections[nSectionIndex];
if (!oSection)
return recalcresult2_End;
if (this.Pages[nPageAbs])
this.Pages[nPageAbs].AddSection(nSectionIndex);
var nStartPos = 0;
var isStart = true;
if (nPageAbs < oSection.StartPage || (nPageAbs === oSection.StartPage && nColumnAbs < oSection.StartColumn))
{
// Такого не должно быть
return recalcresult2_End;
}
else if (nPageAbs === oSection.StartPage && nColumnAbs === oSection.StartColumn)
{
nStartPos = 0;
isStart = true;
}
else if (0 === nColumnAbs)
{
if (!oSection.Pages[nPageAbs - 1] || oSection.Pages[nPageAbs - 1].Columns.length <= 0)
return recalcresult2_End;
nStartPos = oSection.Pages[nPageAbs - 1].Columns[oSection.Pages[nPageAbs - 1].Columns.length - 1].EndPos;
isStart = false;
}
else
{
nStartPos = oSection.Pages[nPageAbs].Columns[nColumnAbs - 1].EndPos;
isStart = false;
}
// Случай, когда на предыдущей странице не убралось ни одной сноски и мы перенеслись сразу на следующую
if (-1 === nStartPos)
{
nStartPos = 0;
isStart = true;
}
if (!oSection.Pages[nPageAbs])
{
oSection.Pages[nPageAbs] = new CEndnoteSectionPage();
var nColumnSpace = nColumnAbs > 0 ? oSectPr.GetColumnSpace(nColumnAbs - 1) : 0;
for (var nColumnIndex = 0; nColumnIndex < nColumnAbs; ++nColumnIndex)
{
var oTempColumn = new CEndnoteSectionPageColumn();
oSection.Pages[nPageAbs].Columns[nColumnIndex] = oTempColumn;
oTempColumn.X = X - nColumnSpace;
oTempColumn.Y = Y;
oTempColumn.XLimit = X - nColumnSpace;
oTempColumn.YLimit = YLimit;
}
}
var oColumn = new CEndnoteSectionPageColumn();
oSection.Pages[nPageAbs].Columns[nColumnAbs] = oColumn;
oColumn.X = X;
oColumn.Y = Y;
oColumn.XLimit = XLimit;
oColumn.YLimit = YLimit;
oColumn.StartPos = nStartPos;
var _Y = Y;
if (isStart && this.Separator)
{
this.Separator.PrepareRecalculateObject();
this.Separator.SetSectionIndex(nSectionIndex);
this.Separator.Reset(X, _Y, XLimit, YLimit);
this.Separator.Set_StartPage(nPageAbs, nColumnAbs, nColumnsCount);
this.Separator.Recalculate_Page(0, true);
oColumn.SeparatorRecalculateObject = this.Separator.SaveRecalculateObject();
oColumn.Separator = true;
var oBounds = this.Separator.GetPageBounds(0);
_Y += oBounds.Bottom - oBounds.Top;
oColumn.Height = _Y - Y;
}
else if (!isStart && this.ContinuationSeparator)
{
this.ContinuationSeparator.PrepareRecalculateObject();
this.ContinuationSeparator.SetSectionIndex(nSectionIndex);
this.ContinuationSeparator.Reset(X, _Y, XLimit, YLimit);
this.ContinuationSeparator.Set_StartPage(nPageAbs, nColumnAbs, nColumnsCount);
this.ContinuationSeparator.Recalculate_Page(0, true);
oColumn.SeparatorRecalculateObject = this.ContinuationSeparator.SaveRecalculateObject();
oColumn.Separator = false;
var oBounds = this.Separator.GetPageBounds(0);
_Y += oBounds.Bottom - oBounds.Top;
oColumn.Height = _Y - Y;
}
for (var nPos = nStartPos, nCount = oSection.Endnotes.length; nPos < nCount; ++nPos)
{
var oEndnote = oSection.Endnotes[nPos];
oEndnote.SetSectionIndex(nSectionIndex);
if (isStart || nPos !== nStartPos)
{
oEndnote.Reset(X, _Y, XLimit, YLimit);
oEndnote.Set_StartPage(nPageAbs, nColumnAbs, nColumnsCount);
}
var nRelativePage = oEndnote.GetElementPageIndex(nPageAbs, nColumnAbs);
var nRecalcResult = oEndnote.Recalculate_Page(nRelativePage, true);
if (recalcresult2_NextPage === nRecalcResult)
{
if (nColumnAbs >= nColumnsCount - 1)
this.Pages[nPageAbs].SetContinue(true);
if (0 === nPos && !oEndnote.IsContentOnFirstPage())
{
oColumn.EndPos = -1;
return recalcresult2_NextPage;
}
else
{
oColumn.EndPos = nPos;
oColumn.Elements.push(oEndnote);
var oBounds = oEndnote.GetPageBounds(nRelativePage);
_Y += oBounds.Bottom - oBounds.Top;
oColumn.Height = _Y - Y;
return recalcresult2_NextPage;
}
}
else if (recalcresult2_CurPage === nRecalcResult)
{
// Такого не должно быть при расчете сносок
}
oColumn.EndPos = nPos;
oColumn.Elements.push(oEndnote);
var oBounds = oEndnote.GetPageBounds(nRelativePage);
_Y += oBounds.Bottom - oBounds.Top;
oColumn.Height = _Y - Y;
if (recalcresult2_NextPage === nRecalcResult)
{
return recalcresult2_NextPage;
}
}
for (var nColumnIndex = nColumnAbs + 1; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
var oTempColumn = new CEndnoteSectionPageColumn();
oSection.Pages[nPageAbs].Columns[nColumnIndex] = oTempColumn;
oTempColumn.X = XLimit + 10;
oTempColumn.Y = Y;
oTempColumn.XLimit = XLimit + 5;
oTempColumn.YLimit = YLimit;
}
return recalcresult2_End;
};
CEndnotesController.prototype.private_UpdateSection = function(oSectPr, nSectionIndex, isFinal, nPageAbs)
{
var oPos = this.GetEndnotePrPos();
this.Sections.length = nSectionIndex;
this.Sections[nSectionIndex] = new CEndnoteSection();
for (var nCurPage = 0; nCurPage <= nPageAbs; ++nCurPage)
{
var oPage = this.Pages[nCurPage];
if (oPage)
{
for (var nEndnoteIndex = 0, nEndnotesCount = oPage.Endnotes.length; nEndnoteIndex < nEndnotesCount; ++nEndnoteIndex)
{
if ((oPos === Asc.c_oAscEndnotePos.DocEnd && isFinal) || (oPos === Asc.c_oAscEndnotePos.SectEnd && oPage.Endnotes[nEndnoteIndex].GetReferenceSectPr() === oSectPr))
this.Sections[nSectionIndex].Endnotes.push(oPage.Endnotes[nEndnoteIndex]);
}
}
}
return this.Sections[nSectionIndex];
};
CEndnotesController.prototype.GetLastSectionIndexOnPage = function(nPageAbs)
{
var oPage = this.Pages[nPageAbs];
if (oPage && oPage.Sections.length)
return oPage.Sections[oPage.Sections.length - 1];
return -1;
};
/**
* Отрисовываем сноски на заданной странице.
* @param {number} nPageAbs
* @param {number} nSectionIndex
* @param {CGraphics} oGraphics
*/
CEndnotesController.prototype.Draw = function(nPageAbs, nSectionIndex, oGraphics)
{
var oSection = this.Sections[nSectionIndex];
if (!oSection)
return;
var oPage = oSection.Pages[nPageAbs];
if (!oPage)
return;
for (var nColumnIndex = 0, nColumnsCount = oPage.Columns.length; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
var oColumn = oPage.Columns[nColumnIndex];
if (!oColumn || oColumn.Elements.length <= 0)
continue;
if (oColumn.Separator && this.Separator && oColumn.SeparatorRecalculateObject)
{
this.Separator.LoadRecalculateObject(oColumn.SeparatorRecalculateObject);
this.Separator.Draw(nPageAbs, oGraphics);
} else if (!oColumn.Separator && this.ContinuationSeparator && oColumn.SeparatorRecalculateObject)
{
this.ContinuationSeparator.LoadRecalculateObject(oColumn.SeparatorRecalculateObject);
this.ContinuationSeparator.Draw(nPageAbs, oGraphics);
}
for (var nEndnoteIndex = 0, nEndnotesCount = oColumn.Elements.length; nEndnoteIndex < nEndnotesCount; ++nEndnoteIndex)
{
var oEndnote = oColumn.Elements[nEndnoteIndex];
var nEndnotePageIndex = oEndnote.GetElementPageIndex(nPageAbs, nColumnIndex);
oEndnote.Draw(nEndnotePageIndex + oEndnote.StartPage, oGraphics);
}
}
};
CEndnotesController.prototype.StartSelection = function(X, Y, nPageAbs, oMouseEvent)
{
if (true === this.Selection.Use)
this.RemoveSelection();
var oResult = this.private_GetEndnoteByXY(X, Y, nPageAbs);
if (null === oResult)
{
// BAD
this.Selection.Use = false;
return;
}
this.Selection.Use = true;
this.Selection.Start = oResult;
this.Selection.End = oResult;
this.Selection.Start.Endnote.Selection_SetStart(X, Y, this.Selection.Start.EndnotePageIndex, oMouseEvent);
this.CurEndnote = this.Selection.Start.Endnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[this.Selection.Start.Endnote.GetId()] = this.Selection.Start.Endnote;
this.Selection.Direction = 0;
};
CEndnotesController.prototype.EndSelection = function(X, Y, nPageAbs, oMouseEvent)
{
if (true === this.IsMovingTableBorder())
{
this.CurEndnote.Selection_SetEnd(X, Y, nPageAbs, oMouseEvent);
return;
}
var oResult = this.private_GetEndnoteByXY(X, Y, nPageAbs);
if (null === oResult)
{
// BAD
this.Selection.Use = false;
return;
}
this.Selection.End = oResult;
this.CurEndnote = this.Selection.End.Endnote;
var sStartId = this.Selection.Start.Endnote.GetId();
var sEndId = this.Selection.End.Endnote.GetId();
// Очищаем старый селект везде кроме начальной сноски
for (let sEndnoteId in this.Selection.Endnotes)
{
if (sEndnoteId !== sStartId)
this.Selection.Endnotes[sEndnoteId].RemoveSelection();
}
if (this.Selection.Start.Endnote !== this.Selection.End.Endnote)
{
this.Selection.Direction = this.private_GetSelectionDirection();
this.Selection.Start.Endnote.SetSelectionUse(true);
this.Selection.Start.Endnote.SetSelectionToBeginEnd(false, this.Selection.Direction < 0);
this.Selection.End.Endnote.SetSelectionUse(true);
this.Selection.End.Endnote.SetSelectionToBeginEnd(true, this.Selection.Direction > 0);
this.Selection.End.Endnote.Selection_SetEnd(X, Y, this.Selection.End.EndnotePageIndex, oMouseEvent);
var oRange = this.private_GetEndnotesRange(this.Selection.Start, this.Selection.End);
for (let sEndnoteId in oRange)
{
if (sEndnoteId !== sStartId && sEndnoteId !== sEndId)
{
var oEndnote = oRange[sEndnoteId];
oEndnote.SelectAll();
}
}
this.Selection.Endnotes = oRange;
}
else
{
this.Selection.End.Endnote.Selection_SetEnd(X, Y, this.Selection.End.EndnotePageIndex, oMouseEvent);
this.Selection.Endnotes = {};
this.Selection.Endnotes[this.Selection.Start.Endnote.GetId()] = this.Selection.Start.Endnote;
this.Selection.Direction = 0;
}
};
CEndnotesController.prototype.Set_CurrentElement = function(bUpdateStates, PageAbs, oEndnote)
{
if (oEndnote instanceof CFootEndnote)
{
if (oEndnote.IsSelectionUse())
{
this.CurEndnote = oEndnote;
this.Selection.Use = true;
this.Selection.Direction = 0;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
this.LogicDocument.Selection.Use = true;
this.LogicDocument.Selection.Start = false;
}
else
{
this.private_SetCurrentEndnoteNoSelection(oEndnote);
this.LogicDocument.Selection.Use = false;
this.LogicDocument.Selection.Start = false;
}
var bNeedRedraw = this.LogicDocument.GetDocPosType() === docpostype_HdrFtr;
this.LogicDocument.SetDocPosType(docpostype_Endnotes);
if (false !== bUpdateStates)
{
this.LogicDocument.UpdateInterface();
this.LogicDocument.UpdateRulers();
this.LogicDocument.UpdateSelection();
}
if (bNeedRedraw)
{
this.LogicDocument.DrawingDocument.ClearCachePages();
this.LogicDocument.DrawingDocument.FirePaint();
}
}
};
CEndnotesController.prototype.AddEndnoteRef = function()
{
if (true !== this.private_IsOneEndnoteSelected() || null === this.CurEndnote)
return;
var oEndnote = this.CurEndnote;
var oParagraph = oEndnote.GetFirstParagraph();
if (!oParagraph)
return;
var oStyles = this.LogicDocument.GetStyles();
var oRun = new ParaRun(oParagraph, false);
oRun.AddToContent(0, new AscWord.CRunEndnoteRef(oEndnote), false);
oRun.SetRStyle(oStyles.GetDefaultEndnoteReference());
oParagraph.Add_ToContent(0, oRun);
};
CEndnotesController.prototype.GetCurEndnote = function()
{
return this.CurEndnote;
};
CEndnotesController.prototype.IsInDrawing = function(X, Y, nPageAbs)
{
var oResult = this.private_GetEndnoteByXY(X, Y, nPageAbs);
if (oResult)
{
var oEndnote = oResult.Endnote;
return oEndnote.IsInDrawing(X, Y, oResult.EndnotePageIndex);
}
return false;
};
CEndnotesController.prototype.IsTableBorder = function(X, Y, nPageAbs)
{
var oResult = this.private_GetEndnoteByXY(X, Y, nPageAbs);
if (oResult)
{
var oEndnote = oResult.Endnote;
return oEndnote.IsTableBorder(X, Y, oResult.EndnotePageIndex);
}
return null;
};
CEndnotesController.prototype.IsInText = function(X, Y, nPageAbs)
{
var oResult = this.private_GetEndnoteByXY(X, Y, nPageAbs);
if (oResult)
{
var oEndnote = oResult.Endnote;
return oEndnote.IsInText(X, Y, oResult.EndnotePageIndex);
}
return null;
};
CEndnotesController.prototype.GetNearestPos = function(X, Y, nPageAbs, bAnchor, oDrawing)
{
var oResult = this.private_GetEndnoteByXY(X, Y, nPageAbs);
if (oResult)
{
var oEndnote = oResult.Endnote;
return oEndnote.Get_NearestPos(oResult.EndnotePageIndex, X, Y, bAnchor, oDrawing);
}
return null;
};
/**
* Проверяем попадание в сноски на заданной странице.
* @param X
* @param Y
* @param nPageAbs
* @returns {boolean}
*/
CEndnotesController.prototype.CheckHitInEndnote = function(X, Y, nPageAbs)
{
var isCheckBottom = this.GetEndnotePrPos() === Asc.c_oAscEndnotePos.SectEnd;
if (true === this.IsEmptyPage(nPageAbs))
return false;
var oPage = this.Pages[nPageAbs];
for (var nIndex = 0, nCount = oPage.Sections.length; nIndex < nCount; ++nIndex)
{
var oSection = this.Sections[oPage.Sections[nIndex]];
if (!oSection)
continue;
var _isCheckBottom = isCheckBottom;
if (!_isCheckBottom && oPage.Sections[nIndex] === this.Sections.length - 1 && nPageAbs === this.Pages.length - 1)
_isCheckBottom = false;
var oSectionPage = oSection.Pages[nPageAbs];
var oColumn = null;
var nFindedColumnIndex = 0, nColumnsCount = oSectionPage.Columns.length;
for (var nColumnIndex = 0; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
if (nColumnIndex < nColumnsCount - 1)
{
if (X < (oSectionPage.Columns[nColumnIndex].XLimit + oSectionPage.Columns[nColumnIndex + 1].X) / 2)
{
oColumn = oSectionPage.Columns[nColumnIndex];
nFindedColumnIndex = nColumnIndex;
break;
}
}
else
{
oColumn = oSectionPage.Columns[nColumnIndex];
nFindedColumnIndex = nColumnIndex;
}
}
if (!oColumn || nFindedColumnIndex >= nColumnsCount)
return false;
for (var nElementIndex = 0, nElementsCount = oColumn.Elements.length; nElementIndex < nElementsCount; ++nElementIndex)
{
var oEndnote = oColumn.Elements[nElementIndex];
var nEndnotePageIndex = oEndnote.GetElementPageIndex(nPageAbs, nFindedColumnIndex);
var oBounds = oEndnote.GetPageBounds(nEndnotePageIndex);
if (oBounds.Top <= Y && (!isCheckBottom || oBounds.Bottom >= Y))
return true;
}
}
return false;
};
CEndnotesController.prototype.GetAllParagraphs = function(Props, ParaArray)
{
for (var sId in this.Endnote)
{
var oEndnote = this.Endnote[sId];
oEndnote.GetAllParagraphs(Props, ParaArray);
}
};
CEndnotesController.prototype.GetAllTables = function(oProps, arrTables)
{
if (!arrTables)
arrTables = [];
for (var sId in this.Endnote)
{
var oEndnote = this.Endnote[sId];
oEndnote.GetAllTables(oProps, arrTables);
}
return arrTables;
};
CEndnotesController.prototype.GetFirstParagraphs = function()
{
var aParagraphs = [];
for (var sId in this.Endnote)
{
var oEndnote = this.Endnote[sId];
var oParagrpaph = oEndnote.GetFirstParagraph();
if(oParagrpaph && oParagrpaph.IsUseInDocument())
{
aParagraphs.push(oParagrpaph);
}
}
return aParagraphs;
};
/**
* Перенеслись ли сноски с предыдущей страницы, на новую
* @param nPageAbs
* @returns {boolean}
*/
CEndnotesController.prototype.IsContinueRecalculateFromPrevPage = function(nPageAbs)
{
if (nPageAbs <= 0 || !this.Pages[nPageAbs - 1])
return false;
return (this.Pages[nPageAbs - 1].Sections.length > 0 && true === this.Pages[nPageAbs - 1].Continue);
};
CEndnotesController.prototype.GotoNextEndnote = function()
{
var oNextEndnote = this.private_GetNextEndnote(this.CurEndnote);
if (oNextEndnote)
{
oNextEndnote.MoveCursorToStartPos(false);
this.private_SetCurrentEndnoteNoSelection(oNextEndnote);
}
};
CEndnotesController.prototype.GotoPrevEndnote = function()
{
var oPrevEndnote = this.private_GetPrevEndnote(this.CurEndnote);
if (oPrevEndnote)
{
oPrevEndnote.MoveCursorToStartPos(false);
this.private_SetCurrentEndnoteNoSelection(oPrevEndnote);
}
};
CEndnotesController.prototype.GetNumberingInfo = function(oPara, oNumPr, oEndnote, isUseReview)
{
var oNumberingEngine = new CDocumentNumberingInfoEngine(oPara, oNumPr, this.Get_Numbering());
if (this.IsSpecialEndnote(oEndnote))
{
oEndnote.GetNumberingInfo(oNumberingEngine, oPara, oNumPr);
}
else
{
var arrEndnotes = this.LogicDocument.GetEndnotesList(null, oEndnote);
for (var nIndex = 0, nCount = arrEndnotes.length; nIndex < nCount; ++nIndex)
{
arrEndnotes[nIndex].GetNumberingInfo(oNumberingEngine, oPara, oNumPr);
}
}
if (true === isUseReview)
return [oNumberingEngine.GetNumInfo(), oNumberingEngine.GetNumInfo(false)];
return oNumberingEngine.GetNumInfo();
};
CEndnotesController.prototype.CheckRunContent = function(fCheck)
{
for (var sId in this.Endnote)
{
let oEndnote = this.Endnote[sId];
if (oEndnote.CheckRunContent(fCheck))
return true;
}
return false;
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CEndnotesController.prototype.private_GetPageColumn = function(nPageAbs, nColumnAbs, nSectionAbs)
{
var oSection = this.Sections[nSectionAbs];
if (!oSection)
return null;
var oPage = oSection.Pages[nPageAbs];
if (!oPage)
return null;
var oColumn = oPage.Columns[nColumnAbs];
if (!oColumn)
return null;
return oColumn;
};
CEndnotesController.prototype.private_GetEndnoteOnPageByXY = function(X, Y, nPageAbs)
{
if (true === this.IsEmptyPage(nPageAbs))
return null;
var oPage = this.Pages[nPageAbs];
for (var nSectionIndex = oPage.Sections.length; nSectionIndex >= 0; --nSectionIndex)
{
var oSection = this.Sections[oPage.Sections[nSectionIndex]];
if (!oSection)
continue;
var oSectionPage = oSection.Pages[nPageAbs];
if (!oSectionPage)
continue;
var oColumn = null;
var nColumnIndex = 0;
for (var nColumnsCount = oSectionPage.Columns.length; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
if (nColumnIndex < nColumnsCount - 1)
{
if (X < (oSectionPage.Columns[nColumnIndex].XLimit + oSectionPage.Columns[nColumnIndex + 1].X) / 2)
{
oColumn = oSectionPage.Columns[nColumnIndex];
break;
}
}
else
{
oColumn = oSectionPage.Columns[nColumnIndex];
break;
}
}
if (!oColumn)
continue;
if (oColumn.Elements.length <= 0)
{
var nCurColumnIndex = nColumnIndex - 1;
while (nCurColumnIndex >= 0)
{
if (oSectionPage.Columns[nCurColumnIndex].Elements.length > 0)
{
oColumn = oSectionPage.Columns[nCurColumnIndex];
nColumnIndex = nCurColumnIndex;
break;
}
nCurColumnIndex--;
}
if (nCurColumnIndex < 0)
{
nCurColumnIndex = nColumnIndex + 1;
while (nCurColumnIndex <= oSectionPage.Columns.length - 1)
{
if (oSectionPage.Columns[nCurColumnIndex].Elements.length > 0)
{
oColumn = oSectionPage.Columns[nCurColumnIndex];
nColumnIndex = nCurColumnIndex;
break;
}
nCurColumnIndex++;
}
}
}
if (!oColumn || oColumn.Elements.length <= 0)
continue;
var nStartPos = oColumn.Elements.length - 1;
if (nStartPos > 0)
{
var oEndnote = oColumn.Elements[nStartPos];
if (oEndnote.IsEmptyPage(oEndnote.GetElementPageIndex(nPageAbs, nColumnIndex)))
nStartPos--;
}
for (var nIndex = nStartPos; nIndex >= 0; --nIndex)
{
var oEndnote = oColumn.Elements[nIndex];
var nElementPageIndex = oEndnote.GetElementPageIndex(nPageAbs, nColumnIndex);
var oBounds = oEndnote.GetPageBounds(nElementPageIndex);
if (oBounds.Top <= Y || (0 === nIndex && 0 === nSectionIndex))
return {
Endnote : oEndnote,
Index : nIndex,
Section : oPage.Sections[nSectionIndex],
Page : nPageAbs,
Column : nColumnIndex,
EndnotePageIndex : nElementPageIndex
};
}
}
return null;
};
CEndnotesController.prototype.private_GetEndnoteByXY = function(X, Y, nPageAbs)
{
var oResult = this.private_GetEndnoteOnPageByXY(X, Y, nPageAbs);
if (null !== oResult)
return oResult;
var nCurPage = nPageAbs - 1;
while (nCurPage >= 0)
{
oResult = this.private_GetEndnoteOnPageByXY(MEASUREMENT_MAX_MM_VALUE, MEASUREMENT_MAX_MM_VALUE, nCurPage);
if (null !== oResult)
return oResult;
nCurPage--;
}
nCurPage = nPageAbs + 1;
while (nCurPage < this.Pages.length)
{
oResult = this.private_GetEndnoteOnPageByXY(-MEASUREMENT_MAX_MM_VALUE, -MEASUREMENT_MAX_MM_VALUE, nCurPage);
if (null !== oResult)
return oResult;
nCurPage++;
}
return null;
};
CEndnotesController.prototype.private_GetEndnotesRange = function(Start, End)
{
var oResult = {};
if (Start.Page > End.Page || (Start.Page === End.Page && (Start.Section > End.Section || (Start.Section === End.Section && (Start.Column > End.Column || (Start.Column === End.Column && Start.Index > End.Index))))))
{
var Temp = Start;
Start = End;
End = Temp;
}
if (Start.Page === End.Page)
{
this.private_GetEndnotesOnPage(Start.Page, Start.Section, Start.Column, Start.Index, End.Section, End.Column, End.Index, oResult);
}
else
{
this.private_GetEndnotesOnPage(Start.Page, Start.Section, Start.Column, Start.Index, -1, -1, -1, oResult);
for (var nCurPage = Start.Page + 1; nCurPage <= End.Page - 1; ++nCurPage)
{
this.private_GetEndnotesOnPage(nCurPage, -1, -1, -1, -1, -1, -1, oResult);
}
this.private_GetEndnotesOnPage(End.Page, -1, -1, -1, End.Section, End.Column, End.Index, oResult);
}
return oResult;
};
CEndnotesController.prototype.private_GetEndnotesOnPage = function(nPageAbs, nSectionStart, nColumnStart, nStartIndex, nSectionEnd, nColumnEnd, nEndIndex, oEndnotes)
{
var _nSectionStart = nSectionStart;
var _nSectionEnd = nSectionEnd;
if (-1 === nSectionStart || -1 === nSectionEnd)
{
var oPage = this.Pages[nPageAbs];
if (!oPage || oPage.Sections.length <= 0)
return;
if (-1 === nSectionStart)
_nSectionStart = oPage.Sections[0];
if (-1 === nSectionEnd)
_nSectionEnd = oPage.Sections[oPage.Sections.length - 1];
}
for (var nSectionIndex = _nSectionStart; nSectionIndex <= _nSectionEnd; ++nSectionIndex)
{
var oSection = this.Sections[nSectionIndex];
if (!oSection)
return;
var oSectionPage = oSection.Pages[nPageAbs];
if (!oSectionPage)
return;
var _nColumnStart = -1 === nColumnStart || nSectionIndex !== _nSectionStart ? 0 : nColumnStart;
var _nColumnEnd = -1 === nColumnEnd || nSectionIndex !== _nSectionEnd ? oSectionPage.Columns.length - 1 : nColumnEnd;
var _nStartIndex = -1 === nColumnStart || -1 === nStartIndex ? 0 : nStartIndex;
var _nEndIndex = -1 === nColumnEnd || -1 === nEndIndex ? oSectionPage.Columns[_nColumnEnd].Elements.length - 1 : nEndIndex;
for (var nColIndex = _nColumnStart; nColIndex <= _nColumnEnd; ++nColIndex)
{
var nSIndex = (nSectionIndex === _nSectionStart && nColIndex === _nColumnStart) ? _nStartIndex : 0;
var nEIndex = (nSectionIndex === _nSectionEnd && nColIndex === _nColumnEnd) ? _nEndIndex : oSectionPage.Columns[nColIndex].Elements.length - 1;
this.private_GetEndnotesOnPageColumn(nPageAbs, nColIndex, nSectionIndex, nSIndex, nEIndex, oEndnotes);
}
}
};
CEndnotesController.prototype.private_GetEndnotesOnPageColumn = function(nPageAbs, nColumnAbs, nSectionAbs, nStartIndex, nEndIndex, oEndnotes)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs, nSectionAbs);
var _StartIndex = -1 === nStartIndex ? 0 : nStartIndex;
var _EndIndex = -1 === nEndIndex ? oColumn.Elements.length - 1 : nEndIndex;
for (var nIndex = _StartIndex; nIndex <= _EndIndex; ++nIndex)
{
var oEndnote = oColumn.Elements[nIndex];
oEndnotes[oEndnote.GetId()] = oEndnote;
}
};
CEndnotesController.prototype.private_OnNotValidActionForEndnotes = function()
{
// Пока ничего не делаем, если надо будет выдавать сообщение, то обработать нужно будет здесь
};
CEndnotesController.prototype.private_IsOneEndnoteSelected = function()
{
return (0 === this.Selection.Direction);
};
CEndnotesController.prototype.private_CheckEndnotesSelectionBeforeAction = function()
{
if (true !== this.private_IsOneEndnoteSelected() || null === this.CurEndnote)
{
this.private_OnNotValidActionForEndnotes();
return false;
}
return true;
};
CEndnotesController.prototype.private_SetCurrentEndnoteNoSelection = function(oEndnote)
{
this.Selection.Use = false;
this.CurEndnote = oEndnote;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Direction = 0;
this.Selection.Endnotes = {};
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
};
CEndnotesController.prototype.private_GetPrevEndnote = function(oEndnote)
{
if (!oEndnote)
return null;
var arrList = this.LogicDocument.GetEndnotesList(null, oEndnote);
if (!arrList || arrList.length <= 1 || arrList[arrList.length - 1] !== oEndnote)
return null;
return arrList[arrList.length - 2];
};
CEndnotesController.prototype.private_GetNextEndnote = function(oEndnote)
{
if (!oEndnote)
return null;
var arrList = this.LogicDocument.GetEndnotesList(oEndnote, null);
if (!arrList || arrList.length <= 1 || arrList[0] !== oEndnote)
return null;
return arrList[1];
};
CEndnotesController.prototype.private_GetDirection = function(oEndote1, oEndnote2)
{
// Предполагается, что эти сноски обязательно есть в документе
if (oEndote1 === oEndnote2)
return 0;
var arrList = this.LogicDocument.GetEndnotesList(null, null);
for (var nPos = 0, nCount = arrList.length; nPos < nCount; ++nPos)
{
if (oEndote1 === arrList[nPos])
return 1;
else if (oEndnote2 === arrList[nPos])
return -1;
}
return 0;
};
CEndnotesController.prototype.private_GetEndnotesLogicRange = function(oEndote1, oEndnote2)
{
return this.LogicDocument.GetEndnotesList(oEndote1, oEndnote2);
};
CEndnotesController.prototype.private_GetSelectionArray = function()
{
if (true !== this.Selection.Use || 0 === this.Selection.Direction)
return [this.CurEndnote];
if (1 === this.Selection.Direction)
return this.private_GetEndnotesLogicRange(this.Selection.Start.Endnote, this.Selection.End.Endnote);
else
return this.private_GetEndnotesLogicRange(this.Selection.End.Endnote, this.Selection.Start.Endnote);
};
CEndnotesController.prototype.private_GetSelectionDirection = function()
{
if (this.Selection.Start.Page > this.Selection.End.Page)
return -1;
else if (this.Selection.Start.Page < this.Selection.End.Page)
return 1;
if (this.Selection.Start.Section > this.Selection.End.Section)
return -1;
else if (this.Selection.Start.Section < this.Selection.End.Section)
return 1;
if (this.Selection.Start.Column > this.Selection.End.Column)
return -1;
else if (this.Selection.Start.Column < this.Selection.End.Column)
return 1;
return this.Selection.Start.Index > this.Selection.End.Index ? -1 : 1;
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Controller area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CEndnotesController.prototype.CanUpdateTarget = function()
{
var oLogicDocument = this.LogicDocument;
if (!oLogicDocument)
return false;
var oCurEndnote = this.CurEndnote;
if (null !== oLogicDocument.FullRecalc.Id && oCurEndnote)
{
var nPageAbs = oLogicDocument.FullRecalc.PageIndex;
var nSectionIndex = oCurEndnote.GetSectionIndex();
var nLastIndex = this.LogicDocument.GetElementsCount() - 1;
if (Asc.c_oAscEndnotePos.SectEnd === this.GetEndnotePrPos())
nLastIndex = this.LogicDocument.SectionsInfo.Get(nSectionIndex).Index;
if (oLogicDocument.FullRecalc.StartIndex < nLastIndex || (oLogicDocument.FullRecalc.StartIndex === nLastIndex && !oLogicDocument.FullRecalc.Endnotes))
return false;
if (!oLogicDocument.FullRecalc.Endnotes)
return true;
var _nSectionIndex = this.LogicDocument.SectionsInfo.Find(oLogicDocument.FullRecalc.SectPr);
if (_nSectionIndex < nSectionIndex)
return false;
else if (_nSectionIndex > nSectionIndex)
return true;
var oSection = this.Sections[nSectionIndex];
if (!oSection)
return false;
var nStartPos = 0;
if (nPageAbs - 1 <= oSection.StartPage || !oSection.Pages[nPageAbs - 1] || !oSection.Pages[nPageAbs - 1].Columns.length)
{
return false;
}
else
{
nStartPos = oSection.Pages[nPageAbs - 1].Columns[0].EndPos;
}
if (oSection.Endnotes[nStartPos] === this.CurEndnote)
{
var nEndnotePageIndex = this.CurEndnote.GetElementPageIndex(oLogicDocument.FullRecalc.PageIndex, oLogicDocument.FullRecalc.ColumnIndex);
return this.CurEndnote.CanUpdateTarget(nEndnotePageIndex);
}
else
{
for (var nPos = 0; nPos < nStartPos; ++nPos)
{
if (this.CurEndnote === oSection.Endnotes[nPos])
return true;
}
}
return false;
}
return true;
};
CEndnotesController.prototype.RecalculateCurPos = function(bUpdateX, bUpdateY, isUpdateTarget)
{
if (this.CurEndnote)
return this.CurEndnote.RecalculateCurPos(bUpdateX, bUpdateY, isUpdateTarget);
return {X : 0, Y : 0, Height : 0, PageNum : 0, Internal : {Line : 0, Page : 0, Range : 0}, Transform : null};
};
CEndnotesController.prototype.GetCurPage = function()
{
if (this.CurEndnote)
return this.CurEndnote.GetAbsoluteStartPage();
return -1;
};
CEndnotesController.prototype.AddNewParagraph = function(bRecalculate, bForceAdd)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.AddNewParagraph(bRecalculate, bForceAdd);
};
CEndnotesController.prototype.AddInlineImage = function(nW, nH, oImage, oGraphicObject, bFlow)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.AddInlineImage(nW, nH, oImage, oGraphicObject, bFlow);
};
CEndnotesController.prototype.AddImages = function(aImages)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.AddImages(aImages);
};
CEndnotesController.prototype.AddOleObject = function(W, H, nWidthPix, nHeightPix, Img, Data, sApplicationId, bSelect, arrImagesForAddToHistory)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return null;
return this.CurEndnote.AddOleObject(W, H, nWidthPix, nHeightPix, Img, Data, sApplicationId, bSelect, arrImagesForAddToHistory);
};
CEndnotesController.prototype.AddTextArt = function(nStyle)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.AddTextArt(nStyle);
};
CEndnotesController.prototype.AddSignatureLine = function(oSignatureDrawing)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.AddSignatureLine(oSignatureDrawing);
};
CEndnotesController.prototype.LoadChartData = function(bNeedRecalculate)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.LoadChartData(bNeedRecalculate);
};
CEndnotesController.prototype.EditChart = function(oChartPr)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.EditChart(oChartPr);
};
CEndnotesController.prototype.UpdateChart = function(oChart)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.UpdateChart(oChart);
};
CEndnotesController.prototype.OpenChartEditor = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.OpenChartEditor();
};
CEndnotesController.prototype.ApplyChartSettings = function(oChartSettings)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
return this.CurEndnote.ApplyChartSettings(oChartSettings);
};
CEndnotesController.prototype.GetChartSettings = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
return this.CurEndnote.GetChartSettings();
};
CEndnotesController.prototype.OpenOleEditor = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.OpenChartEditor();
};
CEndnotesController.prototype.AddInlineTable = function(nCols, nRows, nMode)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return null;
if (this.CurEndnote)
return this.CurEndnote.AddInlineTable(nCols, nRows, nMode);
return null;
};
CEndnotesController.prototype.ClearParagraphFormatting = function(isClearParaPr, isClearTextPr)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.ClearParagraphFormatting(isClearParaPr, isClearTextPr);
}
};
CEndnotesController.prototype.AddToParagraph = function(oItem, bRecalculate)
{
if (para_NewLine === oItem.Type && true === oItem.IsPageBreak())
return;
if (oItem instanceof ParaTextPr)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.AddToParagraph(oItem, false);
}
if (false !== bRecalculate)
{
this.LogicDocument.Recalculate();
}
}
else
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
if (null !== this.CurEndnote)
this.CurEndnote.AddToParagraph(oItem, bRecalculate);
}
};
CEndnotesController.prototype.Remove = function(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.Remove(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord);
};
CEndnotesController.prototype.GetCursorPosXY = function()
{
// Если есть селект, тогда конец селекта совпадает с CurEndnote
if (null !== this.CurEndnote)
return this.CurEndnote.GetCursorPosXY();
return {X : 0, Y : 0}
};
CEndnotesController.prototype.MoveCursorToStartPos = function(AddToSelect)
{
if (true !== AddToSelect)
{
this.LogicDocument.controller_MoveCursorToStartPos(false);
}
else
{
var oEndnote = this.CurEndnote;
if (true === this.Selection.Use)
oEndnote = this.Selection.Start.Endnote;
var arrRange = this.LogicDocument.GetEndnotesList(null, oEndnote);
if (arrRange.length <= 0)
return;
if (true !== this.Selection.Use)
this.LogicDocument.StartSelectionFromCurPos();
this.Selection.End.Endnote = arrRange[0];
this.Selection.Start.Endnote = oEndnote;
this.Selection.Endnotes = {};
oEndnote.MoveCursorToStartPos(true);
this.Selection.Endnotes = {};
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
for (var nIndex = 0, nCount = arrRange.length; nIndex < nCount; ++nIndex)
{
var oTempEndnote = arrRange[nIndex];
if (oTempEndnote !== oEndnote)
{
oTempEndnote.SelectAll(-1);
this.Selection.Endnotes[oTempEndnote.GetId()] = oTempEndnote;
}
}
if (this.Selection.Start.Endnote !== this.Selection.End.Endnote)
this.Selection.Direction = -1;
else
this.Selection.Direction = 0;
}
};
CEndnotesController.prototype.MoveCursorToEndPos = function(AddToSelect)
{
if (true !== AddToSelect)
{
this.LogicDocument.controller_MoveCursorToEndPos(false);
}
else
{
var oEndnote = this.CurEndnote;
if (true === this.Selection.Use)
oEndnote = this.Selection.Start.Endnote;
var arrRange = this.LogicDocument.GetEndnotesList(oEndnote, null);
if (arrRange.length <= 0)
return;
if (true !== this.Selection.Use)
this.LogicDocument.StartSelectionFromCurPos();
this.Selection.End.Endnote = arrRange[arrRange.length - 1];
this.Selection.Start.Endnote = oEndnote;
this.Selection.Endnotes = {};
oEndnote.MoveCursorToEndPos(true);
this.Selection.Endnotes = {};
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
for (var nIndex = 0, nCount = arrRange.length; nIndex < nCount; ++nIndex)
{
var oTempEndnote = arrRange[nIndex];
if (oTempEndnote !== oEndnote)
{
oTempEndnote.SelectAll(1);
this.Selection.Endnotes[oTempEndnote.Get_Id()] = oTempEndnote;
}
}
if (this.Selection.Start.Endnote !== this.Selection.End.Endnote)
this.Selection.Direction = 1;
else
this.Selection.Direction = 0;
}
};
CEndnotesController.prototype.MoveCursorLeft = function(AddToSelect, Word)
{
if (true === this.Selection.Use)
{
if (true !== AddToSelect)
{
var oEndnote = this.CurEndnote;
if (0 === this.Selection.Direction)
oEndnote = this.CurEndnote;
else if (1 === this.Selection.Direction)
oEndnote = this.Selection.Start.Endnote;
else
oEndnote = this.Selection.End.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (oEndnote !== this.Selection.Endnotes[sId])
this.Selection.Endnotes[sId].RemoveSelection();
}
oEndnote.MoveCursorLeft(false, Word);
oEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(oEndnote);
}
else
{
var oEndnote = this.Selection.End.Endnote;
if (false === oEndnote.MoveCursorLeft(true, Word))
{
var oPrevEndnote = this.private_GetPrevEndnote(oEndnote);
if (null === oPrevEndnote)
return false;
if (1 !== this.Selection.Direction)
{
this.Selection.End.Endnote = oPrevEndnote;
this.Selection.Direction = -1;
this.CurEndnote = oPrevEndnote;
this.Selection.Endnotes[oPrevEndnote.GetId()] = oPrevEndnote;
oPrevEndnote.MoveCursorToEndPos(false, true);
oPrevEndnote.MoveCursorLeft(true, Word);
}
else
{
this.Selection.End.Endnote = oPrevEndnote;
this.CurEndnote = oPrevEndnote;
if (oPrevEndnote === this.Selection.Start.Endnote)
this.Selection.Direction = 0;
oEndnote.RemoveSelection();
delete this.Selection.Endnotes[oEndnote.GetId()];
oPrevEndnote.MoveCursorLeft(true, Word);
}
}
}
}
else
{
if (true === AddToSelect)
{
var oEndnote = this.CurEndnote;
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
if (false === oEndnote.MoveCursorLeft(true, Word))
{
var oPrevEndnote = this.private_GetPrevEndnote(oEndnote);
if (null === oPrevEndnote)
return false;
this.Selection.End.Endnote = oPrevEndnote;
this.Selection.Direction = -1;
this.CurEndnote = oPrevEndnote;
this.Selection.Endnotes[oPrevEndnote.GetId()] = oPrevEndnote;
oPrevEndnote.MoveCursorToEndPos(false, true);
oPrevEndnote.MoveCursorLeft(true, Word);
}
}
else
{
var oEndnote = this.CurEndnote;
if (false === oEndnote.MoveCursorLeft(false, Word))
{
var oPrevEndnote = this.private_GetPrevEndnote(oEndnote);
if (null === oPrevEndnote)
return false;
this.Selection.Start.Endnote = oPrevEndnote;
this.Selection.End.Endnote = oPrevEndnote;
this.Selection.Direction = 0;
this.CurEndnote = oPrevEndnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[oPrevEndnote.GetId()] = oPrevEndnote;
oPrevEndnote.MoveCursorToEndPos(false);
}
}
}
return true;
};
CEndnotesController.prototype.MoveCursorRight = function(AddToSelect, Word, FromPaste)
{
if (true === this.Selection.Use)
{
if (true !== AddToSelect)
{
var oEndnote = this.CurEndnote;
if (0 === this.Selection.Direction)
oEndnote = this.CurEndnote;
else if (1 === this.Selection.Direction)
oEndnote = this.Selection.End.Endnote;
else
oEndnote = this.Selection.Start.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (oEndnote !== this.Selection.Endnotes[sId])
this.Selection.Endnotes[sId].RemoveSelection();
}
oEndnote.MoveCursorRight(false, Word, FromPaste);
oEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(oEndnote);
}
else
{
var oEndnote = this.Selection.End.Endnote;
if (false === oEndnote.MoveCursorRight(true, Word, FromPaste))
{
var oNextEndnote = this.private_GetNextEndnote(oEndnote);
if (null === oNextEndnote)
return false;
if (-1 !== this.Selection.Direction)
{
this.Selection.End.Endnote = oNextEndnote;
this.Selection.Direction = 1;
this.CurEndnote = oNextEndnote;
this.Selection.Endnotes[oNextEndnote.GetId()] = oNextEndnote;
oNextEndnote.MoveCursorToStartPos(false);
oNextEndnote.MoveCursorRight(true, Word, FromPaste);
}
else
{
this.Selection.End.Endnote = oNextEndnote;
this.CurEndnote = oNextEndnote;
if (oNextEndnote === this.Selection.Start.Endnote)
this.Selection.Direction = 0;
oEndnote.RemoveSelection();
delete this.Selection.Endnotes[oEndnote.GetId()];
oNextEndnote.MoveCursorRight(true, Word, FromPaste);
}
}
}
}
else
{
if (true === AddToSelect)
{
var oEndnote = this.CurEndnote;
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
if (false === oEndnote.MoveCursorRight(true, Word, FromPaste))
{
var oNextEndnote = this.private_GetNextEndnote(oEndnote);
if (null === oNextEndnote)
return false;
this.Selection.End.Endnote = oNextEndnote;
this.Selection.Direction = 1;
this.CurEndnote = oNextEndnote;
this.Selection.Endnotes[oNextEndnote.GetId()] = oNextEndnote;
oNextEndnote.MoveCursorToStartPos(false);
oNextEndnote.MoveCursorRight(true, Word, FromPaste);
}
}
else
{
var oEndnote = this.CurEndnote;
if (false === oEndnote.MoveCursorRight(false, Word, FromPaste))
{
var oNextEndnote = this.private_GetNextEndnote(oEndnote);
if (null === oNextEndnote)
return false;
this.Selection.Start.Endnote = oNextEndnote;
this.Selection.End.Endnote = oNextEndnote;
this.Selection.Direction = 0;
this.CurEndnote = oNextEndnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[oNextEndnote.GetId()] = oNextEndnote;
oNextEndnote.MoveCursorToStartPos(false);
}
}
}
return true;
};
CEndnotesController.prototype.MoveCursorUp = function(AddToSelect)
{
if (true === this.Selection.Use)
{
if (true === AddToSelect)
{
var oEndnote = this.Selection.End.Endnote;
var oPos = oEndnote.GetCursorPosXY();
if (false === oEndnote.MoveCursorUp(true))
{
var oPrevEndnote = this.private_GetPrevEndnote(oEndnote);
if (null === oPrevEndnote)
return false;
oEndnote.MoveCursorToStartPos(true);
if (1 !== this.Selection.Direction)
{
this.Selection.End.Endnote = oPrevEndnote;
this.Selection.Direction = -1;
this.CurEndnote = oPrevEndnote;
this.Selection.Endnotes[oPrevEndnote.GetId()] = oPrevEndnote;
oPrevEndnote.MoveCursorUpToLastRow(oPos.X, oPos.Y, true);
}
else
{
this.Selection.End.Endnote = oPrevEndnote;
this.CurEndnote = oPrevEndnote;
if (oPrevEndnote === this.Selection.Start.Endnote)
this.Selection.Direction = 0;
oEndnote.RemoveSelection();
delete this.Selection.Endnotes[oEndnote.GetId()];
oPrevEndnote.MoveCursorUpToLastRow(oPos.X, oPos.Y, true);
}
}
}
else
{
var oEndnote = this.CurEndnote;
if (0 === this.Selection.Direction)
oEndnote = this.CurEndnote;
else if (1 === this.Selection.Direction)
oEndnote = this.Selection.Start.Endnote;
else
oEndnote = this.Selection.End.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (oEndnote !== this.Selection.Endnotes[sId])
this.Selection.Endnotes[sId].RemoveSelection();
}
oEndnote.MoveCursorLeft(false, false);
oEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(oEndnote);
}
}
else
{
if (true === AddToSelect)
{
var oEndnote = this.CurEndnote;
var oPos = oEndnote.GetCursorPosXY();
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
if (false === oEndnote.MoveCursorUp(true))
{
var oPrevEndnote = this.private_GetPrevEndnote(oEndnote);
if (null === oPrevEndnote)
return false;
oEndnote.MoveCursorToStartPos(true);
this.Selection.End.Endnote = oPrevEndnote;
this.Selection.Direction = -1;
this.CurEndnote = oPrevEndnote;
this.Selection.Endnotes[oPrevEndnote.GetId()] = oPrevEndnote;
oPrevEndnote.MoveCursorUpToLastRow(oPos.X, oPos.Y, true);
}
}
else
{
var oEndnote = this.CurEndnote;
var oPos = oEndnote.GetCursorPosXY();
if (false === oEndnote.MoveCursorUp(false))
{
var oPrevEndnote = this.private_GetPrevEndnote(oEndnote);
if (null === oPrevEndnote)
return false;
this.Selection.Start.Endnote = oPrevEndnote;
this.Selection.End.Endnote = oPrevEndnote;
this.Selection.Direction = 0;
this.CurEndnote = oPrevEndnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[oPrevEndnote.GetId()] = oPrevEndnote;
oPrevEndnote.MoveCursorUpToLastRow(oPos.X, oPos.Y, false);
}
}
}
return true;
};
CEndnotesController.prototype.MoveCursorDown = function(AddToSelect)
{
if (true === this.Selection.Use)
{
if (true === AddToSelect)
{
var oEndnote = this.Selection.End.Endnote;
var oPos = oEndnote.GetCursorPosXY();
if (false === oEndnote.MoveCursorDown(true))
{
var oNextEndnote = this.private_GetNextEndnote(oEndnote);
if (null === oNextEndnote)
return false;
oEndnote.MoveCursorToEndPos(true);
if (-1 !== this.Selection.Direction)
{
this.Selection.End.Endnote = oNextEndnote;
this.Selection.Direction = 1;
this.CurEndnote = oNextEndnote;
this.Selection.Endnotes[oNextEndnote.GetId()] = oNextEndnote;
oNextEndnote.MoveCursorDownToFirstRow(oPos.X, oPos.Y, true);
}
else
{
this.Selection.End.Endnote = oNextEndnote;
this.CurEndnote = oNextEndnote;
if (oNextEndnote === this.Selection.Start.Endnote)
this.Selection.Direction = 0;
oEndnote.RemoveSelection();
delete this.Selection.Endnotes[oEndnote.GetId()];
oNextEndnote.MoveCursorDownToFirstRow(oPos.X, oPos.Y, true);
}
}
}
else
{
var oEndnote = this.CurEndnote;
if (0 === this.Selection.Direction)
oEndnote = this.CurEndnote;
else if (1 === this.Selection.Direction)
oEndnote = this.Selection.End.Endnote;
else
oEndnote = this.Selection.Start.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (oEndnote !== this.Selection.Endnotes[sId])
this.Selection.Endnotes[sId].RemoveSelection();
}
oEndnote.MoveCursorRight(false, false);
oEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(oEndnote);
}
}
else
{
if (true === AddToSelect)
{
var oEndnote = this.CurEndnote;
var oPos = oEndnote.GetCursorPosXY();
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.Get_Id()] = oEndnote;
if (false === oEndnote.MoveCursorDown(true))
{
var oNextEndnote = this.private_GetNextEndnote(oEndnote);
if (null === oNextEndnote)
return false;
oEndnote.MoveCursorToEndPos(true, false);
this.Selection.End.Endnote = oNextEndnote;
this.Selection.Direction = 1;
this.CurEndnote = oNextEndnote;
this.Selection.Endnotes[oNextEndnote.Get_Id()] = oNextEndnote;
oNextEndnote.MoveCursorDownToFirstRow(oPos.X, oPos.Y, true);
}
}
else
{
var oEndnote = this.CurEndnote;
var oPos = oEndnote.GetCursorPosXY();
if (false === oEndnote.MoveCursorDown(false))
{
var oNextEndnote = this.private_GetNextEndnote(oEndnote);
if (null === oNextEndnote)
return false;
this.Selection.Start.Endnote = oNextEndnote;
this.Selection.End.Endnote = oNextEndnote;
this.Selection.Direction = 0;
this.CurEndnote = oNextEndnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[oNextEndnote.GetId()] = oNextEndnote;
oNextEndnote.MoveCursorDownToFirstRow(oPos.X, oPos.Y, false);
}
}
}
return true;
};
CEndnotesController.prototype.MoveCursorToEndOfLine = function(AddToSelect)
{
if (true === this.Selection.Use)
{
if (true === AddToSelect)
{
var oEndnote = this.Selection.End.Endnote;
oEndnote.MoveCursorToEndOfLine(true);
}
else
{
var oEndnote = null;
if (0 === this.Selection.Direction)
oEndnote = this.CurEndnote;
else if (1 === this.Selection.Direction)
oEndnote = this.Selection.End.Endnote;
else
oEndnote = this.Selection.Start.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (oEndnote !== this.Selection.Endnotes[sId])
this.Selection.Endnotes[sId].RemoveSelection();
}
oEndnote.MoveCursorToEndOfLine(false);
oEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(oEndnote);
}
}
else
{
if (true === AddToSelect)
{
var oEndnote = this.CurEndnote;
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
oEndnote.MoveCursorToEndOfLine(true);
}
else
{
this.CurEndnote.MoveCursorToEndOfLine(false);
}
}
return true;
};
CEndnotesController.prototype.MoveCursorToStartOfLine = function(AddToSelect)
{
if (true === this.Selection.Use)
{
if (true === AddToSelect)
{
var oEndnote = this.Selection.End.Endnote;
oEndnote.MoveCursorToStartOfLine(true);
}
else
{
var oEndnote = null;
if (0 === this.Selection.Direction)
oEndnote = this.CurEndnote;
else if (1 === this.Selection.Direction)
oEndnote = this.Selection.Start.Endnote;
else
oEndnote = this.Selection.End.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (oEndnote !== this.Selection.Endnotes[sId])
this.Selection.Endnotes[sId].RemoveSelection();
}
oEndnote.MoveCursorToStartOfLine(false);
oEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(oEndnote);
}
}
else
{
if (true === AddToSelect)
{
var oEndnote = this.CurEndnote;
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
oEndnote.MoveCursorToStartOfLine(true);
}
else
{
this.CurEndnote.MoveCursorToStartOfLine(false);
}
}
return true;
};
CEndnotesController.prototype.MoveCursorToXY = function(X, Y, PageAbs, AddToSelect)
{
var oResult = this.private_GetEndnoteByXY(X, Y, PageAbs);
if (!oResult || !oResult.Endnote)
return;
var oEndnote = oResult.Endnote;
var PageRel = oResult.EndnotePageIndex;
if (true === AddToSelect)
{
var StartEndnote = null;
if (true === this.Selection.Use)
{
StartEndnote = this.Selection.Start.Endnote;
for (var sId in this.Selection.Endnotes)
{
if (this.Selection.Endnotes[sId] !== StartEndnote)
{
this.Selection.Endnotes[sId].RemoveSelection();
}
}
}
else
{
StartEndnote = this.CurEndnote;
}
var nDirection = this.private_GetDirection(StartEndnote, oEndnote);
if (0 === nDirection)
{
this.Selection.Use = true;
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
oEndnote.MoveCursorToXY(X, Y, true, true, PageRel);
}
else if (nDirection > 0)
{
var arrEndnotes = this.private_GetEndnotesLogicRange(StartEndnote, oEndnote);
if (arrEndnotes.length <= 1)
return;
var oStartEndnote = arrEndnotes[0]; // StartEndnote
var oEndEndnote = arrEndnotes[arrEndnotes.length - 1]; // oEndnote
this.Selection.Use = true;
this.Selection.Start.Endnote = oStartEndnote;
this.Selection.End.Endnote = oEndEndnote;
this.CurEndnote = oEndEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 1;
oStartEndnote.MoveCursorToEndPos(true, false);
for (var nPos = 0, nCount = arrEndnotes.length; nPos < nCount; ++nPos)
{
this.Selection.Endnotes[arrEndnotes[nPos].GetId()] = arrEndnotes[nPos];
if (0 !== nPos && nPos !== nCount - 1)
arrEndnotes[nPos].SelectAll(1);
}
oEndEndnote.MoveCursorToStartPos(false);
oEndEndnote.MoveCursorToXY(X, Y, true, true, PageRel);
}
else if (nDirection < 0)
{
var arrEndnotes = this.private_GetEndnotesLogicRange(oEndnote, StartEndnote);
if (arrEndnotes.length <= 1)
return;
var oEndEndnote = arrEndnotes[0]; // oEndnote
var oStartEndnote = arrEndnotes[arrEndnotes.length - 1]; // StartEndnote
this.Selection.Use = true;
this.Selection.Start.Endnote = oStartEndnote;
this.Selection.End.Endnote = oEndEndnote;
this.CurEndnote = oEndEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = -1;
oStartEndnote.MoveCursorToStartPos(true);
for (var nPos = 0, nCount = arrEndnotes.length; nPos < nCount; ++nPos)
{
this.Selection.Endnotes[arrEndnotes[nPos].GetId()] = arrEndnotes[nPos];
if (0 !== nPos && nPos !== nCount - 1)
arrEndnotes[nPos].SelectAll(-1);
}
oEndEndnote.MoveCursorToEndPos(false, true);
oEndEndnote.MoveCursorToXY(X, Y, true, true, PageRel);
}
}
else
{
if (true === this.Selection.Use)
{
this.RemoveSelection();
}
this.private_SetCurrentEndnoteNoSelection(oEndnote);
oEndnote.MoveCursorToXY(X, Y, false, true, PageRel);
}
};
CEndnotesController.prototype.MoveCursorToCell = function(bNext)
{
if (true !== this.private_IsOneEndnoteSelected() || null === this.CurEndnote)
return false;
return this.CurEndnote.MoveCursorToCell(bNext);
};
CEndnotesController.prototype.SetParagraphAlign = function(Align)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphAlign(Align);
}
};
CEndnotesController.prototype.SetParagraphSpacing = function(Spacing)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphSpacing(Spacing);
}
};
CEndnotesController.prototype.SetParagraphTabs = function(Tabs)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphTabs(Tabs);
}
};
CEndnotesController.prototype.SetParagraphIndent = function(Ind)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphIndent(Ind);
}
};
CEndnotesController.prototype.SetParagraphShd = function(Shd)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphShd(Shd);
}
};
CEndnotesController.prototype.SetParagraphStyle = function(Name)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphStyle(Name);
}
};
CEndnotesController.prototype.SetParagraphContextualSpacing = function(Value)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphContextualSpacing(Value);
}
};
CEndnotesController.prototype.SetParagraphPageBreakBefore = function(Value)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphPageBreakBefore(Value);
}
};
CEndnotesController.prototype.SetParagraphKeepLines = function(Value)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphKeepLines(Value);
}
};
CEndnotesController.prototype.SetParagraphKeepNext = function(Value)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphKeepNext(Value);
}
};
CEndnotesController.prototype.SetParagraphWidowControl = function(Value)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphWidowControl(Value);
}
};
CEndnotesController.prototype.SetParagraphBorders = function(Borders)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.SetParagraphBorders(Borders);
}
};
CEndnotesController.prototype.SetParagraphFramePr = function(FramePr, bDelete)
{
// Не позволяем делать рамки внутри сносок
};
CEndnotesController.prototype.IncreaseDecreaseFontSize = function(bIncrease)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.IncreaseDecreaseFontSize(bIncrease);
}
};
CEndnotesController.prototype.IncreaseDecreaseIndent = function(bIncrease)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.IncreaseDecreaseIndent(bIncrease);
}
};
CEndnotesController.prototype.SetImageProps = function(Props)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
return this.CurEndnote.SetImageProps(Props);
};
CEndnotesController.prototype.SetTableProps = function(Props)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
return this.CurEndnote.SetTableProps(Props);
};
CEndnotesController.prototype.GetCalculatedParaPr = function()
{
var oStartPr = this.CurEndnote.GetCalculatedParaPr();
var oPr = oStartPr.Copy();
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
var oTempPr = oEndnote.GetCalculatedParaPr();
oPr = oPr.Compare(oTempPr);
}
if (undefined === oPr.Ind.Left)
oPr.Ind.Left = oStartPr.Ind.Left;
if (undefined === oPr.Ind.Right)
oPr.Ind.Right = oStartPr.Ind.Right;
if (undefined === oPr.Ind.FirstLine)
oPr.Ind.FirstLine = oStartPr.Ind.FirstLine;
if (true !== this.private_IsOneEndnoteSelected())
oPr.CanAddTable = false;
return oPr;
};
CEndnotesController.prototype.GetCalculatedTextPr = function()
{
var oStartPr = this.CurEndnote.GetCalculatedTextPr(true);
var oPr = oStartPr.Copy();
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
var oTempPr = oEndnote.GetCalculatedTextPr(true);
oPr = oPr.Compare(oTempPr);
}
return oPr;
};
CEndnotesController.prototype.GetDirectParaPr = function()
{
if (this.CurEndnote)
return this.CurEndnote.GetDirectParaPr();
return new CParaPr();
};
CEndnotesController.prototype.GetDirectTextPr = function()
{
if (this.CurEndnote)
return this.CurEndnote.GetDirectTextPr();
return new CTextPr();
};
CEndnotesController.prototype.RemoveSelection = function(bNoCheckDrawing)
{
if (true === this.Selection.Use)
{
for (var sId in this.Selection.Endnotes)
{
this.Selection.Endnotes[sId].RemoveSelection(bNoCheckDrawing);
}
this.Selection.Use = false;
}
this.Selection.Endnotes = {};
if (this.CurEndnote)
this.Selection.Endnotes[this.CurEndnote.GetId()] = this.CurEndnote;
};
CEndnotesController.prototype.IsSelectionEmpty = function(bCheckHidden)
{
if (true !== this.IsSelectionUse())
return true;
var oEndnote = null;
for (var sId in this.Selection.Endnotes)
{
if (null === oEndnote)
oEndnote = this.Selection.Endnotes[sId];
else if (oEndnote !== this.Selection.Endnotes[sId])
return false;
}
if (null === oEndnote)
return true;
return oEndnote.IsSelectionEmpty(bCheckHidden);
};
CEndnotesController.prototype.DrawSelectionOnPage = function(nPageAbs)
{
if (true !== this.Selection.Use || true === this.IsEmptyPage(nPageAbs))
return;
var oPage = this.Pages[nPageAbs];
if (!oPage)
return;
for (var nSectionIndex = 0, nSectionsCount = oPage.Sections.length; nSectionIndex < nSectionsCount; ++nSectionIndex)
{
var oSection = this.Sections[oPage.Sections[nSectionIndex]];
if (!oSection)
continue;
var oSectionPage = oSection.Pages[nPageAbs];
if (!oSectionPage)
continue;
for (var nColumnIndex = 0, nColumnsCount = oSectionPage.Columns.length; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
var oColumn = oSectionPage.Columns[nColumnIndex];
for (var nIndex = 0, nCount = oColumn.Elements.length; nIndex < nCount; ++nIndex)
{
var oEndnote = oColumn.Elements[nIndex];
if (oEndnote === this.Selection.Endnotes[oEndnote.GetId()])
{
var nEndnotePageIndex = oEndnote.GetElementPageIndex(nPageAbs, nColumnIndex);
oEndnote.DrawSelectionOnPage(nEndnotePageIndex);
}
}
}
}
};
CEndnotesController.prototype.GetSelectionBounds = function()
{
if (true === this.Selection.Use)
{
if (0 === this.Selection.Direction)
{
return this.CurEndnote.GetSelectionBounds();
}
else if (1 === this.Selection.Direction)
{
var StartBounds = this.Selection.Start.Endnote.GetSelectionBounds();
var EndBounds = this.Selection.End.Endnote.GetSelectionBounds();
if (!StartBounds && !EndBounds)
return null;
var Result = {};
Result.Start = StartBounds ? StartBounds.Start : EndBounds.Start;
Result.End = EndBounds ? EndBounds.End : StartBounds.End;
Result.Direction = 1;
return Result;
}
else
{
var StartBounds = this.Selection.End.Endnote.GetSelectionBounds();
var EndBounds = this.Selection.Start.Endnote.GetSelectionBounds();
if (!StartBounds && !EndBounds)
return null;
var Result = {};
Result.Start = StartBounds ? StartBounds.Start : EndBounds.Start;
Result.End = EndBounds ? EndBounds.End : StartBounds.End;
Result.Direction = -1;
return Result;
}
}
return null;
};
CEndnotesController.prototype.IsMovingTableBorder = function()
{
if (true !== this.private_IsOneEndnoteSelected())
return false;
return this.CurEndnote.IsMovingTableBorder();
};
CEndnotesController.prototype.CheckPosInSelection = function(X, Y, PageAbs, NearPos)
{
var oResult = this.private_GetEndnoteByXY(X, Y, PageAbs);
if (oResult)
{
var oEndnote = oResult.Endnote;
return oEndnote.CheckPosInSelection(X, Y, oResult.EndnotePageIndex, NearPos);
}
return false;
};
CEndnotesController.prototype.GetSelectedContent = function(SelectedContent)
{
if (true !== this.Selection.Use)
return;
if (0 === this.Selection.Direction)
{
this.CurEndnote.GetSelectedContent(SelectedContent);
}
else
{
var arrEndnotes = this.private_GetSelectionArray();
for (var nPos = 0, nCount = arrEndnotes.length; nPos < nCount; ++nPos)
{
arrEndnotes[nPos].GetSelectedContent(SelectedContent);
}
}
};
CEndnotesController.prototype.UpdateCursorType = function(X, Y, PageAbs, MouseEvent)
{
var oResult = this.private_GetEndnoteByXY(X, Y, PageAbs);
if (oResult)
{
var oEndnote = oResult.Endnote;
oEndnote.UpdateCursorType(X, Y, oResult.EndnotePageIndex, MouseEvent);
}
};
CEndnotesController.prototype.PasteFormatting = function(oData)
{
for (var sId in this.Selection.Endnotes)
{
this.Selection.Endnotes[sId].PasteFormatting(oData);
}
};
CEndnotesController.prototype.IsSelectionUse = function()
{
return this.Selection.Use;
};
CEndnotesController.prototype.IsNumberingSelection = function()
{
if (this.CurEndnote)
return this.CurEndnote.IsNumberingSelection();
return false;
};
CEndnotesController.prototype.IsTextSelectionUse = function()
{
if (true !== this.Selection.Use)
return false;
if (0 === this.Selection.Direction)
return this.CurEndnote.IsTextSelectionUse();
return true;
};
CEndnotesController.prototype.GetCurPosXY = function()
{
if (this.CurEndnote)
return this.CurEndnote.GetCurPosXY();
return {X : 0, Y : 0};
};
CEndnotesController.prototype.GetSelectedText = function(bClearText, oPr)
{
if (true === bClearText)
{
if (true !== this.Selection.Use || 0 !== this.Selection.Direction)
return "";
return this.CurEndnote.GetSelectedText(true, oPr);
}
else
{
var sResult = "";
var arrEndnotes = this.private_GetSelectionArray();
for (var nPos = 0, nCount = arrEndnotes.length; nPos < nCount; ++nPos)
{
var sTempResult = arrEndnotes[nPos].GetSelectedText(false, oPr);
if (null == sTempResult)
return null;
sResult += sTempResult;
}
return sResult;
}
};
CEndnotesController.prototype.GetCurrentParagraph = function(bIgnoreSelection, arrSelectedParagraphs, oPr)
{
return this.CurEndnote.GetCurrentParagraph(bIgnoreSelection, arrSelectedParagraphs, oPr);
};
CEndnotesController.prototype.GetCurrentTablesStack = function(arrTables)
{
if (!arrTables)
arrTables = [];
return this.CurEndnote.GetCurrentTablesStack(arrTables);
};
CEndnotesController.prototype.GetSelectedElementsInfo = function(oInfo)
{
if (true !== this.private_IsOneEndnoteSelected() || null === this.CurEndnote)
oInfo.SetMixedSelection();
else
this.CurEndnote.GetSelectedElementsInfo(oInfo);
};
CEndnotesController.prototype.AddTableRow = function(bBefore)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.AddTableRow(bBefore);
};
CEndnotesController.prototype.AddTableColumn = function(bBefore)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.AddTableColumn(bBefore);
};
CEndnotesController.prototype.RemoveTableRow = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.RemoveTableRow();
};
CEndnotesController.prototype.RemoveTableColumn = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.RemoveTableColumn();
};
CEndnotesController.prototype.MergeTableCells = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.MergeTableCells();
};
CEndnotesController.prototype.SplitTableCells = function(Cols, Rows)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.SplitTableCells(Cols, Rows);
};
CEndnotesController.prototype.RemoveTableCells = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.RemoveTableCells();
};
CEndnotesController.prototype.RemoveTable = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.CurEndnote.RemoveTable();
};
CEndnotesController.prototype.SelectTable = function(Type)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return;
this.RemoveSelection();
this.CurEndnote.SelectTable(Type);
if (true === this.CurEndnote.IsSelectionUse())
{
this.Selection.Use = true;
this.Selection.Start.Endnote = this.CurEndnote;
this.Selection.End.Endnote = this.CurEndnote;
this.Selection.Endnotes = {};
this.Selection.Direction = 0;
this.Selection.Endnotes[this.CurEndnote.GetId()] = this.CurEndnote;
}
};
CEndnotesController.prototype.CanMergeTableCells = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.CanMergeTableCells();
};
CEndnotesController.prototype.CanSplitTableCells = function()
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.CanSplitTableCells();
};
CEndnotesController.prototype.DistributeTableCells = function(isHorizontally)
{
if (false === this.private_CheckEndnotesSelectionBeforeAction())
return false;
return this.CurEndnote.DistributeTableCells(isHorizontally);
};
CEndnotesController.prototype.UpdateInterfaceState = function()
{
if (this.private_IsOneEndnoteSelected())
{
this.CurEndnote.Document_UpdateInterfaceState();
}
else
{
var oApi = this.LogicDocument.GetApi();
if (!oApi)
return;
var oParaPr = this.GetCalculatedParaPr();
if (oParaPr.Tabs)
oApi.Update_ParaTab(AscCommonWord.Default_Tab_Stop, oParaPr.Tabs);
oApi.UpdateParagraphProp(oParaPr);
oApi.UpdateTextPr(this.GetCalculatedTextPr());
}
};
CEndnotesController.prototype.UpdateRulersState = function()
{
var nPageAbs = this.CurEndnote.GetAbsoluteStartPage();
if (this.LogicDocument.Pages[nPageAbs])
{
let sectPr = this.LogicDocument.Pages[nPageAbs].GetFirstSectPr();
var oFrame = sectPr.GetContentFrame(nPageAbs);
this.DrawingDocument.Set_RulerState_Paragraph({L : oFrame.Left, T : oFrame.Top, R : oFrame.Right, B : oFrame.Bottom}, true);
}
if (true === this.private_IsOneEndnoteSelected())
this.CurEndnote.Document_UpdateRulersState();
};
CEndnotesController.prototype.UpdateSelectionState = CFootnotesController.prototype.UpdateSelectionState;
CEndnotesController.prototype.GetSelectionState = function()
{
var arrResult = [];
var oState = {
Endnotes : {},
Use : this.Selection.Use,
Start : this.Selection.Start.Endnote,
End : this.Selection.End.Endnote,
Direction : this.Selection.Direction,
CurEndnote : this.CurEndnote
};
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oState.Endnotes[sId] = {
Endnote : oEndnote,
State : oEndnote.GetSelectionState()
};
}
arrResult.push(oState);
return arrResult;
};
CEndnotesController.prototype.SetSelectionState = function(State, StateIndex)
{
var oState = State[StateIndex];
this.Selection.Use = oState.Use;
this.Selection.Start.Endnote = oState.Start;
this.Selection.End.Endnote = oState.End;
this.Selection.Direction = oState.Direction;
this.CurEndnote = oState.CurEndnote;
this.Selection.Endnotes = {};
for (var sId in oState.Endnotes)
{
this.Selection.Endnotes[sId] = oState.Endnotes[sId].Endnote;
this.Selection.Endnotes[sId].SetSelectionState(oState.Endnotes[sId].State, oState.Endnotes[sId].State.length - 1);
}
};
CEndnotesController.prototype.AddHyperlink = function(oProps)
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
return this.CurEndnote.AddHyperlink(oProps);
return null;
};
CEndnotesController.prototype.ModifyHyperlink = function(oProps)
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
this.CurEndnote.ModifyHyperlink(oProps);
};
CEndnotesController.prototype.RemoveHyperlink = function()
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
this.CurEndnote.RemoveHyperlink();
};
CEndnotesController.prototype.CanAddHyperlink = function(bCheckInHyperlink)
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
return this.CurEndnote.CanAddHyperlink(bCheckInHyperlink);
return false;
};
CEndnotesController.prototype.IsCursorInHyperlink = function(bCheckEnd)
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
return this.CurEndnote.IsCursorInHyperlink(bCheckEnd);
return null;
};
CEndnotesController.prototype.AddComment = function(Comment)
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
{
this.CurEndnote.AddComment(Comment, true, true);
}
};
CEndnotesController.prototype.CanAddComment = function()
{
if (true !== this.IsSelectionUse() || true === this.private_IsOneEndnoteSelected())
return this.CurEndnote.CanAddComment();
return false;
};
CEndnotesController.prototype.GetSelectionAnchorPos = function()
{
if (true !== this.Selection.Use || 0 === this.Selection.Direction)
return this.CurEndnote.GetSelectionAnchorPos();
else if (1 === this.Selection.Direction)
return this.Selection.Start.Endnote.GetSelectionAnchorPos();
else
return this.Selection.End.Endnote.GetSelectionAnchorPos();
};
CEndnotesController.prototype.StartSelectionFromCurPos = function()
{
if (true === this.Selection.Use)
return;
this.Selection.Use = true;
this.Selection.Start.Endnote = this.CurEndnote;
this.Selection.End.Endnote = this.CurEndnote;
this.Selection.Endnotes = {};
this.Selection.Endnotes[this.CurEndnote.GetId()] = this.CurEndnote;
this.CurEndnote.StartSelectionFromCurPos();
};
CEndnotesController.prototype.SaveDocumentStateBeforeLoadChanges = function(State)
{
State.EndnotesSelectDirection = this.Selection.Direction;
State.EndnotesSelectionUse = this.Selection.Use;
if (0 === this.Selection.Direction || false === this.Selection.Use)
{
var oEndnote = this.CurEndnote;
State.CurEndnote = oEndnote;
State.CurEndnoteSelection = oEndnote.Selection.Use;
State.CurEndnoteDocPosType = oEndnote.GetDocPosType();
if (docpostype_Content === oEndnote.GetDocPosType())
{
State.Pos = oEndnote.GetContentPosition(false, false, undefined);
State.StartPos = oEndnote.GetContentPosition(true, true, undefined);
State.EndPos = oEndnote.GetContentPosition(true, false, undefined);
}
else if (docpostype_DrawingObjects === oEndnote.GetDocPosType())
{
this.LogicDocument.DrawingObjects.Save_DocumentStateBeforeLoadChanges(State);
}
}
else
{
State.EndnotesList = this.private_GetSelectionArray();
var oEndnote = State.EndnotesList[0];
State.EndnotesStart = {
Pos : oEndnote.GetContentPosition(false, false, undefined),
StartPos : oEndnote.GetContentPosition(true, true, undefined),
EndPos : oEndnote.GetContentPosition(true, false, undefined)
};
oEndnote = State.EndnotesList[State.EndnotesList.length - 1];
State.EndnotesEnd = {
Pos : oEndnote.GetContentPosition(false, false, undefined),
StartPos : oEndnote.GetContentPosition(true, true, undefined),
EndPos : oEndnote.GetContentPosition(true, false, undefined)
};
}
};
CEndnotesController.prototype.RestoreDocumentStateAfterLoadChanges = function(State)
{
this.RemoveSelection();
if (0 === State.EndnotesSelectDirection)
{
var oEndnote = State.CurEndnote;
if (oEndnote && true === this.IsUseInDocument(oEndnote.GetId()))
{
this.Selection.Start.Endnote = oEndnote;
this.Selection.End.Endnote = oEndnote;
this.Selection.Direction = 0;
this.CurEndnote = oEndnote;
this.Selection.Endnotes = {};
this.Selection.Use = State.EndnotesSelectionUse;
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
if (docpostype_Content === State.CurEndnoteDocPosType)
{
oEndnote.SetDocPosType(docpostype_Content);
oEndnote.Selection.Use = State.CurEndnoteSelection;
if (true === oEndnote.Selection.Use)
{
oEndnote.SetContentPosition(State.StartPos, 0, 0);
oEndnote.SetContentSelection(State.StartPos, State.EndPos, 0, 0, 0);
}
else
{
oEndnote.SetContentPosition(State.Pos, 0, 0);
this.LogicDocument.NeedUpdateTarget = true;
}
}
else if (docpostype_DrawingObjects === State.CurEndnoteDocPosType)
{
oEndnote.SetDocPosType(docpostype_DrawingObjects);
if (true !== this.LogicDocument.DrawingObjects.Load_DocumentStateAfterLoadChanges(State))
{
oEndnote.SetDocPosType(docpostype_Content);
this.LogicDocument.MoveCursorToXY(State.X ? State.X : 0, State.Y ? State.Y : 0, false);
}
}
}
else
{
this.LogicDocument.EndEndnotesEditing();
}
}
else
{
var arrEndnotesList = State.EndnotesList;
var StartEndnote = null;
var EndEndnote = null;
var arrAllEndnotes = this.private_GetEndnotesLogicRange(null, null);
for (var nIndex = 0, nCount = arrEndnotesList.length; nIndex < nCount; ++nIndex)
{
var oEndnote = arrEndnotesList[nIndex];
if (true === this.IsUseInDocument(oEndnote.GetId(), arrAllEndnotes))
{
if (null === StartEndnote)
StartEndnote = oEndnote;
EndEndnote = oEndnote;
}
}
if (null === StartEndnote || null === EndEndnote)
{
this.LogicDocument.EndEndnotesEditing();
return;
}
var arrNewEndnotesList = this.private_GetEndnotesLogicRange(StartEndnote, EndEndnote);
if (arrNewEndnotesList.length < 1)
{
if (null !== EndEndnote)
{
EndEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(EndEndnote);
}
else if (null !== StartEndnote)
{
StartEndnote.RemoveSelection();
this.private_SetCurrentEndnoteNoSelection(StartEndnote);
}
else
{
this.LogicDocument.EndEndnotesEditing();
}
}
else if (arrNewEndnotesList.length === 1)
{
this.Selection.Use = true;
this.Selection.Direction = 0;
this.Selection.Endnotes = {};
this.Selection.Start.Endnote = StartEndnote;
this.Selection.End.Endnote = StartEndnote;
this.CurEndnote = StartEndnote;
this.Selection.Endnotes[StartEndnote.GetId()] = StartEndnote;
if (arrEndnotesList[0] === StartEndnote)
{
StartEndnote.SetDocPosType(docpostype_Content);
StartEndnote.Selection.Use = true;
StartEndnote.SetContentPosition(State.EndnotesStart.Pos, 0, 0);
StartEndnote.SetContentSelection(State.EndnotesStart.StartPos, State.EndnotesStart.EndPos, 0, 0, 0);
}
else if (arrEndnotesList[arrAllEndnotes.length - 1] === StartEndnote)
{
StartEndnote.SetDocPosType(docpostype_Content);
StartEndnote.Selection.Use = true;
StartEndnote.SetContentPosition(State.EndnotesEnd.Pos, 0, 0);
StartEndnote.SetContentSelection(State.EndnotesEnd.StartPos, State.EndnotesEnd.EndPos, 0, 0, 0);
}
else
{
StartEndnote.SetDocPosType(docpostype_Content);
StartEndnote.SelectAll(1);
}
}
else
{
this.Selection.Use = true;
this.Selection.Direction = State.EndnotesSelectDirection;
this.Selection.Endnotes = {};
for (var nIndex = 1, nCount = arrNewEndnotesList.length; nIndex < nCount - 1; ++nIndex)
{
var oEndnote = arrNewEndnotesList[nIndex];
oEndnote.SelectAll(this.Selection.Direction);
this.Selection.Endnotes[oEndnote.GetId()] = oEndnote;
}
this.Selection.Endnotes[StartEndnote.GetId()] = StartEndnote;
this.Selection.Endnotes[EndEndnote.GetId()] = EndEndnote;
if (arrEndnotesList[0] === StartEndnote)
{
StartEndnote.SetDocPosType(docpostype_Content);
StartEndnote.Selection.Use = true;
StartEndnote.SetContentPosition(State.EndnotesStart.Pos, 0, 0);
StartEndnote.SetContentSelection(State.EndnotesStart.StartPos, State.EndnotesStart.EndPos, 0, 0, 0);
}
else
{
StartEndnote.SetDocPosType(docpostype_Content);
StartEndnote.SelectAll(1);
}
if (arrEndnotesList[arrEndnotesList.length - 1] === EndEndnote)
{
EndEndnote.SetDocPosType(docpostype_Content);
EndEndnote.Selection.Use = true;
EndEndnote.SetContentPosition(State.EndnotesEnd.Pos, 0, 0);
EndEndnote.SetContentSelection(State.EndnotesEnd.StartPos, State.EndnotesEnd.EndPos, 0, 0, 0);
}
else
{
EndEndnote.SetDocPosType(docpostype_Content);
EndEndnote.SelectAll(1);
}
if (1 !== this.Selection.Direction)
{
var Temp = StartEndnote;
StartEndnote = EndEndnote;
EndEndnote = Temp;
}
this.Selection.Start.Endnote = StartEndnote;
this.Selection.End.Endnote = EndEndnote;
}
}
};
CEndnotesController.prototype.GetColumnSize = function()
{
// TODO: Переделать
var _w = Math.max(1, AscCommon.Page_Width - (AscCommon.X_Left_Margin + AscCommon.X_Right_Margin));
var _h = Math.max(1, AscCommon.Page_Height - (AscCommon.Y_Top_Margin + AscCommon.Y_Bottom_Margin));
return {
W : AscCommon.Page_Width - (AscCommon.X_Left_Margin + AscCommon.X_Right_Margin),
H : AscCommon.Page_Height - (AscCommon.Y_Top_Margin + AscCommon.Y_Bottom_Margin)
};
};
CEndnotesController.prototype.GetCurrentSectionPr = function()
{
return null;
};
CEndnotesController.prototype.GetColumnFields = function(nPageAbs, nColumnAbs, nSectionIndex)
{
var oColumn = this.private_GetPageColumn(nPageAbs, nColumnAbs, nSectionIndex);
if (!oColumn)
return {X : 0, XLimit : 297};
return {X : oColumn.X, XLimit : oColumn.XLimit};
};
CEndnotesController.prototype.RemoveTextSelection = function()
{
if (true === this.Selection.Use)
{
for (var sId in this.Selection.Endnotes)
{
if (this.Selection.Endnotes[sId] !== this.CurEndnote)
this.Selection.Endnotes[sId].RemoveSelection();
}
this.Selection.Use = false;
}
this.Selection.Endnotes = {};
if (this.CurEndnote)
{
this.Selection.Endnotes[this.CurEndnote.GetId()] = this.CurEndnote;
this.CurEndnote.RemoveTextSelection();
}
};
CEndnotesController.prototype.ResetRecalculateCache = function()
{
for (var Id in this.Endnote)
{
this.Endnote[Id].Reset_RecalculateCache();
}
};
CEndnotesController.prototype.AddContentControl = function(nContentControlType)
{
if (this.CurEndnote)
return this.CurEndnote.AddContentControl(nContentControlType);
return null;
};
CEndnotesController.prototype.GetStyleFromFormatting = function()
{
if (this.CurEndnote)
return this.CurEndnote.GetStyleFromFormatting();
return null;
};
CEndnotesController.prototype.GetSimilarNumbering = function(oEngine)
{
if (this.CurEndnote)
this.CurEndnote.GetSimilarNumbering(oEngine);
};
CEndnotesController.prototype.GetPlaceHolderObject = function()
{
if (this.CurEndnote)
return this.CurEndnote.GetPlaceHolderObject();
return null;
};
CEndnotesController.prototype.GetAllFields = function(isUseSelection, arrFields)
{
// Поиск по всем сноскам должен происходить не здесь
if (!isUseSelection || !this.CurEndnote)
return arrFields ? arrFields : [];
return this.CurEndnote.GetAllFields(isUseSelection, arrFields);
};
CEndnotesController.prototype.GetAllDrawingObjects = function(arrDrawings)
{
if (undefined === arrDrawings || null === arrDrawings)
arrDrawings = [];
for (var sId in this.Endnote)
{
var oEndnote = this.Endnote[sId];
oEndnote.GetAllDrawingObjects(arrDrawings);
}
return arrDrawings;
};
CEndnotesController.prototype.UpdateBookmarks = function(oBookmarkManager)
{
for (var sId in this.Endnote)
{
var oEndnote = this.Endnote[sId];
oEndnote.UpdateBookmarks(oBookmarkManager);
}
};
CEndnotesController.prototype.IsTableCellSelection = function()
{
if (this.CurEndnote)
return this.CurEndnote.IsTableCellSelection();
return false;
};
CEndnotesController.prototype.AcceptRevisionChanges = function(Type, bAll)
{
if (null !== this.CurEndnote)
this.CurEndnote.AcceptRevisionChanges(Type, bAll);
};
CEndnotesController.prototype.RejectRevisionChanges = function(Type, bAll)
{
if (null !== this.CurEndnote)
this.CurEndnote.RejectRevisionChanges(Type, bAll);
};
CEndnotesController.prototype.IsSelectionLocked = function(CheckType)
{
for (var sId in this.Selection.Endnotes)
{
var oEndnote = this.Selection.Endnotes[sId];
oEndnote.Document_Is_SelectionLocked(CheckType);
}
};
CEndnotesController.prototype.GetAllTablesOnPage = function(nPageAbs, arrTables)
{
var oPage = this.Pages[nPageAbs];
if (!oPage || oPage.Sections.length <= 0)
return arrTables;
for (var nSectionIndex = 0, nSectionsCount = oPage.Sections.length; nSectionIndex < nSectionsCount; ++nSectionIndex)
{
var oSection = this.Sections[oPage.Sections[nSectionIndex]];
if (!oSection)
continue;
var oSectionPage = oSection.Pages[nPageAbs];
if (!oSectionPage)
continue;
var nColumnsCount = oSectionPage.Columns.length;
for (var nColumnIndex = 0; nColumnIndex < nColumnsCount; ++nColumnIndex)
{
var oColumn = oSectionPage.Columns[nColumnIndex];
if (!oColumn || oColumn.Elements.length <= 0)
continue;
for (var nIndex = 0, nCount = oColumn.Elements.length; nIndex < nCount; ++nIndex)
{
oColumn.Elements[nIndex].GetAllTablesOnPage(nPageAbs, arrTables);
}
}
}
return arrTables;
};
CEndnotesController.prototype.FindNextFillingForm = function(isNext, isCurrent)
{
var oCurEndnote = this.CurEndnote;
var arrEndnotes = this.LogicDocument.GetEndnotesList(null, null);
var nCurPos = -1;
var nCount = arrEndnotes.length;
if (nCount <= 0)
return null;
if (isCurrent)
{
for (var nIndex = 0; nIndex < nCount; ++nIndex)
{
if (arrEndnotes[nIndex] === oCurEndnote)
{
nCurPos = nIndex;
break;
}
}
}
if (-1 === nCurPos)
{
nCurPos = isNext ? 0 : nCount - 1;
oCurEndnote = arrEndnotes[nCurPos];
isCurrent = false;
}
var oRes = oCurEndnote.FindNextFillingForm(isNext, isCurrent, isCurrent);
if (oRes)
return oRes;
if (true === isNext)
{
for (var nIndex = nCurPos + 1; nIndex < nCount; ++nIndex)
{
oRes = arrEndnotes[nIndex].FindNextFillingForm(isNext, false);
if (oRes)
return oRes;
}
}
else
{
for (var nIndex = nCurPos - 1; nIndex >= 0; --nIndex)
{
oRes = arrEndnotes[nIndex].FindNextFillingForm(isNext, false);
if (oRes)
return oRes;
}
}
return null;
};
CEndnotesController.prototype.CollectSelectedReviewChanges = function(oTrackManager)
{
if (this.Selection.Use)
{
for (var sId in this.Selection.Endnotes)
{
this.Selection.Endnotes[sId].CollectSelectedReviewChanges(oTrackManager);
}
}
else if (this.CurEndnote)
{
this.CurEndnote.CollectSelectedReviewChanges(oTrackManager);
}
};
CEndnotesController.prototype.GetCurrentTopDocContent = function()
{
if (this.Selection.Use)
{
for (let id in this.Selection.Endnotes)
{
return this.Selection.Endnotes[id];
}
}
else if (this.CurEndnote)
return this.CurEndnote;
return this.LogicDocument;
};
/**
* Класс регистрирующий концевые сноски на странице
* и номера секций, сноски которых были пересчитаны на данной странице
* @constructor
*/
function CEndnotePage()
{
this.Endnotes = [];
this.Sections = [];
this.Continue = false; // Сноски на данной странице не закончились и переносятся на следующую
this.EndnotesPos = []; // Логическая позиция на странице (номер секции на странице и номер колонки)
this.CurSection = 0;
this.CurColumn = 0;
}
CEndnotePage.prototype.Reset = function()
{
this.Endnotes = [];
this.Sections = [];
this.EndnotesPos = [];
this.CurSection = 0;
this.CurColumn = 0;
};
CEndnotePage.prototype.ResetColumn = function(nSectionIndex, nColumnIndex)
{
this.CurSection = nSectionIndex;
this.CurColumn = nColumnIndex;
for (var nEndnoteIndex = 0, nEndnotesCount = this.Endnotes.length; nEndnoteIndex < nEndnotesCount; ++nEndnoteIndex)
{
if ((this.EndnotesPos[nEndnoteIndex].Section === nSectionIndex && this.EndnotesPos[nEndnoteIndex].Column >= nColumnIndex)
|| (this.EndnotesPos[nEndnoteIndex].Section > nSectionIndex))
{
this.Endnotes.length = nEndnoteIndex;
this.EndnotesPos.length = nEndnoteIndex;
return;
}
}
};
CEndnotePage.prototype.AddEndnotes = function(arrEndnotes)
{
// Может прийти добавление одной и той же сноски несколько раз, т.к. мы можем пересчитывать одну и ту же колонку
// или страницу несколько раз. Но при этом сама последовательность сносок не должна меняться, поэтому
// точку поиска следующей сноски спокойно сдвигаем, если нашли для предыдущей.
var nStartPos = 0;
for (var nAddIndex = 0, nAddCount = arrEndnotes.length; nAddIndex < nAddCount; ++nAddIndex)
{
var oEndnote = arrEndnotes[nAddIndex];
var isNeedAdd = true;
for (var nEndnoteIndex = nStartPos, nEndnotesCount = this.Endnotes.length; nEndnoteIndex < nEndnotesCount; ++nEndnoteIndex)
{
if (this.Endnotes[nEndnoteIndex] === oEndnote)
{
nStartPos = nEndnoteIndex + 1;
isNeedAdd = false;
this.EndnotesPos[nEndnoteIndex] = {Section : this.CurSection, Column : this.CurColumn};
}
}
if (isNeedAdd)
{
this.Endnotes.push(oEndnote);
this.EndnotesPos.push({Section : this.CurSection, Column : this.CurColumn});
}
}
};
CEndnotePage.prototype.AddSection = function(nSectionIndex)
{
this.Sections.push(nSectionIndex);
};
CEndnotePage.prototype.SetContinue = function(isContinue)
{
this.Continue = isContinue;
};
function CEndnoteSection()
{
this.Endnotes = [];
this.StartPage = 0;
this.StartColumn = 0;
this.Pages = [];
this.SeparatorRecalculateObject = null;
this.Separator = false; // true - Separator
}
function CEndnoteSectionPage()
{
this.Columns = [];
}
function CEndnoteSectionPageColumn()
{
this.Elements = [];
this.StartPos = 0;
this.EndPos = -1;
this.X = 0;
this.XLimit = 0;
this.Y = 0;
this.YLimit = 0;
this.Height = 0;
this.ContinuationSeparatorRecalculateObject = null;
}