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

191 lines
5.9 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function()
{
let marksToCheck = [];
/**
* @param logicDocument {AscWord.Document}
* @constructor
*/
function PermRangesManager(logicDocument)
{
this.logicDocument = logicDocument
this.ranges = {};
}
/**
* Статический метод, который проверяет попадаем ли целиком в разрешенный диапазон по заданным стартовому и
* конечному диапазонам
* @param startRanges
* @param endRanges
*/
PermRangesManager.isInPermRange = function(startRanges, endRanges)
{
// TODO: Пока мы просто проверяем само наличие диапазона, в будущем надо проверяеть пользователя
if (endRanges.length < 0)
return false;
for (let iRange = 0, rangeCount = endRanges.length; iRange < rangeCount; ++iRange)
{
if (-1 !== startRanges.indexOf(endRanges[iRange]))
return true;
}
return false;
};
PermRangesManager.prototype.addMark = function(mark)
{
let rangeId = mark.getRangeId();
if (!this.ranges[rangeId])
this.ranges[rangeId] = {};
if (mark.isStart())
this.ranges[rangeId].start = mark;
else
this.ranges[rangeId].end = mark;
};
PermRangesManager.prototype.getStartMark = function(rangeId)
{
this.updateMarks();
if (!this.ranges[rangeId] || !this.ranges[rangeId].start)
return null
return this.ranges[rangeId].start;
};
PermRangesManager.prototype.getEndMark = function(rangeId)
{
this.updateMarks();
if (!this.ranges[rangeId] || !this.ranges[rangeId].end)
return null;
return this.ranges[rangeId].end;
};
PermRangesManager.prototype.updateMarks = function()
{
for (let i = 0, count = marksToCheck.length; i < count; ++i)
{
let mark = marksToCheck[i];
if (!mark.isUseInDocument())
continue;
this.addMark(mark);
}
marksToCheck.length = 0;
};
/**
* Проверяем заданный отрезок, если он невалидный или пустой, тогда удаляем его из документа
* @param {number} rangeId
*/
PermRangesManager.prototype.checkRange = function(rangeId)
{
this.updateMarks();
if (!this._isValidRange(rangeId) || (this.logicDocument.CanEdit() && this._isEmptyRange(rangeId)))
this.removeRange(rangeId);
};
PermRangesManager.prototype.removeRange = function(rangeId)
{
if (!this.ranges[rangeId])
return;
if (this.ranges[rangeId].start)
this.ranges[rangeId].start.removeMark();
if (this.ranges[rangeId].end)
this.ranges[rangeId].end.removeMark();
delete this.ranges[rangeId];
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PermRangesManager.prototype._isValidRange = function(rangeId)
{
if (!this.ranges[rangeId])
return false;
let start = this.ranges[rangeId].start;
let end = this.ranges[rangeId].end;
if (!start || !end || !start.isUseInDocument() || !end.isUseInDocument())
return false;
let startPos = start.getPositionInDocument();
let endPos = end.getPositionInDocument();
if (!startPos || !endPos || !AscWord.isInSameTopDocContent(startPos, endPos))
return false;
return AscWord.CompareDocumentPositions(startPos, endPos) <= 0;
};
PermRangesManager.prototype._isEmptyRange = function(rangeId)
{
// Здесь мы считаем, что заданный отрезок валидный
let state = this.logicDocument.SaveDocumentState();
let startPos = this.ranges[rangeId].start.getPositionInDocument();
let endPos = this.ranges[rangeId].end.getPositionInDocument();
let topDocument = this.ranges[rangeId].start.getParagraph().GetTopDocumentContent();
if (!topDocument)
return true;
topDocument.SetSelectionByContentPositions(startPos, endPos);
let result = topDocument.IsSelectionEmpty();
topDocument.RemoveSelection();
this.logicDocument.LoadDocumentState(state);
return result;
};
function registerPermRangeMark(mark)
{
marksToCheck.push(mark);
}
//--------------------------------------------------------export----------------------------------------------------
AscWord.PermRangesManager = PermRangesManager;
AscWord.registerPermRangeMark = registerPermRangeMark;
})();