package com.falkensweb.flex.view{ import mx.controls.DataGrid; import flash.events.MouseEvent; import flash.display.Sprite; import mx.controls.listClasses.IListItemRenderer; import mx.controls.dataGridClasses.DataGridItemRenderer; import flash.geom.Point; public class SelectableCellDataGrid extends DataGrid{ private var lastOver:DataGridItemRenderer=null; private var selectedCell:DataGridItemRenderer=null public function get selectedCellData():Object{ if (selectedCell != null){ return selectedCell.data; } return new Object(); } public function SelectableCellDataGrid(){ super(); this.addEventListener(MouseEvent.MOUSE_OUT,doOut); } override protected function drawHighlightIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void{ //what are we over, and where is it ? var r:Object=findRowColFor(stage.mouseX,stage.mouseY,getStyle("rollOverColor")); if (selectedCell!=null ){ selectedCell.background=true; selectedCell.backgroundColor=getStyle("selectionColor"); trace('old selected restated in hover'); } } override protected function selectItem(item:IListItemRenderer, shiftKey:Boolean, ctrlKey:Boolean, transition:Boolean = true):Boolean{ var r:Boolean=super.selectItem(item,shiftKey,ctrlKey,transition); var rr:Object=findRowColFor(stage.mouseX,stage.mouseY,getStyle("selectionColor")); if (rr.x>-1){ if (selectedCell != null){//clear existing selectedCell.background=false; } selectedCell=rr.rend; selectedCell.background=true; selectedCell.backgroundColor=getStyle("selectionColor"); } return r; } override protected function drawSelectionIndicator(indicator:Sprite, x:Number, y:Number, width:Number, height:Number, color:uint, itemRenderer:IListItemRenderer):void{ var r:Object=findRowColFor(stage.mouseX,stage.mouseY,getStyle("rollOverColor")); if (selectedCell!=null && r.rend==selectedCell){ selectedCell.background=true; selectedCell.backgroundColor=getStyle("selectionColor"); } } /** * Locate the ItemRenderer in this datagrid that is under this point */ private function findRowColFor(x:Number,y:Number,color:uint):Object{ var point1:Point = new Point(x,y); var point2:Point = globalToLocal(point1); x=point2.x; y=point2.y; var i:Number=0; var j:Number=0; var calcX:Number=0; var calcY:Number=0; var r:Object=new Object; r.x=-1;//not found flag for (i=0;i0){ for (j=0;j calcX && x<=calcX+rend.width && y > calcY && y<=calcY+rend.height+3 ){ var last:Object=lastOver; if (last!=null && last!=selectedCell){last.background=false;} r.width=rend.width; r.height=22;//rend.height; r.x=calcX; r.y=calcY; r.rend=rend; rend.background=true; rend.backgroundColor=color; lastOver=rend; return r; } calcX=calcX+rend.width; } } calcY=calcY+24;//+i[0].height calcX=0; } return r; } public function doOut(e:*):void{ if (lastOver!=null && lastOver !=selectedCell){lastOver.background=false;} } } }