diff options
Diffstat (limited to 'includes/js/dijit/Declaration.js')
-rw-r--r-- | includes/js/dijit/Declaration.js | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/includes/js/dijit/Declaration.js b/includes/js/dijit/Declaration.js new file mode 100644 index 0000000..2b18cfe --- /dev/null +++ b/includes/js/dijit/Declaration.js @@ -0,0 +1,76 @@ +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 + ); + } + } +); + +} |