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;
|
||
|
||
})();
|
||
|