refactoring: stop using data api on document element to keep reference to wlxmlNode
[fnpeditor.git] / src / editor / modules / documentCanvas / canvas / wlxmlListener.js
index ec3001d..cbf8d08 100644 (file)
@@ -14,6 +14,7 @@ $.extend(Listener.prototype, {
         if(wlxmlDocument === this.wlxmlDocument) {
             return;
         }
+        this.wlxmlDocument = wlxmlDocument;
 
         wlxmlDocument.on('change', function(event) {
             var handler = handlers[event.type];
@@ -28,6 +29,12 @@ $.extend(Listener.prototype, {
     }
 });
 
+
+var _metadataEventHandler = function(event) {
+    var canvasNode = utils.findCanvasElement(event.meta.node);
+    canvasNode.exec('updateMetadata');
+};
+
 var handlers = {
     nodeAttrChange: function(event) {
         if(event.meta.attr === 'class') {
@@ -38,7 +45,50 @@ var handlers = {
     nodeTagChange: function(event) {
         var canvasNode = utils.findCanvasElement(event.meta.node);
         canvasNode.setWlxmlTag(event.meta.newTagName);
-    }
+        canvasNode.wlxmlNode = event.meta.node;
+    },
+    nodeAdded: function(event, checkForExistence) {
+        if(event.meta.node.isRoot()) {
+            this.canvas.reloadRoot();
+            return;
+        }
+        var parentElement = utils.findCanvasElement(event.meta.node.parent()),
+            nodeIndex = event.meta.node.getIndex(),
+            referenceElement, referenceAction, actionArg;
+
+        if(nodeIndex === 0) {
+            referenceElement = parentElement;
+            referenceAction = 'prepend';
+        } else {
+            referenceElement = parentElement.children()[nodeIndex-1];
+            referenceAction = 'after';
+        }
+
+        actionArg = (checkForExistence && utils.findCanvasElement(event.meta.node, event.meta.parent)) || event.meta.node;
+        referenceElement[referenceAction](actionArg);
+    },
+    nodeMoved: function(event) {
+        return handlers.nodeAdded.call(this, event, true);
+    },
+    nodeDetached: function(event) {
+        var canvasNode = utils.findCanvasElementInParent(event.meta.node, event.meta.parent);
+        canvasNode.detach();
+    },
+    nodeTextChange: function(event) {
+        //console.log('wlxmlListener: ' + event.meta.node.getText());
+        var canvasElement = utils.findCanvasElement(event.meta.node),
+            toSet = event.meta.node.getText();
+        if(toSet === '') {
+            toSet = utils.unicode.ZWS;
+        }
+        if(toSet !== canvasElement.getText()) {
+            canvasElement.setText(toSet);
+        }
+    },
+
+    metadataChanged: _metadataEventHandler,
+    metadataAdded: _metadataEventHandler,
+    metadataRemoved: _metadataEventHandler
 };
 
 return {