Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dijit.Declaration"] = true;
dojo.provide("dijit.Declaration");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");

dojo.declare(
        "dijit.Declaration",
        dijit._Widget,
        {
                // summary:
                //              The Declaration widget allows a user to declare new widget
                //              classes directly from a snippet of markup.

                _noScript: true,
                widgetClass: "",
                replaceVars: true,
                defaults: null,
                mixins: [],
                buildRendering: function(){
                        var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);
                        var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan();
                        var scripts = dojo.query("> script[type^='dojo/']", src).orphan();
                        var srcType = src.nodeName;

                        var propList = this.defaults||{};

                        // map array of strings like [ "dijit.form.Button" ] to array of mixin objects
                        // (note that dojo.map(this.mixins, dojo.getObject) doesn't work because it passes
                        // a bogus third argument to getObject(), confusing it)
                        this.mixins = this.mixins.length ?
                                dojo.map(this.mixins, function(name){ return dojo.getObject(name); } ) :
                                [ dijit._Widget, dijit._Templated ];

                        if(preambles.length){
                                // we only support one preamble. So be it.
                                propList.preamble = dojo.parser._functionFromScript(preambles[0]);
                        }

                        var parsedScripts = dojo.map(scripts, function(s){
                                var evt = s.getAttribute("event")||"postscript";
                                return {
                                        event: evt,
                                        func: dojo.parser._functionFromScript(s)
                                };
                        });

                        // do the connects for each <script type="dojo/connect" event="foo"> block and make
                        // all <script type="dojo/method"> tags execute right after construction
                        this.mixins.push(function(){
                                dojo.forEach(parsedScripts, function(s){
                                        dojo.connect(this, s.event, this, s.func);
                                }, this);
                        });

                        propList.widgetsInTemplate = true;
                        propList._skipNodeCache = true;
                        propList.templateString = "<"+srcType+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||'')+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||'')+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
                        // console.debug(propList.templateString);

                        // strip things so we don't create stuff under us in the initial setup phase
                        dojo.query("[dojoType]", src).forEach(function(node){
                                node.removeAttribute("dojoType");
                        });

                        // create the new widget class
                        dojo.declare(
                                this.widgetClass,
                                this.mixins,
                                propList
                        );
                }
        }
);

}