flex Tree的渲染

package CheckboxTree {
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Rectangle;
    
    import mx.collections.ICollectionView;
    import mx.collections.IList;
    import mx.collections.IViewCursor;
    import mx.controls.Alert;
    import mx.controls.CheckBox;
    import mx.controls.Tree;
    import mx.controls.treeClasses.ITreeDataDescriptor;
    import mx.controls.treeClasses.TreeItemRenderer;
    import mx.controls.treeClasses.TreeListData;
    import mx.events.FlexEvent;
    import mx.events.ListEvent;
   
    
    public class CheckTreeRenderer extends TreeItemRenderer
    {
        protected var myCheckBox:CheckBox;
        private var myTree:CheckTree;
        
        /**
         * STATE_SCHRODINGER : 部分子项选中 <br />
         * STATE_CHECKED :     全部子项选中 <br />
         * STATE_UNCHECKED :   全部子项未选中 <br />
         */
        static private var STATE_SCHRODINGER:int=2;
        static private var STATE_CHECKED:int=1;
        static private var STATE_UNCHECKED:int=0;
        
        /**
         *记录当前选中的大区的ID
         *
         */        
        private var defaultAreaId:int = 0 ;
        
        
        public function CheckTreeRenderer()
        {
            super();
        }
        
        
        /**
         * 初始化完成时处理复选框和图片对象
         *
         */      
        override protected function createChildren():void
        {
            myCheckBox = new CheckBox();
            addChild(myCheckBox);  
            myCheckBox.addEventListener(MouseEvent.CLICK, checkBoxToggleHandler);
//            myCheckBox.addEventListener(FlexEvent.CREATION_COMPLETE,asdas);
            myTree = this.owner as CheckTree;  
            super.createChildren();  
        }
        
//        protected function asdas(event:Event):void
//        {
//            checkBoxState();
//            
//        }
        
        protected function onPropertyChange(e:ListEvent=null):void  
        {  
            this.updateDisplayList(unscaledWidth,unscaledHeight);  
        }
        
        override public function set data(value:Object):void  
        {  
            if (value != null)  
            {  
                super.data=value;
                setCheckState(myCheckBox, value, value.state);
//                checkBoxState();
            }  
        }  
        
        
        /**
         *如果当前的PID为且为选中或部分选中状态则记录该大区ID
         * @param checkBox
         * @param value
         * @param state
         *
         */        
        private function setCheckState(checkBox:CheckBox, value:Object, state:int):void
        {
            
            if (state == STATE_CHECKED)
            {
                checkBox.selected=true;
                if( (this.owner as CheckTree).isSelectTwoArea == false && value.PID == 0 )
                {
                    defaultAreaId = value.Id;
                }
            }
            else if (state == STATE_UNCHECKED)
                checkBox.selected=false;
            else if (state == STATE_SCHRODINGER)
            {
                checkBox.selected=false;
                if((this.owner as CheckTree).isSelectTwoArea == false && value.PID == 0)
                {
                    defaultAreaId = value.Id;
                }
                
            }
                
        }
        
        
        private function toggleParents (item:Object, tree:Tree, state:int):void
        {
            if (item == null)
            {
                return;
            }
            else
            {
                
                if((this.owner as CheckTree).isSelectTwoArea = false && item.PID == 0 && defaultAreaId != 0 && defaultAreaId != item.Id)
                {
                    Alert.show("不能同时选择两个大区","提示");
                    return;
                }
                var tmpTree:IList=myTree.dataProvider as IList;
                var oldValue:Number=item.state as Number;
                var newValue:Number=state as Number;
                item.state = state;
                tmpTree.itemUpdated(item,item.state,oldValue,newValue);
                toggleParents(tree.getParentItem(item), tree, getState (tree, tree.getParentItem(item)));
            }
        }
        
        /**
         * // TODO : 设置项目的状态和子项的状态
         * @param item 项目
         * @param tree 树对象
         * @param state 目标状态
         *
         */  
        private function toggleChildren(item:Object, tree:Tree, state:int):void  
        {  
            if (item == null)  
                return ;  
            else  
            {  
                var tmpTree:IList=myTree.dataProvider as IList;
                var oldValue:Number=item.state as Number;
                var newValue:Number=state as Number;
                
                item.state = state;
                tmpTree.itemUpdated(item,item.state,oldValue,newValue);
                
                var treeData:ITreeDataDescriptor=tree.dataDescriptor;  
                if (treeData.hasChildren(item))  
                {  
                    var children:ICollectionView=treeData.getChildren(item);  
                    var cursor:IViewCursor=children.createCursor();  
                    while(!cursor.afterLast)  
                    {  
                        toggleChildren(cursor.current, tree, state);  
                        cursor.moveNext();  
                    }  
                }  
            }  
        }  
        
        
        private function getState(tree:Tree, parent:Object):int
        {
            var noChecks:int=0;
            var noCats:int=0;
            var noUnChecks:int=0;
            if (parent != null)
            {
                var treeData:ITreeDataDescriptor = tree.dataDescriptor;
                var cursor:IViewCursor = treeData.getChildren(parent).createCursor();
                while (!cursor.afterLast)
                {
                    if (cursor.current.state == STATE_CHECKED)
                        noChecks++;
                    else if (cursor.current.state == STATE_UNCHECKED)
                        noUnChecks++;
                    else
                        noCats++;
                    cursor.moveNext();
                }
            }
            if ((noChecks > 0 && noUnChecks > 0) || noCats > 0)
                return STATE_SCHRODINGER;
            else if (noChecks > 0)
                return STATE_CHECKED;
            else
                return STATE_UNCHECKED;
        }
        
        
        
        /**
         * //TODO:设置项目的父项状态和子项状态
         * @param event 事件
         *
         */  
        private function checkBoxState():void  
        {
            if (data)  
            {  
                var myListData:TreeListData=TreeListData(this.listData);  
                var selectedNode:Object=myListData.item;  
                myTree=myListData.owner as CheckTree;  
                var toggle:Boolean=myCheckBox.selected;  
                if (toggle)  
                {  
                    toggleChildren(data, myTree, STATE_CHECKED);  
                    
                    myTree.expandChildrenOf(data, true);  
                }  
                else  
                {  
                    toggleChildren(data, myTree, STATE_UNCHECKED);  
                    
                    myTree.expandChildrenOf(data, false);  
                }  
                var parent:Object = myTree.getParentItem(data);
                if(null != parent)
                {
                    toggleParents (parent, myTree, getState (myTree, parent));
                }
            }  
        }
        
        /**
         * //TODO:设置项目的父项状态和子项状态
         * @param event 事件
         *
         */  
        private function checkBoxToggleHandler(event:MouseEvent):void  
        {  
            checkBoxState();
        }  
        
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void  
        {  
            super.updateDisplayList(unscaledWidth, unscaledHeight);  
            if (super.data)  
            {  
                if (super.icon != null)  
                {  
                    myCheckBox.x=super.icon.x + 1;  
                    myCheckBox.y=(height - myCheckBox.height) / 2 - 2;  
                    super.icon.x=myCheckBox.x + myCheckBox.width + 15;  
                    super.label.x=super.icon.x + super.icon.width + 3;  
                }  
                else  
                {  
                    myCheckBox.x=super.label.x + 10;  
                    myCheckBox.y=(height - myCheckBox.height) / 2 - 2;  
                    super.label.x=myCheckBox.x + myCheckBox.width + 15;  
                }  
                setCheckState(myCheckBox, data, data.state);  
                
                if(data.state == STATE_SCHRODINGER)
                {
                    myCheckBox.setStyle("chromeColor","#5b5691");
                }
                else
                {
                    myCheckBox.setStyle("chromeColor","#CCCCCC");
                }
            }  
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值