191 lines
5.9 KiB
JavaScript
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;
|
|
|
|
})();
|
|
|