AS3 OptionsList ---- 选项框列表类

Option类:

package
{
	import flash.display.Shape;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;

	/**
	 * 列表框子控件--列表选项框(单个选项)
	 * @author Jave.Lin
	 */	
	public class Option extends Control
	{
		private var _isDrawBorder:Boolean=false;//是否绘制边框
		private var _mask:Shape;
		private var _isDowned:Boolean=false;
		private var _glowFilter:GlowFilter;
		//数据对象
		private var _data:Object;
		//显示数据对象文本
		private var _textbox:TextBox;
		
		public function get isDrawBorder():Boolean
		{
			return _isDrawBorder;
		}
		
		public function set isDrawBorder(value:Boolean):void
		{
			if(_isDrawBorder!=value)
			{
				_isDrawBorder=value;
				
				refreshBackground();
			}
		}
		
		public function get textColor():uint
		{
			return _textbox.textColor;
		}
		
		public function set textColor(value:uint):void
		{
			_textbox.textColor=value;
		}
		
		public override function get width():Number
		{
			return super.width;
		}
		
		public override function set width(value:Number):void
		{
			if(width!=value)
			{
				_w=value;
				_textbox.width=_w;
				
				refreshBackground();
			}
		}
		
		public override function get height():Number
		{
			return super.height;
		}
		
		public override function set height(value:Number):void
		{
			if(height!=value)
			{
				_h=value;
				_textbox.height=_h;
				
				refreshBackground();
			}
		}
		
		public function get data():Object
		{
			return _data;
		}
		
		public function set data($data:Object):void
		{
			if(_data!=$data)
			{
				_data=$data;
				if(_data)
				{
					_textbox.text=_data.toString();
				}
				else
				{
					_textbox.text='';
				}
				refreshBackground();
			}
		}
		
		public function Option($data:Object)
		{
			super();
			
			data=$data;
		}
		
		public function setWithAndHeight($width:Number,$height:Number):void
		{
			_textbox.width=_w=$width;
			_textbox.height=_w=$height;
			
			refreshBackground();
		}
		
		protected override function initialize():void
		{
			this.mouseChildren=false;
			
			_textbox=new TextBox();
			_textbox.isDrawBorder=false;
			_textbox.isReadOnly=true;
			_textbox.isSelectable=false;
			_textbox.fontSize=10;
			addChild(_textbox);
			
			_mask=new Shape();
			addChild(_mask);
			
			this.mask=_mask;
			
			textColor=0;
			_glowFilter=new GlowFilter(0x00ff00,1,3,3,3);
			
			if(stage)
			{
				onAddedToStageHandler();
			}
			else
			{
				addEventListener(Event.ADDED_TO_STAGE,onAddedToStageHandler);
			}
		}
		
		private function onAddedToStageHandler(e:Event=null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE,onAddedToStageHandler);
			
			addEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStageHandler);
			
			addEventListener(MouseEvent.MOUSE_OVER,onMouseOverHandler);
			addEventListener(MouseEvent.MOUSE_OUT,onMouseOutHandler);
		}
		
		private function onRemovedFromStageHandler(e:Event):void
		{
			removeEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStageHandler);
			removeEventListener(MouseEvent.MOUSE_OVER,onMouseOverHandler);
			removeEventListener(MouseEvent.MOUSE_OUT,onMouseOutHandler);
		}
		
		private function onMouseOutHandler(e:MouseEvent):void
		{
			removeEventListener(MouseEvent.MOUSE_OUT,onMouseOutHandler);
			addEventListener(MouseEvent.MOUSE_OVER,onMouseOverHandler);
			
			filters=null;
		}
		
		private function onMouseOverHandler(e:MouseEvent):void
		{
			removeEventListener(MouseEvent.MOUSE_OVER,onMouseOverHandler);
			addEventListener(MouseEvent.MOUSE_OUT,onMouseOutHandler);
			
			filters=[_glowFilter];
		}
		
		protected override function refreshBackground():void
		{
			this.graphics.clear();
			
			this.graphics.beginFill(0x00ff00,.2);
			this.graphics.drawRect(0,0,width,height);	
			this.graphics.endFill();
			
			if(_isDrawBorder)
			{
				this.graphics.lineStyle(1);
				this.graphics.moveTo(0,0);
				this.graphics.lineTo(width-1,0);
				this.graphics.lineTo(width-1,height-1);
				this.graphics.lineTo(0,height-1);
				this.graphics.lineTo(0,0);
			}
			
			_mask.graphics.clear();
			
			_mask.graphics.beginFill(0x00ff00,.2);
			_mask.graphics.drawRect(0,0,width,height);	
			_mask.graphics.endFill();
		}
		
		public override function toString():String
		{
			return "Option ["+_data+"]";
		}
	}
}

OptionsList类:

package
{
	import controlsEvents.OptionsListEvent;
	
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.utils.Dictionary;
	/**
	 * 多选项选择框列表类
	 * @author Jave.Lin
	 */
	public class OptionsList extends Control
	{
		private var _itemsContainer:Panel;//子项容器
		private var _itemsControlDic:Dictionary;//子顶控制列表
		private var _isShow:Boolean=true;//是否显示
		private var _selectedItem:Option;
		private var _selectedIndex:int;
		
		private var _items:Vector.<Object>;//子项所有数据
		
		public function get items():Vector.<Object>
		{
			return _items;
		}
		//获取当前选中的子项控件,里面包括数据
		public function get selectedItem():Option
		{
			return _selectedItem;
		}
		//获取当前选中子项的索引
		public function get selectedIndex():int
		{
			return _selectedIndex;
		}
		//设置当前选中子项的索引
		public function set selectedIndex(value:int):void
		{
			if(_selectedIndex!=value)
			{
				if(value>_items.length-1)
				{
					throw new Error("set OptionsList.selectedIndex error,value:"+value);
				}
				if(value<0)
				{
					if(value==-1)
					{
						_selectedIndex=value;
						_selectedItem=null;
					}
					else
					{
						throw new Error("set OptionsList.selectedIndex error,value:"+value);
					}
				}
				else
				{
					_selectedIndex=value;
					_selectedItem=findOptionByData(_items[_selectedIndex]);
				}
				
				dispatchEvent(new OptionsListEvent(OptionsListEvent.SELECTED_CHANGED));
			}
		}
		
		public override function get width():Number
		{
			return super.width;
		}
		
		public override function set width(value:Number):void
		{
			if(width!=value)
			{
				_w=value;
				
				_itemsContainer.width=_w;
				for each (var o:Option in _itemsControlDic) 
				{
					o.width=_w;
				}
			}
		}
		
		public override function get height():Number
		{
			return super.height;
		}
		
		public override function set height(value:Number):void
		{
			if(height!=value)
			{
				_h=value;
				
				_itemsContainer.height=_h;
			}
		}
		//是否显示
		public function get isShow():Boolean
		{
			return _isShow;
		}
		
		public function set isShow(value:Boolean):void
		{
			if(_isShow!=value)
			{
				_isShow=value;
			}
		}
		
		public function OptionsList()
		{
			super();
		}
		
		public function addItem(obj:Object):void
		{
			if(obj==null)
			{
				throw new Error("OptionsList.addItem obj is null");
			}
			_items.push(obj);
			
			var o:Option=new Option(obj);
			o.addEventListener(MouseEvent.CLICK,onOptionClickHandler);
			_itemsContainer.addChild(o);
			_itemsControlDic[obj]=o;
			o.y=(_items.length-1)*o.height;
			o.width=_w;
			
			_itemsContainer.refreshScroller();
		}
		
		private function onOptionClickHandler(e:MouseEvent):void
		{
			var o:Option=e.target as Option;
			if(o==null)return;
			_selectedItem=o;
			selectedIndex=_items.indexOf(o.data);
		}
		
		public function addItemRange(arr:Array):void
		{
			for each (var obj:Object in arr) 
			{
				if(obj==null)
				{
					throw new Error("OptionsList.addItem obj is null");
				}
				_items.push(obj);
				
				var o:Option=new Option(obj);
				o.addEventListener(MouseEvent.CLICK,onOptionClickHandler);
				_itemsContainer.addChild(o);
				_itemsControlDic[obj]=o;
				o.y=(_items.length-1)*o.height;
				o.width=_w;
			}
			
			_itemsContainer.refreshScroller();
		}
		
		public function removeItem(obj:Object):void
		{
			if(obj==null)
			{
				throw new Error("OptionsList.removeItem obj is null");
			}
			removeOptionByData(obj);
		}
		//根据数据:删除数据及控件
		public function removeOptionByData($data:Object):Option
		{
			if($data==null)
			{
				throw new Error("OptionsList.removeComboBoxByData $data is null");
			}
			//删除数据
			var index:int=_items.indexOf($data);
			if(index!=-1)
			{
				_items.splice(index,1);
			}
			//删除控件
			var option:Option=findOptionByData($data);
			if(option)
			{
				delete _itemsControlDic[$data];//从字典中删除:控件
				_itemsContainer.removeChild(option);//从控件容器中删除:控件
			}
			onSortControl(index);
			return option;
		}
		//根据数据找
		public function findOptionByData($data:Object):Option
		{
			return _itemsControlDic[$data];
		}
		//排列控件
		private function onSortControl(startIndex:int=-1):void
		{
			var i:int=0;
			if(startIndex!=-1)i=startIndex;
			for (; i < _items.length; i++) 
			{
				var cbo:Option=findOptionByData(_items[i]);
				cbo.y=i*cbo.height;
			}
		}
		
		protected override function initialize():void
		{
			_items=new Vector.<Object>();
			_itemsControlDic=new Dictionary();
			
			_itemsContainer=new Panel();
			addChild(_itemsContainer);
			
			_itemsContainer.isUseVs=true;
		}
		
		protected override function refreshBackground():void
		{
			// nothing to do
		}
	}
}

测试类:

package test
{
	import controlsEvents.OptionsListEvent;
	
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.utils.setInterval;
	
	public class OptionsListTest extends Sprite
	{
		private var author:Label;
		private var comboBoxOptions:OptionsList;
		
		public function OptionsListTest()
		{
			super();
			
			stage.color=0xccccbb;
			stage.frameRate=60;
			stage.align=StageAlign.TOP_LEFT;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			
			author=new Label();
			addChild(author);
			author.textColor=0x00ff00;
			author.fontSize=24;
			author.x=100;
			author.y=50;
			author.text="作者:Jave.Lin";
			
			comboBoxOptions=new OptionsList();
			addChild(comboBoxOptions);
			
			comboBoxOptions.width=200;
			comboBoxOptions.height=150;
			
			comboBoxOptions.x=100;
			comboBoxOptions.y=100;
			
			var arr:Array=[];
			
			for (var i:int = 0; i < 20; i++) 
			{
				arr[i]="test"+i;
			}
			comboBoxOptions.addItemRange(arr);
			
			comboBoxOptions.addEventListener(OptionsListEvent.SELECTED_CHANGED,onSelectedChangedHandler);
//			setInterval(function():void{comboBoxOptions.removeItem("test5");},1000);
//			setInterval(function():void{comboBoxOptions.removeItem("test1");},2000);
		}
		
		private function onSelectedChangedHandler(e:OptionsListEvent):void
		{
			var cbos:OptionsList=e.target as OptionsList;
			if(cbos==null)return;
			trace("cbos",cbos);
			trace("cbos.selectedIndex",cbos.selectedIndex);
			trace("cbos.selectedItem",cbos.selectedItem);
		}
	}
}

运行图片效果:

AS3 OptionsList ---- 选项框列表类_第1张图片

你可能感兴趣的:(AS3 OptionsList ---- 选项框列表类)