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 });