textRollOverColor in Flex DataGrid
According to Adobe's documentation, the Flex DataGrid control supports the textRollOverColor CSS property. But this
past week I discovered that this is not the case :( A quick search revealed that I'm
not alone in this discovery, but it seems that
no one has proposed a useful solution yet... so I went about creating my own :)
So, why doesn't it work as documented? Well, a quick check revealed that the relevant text colors are supposed to be set
in the DataGridItemRenderer's validateNow() method. That method sets the item's explicitColor property, and then
calls the super.validateNow() method to update the display. However, the super (UITextField) class' validateNow()
method does not update the text format unless the styleChangedFlag property is set - but that flag is not being set.
Since the styleChangedFlag property is marked as private, I can only assume that it is meant to be set by the relevant
setter functions, but as there is no setter function for the explicitColor property, the styleChangedFlag is not
set.
So, what to do about it? Well, I found easiest solution was to write a custom DataGridItemRender that overrides the
super class' validateNow() method. The new validateNow() method looks like this:
override public function validateNow():void {
  super.validateNow();
  if (data && parent && !(data as DataGridColumn)) {
    var dg:DataGrid = DataGrid(listData.owner);
    if (dg.isItemHighlighted(listData.uid))
      textColor = getStyle("textRollOverColor");
    else if (dg.isItemSelected(listData.uid))
      textColor = getStyle("textSelectedColor");
    else textColor = getStyle("color");
  }
}
It's pretty straight-forward - based very closely on the DataGridItemRenderer's validateNow() method, but instead of
setting the item's explicitColor property, it goes straight ahead and sets the underlying text field's color directly.
You might also notice the reference to the textSelectedColor style - it turns out that one was also broken, but this
override fixes it too.
Something you won't find in the DataGridItemRenderer's validateNow() method is the reference to the data as DataGridColumn clause at the end of the first if statement... I won't go into the details now, but this custom renderer
won't help for DataGrid header items, and so that clause prevents this override from doing anything to header items.
In short, validateNow() is almost never called for DataGrid header items, so they have to be treated specially.
Well, that's it for now... in my next post I will show how to fix the
DataGrid header items (need a custom DataGrid control), and link to a demo app that you can test, and view the
source of :)
