CheckBoxList 自定义控件

package com.gps.view.component
{
	import flash.events.Event;
	
	import mx.collections.ArrayCollection;
	import mx.collections.ICollectionView;
	import mx.collections.IList;
	import mx.collections.ListCollectionView;
	import mx.collections.XMLListCollection;
	import mx.containers.Tile;
	import mx.controls.CheckBox;
	import mx.controls.Alert;
	import mx.core.IUIComponent;
	//**********说明*****************//
	//CheckBoxList默认labelField = "label",dataField = "selected"
   //selectedName以字符串的形式返回或设置被选中的选项,如区域1、区域2、区域4  设置区域1、区域2、区域4为选中状态
	//getSelectedId()获取选中项的ID,以array的形式返回
	public class CheckBoxList extends Tile
	{                
		protected var collection:ICollectionView;            //显示的数据源
		private var _labelField:String = "label";            //显示的数据字段
		private var _dataField : String = "selected";        //选中的状态
		private var _selectedName : String = "";             //设置选中的值
		private var _splitString : String = "、";            //设置选中值的分割符
		private var _checkBoxNum:Number = 10;                //设置显示的复选框个数
		private var cellWidth:Number;
		private var cellHeight:Number;
		
		 
		public function CheckBoxList()
		{
			super();
		} 
		
		//数据源
		[Bindable("collectionChanged")]
		public function get dataProvider():Object
		{
			return collection;
		}
		public function set dataProvider(value:Object):void
		{
			if (value is Array)
			{
				collection = new ArrayCollection(value as Array);
			}
			else if (value is ICollectionView)
			{
				collection = ICollectionView(value);
			}
			else if (value is IList)
			{
				collection = new ListCollectionView(IList(value));
			}
			else if (value is XMLList)
			{
				collection = new XMLListCollection(value as XMLList);
			}
			else
			{
				
				var tmp:Array = [value];
				collection = new ArrayCollection(tmp);
			}            
			
			dispatchEvent(new Event("collectionChanged"));
			addOrResetChildren();
		}
		
		//显示字段
		[Bindable("labelFieldChanged")]
		public function get labelField():String
		{
			return _labelField;
		}
		public function set labelField(value:String):void
		{
			_labelField = value;
			dispatchEvent(new Event("labelFieldChanged"));
		}
		
		//设定选中的状态
		[Bindable("dataFieldChanged")]
		public function get dataField() : String
		{
			return _dataField;
		}
		public function set dataField(value : String) : void
		{
			_dataField = value;
			dispatchEvent(new Event("dataFieldChanged"));
		}
		
		//设定选中的值
		[Bindable("selectedNameChanged")]
		public function get selectedName() : String
		{
			var value : String = "";
			var splitStr:String = "";
			for each (var obj : Object in this.getChildren())
			{
				if(obj[dataField] == true)
				{
					value += splitStr + obj[labelField] ;
					splitStr = _splitString;
				}
			}
			return value;
		}
		
		
		public function set selectedName(value:String) : void
		{
			if(value != null && value != "")
			{
				var selectedNames:Array = value.split(this.splitString);
				for each(var label:String in selectedNames)
				{
					for each(var object:Object in this.getChildren())
					{
						if(object[labelField] == label)
						{
							object[dataField] = "true";
						}
					}
				}
			}
			dispatchEvent(new Event("selectedNameChanged"));
		}
		
		//显示的复选框个数
		[Bindable("checkBoxNumChanged")]
		public function get checkBoxNum():Number
		{
			return this._checkBoxNum;
		}
		public function set checkBoxNum(value : Number):void
		{
			this._checkBoxNum = value;
			dispatchEvent(new Event("checkBoxNumChanged"));
		}
		
		//设定分割符
		[Bindable("splitStringChanged")]
		public function get splitString() : String
		{
			return _splitString;    
		}
		public function set splitString(value : String) : void
		{
			_splitString = value;
			dispatchEvent(new Event("splitStringChanged"));
		}
		
		//新增或重置子列表
		public function addOrResetChildren() : void
		{
			this.removeAllChildren();
			if(collection == null) return;
			for (var i : int =0; i < collection.length; i++)
			{
				var cb : CheckBox = new CheckBox();
				
				cb.id = collection[i].id;
				cb.selected= collection[i][dataField]=="true" ? true : false;
				cb.label = collection[i][labelField];   
				cb.setStyle("color","#333333");
				cb.setStyle("textRollOverColor","#333333");
				cb.setStyle("textSelectedColor","#333333");
				cb.setStyle("fontSize","12");
				cb.setStyle("fontFamily","宋体");
				
				addChild(cb); 
			}
		}
		
		//拿到当前选中的checkBox的Id
		public function getSelectedIds() : Array
		{
			var arr : Array = new Array();
			for each (var obj : Object in this.getChildren())
			{
				if(obj.selected == true)
				{
					arr.push(obj.id);
				}
			}
			return arr;
		}
		
		//显示格式
		protected override function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			findCellSize();
			
			if(numChildren<=0) return ;   
			var horizontalGap:Number = getStyle("horizontalGap");
			var verticalGap:Number = getStyle("verticalGap"); 
			this.width = cellWidth + 20; //只显示一列,如果dataProvider的length大于显示的checkBox数量会出现滚动条,这里预留出滚动条的宽度20象素
			this.height = (cellHeight + verticalGap) * _checkBoxNum;
			
		}
		
		private function findCellSize():void
		{
			
			var widthSpecified:Boolean = !isNaN(tileWidth);
			var heightSpecified:Boolean = !isNaN(tileHeight);
			if (widthSpecified && heightSpecified)
			{
				cellWidth = tileWidth;
				cellHeight = tileHeight;
				return;
			}
			
			
			var maxChildWidth:Number = 0;
			var maxChildHeight:Number = 0;
			
		
			var n:int = numChildren;
			for (var i:int = 0; i < n; i++)
			{
				var child:IUIComponent = IUIComponent(getChildAt(i));
				
				if (!child.includeInLayout)
				{
					continue;
				}
				
				var width:Number = child.getExplicitOrMeasuredWidth();
				if (width > maxChildWidth)
				{
					maxChildWidth = width;
				}
				
				var height:Number = child.getExplicitOrMeasuredHeight();
				if (height > maxChildHeight)
				{
					maxChildHeight = height;
				}
			}
			
		
			cellWidth = widthSpecified ? tileWidth : maxChildWidth;
			cellHeight = heightSpecified ? tileHeight : maxChildHeight;
		}
	}
	

}

 

posted @ 2012-11-23 16:01  刀锋浪  阅读(271)  评论(0)    收藏  举报