source: Dev/branches/rest-dojo-ui/client/dojox/dtl/contrib/dijit.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 6.3 KB
Line 
1define([
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});
Note: See TracBrowser for help on using the repository browser.