1 | define([ |
---|
2 | "dojo/_base/lang", |
---|
3 | "dojo/_base/connect", |
---|
4 | "dojo/_base/array", |
---|
5 | "dojo/query", |
---|
6 | "../_base", |
---|
7 | "../dom", |
---|
8 | "dojo/parser", |
---|
9 | "dojo/_base/sniff" |
---|
10 | ], function(lang,connect,array,query,dd,dxdom,parser,has){ |
---|
11 | |
---|
12 | var ddcd = lang.getObject("contrib.dijit", true, dd); |
---|
13 | /*===== |
---|
14 | ddcd = { |
---|
15 | // TODO: summary |
---|
16 | }; |
---|
17 | =====*/ |
---|
18 | |
---|
19 | ddcd.AttachNode = lang.extend(function(keys, object){ |
---|
20 | this._keys = keys; |
---|
21 | this._object = object; |
---|
22 | }, |
---|
23 | { |
---|
24 | render: function(context, buffer){ |
---|
25 | if(!this._rendered){ |
---|
26 | this._rendered = true; |
---|
27 | for(var i = 0, key; key = this._keys[i]; i++){ |
---|
28 | context.getThis()[key] = this._object || buffer.getParent(); |
---|
29 | } |
---|
30 | } |
---|
31 | return buffer; |
---|
32 | }, |
---|
33 | unrender: function(context, buffer){ |
---|
34 | if(this._rendered){ |
---|
35 | this._rendered = false; |
---|
36 | for(var i = 0, key; key = this._keys[i]; i++){ |
---|
37 | if(context.getThis()[key] === (this._object || buffer.getParent())){ |
---|
38 | delete context.getThis()[key]; |
---|
39 | } |
---|
40 | } |
---|
41 | } |
---|
42 | return buffer; |
---|
43 | }, |
---|
44 | clone: function(buffer){ |
---|
45 | return new this.constructor(this._keys, this._object); |
---|
46 | } |
---|
47 | }); |
---|
48 | |
---|
49 | ddcd.EventNode = lang.extend(function(command, obj){ |
---|
50 | this._command = command; |
---|
51 | |
---|
52 | var type, events = command.split(/\s*,\s*/); |
---|
53 | var trim = lang.trim; |
---|
54 | var types = []; |
---|
55 | var fns = []; |
---|
56 | while(type = events.pop()){ |
---|
57 | if(type){ |
---|
58 | var fn = null; |
---|
59 | if(type.indexOf(":") != -1){ |
---|
60 | // oh, if only JS had tuple assignment |
---|
61 | var funcNameArr = type.split(":"); |
---|
62 | type = trim(funcNameArr[0]); |
---|
63 | fn = trim(funcNameArr.slice(1).join(":")); |
---|
64 | }else{ |
---|
65 | type = trim(type); |
---|
66 | } |
---|
67 | if(!fn){ |
---|
68 | fn = type; |
---|
69 | } |
---|
70 | types.push(type); |
---|
71 | fns.push(fn); |
---|
72 | } |
---|
73 | } |
---|
74 | |
---|
75 | this._types = types; |
---|
76 | this._fns = fns; |
---|
77 | this._object = obj; |
---|
78 | this._rendered = []; |
---|
79 | }, |
---|
80 | { |
---|
81 | // _clear: Boolean |
---|
82 | // Make sure we kill the actual tags (onclick problems, etc) |
---|
83 | _clear: false, |
---|
84 | render: function(context, buffer){ |
---|
85 | for(var i = 0, type; type = this._types[i]; i++){ |
---|
86 | if(!this._clear && !this._object){ |
---|
87 | buffer.getParent()[type] = null; |
---|
88 | } |
---|
89 | var fn = this._fns[i]; |
---|
90 | var args; |
---|
91 | if(fn.indexOf(" ") != -1){ |
---|
92 | if(this._rendered[i]){ |
---|
93 | connect.disconnect(this._rendered[i]); |
---|
94 | this._rendered[i] = false; |
---|
95 | } |
---|
96 | args = array.map(fn.split(" ").slice(1), function(item){ |
---|
97 | return new dd._Filter(item).resolve(context); |
---|
98 | }); |
---|
99 | fn = fn.split(" ", 2)[0]; |
---|
100 | } |
---|
101 | if(!this._rendered[i]){ |
---|
102 | if(!this._object){ |
---|
103 | this._rendered[i] = buffer.addEvent(context, type, fn, args); |
---|
104 | }else{ |
---|
105 | var resolved = fn; |
---|
106 | if(lang.isArray(args)){ |
---|
107 | resolved = function(e){ |
---|
108 | this[fn].apply(this, [e].concat(args)); |
---|
109 | } |
---|
110 | } |
---|
111 | this._rendered[i] = connect.connect(this._object, type, context.getThis(), fn); |
---|
112 | } |
---|
113 | } |
---|
114 | } |
---|
115 | this._clear = true; |
---|
116 | |
---|
117 | return buffer; |
---|
118 | }, |
---|
119 | unrender: function(context, buffer){ |
---|
120 | while(this._rendered.length){ |
---|
121 | connect.disconnect(this._rendered.pop()); |
---|
122 | } |
---|
123 | return buffer; |
---|
124 | }, |
---|
125 | clone: function(){ |
---|
126 | return new this.constructor(this._command, this._object); |
---|
127 | } |
---|
128 | }); |
---|
129 | |
---|
130 | function cloneNode(n1){ |
---|
131 | var n2 = n1.cloneNode(true); |
---|
132 | if(has("ie")){ |
---|
133 | query("script", n2).forEach("item.text = this[index].text;", query("script", n1)); |
---|
134 | } |
---|
135 | return n2; |
---|
136 | } |
---|
137 | |
---|
138 | ddcd.DojoTypeNode = lang.extend(function(node, parsed){ |
---|
139 | this._node = node; |
---|
140 | this._parsed = parsed; |
---|
141 | |
---|
142 | var events = node.getAttribute("dojoAttachEvent") || node.getAttribute("data-dojo-attach-event"); |
---|
143 | if(events){ |
---|
144 | this._events = new ddcd.EventNode(lang.trim(events)); |
---|
145 | } |
---|
146 | var attach = node.getAttribute("dojoAttachPoint") || node.getAttribute("data-dojo-attach-point"); |
---|
147 | if(attach){ |
---|
148 | this._attach = new ddcd.AttachNode(lang.trim(attach).split(/\s*,\s*/)); |
---|
149 | } |
---|
150 | |
---|
151 | if(!parsed){ |
---|
152 | this._dijit = parser.instantiate([cloneNode(node)])[0]; |
---|
153 | }else{ |
---|
154 | node = cloneNode(node); |
---|
155 | var old = ddcd.widgetsInTemplate; |
---|
156 | ddcd.widgetsInTemplate = false; |
---|
157 | this._template = new dd.DomTemplate(node); |
---|
158 | ddcd.widgetsInTemplate = old; |
---|
159 | } |
---|
160 | }, |
---|
161 | { |
---|
162 | render: function(context, buffer){ |
---|
163 | if(this._parsed){ |
---|
164 | var _buffer = new dd.DomBuffer(); |
---|
165 | this._template.render(context, _buffer); |
---|
166 | var root = cloneNode(_buffer.getRootNode()); |
---|
167 | var div = document.createElement("div"); |
---|
168 | div.appendChild(root); |
---|
169 | var rendered = div.innerHTML; |
---|
170 | div.removeChild(root); |
---|
171 | if(rendered != this._rendered){ |
---|
172 | this._rendered = rendered; |
---|
173 | if(this._dijit){ |
---|
174 | this._dijit.destroyRecursive(); |
---|
175 | } |
---|
176 | this._dijit = parser.instantiate([root])[0]; |
---|
177 | } |
---|
178 | } |
---|
179 | |
---|
180 | var node = this._dijit.domNode; |
---|
181 | |
---|
182 | if(this._events){ |
---|
183 | this._events._object = this._dijit; |
---|
184 | this._events.render(context, buffer); |
---|
185 | } |
---|
186 | if(this._attach){ |
---|
187 | this._attach._object = this._dijit; |
---|
188 | this._attach.render(context, buffer); |
---|
189 | } |
---|
190 | |
---|
191 | return buffer.concat(node); |
---|
192 | }, |
---|
193 | unrender: function(context, buffer){ |
---|
194 | return buffer.remove(this._dijit.domNode); |
---|
195 | }, |
---|
196 | clone: function(){ |
---|
197 | return new this.constructor(this._node, this._parsed); |
---|
198 | } |
---|
199 | }); |
---|
200 | |
---|
201 | lang.mixin(ddcd, { |
---|
202 | widgetsInTemplate: true, |
---|
203 | dojoAttachPoint: function(parser, token){ |
---|
204 | return new ddcd.AttachNode(token.contents.slice(token.contents.indexOf("data-") !== -1 ? 23 : 16).split(/\s*,\s*/)); |
---|
205 | }, |
---|
206 | dojoAttachEvent: function(parser, token){ |
---|
207 | return new ddcd.EventNode(token.contents.slice(token.contents.indexOf("data-") !== -1 ? 23 : 16)); |
---|
208 | }, |
---|
209 | dojoType: function(parser, token){ |
---|
210 | var parsed = false; |
---|
211 | if(token.contents.slice(-7) == " parsed"){ |
---|
212 | parsed = true; |
---|
213 | } |
---|
214 | var contents = token.contents.indexOf("data-") !== -1 ? token.contents.slice(15) : token.contents.slice(9); |
---|
215 | var dojoType = parsed ? contents.slice(0, -7) : contents.toString(); |
---|
216 | |
---|
217 | if(ddcd.widgetsInTemplate){ |
---|
218 | var node = parser.swallowNode(); |
---|
219 | node.setAttribute("data-dojo-type", dojoType); |
---|
220 | return new ddcd.DojoTypeNode(node, parsed); |
---|
221 | } |
---|
222 | |
---|
223 | return new dd.AttributeNode("data-dojo-type", dojoType); |
---|
224 | }, |
---|
225 | on: function(parser, token){ |
---|
226 | // summary: |
---|
227 | // Associates an event type to a function (on the current widget) by name |
---|
228 | var parts = token.contents.split(); |
---|
229 | return new ddcd.EventNode(parts[0] + ":" + parts.slice(1).join(" ")); |
---|
230 | } |
---|
231 | }); |
---|
232 | ddcd["data-dojo-type"] = ddcd.dojoType; |
---|
233 | ddcd["data-dojo-attach-point"] = ddcd.dojoAttachPoint; |
---|
234 | ddcd["data-dojo-attach-event"] = ddcd.dojoAttachEvent; |
---|
235 | |
---|
236 | |
---|
237 | dd.register.tags("dojox.dtl.contrib", { |
---|
238 | "dijit": ["attr:dojoType", "attr:data-dojo-type", "attr:dojoAttachPoint", "attr:data-dojo-attach-point", ["attr:attach", "dojoAttachPoint"], ["attr:attach", "data-dojo-attach-point"], "attr:dojoAttachEvent", "attr:data-dojo-attach-event", [/(attr:)?on(click|key(up))/i, "on"]] |
---|
239 | }); |
---|
240 | |
---|
241 | return ddcd; |
---|
242 | }); |
---|