UNPKG

devexpress-richedit

Version:

DevExpress Rich Text Editor is an advanced word-processing tool designed for working with rich text documents.

53 lines (52 loc) 3.4 kB
import { ListUtils } from '@devexpress/utils/lib/utils/list'; import { RangePermissionsChangedSubDocumentChange } from '../changes/sub-document/range-permissions-changed'; import { ConstRangePermission, RangePermission } from '../range-permissions'; import { BaseManipulator } from './base-manipulator'; import { SearchUtils } from '@devexpress/utils/lib/utils/search'; export class RangePermissionManipulator extends BaseManipulator { createRangePermission(subDocument, permissionTemplate) { subDocument.rangePermissions.push(new RangePermission(subDocument.positionManager, permissionTemplate.interval, permissionTemplate.userName, permissionTemplate.group)); subDocument.rangePermissions = subDocument.rangePermissions.sort(ConstRangePermission.comparer); subDocument.filterRangePermissions(this.modelManipulator.modelManager.richOptions.documentProtection); this.modelManipulator.notifyModelChanged(new RangePermissionsChangedSubDocumentChange(subDocument.id, permissionTemplate)); } deleteRangePermission(subDocument, permissionTemplate, permissionIndex = ListUtils.indexBy(subDocument.rangePermissions, (b) => b.constRangePermission.equals(permissionTemplate))) { subDocument.rangePermissions.splice(permissionIndex, 1)[0].destructor(subDocument.positionManager); subDocument.filterRangePermissions(this.modelManipulator.modelManager.richOptions.documentProtection); this.modelManipulator.notifyModelChanged(new RangePermissionsChangedSubDocumentChange(subDocument.id, permissionTemplate)); } insertRangePermissionsFromSubDocument(fromSubDocument, toSubDocument, fromInterval, modelsConstOffset) { const rangePermissions = fromSubDocument.rangePermissions; let ind = SearchUtils.normedInterpolationIndexOf(rangePermissions, (b) => b.start, fromInterval.start); while (rangePermissions[ind] && rangePermissions[ind].start >= fromInterval.start) ind--; ind = Math.max(0, ind); for (let rpm; (rpm = rangePermissions[ind]) && rpm.start <= fromInterval.end; ind++) { if (fromInterval.containsInterval(rpm.interval)) { const template = rpm.constRangePermission; template.interval.start += modelsConstOffset; template.interval.end += modelsConstOffset + 1; this.createRangePermission(toSubDocument, template); } } toSubDocument.rangePermissions = toSubDocument.rangePermissions.sort(ConstRangePermission.comparer); } deleteRangePermissions(subDocument, interval) { const rangePermissions = subDocument.rangePermissions; const result = []; let ind = SearchUtils.normedInterpolationIndexOf(rangePermissions, (b) => b.start, interval.start); while (rangePermissions[ind] && rangePermissions[ind].start >= interval.start) ind--; ind = Math.max(0, ind); for (let curr; (curr = rangePermissions[ind]) && curr.interval.start <= interval.end;) { if (interval.containsInterval(curr.interval)) { const tmpl = curr.constRangePermission; this.deleteRangePermission(subDocument, tmpl, ind); result.push(tmpl); } else ind++; } return result; } }