X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/74635b9e0dd3069953072eab9de946b77d1b313e..4729ca360f43f0b909dadabbce5438d4910382ed:/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 bcfc954..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}, @@ -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); }, @@ -290,12 +290,38 @@ $.extend(Canvas.prototype, Backbone.Events, { 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); @@ -303,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)) { @@ -317,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'); } 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); @@ -391,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'); @@ -572,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 {