X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/7c4c5ee807a9700c1b26e91f0d1720e3c6fd9ec3..001f12aa1576f93fbcec4d378a1e75474de73631:/src/editor/modules/documentCanvas/canvas/utils.js diff --git a/src/editor/modules/documentCanvas/canvas/utils.js b/src/editor/modules/documentCanvas/canvas/utils.js index 4e262a0..3efc450 100644 --- a/src/editor/modules/documentCanvas/canvas/utils.js +++ b/src/editor/modules/documentCanvas/canvas/utils.js @@ -20,58 +20,57 @@ var nearestInDocumentOrder = function(selector, direction, element) { return null; }; -var getElementForElementRootNode = function(node, withParent) { - if(node.nodeType === Node.TEXT_NODE) { - return _getElementForRootTextNode(node, withParent); +var getElementForElementRootNode = function(node, mirrors, canvasContainer) { + if(canvasContainer) { + var candidates = [node.getData('canvasElement')].concat(node.getData('mirrorElements')), + toret; + candidates.some(function(c) { + // @@ + if(c.dom.parents().index(canvasContainer.dom) !== -1) { + toret = c; + return true; + } + }); + return toret; } - return node.getData('canvasElement'); + return node.getData(mirrors ? 'mirrorElements' : 'canvasElement'); }; -var _getElementForRootTextNode = function(textNode, withParent) { - var parentElement = getElementForNode(withParent || textNode.parent()), - toret; - parentElement.children().some(function(child) { - if(child.wlxmlNode.sameNode(textNode)) { - toret = child; - return true; - } - }); - return toret; -}; - -var getElementForNode = function(node, withParent) { - if(node.nodeType === Node.TEXT_NODE) { - return _getElementForTextNode(node, withParent); - } +var getElementForNode = function(node, mirrors) { while(!node.getData('canvasElement')) { node = node.parent(); } - return node.getData('canvasElement'); + return node.getData(mirrors ? 'mirrorElements' : 'canvasElement'); }; -var _getElementForTextNode = function(textNode, withParent) { - var parentElement = getElementForNode(withParent || textNode.parent()), - toret; - parentElement.children().some(function(child) { - if(child.wlxmlNode.sameNode(textNode)) { - toret = child; - return true; - } - }); - return toret || parentElement; -}; - -var getElementForDetachedNode = function(node, originalParent) { +var getElementForDetachedNode = function(node, originalParent, mirrors) { var ptr = originalParent; if(ptr === null) { - return node.getData('canvasElement'); + return node.getData(mirrors ? 'mirrorElements' : 'canvasElement'); } while(!ptr.getData('canvasElement')) { ptr = ptr.parent(); } - return ptr.getData('canvasElement'); + return ptr.getData(mirrors ? 'mirrorElements' : 'canvasElement'); }; +var caretPositionFromPoint = function(x, y) { + /* globals document */ + var range, textNode, offset; + if(document.caretPositionFromPoint) { + range = document.caretPositionFromPoint(x, y); + textNode = range.offsetNode; + offset = range.offset; + } else if(document.caretRangeFromPoint) { + range = document.caretRangeFromPoint(x, y); + textNode = range.startContainer; + offset = range.startOffset; + } + return { + textNode: textNode, + offset: offset + }; +}; return { @@ -81,7 +80,8 @@ return { }, getElementForNode: getElementForNode, getElementForDetachedNode: getElementForDetachedNode, - getElementForElementRootNode: getElementForElementRootNode + getElementForElementRootNode: getElementForElementRootNode, + caretPositionFromPoint: caretPositionFromPoint }; });