1 /** 2 * @fileOverview tree management utils 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add("tree/treemgr", function (S, Event) { 6 7 function TreeMgr() { 8 } 9 10 TreeMgr.ATTRS = 11 /** 12 * @lends Tree# 13 */ 14 { 15 /** 16 * Whether show root node. 17 * Default:true. 18 * @type Boolean 19 */ 20 showRootNode:{ 21 value:true, 22 view:1 23 }, 24 /** 25 * Current selected tree node. 26 * @type Tree.Node 27 */ 28 selectedItem:{}, 29 tree:{ 30 valueFn:function () { 31 return this; 32 } 33 }, 34 // only root node is focusable 35 focusable:{ 36 value:true 37 } 38 }; 39 40 function getIdFromNode(c) { 41 var el = c.get("el"), 42 id = el.attr("id"); 43 if (!id) { 44 el.attr("id", id=S.guid("tree-node")); 45 } 46 return id; 47 } 48 49 S.augment(TreeMgr, { 50 /* 51 加快从事件代理获取原事件节点 52 */ 53 __getAllNodes:function () { 54 var self = this; 55 if (!self._allNodes) { 56 self._allNodes = {}; 57 } 58 return self._allNodes; 59 }, 60 61 __renderUI:function () { 62 var self = this; 63 // add 过那么一定调用过 checkIcon 了 64 if (!self.get("children").length) { 65 self._computeClass("root_renderUI"); 66 } 67 }, 68 69 _register:function (c) { 70 this.__getAllNodes()[getIdFromNode(c)] = c; 71 }, 72 73 _unRegister:function (c) { 74 delete this.__getAllNodes()[getIdFromNode(c)]; 75 }, 76 77 handleKeyEventInternal:function (e) { 78 var current = this.get("selectedItem"); 79 if (e.keyCode == Event.KeyCodes.ENTER) { 80 // 传递给真正的单个子节点 81 return current.performActionInternal(e); 82 } 83 return current._keyNav(e); 84 }, 85 86 // 重写 delegateChildren ,缓存加快从节点获取对象速度 87 getOwnerControl:function (node) { 88 var self = this, 89 n, 90 allNodes = self.__getAllNodes(), 91 elem = self.get("el")[0]; 92 while (node && node !== elem) { 93 if (n = allNodes[node.id]) { 94 return n; 95 } 96 node = node.parentNode; 97 } 98 // 最终自己处理 99 return self; 100 }, 101 102 // 单选 103 _uiSetSelectedItem:function (n, ev) { 104 if (ev.prevVal) { 105 ev.prevVal.set("selected", false); 106 } 107 n.set("selected", true); 108 }, 109 110 111 _uiSetFocused:function (v) { 112 var self = this; 113 // 得到焦点时没有选择节点 114 // 默认选择自己 115 if (v && !self.get("selectedItem")) { 116 self.select(); 117 } 118 } 119 }); 120 121 return TreeMgr; 122 }, { 123 requires:['event'] 124 });