dijit.js 6.0 KB

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