Fixing typo in cursor.getSelectionBoundry
[fnpeditor.git] / modules / documentCanvas / canvas / canvas.js
index f96e62e..dd15d06 100644 (file)
@@ -169,8 +169,23 @@ $.extend(Canvas.prototype, {
             }
 
             this.wrapper.on('keyup', function(e) {
-                if(e.which >= 37 && e.which <= 40)
-                    canvas.setCurrentElement(canvas.getCursor().getPosition().element, {caretTo: false})
+                if(e.which >= 37 && e.which <= 40) {
+                    var element = canvas.getCursor().getPosition().element,
+                        caretTo = false;
+                    if(!element) {
+                        // Chrome hack
+                        var direction;
+                        if(e.which === KEYS.ARROW_LEFT  || e.which === KEYS.ARROW_UP) {
+                            direction = 'above';
+                            caretTo = 'end';
+                        } else {
+                            direction = 'below';
+                            caretTo = 'start';
+                        }
+                        element = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]:visible', direction, window.getSelection().focusNode));
+                    }
+                    canvas.setCurrentElement(element, {caretTo: caretTo});
+                }
             });
          
             this.wrapper.on('keydown', function(e) {
@@ -206,9 +221,9 @@ $.extend(Canvas.prototype, {
                 }
             });
 
-            this.wrapper.on('click', '[wlxml-tag], [document-text-element]', function(e) {
+            this.wrapper.on('click', '[document-node-element], [document-text-element]', function(e) {
                 e.stopPropagation();
-                canvas.setCurrentElement(canvas.getDocumentElement(e.target), {caretTo: false});
+                canvas.setCurrentElement(canvas.getDocumentElement(e.currentTarget), {caretTo: false});
             });
 
             var observer = new MutationObserver(function(mutations) {
@@ -221,8 +236,8 @@ $.extend(Canvas.prototype, {
             observer.observe(this.d[0], config);
 
 
-            this.wrapper.on('mouseover', '[wlxml-tag], [document-text-element]', function(e) {
-                var el = canvas.getDocumentElement(e.target);
+            this.wrapper.on('mouseover', '[document-node-element], [document-text-element]', function(e) {
+                var el = canvas.getDocumentElement(e.currentTarget);
                 if(!el)
                     return;
                 e.stopPropagation();
@@ -230,8 +245,8 @@ $.extend(Canvas.prototype, {
                     el = el.parent();
                 el.toggleLabel(true);
             });
-            this.wrapper.on('mouseout', '[wlxml-tag], [document-text-element]', function(e) {
-                var el = canvas.getDocumentElement(e.target);
+            this.wrapper.on('mouseout', '[document-node-element], [document-text-element]', function(e) {
+                var el = canvas.getDocumentElement(e.currentTarget);
                 if(!el)
                     return;
                 e.stopPropagation();
@@ -306,19 +321,9 @@ $.extend(Canvas.prototype, {
 
     list: {},
 
-
-
-    highlightElement: function(element) {
-        this.wrapper.find('.highlighted-element').removeClass('highlighted-element');
-        element.dom().addClass('highlighted-element');
-    },
-
-    dimElement: function(element) {
-        element.dom().removeClass('highlighted-element');
-    },
     
     getCurrentNodeElement: function() {
-        return this.getDocumentElement(this.wrapper.find('.current-node-element')[0]);
+        return this.getDocumentElement(this.wrapper.find('.current-node-element').parent()[0]);
     },
 
     getCurrentTextElement: function() {
@@ -346,7 +351,7 @@ $.extend(Canvas.prototype, {
                 element.dom().addClass('current-text-element');
             } else {
                 this.wrapper.find('.current-node-element').removeClass('current-node-element')
-                element.dom().addClass('current-node-element');
+                element._container().addClass('current-node-element');
                 this.publisher('currentElementChanged', element);
             }
         }.bind(this);
@@ -579,23 +584,40 @@ $.extend(Cursor.prototype, {
             anchorElement = this.canvas.getDocumentElement(selection.anchorNode),
             focusElement = this.canvas.getDocumentElement(selection.focusNode);
         
-        if(anchorElement instanceof documentElement.DocumentNodeElement || focusElement instanceof documentElement.DocumentNodeElement)
+        var getOffset = function(where) {
+            var toret, node;
+            if(where === 'anchor') {
+                node = selection.anchorNode;
+                toret = selection.anchorOffset;
+            } else {
+                node = selection.focusNode;
+                toret = selection.focusOffset;
+            }
+                        
+            if(toret === 1 && node.data.charAt(0) === utils.unicode.ZWS)
+                toret = 0;
+            else if((toret === node.data.length - 1) && (node.data.charAt(node.data.length - 1) === utils.unicode.ZWS))
+                toret++;
+            return toret;
+        }
+
+        if((!anchorElement) || (anchorElement instanceof documentElement.DocumentNodeElement) || (!focusElement) || focusElement instanceof documentElement.DocumentNodeElement)
             return {};
 
         if(which === 'anchor') {
             return {
                 element: anchorElement,
-                offset: selection.anchorOffset,
-                offsetAtBeginning: selection.anchorOffset === 0,
-                offsetAtEnd: anchorElement && anchorElement.getText().length === selection.anchorOffset
+                offset: getOffset('anchor'),
+                offsetAtBeginning: getOffset('anchor') === 0,
+                offsetAtEnd: selection.anchorNode.data.length === getOffset('anchor')
             };
         }
         if(which === 'focus') {
             return {
                 element: focusElement,
-                offset: selection.focusOffset,
-                offsetAtBeginning: selection.focusOffset === 0,
-                offsetAtEnd: focusElement && focusElement.getText().length === selection.focusOffset
+                offset: getOffset('focus'),
+                offsetAtBeginning: getOffset('focus') === 0,
+                offsetAtEnd: selection.focusNode.data.length === getOffset('focus')
             };
         }
         
@@ -608,38 +630,39 @@ $.extend(Cursor.prototype, {
             if(anchorFirst) {
                 if(which === 'start') {
                     element = anchorElement;
-                    offset = selection.anchorOffset;
+                    offset = getOffset('anchor')
                 }
                 else if(which === 'end') {
                     element = focusElement,
-                    offset = selection.focusOffset;
+                    offset = getOffset('focus')
                 }
             } else {
                 if(which === 'start') {
                     element = focusElement,
-                    offset = selection.focusOffset
+                    offset = getOffset('focus')
                 }
                 else if(which === 'end') {
                     element = anchorElement;
-                    offset = selection.anchorOffset;
+                    offset = getOffset('anchor')
                 }
             }
         } else {
             // TODO: Handle order via https://developer.mozilla.org/en-US/docs/Web/API/Node.compareDocumentPosition
             if(which === 'start') {
                 element = anchorElement;
-                offset = selection.anchorOffset
+                offset = getOffset('anchor')
             } else {
                 element = focusElement;
-                offset = selection.focusOffset
+                offset = getOffset('focus')
             }
         }
 
+        var nodeLen = (element.sameNode(focusElement) ? selection.focusNode : selection.anchorNode).length;
         return {
             element: element,
             offset: offset,
             offsetAtBeginning: offset === 0,
-            offsetAtEnd: element.getText().length === offset
+            offsetAtEnd: nodeLen === offset
         }
     }
 })