Fix: Do not set text on canvas element if it didn't change.
[fnpeditor.git] / src / editor / modules / documentCanvas / canvas / wlxmlListener.js
1 define([
2 'libs/jquery',
3 'modules/documentCanvas/canvas/utils',
4 ], function($, utils) {
5     
6 'use strict';
7
8 var Listener = function(canvas) {
9     this.canvas = canvas;
10 };
11
12 $.extend(Listener.prototype, {
13     listenTo: function(wlxmlDocument) {
14         if(wlxmlDocument === this.wlxmlDocument) {
15             return;
16         }
17         this.wlxmlDocument = wlxmlDocument;
18
19         wlxmlDocument.on('change', function(event) {
20             var handler = handlers[event.type];
21             if(handler) {
22                 handler.bind(this)(event);
23             }
24         }, this);
25
26         wlxmlDocument.on('contentSet', function() {
27             this.canvas.loadWlxmlDocument(wlxmlDocument);
28         }, this);
29     }
30 });
31
32 var handlers = {
33     nodeAttrChange: function(event) {
34         if(event.meta.attr === 'class') {
35             var canvasNode = utils.findCanvasElement(event.meta.node);
36             canvasNode.setWlxmlClass(event.meta.newVal);
37         }
38     },
39     nodeTagChange: function(event) {
40         var canvasNode = utils.findCanvasElement(event.meta.node);
41         canvasNode.setWlxmlTag(event.meta.newTagName);
42     },
43     nodeAdded: function(event, checkForExistence) {
44         if(event.meta.node.isRoot()) {
45             this.canvas.reloadRoot();
46             return;
47         }
48         var parentElement = utils.findCanvasElement(event.meta.node.parent()),
49             nodeIndex = event.meta.node.getIndex(),
50             referenceElement, referenceAction, actionArg;
51
52         if(nodeIndex === 0) {
53             referenceElement = parentElement;
54             referenceAction = 'prepend';
55         } else {
56             referenceElement = parentElement.children()[nodeIndex-1];
57             referenceAction = 'after';
58         }
59
60         actionArg = (checkForExistence && utils.findCanvasElement(event.meta.node)) || event.meta.node;
61         referenceElement[referenceAction](actionArg);
62     },
63     nodeMoved: function(event) {
64         return handlers.nodeAdded(event, true);
65     },
66     nodeDetached: function(event) {
67         var canvasNode = utils.findCanvasElementInParent(event.meta.node, event.meta.parent);
68         canvasNode.detach();
69     },
70     nodeTextChange: function(event) {
71         var canvasElement = utils.findCanvasElement(event.meta.node),
72             toSet = event.meta.node.getText();
73         if(toSet === '') {
74             toSet = utils.unicode.ZWS;
75         }
76         if(toSet !== canvasElement.getText()) {
77             canvasElement.setText(toSet);
78         }
79     }
80 };
81
82 return {
83     create: function(canvas) {
84         return new Listener(canvas);
85     }
86 };
87
88 });