X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/e0aad96df245c7148966887cbcc77417a4b7675b..6b27d5301b4995add87d5734e6de2d974007a196:/src/editor/modules/documentCanvas/canvas/canvas.js?ds=sidebyside diff --git a/src/editor/modules/documentCanvas/canvas/canvas.js b/src/editor/modules/documentCanvas/canvas/canvas.js index 0ec22a1..a057e05 100644 --- a/src/editor/modules/documentCanvas/canvas/canvas.js +++ b/src/editor/modules/documentCanvas/canvas/canvas.js @@ -58,7 +58,7 @@ $.extend(TextHandler.prototype, { var Canvas = function(wlxmlDocument, elements) { - this.elementsRegister = new ElementsRegister(documentElement.DocumentNodeElement, genericElement); + this.elementsRegister = new ElementsRegister(documentElement.DocumentNodeElement); elements = [ {tag: 'section', klass: null, prototype: genericElement}, @@ -124,7 +124,7 @@ $.extend(Canvas.prototype, Backbone.Events, { reloadRoot: function() { this.rootElement = this.createElement(this.wlxmlDocument.root); this.wrapper.empty(); - this.wrapper.append(this.rootElement.dom()); + this.wrapper.append(this.rootElement.dom); }, setupEventHandling: function() { @@ -233,7 +233,7 @@ $.extend(Canvas.prototype, Backbone.Events, { this.eventBus.on('elementToggled', function(toggle, element) { if(!toggle) { - canvas.setCurrentElement(element.getPreviousTextElement()); + canvas.setCurrentElement(canvas.getPreviousTextElement(element)); } }); }, @@ -247,7 +247,7 @@ $.extend(Canvas.prototype, Backbone.Events, { }, toggleElementHighlight: function(node, toggle) { - var element = utils.findCanvasElement(node); + var element = utils.getElementForNode(node); element.toggleHighlight(toggle); }, @@ -270,18 +270,58 @@ $.extend(Canvas.prototype, Backbone.Events, { } }, + getPreviousTextElement: function(relativeToElement, includeInvisible) { + return this.getNearestTextElement('above', relativeToElement, includeInvisible); + }, + + getNextTextElement: function(relativeToElement, includeInvisible) { + return this.getNearestTextElement('below', relativeToElement, includeInvisible); + }, + + getNearestTextElement: function(direction, relativeToElement, includeInvisible) { + includeInvisible = includeInvisible !== undefined ? includeInvisible : false; + var selector = '[document-text-element]' + (includeInvisible ? '' : ':visible'); + return this.getDocumentElement(utils.nearestInDocumentOrder(selector, direction, relativeToElement.dom[0])); + }, + contains: function(element) { - return element.dom().parents().index(this.wrapper) !== -1; + return element.dom.parents().index(this.wrapper) !== -1; }, triggerSelectionChanged: function() { this.trigger('selectionChanged', this.getSelection()); + var s = this.getSelection(), + f = s.toDocumentFragment(); + if(f && f instanceof f.RangeFragment) { + var $current = this.wrapper.find('.current-node-element'); + var current = $current && this.getDocumentElement($current.parent()[0]); + + if($current) { + $current.removeClass('current-node-element'); + } + if(current) { + current.markAsCurrent(false); + } + } }, getSelection: function() { return new Selection(this); }, + select: function(fragment) { + if(fragment instanceof this.wlxmlDocument.RangeFragment) { + this.setCurrentElement(fragment.endNode, {caretTo: fragment.endOffset}); + } else if(fragment instanceof this.wlxmlDocument.NodeFragment) { + var params = { + caretTo: fragment instanceof this.wlxmlDocument.CaretFragment ? fragment.offset : 'start' + }; + this.setCurrentElement(fragment.node, params); + } else { + logger.debug('Fragment not supported'); + } + }, + setCurrentElement: function(element, params) { if(!element) { logger.debug('Invalid element passed to setCurrentElement: ' + element); @@ -289,7 +329,7 @@ $.extend(Canvas.prototype, Backbone.Events, { } if(!(element instanceof documentElement.DocumentElement)) { - element = utils.findCanvasElement(element); + element = utils.getElementForNode(element); } if(!element || !this.contains(element)) { @@ -303,21 +343,22 @@ $.extend(Canvas.prototype, Backbone.Events, { if(byBrowser && byBrowser.parent().sameNode(nodeToLand)) { return byBrowser; } - var children = e.children(); - for(var i = 0; i < children.length; i++) { - if(children[i] instanceof documentElement.DocumentTextElement) { - return children[i]; - } - } - return null; + return e.getVerticallyFirstTextElement(); }.bind(this); var _markAsCurrent = function(element) { if(element instanceof documentElement.DocumentTextElement) { this.wrapper.find('.current-text-element').removeClass('current-text-element'); - element.dom().addClass('current-text-element'); + element.dom.addClass('current-text-element'); } else { - this.wrapper.find('.current-node-element').removeClass('current-node-element'); + var $current = this.wrapper.find('.current-node-element'); + var current = this.getDocumentElement($current.parent()[0]); + $current.removeClass('current-node-element'); + + if(current) { + current.markAsCurrent(false); + } element._container().addClass('current-node-element'); + element.markAsCurrent(true); } }.bind(this); @@ -349,7 +390,7 @@ $.extend(Canvas.prototype, Backbone.Events, { _moveCaretToTextElement: function(element, where) { var range = document.createRange(), - node = element.dom().contents()[0]; + node = element.dom.contents()[0]; if(typeof where !== 'number') { range.selectNodeContents(node); @@ -377,10 +418,6 @@ $.extend(Canvas.prototype, Backbone.Events, { } }, - findCanvasElement: function(node) { - return utils.findCanvasElement(node); - }, - toggleGrid: function() { this.wrapper.toggleClass('grid-on'); this.trigger('changed'); @@ -558,7 +595,7 @@ $.extend(Cursor.prototype, { if(selection.anchorNode === selection.focusNode) { anchorFirst = selection.anchorOffset <= selection.focusOffset; } else { - anchorFirst = parent.childIndex(anchorElement) < parent.childIndex(focusElement); + anchorFirst = (parent.getFirst(anchorElement, focusElement) === anchorElement); } placeData = getPlaceData(anchorFirst); } else {