angular-xml-editor
Version:
XML editor component for Angular
130 lines (129 loc) • 12.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XmlCursorPos, XMLCursorPositions } from './xmlCursorPos.class';
import { XmlToolbox } from '../xmlToolbox.class';
import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class';
export class XmlCursor {
constructor() {
this.xmlDocumentRootNode = undefined;
this.domDummyNodeManager = new DomDummyNodeManager();
this.StartPos = new XmlCursorPos();
this.EndPos = new XmlCursorPos();
}
/**
* is there nothing between start and end pos?
* @return {?}
*/
isEmptySelection() {
if (this.StartPos.equals(this.EndPos)) {
return true;
}
return false;
}
/**
* @return {?}
*/
sortStartAndEnd() {
if (this.StartPos.ActualNode && this.EndPos.ActualNode) {
if (this.StartPos.ActualNode.isSameNode(this.EndPos.ActualNode)) {
if (this.StartPos.PosAtNode === XMLCursorPositions.CursorInsideTextNode &&
this.EndPos.PosAtNode === XMLCursorPositions.CursorInsideTextNode &&
this.StartPos.PosInTextnode > this.EndPos.PosInTextnode) {
this.swapStartAndEnd();
}
}
else {
/** @type {?} */
const compared = this.StartPos.ActualNode.compareDocumentPosition(this.EndPos.ActualNode);
// tslint:disable-next-line:no-bitwise
if (!(compared & Node.DOCUMENT_POSITION_FOLLOWING)) {
this.swapStartAndEnd();
}
}
}
}
/**
* @return {?}
*/
swapStartAndEnd() {
/** @type {?} */
const node = this.StartPos.ActualNode;
/** @type {?} */
const pos = this.StartPos.PosAtNode;
/** @type {?} */
const text = this.StartPos.PosInTextnode;
this.StartPos.SetCursor(this.EndPos.ActualNode, this.EndPos.PosAtNode, this.EndPos.PosInTextnode);
this.EndPos.SetCursor(node, pos, text);
}
/**
* @return {?}
*/
show() {
if (window.getSelection) {
/** @type {?} */
const selection = window.getSelection();
this.show2(selection);
}
else {
throw new Error('showCursor: unable to get "window.getSelection"');
}
}
/**
* @param {?} selection
* @return {?}
*/
show2(selection) {
if (!selection) {
return;
}
/** @type {?} */
const elems = document.querySelectorAll('.selected');
[].forEach.call(elems, function (el) {
el.classList.remove('selected');
});
/** @type {?} */
const startSelection = XmlCursorPos.getSelectionForPos(this.StartPos);
if (this.EndPos && this.EndPos.ActualNode && !this.EndPos.equals(this.StartPos)) {
/** @type {?} */
const endSelection = XmlCursorPos.getSelectionForPos(this.EndPos);
selection.setBaseAndExtent(startSelection.node, startSelection.offset, endSelection.node, endSelection.offset);
}
else {
// only start pos
selection.setPosition(startSelection.node, startSelection.offset);
// select tag by adding "select" class
if (this.StartPos.PosAtNode === XMLCursorPositions.CursorOnCompleteNode) {
/** @type {?} */
const asElem = /** @type {?} */ (this.StartPos.ActualNode);
if (asElem && asElem.classList) {
asElem.classList.add('selected');
console.log('selected!');
}
else {
console.error(`no asElem.classList for select! ${XmlToolbox.GetNodeDebugContext(asElem)}`);
}
}
}
}
}
if (false) {
/** @type {?} */
XmlCursor.prototype.xmlDocumentRootNode;
/** @type {?} */
XmlCursor.prototype.domDummyNodeManager;
/** @type {?} */
XmlCursor.prototype.StartPos;
/** @type {?} */
XmlCursor.prototype.EndPos;
}
/**
* @record
*/
export function SelectionPos() { }
/** @type {?} */
SelectionPos.prototype.node;
/** @type {?} */
SelectionPos.prototype.offset;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sQ3Vyc29yLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci14bWwtZWRpdG9yLyIsInNvdXJjZXMiOlsibGliL2NvZGUvY3Vyc29yL3htbEN1cnNvci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUU5RSxNQUFNOzttQ0FDMkIsU0FBUzttQ0FDbEIsSUFBSSxtQkFBbUIsRUFBRTt3QkFFN0IsSUFBSSxZQUFZLEVBQUU7c0JBQ3BCLElBQUksWUFBWSxFQUFFOzs7Ozs7SUFLbEMsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7Ozs7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUN0RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUMvRCxJQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLGtCQUFrQixDQUFDLG9CQUFvQjtvQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssa0JBQWtCLENBQUMsb0JBQW9CO29CQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFDdkQ7b0JBQ0EsSUFBSSxDQUFDLGVBQWUs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QUssQ0FBQyxtQ0FBbUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDNUY7YUFDRjtTQUNGOztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuL3htbEN1cnNvclBvcy5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbFRvb2xib3ggfSBmcm9tICcuLi94bWxUb29sYm94LmNsYXNzJztcclxuaW1wb3J0IHsgRG9tRHVtbXlOb2RlTWFuYWdlciB9IGZyb20gJy4uL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgWG1sQ3Vyc29yIHtcclxuICB4bWxEb2N1bWVudFJvb3ROb2RlOiBFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gIGRvbUR1bW15Tm9kZU1hbmFnZXIgPSBuZXcgRG9tRHVtbXlOb2RlTWFuYWdlcigpO1xyXG5cclxuICBwdWJsaWMgU3RhcnRQb3MgPSBuZXcgWG1sQ3Vyc29yUG9zKCk7XHJcbiAgcHVibGljIEVuZFBvcyA9IG5ldyBYbWxDdXJzb3JQb3MoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogaXMgdGhlcmUgbm90aGluZyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgcG9zP1xyXG4gICAqL1xyXG4gIGlzRW1wdHlTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5TdGFydFBvcy5lcXVhbHModGhpcy5FbmRQb3MpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc29ydFN0YXJ0QW5kRW5kKCkge1xyXG4gICAgaWYgKHRoaXMuU3RhcnRQb3MuQWN0dWFsTm9kZSAmJiB0aGlzLkVuZFBvcy5BY3R1YWxOb2RlKSB7XHJcbiAgICAgIGlmICh0aGlzLlN0YXJ0UG9zLkFjdHVhbE5vZGUuaXNTYW1lTm9kZSh0aGlzLkVuZFBvcy5BY3R1YWxOb2RlKSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuU3RhcnRQb3MuUG9zQXROb2RlID09PSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGUgJiZcclxuICAgICAgICAgIHRoaXMuRW5kUG9zLlBvc0F0Tm9kZSA9PT0gWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlICYmXHJcbiAgICAgICAgICB0aGlzLlN0YXJ0UG9zLlBvc0luVGV4dG5vZGUgPiB0aGlzLkVuZFBvcy5Qb3NJblRleHRub2RlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnN3YXBTdGFydEFuZEVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjb21wYXJlZCA9IHRoaXMuU3RhcnRQb3MuQWN0dWFsTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLkVuZFBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxyXG4gICAgICAgIGlmICghKGNvbXBhcmVkICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpKSB7XHJcbiAgICAgICAgICB0aGlzLnN3YXBTdGFydEFuZEVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3dhcFN0YXJ0QW5kRW5kKCkge1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuU3RhcnRQb3MuQWN0dWFsTm9kZTtcclxuICAgIGNvbnN0IHBvcyA9IHRoaXMuU3RhcnRQb3MuUG9zQXROb2RlO1xyXG4gICAgY29uc3QgdGV4dCA9IHRoaXMuU3RhcnRQb3MuUG9zSW5UZXh0bm9kZTtcclxuICAgIHRoaXMuU3RhcnRQb3MuU2V0Q3Vyc29yKHRoaXMuRW5kUG9zLkFjdHVhbE5vZGUsIHRoaXMuRW5kUG9zLlBvc0F0Tm9kZSwgdGhpcy5FbmRQb3MuUG9zSW5UZXh0bm9kZSk7XHJcbiAgICB0aGlzLkVuZFBvcy5TZXRDdXJzb3Iobm9kZSwgcG9zLCB0ZXh0KTtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgdGhpcy5zaG93MihzZWxlY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG93Q3Vyc29yOiB1bmFibGUgdG8gZ2V0IFwid2luZG93LmdldFNlbGVjdGlvblwiJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3cyKHNlbGVjdGlvbjogU2VsZWN0aW9uKSB7XHJcbiAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIGFsbCBzZWxlY3RlZCBjbGFzc2VzXHJcbiAgICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZCcpO1xyXG4gICAgW10uZm9yRWFjaC5jYWxsKGVsZW1zLCBmdW5jdGlvbihlbCkge1xyXG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc3RhcnRTZWxlY3Rpb24gPSBYbWxDdXJzb3JQb3MuZ2V0U2VsZWN0aW9uRm9yUG9zKHRoaXMuU3RhcnRQb3MpO1xyXG4gICAgaWYgKHRoaXMuRW5kUG9zICYmIHRoaXMuRW5kUG9zLkFjdHVhbE5vZGUgJiYgIXRoaXMuRW5kUG9zLmVxdWFscyh0aGlzLlN0YXJ0UG9zKSkge1xyXG4gICAgICAvLyBzdGFydCArIGVuZCBwb3NcclxuICAgICAgY29uc3QgZW5kU2VsZWN0aW9uID0gWG1sQ3Vyc29yUG9zLmdldFNlbGVjdGlvbkZvclBvcyh0aGlzLkVuZFBvcyk7XHJcbiAgICAgIHNlbGVjdGlvbi5zZXRCYXNlQW5kRXh0ZW50KHN0YXJ0U2VsZWN0aW9uLm5vZGUsIHN0YXJ0U2VsZWN0aW9uLm9mZnNldCwgZW5kU2VsZWN0aW9uLm5vZGUsIGVuZFNlbGVjdGlvbi5vZmZzZXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gb25seSBzdGFydCBwb3NcclxuICAgICAgc2VsZWN0aW9uLnNldFBvc2l0aW9uKHN0YXJ0U2VsZWN0aW9uLm5vZGUsIHN0YXJ0U2VsZWN0aW9uLm9mZnNldCk7XHJcblxyXG4gICAgICAvLyBzZWxlY3QgdGFnIGJ5IGFkZGluZyBcInNlbGVjdFwiIGNsYXNzXHJcbiAgICAgIGlmICh0aGlzLlN0YXJ0UG9zLlBvc0F0Tm9kZSA9PT0gWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvck9uQ29tcGxldGVOb2RlKSB7XHJcbiAgICAgICAgY29uc3QgYXNFbGVtID0gdGhpcy5TdGFydFBvcy5BY3R1YWxOb2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGFzRWxlbSAmJiBhc0VsZW0uY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICBhc0VsZW0uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3RlZCEnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgbm8gYXNFbGVtLmNsYXNzTGlzdCBmb3Igc2VsZWN0ISAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChhc0VsZW0pfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25Qb3Mge1xyXG4gIG5vZGU6IE5vZGU7XHJcbiAgb2Zmc2V0OiBudW1iZXI7XHJcbn1cclxuIl19