/* * (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; }