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