Ext.lingo.TreeField.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /*
  2. * Ext JS Library 1.1
  3. * Copyright(c) 2006-2007, Ext JS, LLC.
  4. * licensing@extjs.com
  5. *
  6. * http://www.extjs.com/license
  7. *
  8. * @author Lingo
  9. * @since 2007-09-21
  10. * http://code.google.com/p/anewssystem/
  11. */
  12. /**
  13. * 声明Ext.lingo命名控件
  14. * TODO: 完全照抄,作用不明
  15. */
  16. Ext.namespace("Ext.lingo");
  17. /**
  18. * 下拉树形.
  19. *
  20. */
  21. //
  22. // var tree = new Ext.tree.TreePanel(el,{containerScroll: true});
  23. // var p = new Ext.data.HttpProxy({url:url});
  24. // p.on("loadexception", function(o, response, e) {
  25. // if (e) throw e;
  26. // });
  27. // p.load(null, {
  28. // read: function(response) {
  29. // var doc = response.responseXML;
  30. // tree.setRootNode(rpTreeNodeFromXml(doc.documentElement || doc));
  31. // }
  32. // }, callback || tree.render, tree);
  33. // return tree;
  34. //
  35. //}
  36. // 从xml中创建树
  37. /*
  38. function rpTreeNodeFromXml(XmlEl) {
  39. // 如果是text节点,就取节点值,如果不是text节点,就取tagName
  40. var t = ((XmlEl.nodeType == 3) ? XmlEl.nodeValue : XmlEl.tagName);
  41. // 没有text,没有节点的时候
  42. if (t.replace(/\s/g,'').length == 0) {
  43. return null;
  44. }
  45. // 特别指定一个没有任何属性,并且只包含一个text节点的元素
  46. var leafTextNode = ((XmlEl.attributes.length == 0) && (XmlEl.childNodes.length == 1) && (XmlEl.firstChild.nodeType == 3));
  47. if (leafTextNode ) {
  48. return new Ext.tree.TreeNode({
  49. tagName: XmlEl.tagName,
  50. text: XmlEl.firstChild.nodeValue
  51. });
  52. }
  53. var result = new Ext.tree.TreeNode({
  54. text : t
  55. });
  56. result.tagName=XmlEl.tagName;
  57. // 为元素处理属性和子节点
  58. if (XmlEl.nodeType == 1) {
  59. Ext.each(XmlEl.attributes, function(a) {
  60. result.attributes[a.nodeName]=a.nodeValue;
  61. if(a.nodeName=='text')
  62. result.setText(a.nodeValue);
  63. });
  64. if (!leafTextNode) {
  65. Ext.each(XmlEl.childNodes, function(el) {
  66. // 只处理元素和text节点
  67. if ((el.nodeType == 1) || (el.nodeType == 3)) {
  68. var c = rpTreeNodeFromXml(el);
  69. if (c) {
  70. result.appendChild(c);
  71. }
  72. }
  73. });
  74. }
  75. }
  76. return result;
  77. }
  78. */
  79. Ext.lingo.TreeField = function(config) {
  80. config.readOnly = true;
  81. Ext.lingo.TreeField.superclass.constructor.call(this, config);
  82. this.url = this.treeConfig.dataTag;
  83. };
  84. Ext.extend(Ext.lingo.TreeField, Ext.form.TriggerField, {
  85. triggerClass : 'x-form-date-trigger',
  86. defaultAutoCreate : {
  87. tag : "input",
  88. type : "text",
  89. size : "10",
  90. autocomplete : "off"
  91. },
  92. onRender : function(ct, position) {
  93. Ext.lingo.TreeField.superclass.onRender.call(this, ct, position);
  94. var hiddenName = this.treeConfig.hiddenName;
  95. var hiddenId = this.treeConfig.hiddenId ? this.treeConfig.hiddenId : hiddenName;
  96. this.treeConfig.hiddenId = hiddenId;
  97. this.hiddenField = this.el.insertSibling({
  98. tag: 'input',
  99. type:'hidden',
  100. id: hiddenId,
  101. name: hiddenName
  102. }, 'before', true);
  103. this.el.dom.removeAttribute('name');
  104. },
  105. getValue : function() {
  106. //return Ext.lingo.TreeField.superclass.getValue.call(this) || this.hiddenField.value;
  107. return this.hiddenField.value;
  108. },
  109. setValue : function(val) {
  110. if (this.hiddenField) {
  111. this.hiddenField.value = val;
  112. }
  113. Ext.lingo.TreeField.superclass.setValue.call(this, val);
  114. },
  115. menuListeners : {
  116. select:function (item, picker, node) {
  117. var v = node.text;
  118. //var v = node.id;
  119. var ed = this.ed;
  120. if (this.selfunc) {
  121. v = this.selfunc(node);
  122. }
  123. if (ed) {
  124. var r = ed.record;
  125. r.set(this.fn, v);
  126. } else {
  127. this.focus();
  128. this.selectedId = node.id;
  129. //this.setValue(v);
  130. //document.getElementById(this.treeConfig.hiddenId).value = node.id;
  131. }
  132. },
  133. hide : function(){
  134. }
  135. },
  136. onTriggerClick : function(){
  137. if(this.disabled){
  138. return;
  139. }
  140. if(this.menu == null){
  141. this.menu = new Ext.menu.TreeMenu(this.treeConfig);
  142. }
  143. this.menu.picker.url = this.url;
  144. Ext.apply(this.menu.picker, {
  145. url : this.url
  146. });
  147. this.menu.on(Ext.apply({}, this.menuListeners, {
  148. scope : this
  149. }));
  150. this.menu.picker.setValue(this.getValue());
  151. this.menu.show(this.el, "tl-bl?");
  152. },
  153. getName: function() {
  154. return this.name;
  155. },
  156. invalidText : "{0} is not a valid date - it must be in the format {1}"
  157. });
  158. Ext.menu.TreeMenu = function(config) {
  159. this.url = config.dataTag;
  160. Ext.menu.TreeMenu.superclass.constructor.call(this, config);
  161. this.plain = true;
  162. var di = new Ext.menu.TreeItem(config);
  163. this.add(di);
  164. this.picker = di.picker;
  165. this.relayEvents(di, ["select"]);
  166. this.relayEvents(di, ["beforesubmit"]);
  167. };
  168. Ext.extend(Ext.menu.TreeMenu, Ext.menu.Menu);
  169. Ext.menu.TreeItem = function(config){
  170. var treePicker = new Ext.TreePicker(config);
  171. this.component = treePicker;
  172. Ext.menu.TreeItem.superclass.constructor.call(this, treePicker, config);
  173. this.picker = this.component;
  174. this.addEvents({select: true});
  175. this.picker.on("render", function(picker){
  176. picker.getEl().swallowEvent("click");
  177. //picker.container.addClass("x-menu-date-item");
  178. });
  179. this.picker.on("select", this.onSelect, this);
  180. };
  181. Ext.extend(Ext.menu.TreeItem, Ext.menu.Adapter, {
  182. onSelect : function(picker, node) {
  183. this.fireEvent("select", this, picker, node);
  184. Ext.menu.TreeItem.superclass.handleClick.call(this);
  185. }
  186. });
  187. Ext.TreePicker = function(config){
  188. Ext.TreePicker.superclass.constructor.call(this, config);
  189. this.addEvents({select: true});
  190. if(this.handler){
  191. this.on("select", this.handler, this.scope || this);
  192. }
  193. };
  194. Ext.extend(Ext.TreePicker, Ext.Component, {
  195. setValue : function(value) {
  196. this.value = value;
  197. if(this.tree)
  198. this.tree.selectPath(value, 'text');
  199. },
  200. getValue : function() {
  201. return this.value;
  202. },
  203. onRender : function(container) {
  204. var me = this;
  205. var dh = Ext.DomHelper;
  206. var el = document.createElement("div");
  207. el.className = "x-date-picker";
  208. el.innerHTML = '';
  209. var eo = Ext.get(el);
  210. this.el = eo;
  211. container.dom.appendChild(el);
  212. var tree = this.createTree(el, me.dataTag, function() {
  213. var tree = this;
  214. tree.render();
  215. tree.selectPath(me.getValue(), 'text');
  216. });
  217. tree.on('click',function(node,e){
  218. me.fireEvent("select", me, node);
  219. });
  220. this.tree = tree;
  221. },
  222. createTree : function(el, url, callback) {
  223. var Tree = Ext.tree;
  224. // id
  225. var tree = new Tree.TreePanel({
  226. el:el,
  227. autoScroll:true,
  228. animate:true,
  229. enableDD:true,
  230. autoHeight:true,
  231. autoWidth:true,
  232. containerScroll:true,
  233. loader: new Tree.TreeLoader({
  234. dataUrl: url
  235. })
  236. });
  237. // 设置根节点
  238. var root = new Tree.AsyncTreeNode({
  239. text : this.initialConfig.title, // c.title
  240. draggable : false,
  241. id : '-1'
  242. });
  243. tree.setRootNode(root);
  244. // 渲染
  245. tree.render();
  246. root.expand();
  247. return tree;
  248. }
  249. });
  250. Ext.reg('treefield', Ext.lingo.TreeField);