smartxml: fix - do not send nodeDetached event for out of document node
[fnpeditor.git] / src / editor / modules / documentCanvas / canvas / wlxmlManagers.js
1 define([
2 'libs/jquery',
3 'modules/documentCanvas/canvas/widgets'
4 ], function($, widgets) {
5     
6 'use strict';
7
8
9 var DocumentElementWrapper = function(documentElement) {
10     
11     this.documentElement = documentElement;
12
13     this.addWidget = function(widget) {
14         documentElement.dom().children('.canvas-widgets').append(widget);
15     };
16
17     this.clearWidgets = function() {
18         documentElement.dom().children('.canvas-widgets').empty();
19     }
20
21     this.setDisplayStyle = function(displayStyle) {
22         documentElement.dom().css('display', displayStyle || '');
23         documentElement._container().css('display', displayStyle || '');
24     };
25
26     this.tag = function() {
27         return documentElement.getWlxmlTag();
28     };
29
30     this.klass = function() {
31         return documentElement.getWlxmlClass();
32     };
33
34     this.toggle = function(toggle) {
35         documentElement._container().toggle(toggle);
36     }
37
38     var eventBus = documentElement.canvas ? documentElement.canvas.eventBus :
39         {trigger: function() {}};
40     this.trigger = function() {
41         eventBus.trigger.apply(eventBus, arguments);
42     }
43
44 }
45
46 var getDisplayStyle = function(tag, klass) {
47     if(tag === 'metadata')
48         return 'none';
49     if(tag === 'span')
50         return 'inline';
51     if(klass === 'item')
52         return null;
53     return 'block';
54 }
55
56 var GenericManager = function(wlxmlElement) {
57     this.el = wlxmlElement;
58 };
59
60 $.extend(GenericManager.prototype, {
61     setup: function() {
62         this.el.setDisplayStyle(getDisplayStyle(this.el.tag(), this.el.klass()));
63
64         this.el.clearWidgets();
65         this.el.addWidget(widgets.labelWidget(this.el.tag(), this.el.klass()));
66
67     },
68     toggle: function(toggle) {
69         this.el.toggle(toggle);
70     }
71
72 })
73
74 var managers = {
75     _m: {},
76     set: function(tag, klass, manager) {
77         if(!this._m[tag])
78             this._m[tag] = {};
79         this._m[tag][klass] = manager;
80     },
81     get: function(tag,klass) {
82         if(this._m[tag] && this._m[tag][klass])
83             return this._m[tag][klass];
84         return GenericManager;
85     }
86 }
87
88 var FootnoteManager = function(wlxmlElement) {
89     this.el = wlxmlElement;
90 };
91 $.extend(FootnoteManager.prototype, {
92     setup: function() {
93         this.el.clearWidgets();
94
95         var clickHandler = function() {
96             this.toggle(true);
97         }.bind(this);
98         this.footnoteHandler = widgets.footnoteHandler(clickHandler);
99         this.el.addWidget(this.footnoteHandler);
100
101         var closeHandler = function() {
102             this.toggle(false);
103
104         }.bind(this);
105         this.hideButton = widgets.hideButton(closeHandler);
106         this.el.addWidget(this.hideButton);
107
108         this.toggle(false, {silent: true});
109     },
110     toggle: function(toggle, options) {
111         options = options || {};
112         this.hideButton.toggle(toggle);
113         this.footnoteHandler.toggle(!toggle);
114         
115         this.el.setDisplayStyle(toggle ? 'block' : 'inline');
116         this.el.toggle(toggle);
117         if(!options.silent)
118             this.el.trigger('elementToggled', toggle, this.el.documentElement);
119     }
120 })
121 managers.set('aside', 'footnote', FootnoteManager);
122
123
124 var ListItemManager = function(wlxmlElement) {
125     this.el = wlxmlElement;
126 };
127 $.extend(ListItemManager.prototype, {
128     setup: function() {
129         this.el.clearWidgets();
130         this.el.addWidget(widgets.labelWidget(this.el.tag(), this.el.klass()));
131         this.el.documentElement._container().css({display: 'list-item'});
132     },
133     toggleBullet: function(toggle) {
134         this.el.documentElement._container().css({display : toggle ? 'list-item' : 'block'});
135     }
136 });
137 managers.set('div', 'item', ListItemManager);
138
139 return {
140     getFor: function(documentElement) {
141         var wlxmlElement = new DocumentElementWrapper(documentElement);
142         return new (managers.get(wlxmlElement.tag(), wlxmlElement.klass()))(wlxmlElement);
143
144     }
145 };
146
147 });