package lib { import flash.events.MouseEvent; import flash.text.TextField; import mx.containers.Canvas; import mx.controls.ComboBox; import mx.controls.Label; import mx.core.ScrollPolicy; import mx.events.DropdownEvent; import flash.utils.setTimeout; import mx.events.FlexEvent; public class RatingItemRenderer extends Canvas { private var _label:Label; private var _select:ComboBox; public var dataField:String; public function RatingItemRenderer() { verticalScrollPolicy = ScrollPolicy.OFF; horizontalScrollPolicy = ScrollPolicy.OFF; _label = new Label(); _label.percentWidth = 100; _label.percentHeight = 100; _label.addEventListener(MouseEvent.CLICK, onLabelClick); addChild(_label); var dp:Array = [ {label: 1, data: 1}, {label: 2, data: 2}, {label: 3, data: 3}, {label: 4, data: 4}, {label: 5, data: 5}, {label: 6, data: 6}, {label: 7, data: 7}, {label: 8, data: 8}, {label: 9, data: 9}, {label: 10, data: 10} ]; _select = new ComboBox(); _select.width = 150; _select.height = 18; _select.dataProvider = dp; _select.addEventListener(DropdownEvent.CLOSE, onSelectClose); addEventListener(FlexEvent.DATA_CHANGE, onDataChanged); } override protected function commitProperties():void { _label.text = data[dataField]; } private function onLabelClick(e:MouseEvent):void { if(contains(_label)) { removeChild(_label); } addChild(_select); _select.selectedIndex = Number(data[dataField]) - 1; setTimeout(openSelect, 200); } private function openSelect():void { _select.open(); } private function onSelectClose(e:DropdownEvent):void { if(contains(_select)) { removeChild(_select); } if(data[dataField] != _select.selectedIndex + 1) { data[dataField] = _select.selectedIndex + 1; data[dataField + "Callback"](data); } _label.text = data[dataField] = _select.selectedIndex + 1; addChild(_label); } private function onDataChanged(e:FlexEvent):void { invalidateProperties(); } } }