dijit.js 6.4 KB

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