X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/24ac4f5092661ce053f33d460306bf81d6a3dc8a..5961ba42ff4f3c3410e0400d7582b43b3067fc27:/src/editor/modules/documentCanvas/canvas/utils.js?ds=inline diff --git a/src/editor/modules/documentCanvas/canvas/utils.js b/src/editor/modules/documentCanvas/canvas/utils.js index 87911cf..337f4d3 100644 --- a/src/editor/modules/documentCanvas/canvas/utils.js +++ b/src/editor/modules/documentCanvas/canvas/utils.js @@ -3,13 +3,14 @@ define([ ], function($) { 'use strict'; - +/* globals Node */ var nearestInDocumentOrder = function(selector, direction, element) { var parents = $(element).parents(), parent = parents.length ? $(parents[parents.length-1]) : element; var adj = parent.find(selector).filter(function() { + /*jshint bitwise: false*/ return this.compareDocumentPosition(element) & (direction === 'above' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING); }); @@ -17,28 +18,45 @@ var nearestInDocumentOrder = function(selector, direction, element) { return adj[direction === 'above' ? adj.length-1 : 0]; } return null; -} +}; -var findCanvasElement = function(node) { +var findCanvasElement = function(node, childOf) { if(node.nodeType === Node.ELEMENT_NODE) { return node.getData('canvasElement'); } if(node.nodeType === Node.TEXT_NODE) { - var parent = node.parent(), - toret; + return findCanvasElementInParent(node, childOf || node.parent()); + } +}; + +/** + * We take child and its parent as arguments separatly to + * handle situation where child was removed from WLXMLDocument + * and it lost reference to its parent (but we may still have it on canvas). +*/ +var findCanvasElementInParent = function(wlxmlChildNode, wlxmlParentNode) { + var parentElement, toret; - parent.children().forEach(function(child) { - if(child.data('wlxmlNode').sameNode(node)) + if(wlxmlParentNode === null) { + toret = wlxmlChildNode.getData('canvasElement'); + if(toret.parent()) { + throw new Error('This should never happen: root canvas element doesn\'t render root document node!'); + } + } else { + parentElement = findCanvasElement(wlxmlParentNode); + parentElement.children().forEach(function(child) { + if(child.data('wlxmlNode').sameNode(wlxmlChildNode)) { // czemu tu, przy drugim undo child nie mial data? toret = child; + } }); - if(toret) - return toret; } + return toret; }; return { nearestInDocumentOrder: nearestInDocumentOrder, findCanvasElement: findCanvasElement, + findCanvasElementInParent: findCanvasElementInParent, unicode: { ZWS: '\u200B' }