     {
         // TBD: provide optional return value (Rectangle) parameter    
         if ((row < 0) || (row >= rowCount))
-            return null;  // TBD: return empty Rectangle instead
+            return new Rectangle();  // TBD: return empty Rectangle instead
         
         const firstCellR:Rectangle = getCellBounds(row, 0);
         const lastCellR:Rectangle = getCellBounds(row, columnCount - 1);

     *  Returns the index of the row at the specified coordinates. If
     *  the coordinates lie in a gap area, the index returned is the
     *  previous row.
     */
    public function getRowIndexAt(x:Number, y:Number):int
    {
        if (!isNaN(fixedRowHeight))
            return y / (fixedRowHeight + rowGap);
        
        if (rowList.length == 0)
            return y / (defaultRowHeight + rowGap);
        
        var node:GridRowNode = rowList.first;
        var index:int = 0;
        var cur:Number = y;
        var n:int;
        
        while (node)
        {
            // add not included rows.
            if (node.rowIndex > index)
            {
                n = node.rowIndex - index;
                for (var i:int = 0; i < n; i++)
                {
                    cur -= defaultRowHeight + rowGap;
                    if (cur < 0)
                        return index;
                    index++;
                }
            }
            
            cur -= node.maxCellHeight + rowGap;
            if (cur < 0)
                return index;
            index++;
            
            node = node.next;
        }
        
        n = this.rowCount;
        for (; index < n; index++)
        {
            cur -= defaultRowHeight + rowGap;
            if (cur < 0)
                return index;
        }
        
        return -1;
    }
    
    /**

        if (node)
        {
            node.cellHeights[col] = height;
            if (node.updateMaxHeight())
                recentNode = null;
        }
    }
    
