ExtJs 3.31 三態樹

主要實現原理就是替換TreeNodeUI這個類的renderElements方法,將以前的<input type='checkbox'>替換成圖片形式的checkbox。當然需要修改相應的方法,如isChecked() 等方法。

注意:1、現在三態的表示方式均爲字符串 "True","False","Not",分別代表 選中、空、反選。

2、在TreeNode中增加isThr屬性,表示是否爲三太顯示,false和置默認爲兩態,true爲三太。

 

廢話不說了直接上代碼。

 

1、JS代碼:

  1. Ext.override(Ext.tree.TreeNodeUI, { 
  2.     grayedValue: null
  3.     isThr: false
  4.     onDisableChange: function (node, state) { 
  5.         this.disabled = state; 
  6.         this[state ? 'addClass' : 'removeClass']("x-tree-node-disabled"); 
  7.     }, 
  8.     initEvents: function () { 
  9.         this.node.on("move"this.onMove, this); 
  10.         if (this.node.disabled) { 
  11.             this.disabled = true
  12.             this.addClass("x-tree-node-disabled"); 
  13.         } 
  14.         if (this.node.hidden) { 
  15.             this.hide(); 
  16.         } 
  17.         var ot = this.node.getOwnerTree(); 
  18.         var dd = ot.enableDD || ot.enableDrag || ot.enableDrop; 
  19.         if (dd && (!this.node.isRoot || ot.rootVisible)) { 
  20.             Ext.dd.Registry.register(this.elNode, { 
  21.                 node: this.node, 
  22.                 handles: this.getDDHandles(), 
  23.                 isHandle: false 
  24.             }); 
  25.         } 
  26.     }, 
  27.     onDblClick: function (e) { 
  28.         e.preventDefault(); 
  29.         if (this.disabled) { 
  30.             return
  31.         } 
  32.         if (!this.animating && this.node.isExpandable() && !e.getTarget('.x-tree-checkbox', 1)) { 
  33.             this.node.toggle(); 
  34.         } 
  35.         this.fireEvent("dblclick"this.node, e); 
  36.     }, 
  37.     onCheckChange: function () { 
  38.         var checked = this.isChecked(); 
  39.         if (checked !== this.node.attributes.checked) { 
  40.             this.node.attributes.checked = checked; 
  41.             this.fireEvent('checkchange'this.node, checked); 
  42.         } 
  43.     }, 
  44.     toggleCheck: function (checked) { 
  45.         var cb = this.checkbox; 
  46.         if (!cb) { 
  47.             return 'false'
  48.         } 
  49.         if (checked === undefined) { 
  50.             checked = this.isChecked(); 
  51.         } 
  52.         else { 
  53.             if (this.isThr == true) { 
  54.                 checked = checked == 'true' ? 'false' : (checked == 'false' ? 'not' : 'true'); 
  55.             } 
  56.             else { 
  57.                 checked = checked == 'true' ? 'false' : 'true'
  58.             } 
  59.         } 
  60.         if (this.isThr == true) { 
  61.             if (checked == 'true') { 
  62.                 Ext.fly(cb).replaceClass('x-tree-node-checked''x-tree-node-grayed'); 
  63.             } else if (checked == 'false') { 
  64.                 Ext.fly(cb).replaceClass('x-tree-node-unchecked''x-tree-node-checked'); 
  65.             } else if (checked == 'not') { 
  66.                 Ext.fly(cb).replaceClass('x-tree-node-grayed''x-tree-node-unchecked'); 
  67.             } 
  68.             else { 
  69.                 Ext.fly(cb).removeClass(['x-tree-node-checked''x-tree-node-grayed''x-tree-node-unchecked']); 
  70.             } 
  71.         } 
  72.         else { 
  73.             if (checked == 'true') { 
  74.                 Ext.fly(cb).replaceClass('x-tree-node-checked''x-tree-node-unchecked'); 
  75.             } else if (checked == 'false') { 
  76.                 Ext.fly(cb).replaceClass('x-tree-node-unchecked''x-tree-node-checked'); 
  77.             } else { 
  78.                 Ext.fly(cb).removeClass(['x-tree-node-checked''x-tree-node-unchecked']); 
  79.             } 
  80.         } 
  81.         this.onCheckChange(); 
  82.         return checked; 
  83.     }, 
  84.     onCheckboxClick: function () { 
  85.         if (!this.disabled) { 
  86.             this.toggleCheck(); 
  87.         } 
  88.     }, 
  89.     onCheckboxOver: function () { 
  90.         this.addClass('x-tree-checkbox-over'); 
  91.     }, 
  92.     onCheckboxOut: function () { 
  93.         this.removeClass('x-tree-checkbox-over'); 
  94.     }, 
  95.     onCheckboxDown: function () { 
  96.         this.addClass('x-tree-checkbox-down'); 
  97.     }, 
  98.     onCheckboxUp: function () { 
  99.         this.removeClass('x-tree-checkbox-down'); 
  100.     }, 
  101.     renderElements: function (n, a, targetNode, bulkRender) { 
  102.         this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : ''
  103.         var cb = a.checked !== undefined; 
  104.         this.isThr = a.isThr !== undefined; 
  105.         var href = a.href ? a.href : Ext.isGecko ? "" : "#"
  106.         var buf = ['<li class="x-tree-node"><div ext:tree-node-id="', n.id, '" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls, '" unselectable="on">'
  107.             '<span class="x-tree-node-indent">'this.indentMarkup, "</span>"
  108.             '<img src="'this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />'
  109.             '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon', (a.icon ? " x-tree-node-inline-icon" : ""), (a.iconCls ? " " + a.iconCls : ""), '" unselectable="on" />', 
  110.             cb ? ('<img src="' + this.emptyIcon + '" class="x-tree-checkbox' + (a.checked === true ? ' x-tree-node-checked' : (a.checked === false ? ' x-tree-node-unchecked' : ' x-tree-node-grayed')) + '" />') : ''
  111.             '<a hidefocus="on" class="x-tree-node-anchor" href="', href, '" tabIndex="1" '
  112.             a.hrefTarget ? ' target="' + a.hrefTarget + '"' : ""'><span unselectable="on">', n.text, "</span></a></div>"
  113.             '<ul class="x-tree-node-ct" style="display:none;"></ul>'
  114.             "</li>"].join(''); 
  115.         var nel; 
  116.         if (bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())) { 
  117.             this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf); 
  118.         } else { 
  119.             this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf); 
  120.         } 
  121.         this.elNode = this.wrap.childNodes[0]; 
  122.         this.ctNode = this.wrap.childNodes[1]; 
  123.         var cs = this.elNode.childNodes; 
  124.         this.indentNode = cs[0]; 
  125.         this.ecNode = cs[1]; 
  126.         this.iconNode = cs[2]; 
  127.         var index = 3; 
  128.         if (cb) { 
  129.             this.checkbox = cs[3]; 
  130.             index++; 
  131.         } 
  132.         this.anchor = cs[index]; 
  133.         this.textNode = cs[index].firstChild; 
  134.     }, 
  135.     isChecked: function () { 
  136.         if (this.isThr == true) { 
  137.             return this.checkbox 
  138.             ? (Ext.fly(this.checkbox).hasClass('x-tree-node-checked'
  139.                 ? 'true' 
  140.                 : Ext.fly(this.checkbox).hasClass('x-tree-node-grayed'
  141.                     ? 'not' 
  142.                     : Ext.fly(this.checkbox).hasClass('x-tree-node-unchecked'
  143.                         ? 'false' 
  144.                         : 'false' 
  145.                     ) 
  146.             : false
  147.         } 
  148.         else { 
  149.             return this.checkbox 
  150.             ? (Ext.fly(this.checkbox).hasClass('x-tree-node-checked'
  151.                 ? 'true' 
  152.                 : Ext.fly(this.checkbox).hasClass('x-tree-node-unchecked'
  153.                     ? 'false' 
  154.                     : 'false'
  155.             : 'false'
  156.         } 
  157.     }, 
  158.     getChecked: function () { 
  159.         return this.node.attributes.checked; 
  160.     } 
  161. }); 
  162. Ext.override(Ext.tree.TreeEventModel, { 
  163.     initEvents :function(){ 
  164.         var el = this.tree.getTreeEl(); 
  165.         el.on('click'this.delegateClick, this); 
  166.         if(this.tree.trackMouseOver !== false){ 
  167.             el.on('mouseover'this.delegateOver, this); 
  168.             el.on('mouseout'this.delegateOut, this); 
  169.         } 
  170.         el.on('mousedown'this.delegateDown, this); 
  171.         el.on('mouseup'this.delegateUp, this); 
  172.         el.on('dblclick'this.delegateDblClick, this); 
  173.         el.on('contextmenu'this.delegateContextMenu, this); 
  174.     }, 
  175.     delegateOver :function(e, t){ 
  176.         if(!this.beforeEvent(e)){ 
  177.             return
  178.         } 
  179.         if(this.lastEcOver){ 
  180.             this.onIconOut(e, this.lastEcOver); 
  181.             delete this.lastEcOver; 
  182.         } 
  183.         if(this.lastCbOver){ 
  184.             this.onCheckboxOut(e, this.lastCbOver); 
  185.             delete this.lastCbOver; 
  186.         } 
  187.         if(e.getTarget('.x-tree-ec-icon', 1)){ 
  188.             this.lastEcOver = this.getNode(e); 
  189.             this.onIconOver(e, this.lastEcOver); 
  190.         } 
  191.         else if(e.getTarget('.x-tree-checkbox', 1)){ 
  192.             this.lastCbOver = this.getNode(e); 
  193.             this.onCheckboxOver(e, this.lastCbOver); 
  194.         } 
  195.         if(this.getNodeTarget(e)){ 
  196.             this.onNodeOver(e, this.getNode(e)); 
  197.         } 
  198.     }, 
  199.     delegateOut :function(e, t){ 
  200.         if(!this.beforeEvent(e)){ 
  201.             return
  202.         } 
  203.         var n; 
  204.         if(e.getTarget('.x-tree-ec-icon', 1)){ 
  205.             n = this.getNode(e); 
  206.             this.onIconOut(e, n); 
  207.             if(n == this.lastEcOver){ 
  208.                 delete this.lastEcOver; 
  209.             } 
  210.         } 
  211.         else if(e.getTarget('.x-tree-checkbox', 1)){ 
  212.             n = this.getNode(e); 
  213.             this.onCheckboxOut(e, n); 
  214.             if(n == this.lastCbOver){ 
  215.                 delete this.lastCbOver; 
  216.             } 
  217.         } 
  218.         t = this.getNodeTarget(e); 
  219.         if(t && !e.within(t, true)){ 
  220.             this.onNodeOut(e, this.getNode(e)); 
  221.         } 
  222.     }, 
  223.     delegateDown :function(e, t){ 
  224.         if(!this.beforeEvent(e)){ 
  225.             return
  226.         } 
  227.         if(e.getTarget('.x-tree-checkbox', 1)){ 
  228.             this.onCheckboxDown(e, this.getNode(e)); 
  229.         } 
  230.     }, 
  231.     delegateUp :function(e, t){ 
  232.         if(!this.beforeEvent(e)){ 
  233.             return
  234.         } 
  235.         if(e.getTarget('.x-tree-checkbox', 1)){ 
  236.             this.onCheckboxUp(e, this.getNode(e)); 
  237.         } 
  238.     }, 
  239.     delegateClick :function(e, t){ 
  240.         if(!this.beforeEvent(e)){ 
  241.             return
  242.         } 
  243.         if(e.getTarget('.x-tree-checkbox', 1)){ 
  244.             this.onCheckboxClick(e, this.getNode(e)); 
  245.         } 
  246.         else if(e.getTarget('.x-tree-ec-icon', 1)){ 
  247.             this.onIconClick(e, this.getNode(e)); 
  248.         } 
  249.         else if(this.getNodeTarget(e)){          
  250.             this.onNodeClick(e, this.getNode(e)); 
  251.         } 
  252.     }, 
  253.     onCheckboxClick :function(e, node){ 
  254.         node.ui.onCheckboxClick(); 
  255.     }, 
  256.     onCheckboxOver :function(e, node){ 
  257.         node.ui.onCheckboxOver(); 
  258.     }, 
  259.     onCheckboxOut :function(e, node){ 
  260.         node.ui.onCheckboxOut(); 
  261.     }, 
  262.     onCheckboxDown :function(e, node){ 
  263.         node.ui.onCheckboxDown(); 
  264.     }, 
  265.     onCheckboxUp :function(e, node){ 
  266.         node.ui.onCheckboxUp(); 
  267.     } 
  268. }); 
  269. Ext.override(Ext.tree.TreePanel, { 
  270.     getChecked : function(a, startNode){ 
  271.         startNode = startNode || this.root; 
  272.         var r = []; 
  273.         var f = function(){ 
  274.             if(this.ui.getChecked()){ 
  275.                 r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a])); 
  276.             } 
  277.         }; 
  278.         startNode.cascade(f); 
  279.         return r; 
  280.     } 
  281. }); 

 

2、CSS文件:

 

  1. .x-tree-checkbox { 
  2.     background:url('../../resources/images/default/form/checkbox.gif'no-repeat 0 0
  3.     height:13px
  4.     width:13px
  5.     vertical-align:middle
  6. .x-tree-checkbox-over .x-tree-checkbox { 
  7.     background-position:-13px 0
  8. .x-tree-checkbox-down .x-tree-checkbox { 
  9.     background-position:-26px 0
  10. .x-tree-node-disabled .x-tree-checkbox { 
  11.     background-position:-39px 0
  12. .x-tree-node-checked { 
  13.     background-position:0 -13px
  14. .x-tree-checkbox-over .x-tree-node-checked { 
  15.     background-position:-13px -13px
  16. .x-tree-checkbox-down .x-tree-node-checked { 
  17.     background-position:-26px -13px
  18. .x-tree-node-disabled .x-tree-node-checked { 
  19.     background-position:-39px -13px
  20. .x-tree-node-grayed { 
  21.     background-position:0 -26px
  22. .x-tree-checkbox-over .x-tree-node-grayed { 
  23.     background-position:-13px -26px
  24. .x-tree-checkbox-down .x-tree-node-grayed { 
  25.     background-position:-26px -26px
  26. .x-tree-node-unchecked { 
  27.     background-position:0 0
  28. .x-tree-checkbox-over .x-tree-node-unchecked { 
  29.     background-position:-13px 0
  30. .x-tree-checkbox-down .x-tree-node-unchecked { 
  31.     background-position:-26px 0
  32. .x-tree-node-disabled .x-tree-node-grayed { 
  33.     background-position:-39px -26px

 

3、圖片:

將該圖片放到  ext路徑/resources/images/default/form/ 下替換 checkbox.gif文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章