X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/8bf6c2bb6ef0a358a3591d19d6aff7a1f7f22b92..bb42027c8fd9ed17234381d3c366c387a20592f0:/modules/documentCanvas/canvasManager.js diff --git a/modules/documentCanvas/canvasManager.js b/modules/documentCanvas/canvasManager.js index 5edd4be..87fa834 100644 --- a/modules/documentCanvas/canvasManager.js +++ b/modules/documentCanvas/canvasManager.js @@ -16,7 +16,7 @@ var getCursorPosition = function() { parentNode: parent, focusNode: $(selection.focusNode).parent(), isAtEnd: selection.anchorOffset === anchorNode.text().length - } + }; }; var Manager = function(canvas, sandbox) { @@ -76,12 +76,12 @@ var Manager = function(canvas, sandbox) { }; canvas.dom.onHide = function() { manager.scrollbarPosition = canvas.dom.find('#rng-module-documentCanvas-contentWrapper').scrollTop(); - } + }; }; Manager.prototype.selectNode = function(cnode, options) { options = options || {}; - var nodeElement = this.getNodeElement(cnode) + var nodeElement = this.getNodeElement(cnode); this.dimNode(cnode); @@ -97,29 +97,45 @@ Manager.prototype.selectNode = function(cnode, options) { }; Manager.prototype.insertNewNode = function(wlxmlTag, wlxmlClass) { - var selection = window.getSelection(); - - if(selection.getRangeAt(0).collapsed) { - - } else { - var offsetStart = selection.anchorOffset; - var offsetEnd = selection.focusOffset; - if(offsetStart > offsetEnd) { - var tmp = offsetStart; - offsetStart = offsetEnd; - offsetEnd = tmp; + var selection = window.getSelection(), + $anchorNode = $(selection.anchorNode), + $focusNode = $(selection.focusNode); + + + if(!selection.isCollapsed && $anchorNode.parent()[0] === $focusNode.parent()[0]) { + var textNodeIdx, + parent = $anchorNode.parent(), + parentContents = parent.contents(), + offsetStart = selection.anchorOffset, + offsetEnd = selection.focusOffset; + + if(selection.anchorNode === selection.focusNode) { + if(offsetStart > offsetEnd) { + var tmp = offsetStart; + offsetStart = offsetEnd; + offsetEnd = tmp; + } + textNodeIdx = parentContents.index($anchorNode); + } else { + if(parentContents.index($anchorNode) > parentContents.index($focusNode)) { + offsetStart = selection.focusOffset; + offsetEnd = selection.anchorOffset; + } + textNodeIdx = [parentContents.index($anchorNode), parentContents.index($focusNode)]; } + var wrapper = canvasNode.create({tag: wlxmlTag, klass: wlxmlClass}); - this.canvas.nodeWrap({inside: canvasNode.create($(selection.anchorNode).parent()), + this.canvas.nodeWrap({inside: canvasNode.create(parent), _with: wrapper, offsetStart: offsetStart, - offsetEnd: offsetEnd + offsetEnd: offsetEnd, + textNodeIdx: textNodeIdx }); this.selectNode(wrapper, {movecaret: 'end'}); } -} +}; Manager.prototype.getNodeElement = function(cnode) { return this.canvas.dom.find('#'+cnode.getId()); @@ -151,9 +167,9 @@ Manager.prototype.selectFirstNode = function() { }).first(); var node; if(firstNodeWithText.length) - node = $(firstNodeWithText[0]) + node = $(firstNodeWithText[0]); else { - node = this.canvas.dom.find('[wlxml-class|="p"]') + node = this.canvas.dom.find('[wlxml-class|="p"]'); } this.selectNode(canvasNode.create(node), {movecaret: true}); }; @@ -169,7 +185,7 @@ Manager.prototype.movecaretToNode = function(nodeElement, where) { collapseArg = false; range.collapse(collapseArg); var selection = document.getSelection(); - selection.removeAllRanges() + selection.removeAllRanges(); selection.addRange(range); }; @@ -210,7 +226,7 @@ Manager.prototype.onBackspaceKey = function(e) { this.canvas.nodeRemove({node: toRemove}); // jesli nie ma tekstu, to anchor nie jest tex nodem this.selectNode(prevNode, {movecaret: 'end'}); } -} +}; Manager.prototype.command = function(command, meta) { var pos = getCursorPosition(); @@ -231,7 +247,7 @@ Manager.prototype.command = function(command, meta) { } } -} +}; return Manager;