<?xml version="1.0" encoding="utf-8"?> 
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
<mx:Script>        
<![CDATA[
    import mx.controls.*;
    import mx.controls.dataGridClasses.*;

    private var theData:Object;

	override public function set data(obj:Object):void {

	    theData = obj;
	    
		if (obj && obj.eventName) { 
			text = obj.eventName as String;
		}else{
		    text = "";
		}
		
		/**
		if(obj){
            trace ("Rendering item: ");
            trace ("    obj.dataSource: " + obj.dataSource); // Event, Object, Mouse...
            trace ("    obj.target: " + obj.target);
            trace ("    obj.eventName: " + obj.eventName);
            trace ("    obj.event: " + obj.event);
		}
		**/

	}
	
	// Paint red if there's a failure.  Code lifted from Joan's blog.
	override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{

        var g:Graphics = graphics;
        var grid1:DataGrid = DataGrid(DataGridListData(listData).owner);
        
        super.updateDisplayList(unscaledWidth, unscaledHeight);
        
        g.clear();

        if (grid1.isItemSelected(theData) || grid1.isItemHighlighted(theData))
            return;
        
        if(theData && theData.eventName){
    	    if(theData.eventName.indexOf ("result=fail") != -1){
                g.beginFill(0xff0000);
                g.drawRect(0, 0, unscaledWidth, unscaledHeight);
                g.endFill();
    	    }
        }
	}

]]>    
</mx:Script>        

</mx:Label> 
