]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
Added OS/2 patches to wxGTK.
[wxWidgets.git] / src / generic / listctrl.cpp
index 192ddb36a0bd06529e9e563e085f3c6b0cd9e8db..25364ef23fb0d50a37278fa331394b0cfcffae98 100644 (file)
 #pragma implementation "listctrl.h"
 #endif
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
 #include "wx/dcscreen.h"
 #include "wx/app.h"
-#include "wx/listctrl.h"
+#include "wx/generic/listctrl.h"
+#include "wx/generic/imaglist.h"
 
 //-----------------------------------------------------------------------------
 //  wxListItemData
@@ -73,7 +81,7 @@ void wxListItemData::SetPosition( int x, int y )
     m_ypos = y;
 }
 
-void wxListItemData::SetSize( int const width, int height )
+void wxListItemData::SetSize( int width, int height )
 {
     if (width != -1) m_width = width;
     if (height != -1) m_height = height;
@@ -260,7 +268,7 @@ wxListLineData::wxListLineData( wxListMainWindow *owner, int mode, wxBrush *hili
     m_spacing = 0;
 }
 
-void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing )
+void wxListLineData::CalculateSize( wxDC *dc, int spacing )
 {
     m_spacing = spacing;
     switch (m_mode)
@@ -319,7 +327,7 @@ void wxListLineData::CalculateSize( wxPaintDC *dc, int spacing )
     }
 }
 
-void wxListLineData::SetPosition( wxPaintDC *dc, int x, int y, int window_width )
+void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
 {
   m_bound_all.x = x;
   m_bound_all.y = y;
@@ -435,7 +443,7 @@ void wxListLineData::GetLabelExtent( int &x, int &y, int &width, int &height )
     height = m_bound_label.height;
 }
 
-void wxListLineData::GetRect( wxRectangle &rect )
+void wxListLineData::GetRect( wxRect &rect )
 {
     AssignRect( rect, m_bound_all );
 }
@@ -470,7 +478,7 @@ void wxListLineData::SetItem( int index, const wxListItem &info )
     }
 }
 
-void wxListLineData::GetItem( int const index, wxListItem &info )
+void wxListLineData::GetItem( int index, wxListItem &info )
 {
     int i = index;
     wxNode *node = m_items.Nth( i );
@@ -516,7 +524,7 @@ int wxListLineData::GetImage( int index )
     return -1;
 }
 
-void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG )
+void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
 {
     long dev_x = dc->LogicalToDeviceX( m_bound_all.x-2 );
     long dev_y = dc->LogicalToDeviceY( m_bound_all.y-2 );
@@ -544,6 +552,7 @@ void wxListLineData::DoDraw( wxPaintDC *dc, bool hilight, bool paintBG )
                            m_bound_hilight.width, m_bound_hilight.height );
     }
     
+    dc->SetBackgroundMode(wxTRANSPARENT);
     if (m_mode == wxLC_REPORT)
     {
         wxString s;
@@ -616,7 +625,7 @@ void wxListLineData::ReverseHilight( void )
         m_owner->DeselectLine( this );
 }
 
-void wxListLineData::DrawRubberBand( wxPaintDC *dc, bool on )
+void wxListLineData::DrawRubberBand( wxDC *dc, bool on )
 {
     if (on)
     {
@@ -627,12 +636,12 @@ void wxListLineData::DrawRubberBand( wxPaintDC *dc, bool on )
     }
 }
 
-void wxListLineData::Draw( wxPaintDC *dc )
+void wxListLineData::Draw( wxDC *dc )
 {
     DoDraw( dc, m_hilighted, m_hilighted );
 }
 
-bool wxListLineData::IsInRect( int x, int y, const wxRectangle &rect )
+bool wxListLineData::IsInRect( int x, int y, const wxRect &rect )
 {
     return ((x >= rect.x) && (x <= rect.x+rect.width) && 
             (y >= rect.y) && (y <= rect.y+rect.height));
@@ -643,7 +652,7 @@ bool wxListLineData::IsHilighted( void )
     return m_hilighted;
 }
 
-void wxListLineData::AssignRect( wxRectangle &dest, int x, int y, int width, int height )
+void wxListLineData::AssignRect( wxRect &dest, int x, int y, int width, int height )
 {
     dest.x = x;
     dest.y = y;
@@ -651,7 +660,7 @@ void wxListLineData::AssignRect( wxRectangle &dest, int x, int y, int width, int
     dest.height = height;
 }
 
-void wxListLineData::AssignRect( wxRectangle &dest, const wxRectangle &source )
+void wxListLineData::AssignRect( wxRect &dest, const wxRect &source )
 {
     dest.x = source.x;
     dest.y = source.y;
@@ -676,7 +685,7 @@ wxListHeaderWindow::wxListHeaderWindow( void )
     m_owner = (wxListMainWindow *) NULL;
     m_currentCursor = (wxCursor *) NULL;
     m_resizeCursor = (wxCursor *) NULL;
-    m_isDraging = FALSE;
+    m_isDragging = FALSE;
 }
 
 wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMainWindow *owner,
@@ -688,7 +697,8 @@ wxListHeaderWindow::wxListHeaderWindow( wxWindow *win, wxWindowID id, wxListMain
 //  m_currentCursor = wxSTANDARD_CURSOR;
     m_currentCursor = (wxCursor *) NULL;
     m_resizeCursor = new wxCursor( wxCURSOR_SIZEWE );
-    m_isDraging = FALSE;
+    m_isDragging = FALSE;
+    SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ) );
 }
 
 wxListHeaderWindow::~wxListHeaderWindow( void )
@@ -696,7 +706,7 @@ wxListHeaderWindow::~wxListHeaderWindow( void )
     delete m_resizeCursor;
 }
 
-void wxListHeaderWindow::DoDrawRect( wxPaintDC *dc, int x, int y, int w, int h )
+void wxListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h )
 {
     const int m_corner = 1;
 
@@ -704,7 +714,7 @@ void wxListHeaderWindow::DoDrawRect( wxPaintDC *dc, int x, int y, int w, int h )
 
     dc->SetPen( *wxBLACK_PEN );
     dc->DrawLine( x+w-m_corner+1, y, x+w, y+h );  // right (outer)
-    dc->DrawRectangle( x, y+h, w, 1 );            // bottom (outer)
+    dc->DrawRectangle( x, y+h, w+1, 1 );          // bottom (outer)
 
     wxPen pen( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNSHADOW ), 1, wxSOLID );
   
@@ -734,6 +744,7 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
     int y = 0;
     GetClientSize( &w, &h );
 
+    dc.SetBackgroundMode(wxTRANSPARENT);
     dc.SetTextForeground( *wxBLACK );
     if (m_foregroundColour.Ok()) dc.SetTextForeground( m_foregroundColour );
 
@@ -770,7 +781,7 @@ void wxListHeaderWindow::DrawCurrent()
     m_owner->ClientToScreen( &x2, &y2 );
 
     wxScreenDC dc;
-    dc.SetLogicalFunction( wxXOR );
+    dc.SetLogicalFunction( wxINVERT );
     dc.SetPen( wxPen( *wxBLACK, 2, wxSOLID ) );
     dc.SetBrush( *wxTRANSPARENT_BRUSH );
 
@@ -786,13 +797,13 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
 {
     int x = event.GetX();
     int y = event.GetY();
-    if (m_isDraging)
+    if (m_isDragging)
     {
         DrawCurrent();
         if (event.ButtonUp())
         {
             ReleaseMouse();
-            m_isDraging = FALSE;
+            m_isDragging = FALSE;
             m_owner->SetColumnWidth( m_column, m_currentX-m_minX );
         }
         else
@@ -827,7 +838,7 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
 
     if (event.LeftDown() && hit_border)
     {
-        m_isDraging = TRUE;
+        m_isDragging = TRUE;
         m_currentX = x;
         DrawCurrent();
         CaptureMouse();
@@ -932,6 +943,7 @@ BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow)
   EVT_SIZE           (wxListMainWindow::OnSize)
   EVT_MOUSE_EVENTS   (wxListMainWindow::OnMouse)
   EVT_CHAR           (wxListMainWindow::OnChar)
+  EVT_KEY_DOWN       (wxListMainWindow::OnKeyDown)
   EVT_SET_FOCUS      (wxListMainWindow::OnSetFocus)
   EVT_KILL_FOCUS     (wxListMainWindow::OnKillFocus)
 END_EVENT_TABLE()
@@ -1019,7 +1031,7 @@ void wxListMainWindow::RefreshLine( wxListLineData *line )
         wxClientDC dc(this);
         PrepareDC( dc );
         line->GetExtent( x, y, w, h );
-        wxRectangle rect(
+        wxRect rect(
           dc.LogicalToDeviceX(x-3),
           dc.LogicalToDeviceY(y-3),
           dc.LogicalToDeviceXRel(w+6),
@@ -1030,13 +1042,15 @@ void wxListMainWindow::RefreshLine( wxListLineData *line )
 
 void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
 {
+    // Note: a wxPaintDC must be constructed even if no drawing is
+    // done (a Windows requirement).
+    wxPaintDC dc( this );
+    PrepareDC( dc );
+
     if (m_dirty) return;
     
     if (m_lines.GetCount() == 0) return;
 
-    wxPaintDC dc( this );
-    PrepareDC( dc );
-
     dc.BeginDrawing();
 
     dc.SetFont( GetFont() );
@@ -1179,7 +1193,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
     long x = dc.DeviceToLogicalX( (long)event.GetX() );
     long y = dc.DeviceToLogicalY( (long)event.GetY() );
     
-    // Did we actually hit an item ?
+    /* Did we actually hit an item ? */
     long hitResult = 0;
     wxNode *node = m_lines.First();
     wxListLineData *line = (wxListLineData *) NULL;
@@ -1344,15 +1358,15 @@ void wxListMainWindow::MoveToFocus( void )
     {
         int y_s = m_yScroll*GetScrollPos( wxVERTICAL );
         if ((y > y_s) && (y+h < y_s+h_p)) return;
-        if (y-y_s < 5) Scroll( -1, (y-5-h_p/2)/m_yScroll );
-        if (y+h+5 > y_s+h_p) Scroll( -1, (y+h-h_p/2+h+15)/m_yScroll );
+        if (y-y_s < 5) { Scroll( -1, (y-5-h_p/2)/m_yScroll ); Refresh(); }
+        if (y+h+5 > y_s+h_p) { Scroll( -1, (y+h-h_p/2+h+15)/m_yScroll); Refresh(); }
     }
     else
     {
         int x_s = m_xScroll*GetScrollPos( wxHORIZONTAL );
         if ((x > x_s) && (x+w < x_s+w_p)) return;
-        if (x-x_s < 5) Scroll( (x-5)/m_xScroll, -1 );
-        if (x+w-5 > x_s+w_p) Scroll( (x+w-w_p+15)/m_xScroll, -1 );
+        if (x-x_s < 5) { Scroll( (x-5)/m_xScroll, -1 ); Refresh(); }
+        if (x+w-5 > x_s+w_p) { Scroll( (x+w-w_p+15)/m_xScroll, -1 ); Refresh(); }
     }
 }
 
@@ -1369,145 +1383,184 @@ void wxListMainWindow::OnArrowChar( wxListLineData *newCurrent, bool shiftDown )
     UnfocusLine( oldCurrent );
 }
 
+void wxListMainWindow::OnKeyDown( wxKeyEvent &event )
+{
+    wxWindow *parent = GetParent();
+  
+    /* we propagate the key event up */
+    wxKeyEvent ke( wxEVT_KEY_DOWN );
+    ke.m_shiftDown = event.m_shiftDown;
+    ke.m_controlDown = event.m_controlDown;
+    ke.m_altDown = event.m_altDown;
+    ke.m_metaDown = event.m_metaDown;
+    ke.m_keyCode = event.m_keyCode;
+    ke.m_x = event.m_x;
+    ke.m_y = event.m_y;
+    ke.SetEventObject( parent );
+    if (parent->GetEventHandler()->ProcessEvent( ke )) return;
+    
+    event.Skip();
+}
+  
 void wxListMainWindow::OnChar( wxKeyEvent &event )
 {
-  wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetParent()->GetId() );
-  le.m_code = event.KeyCode();
-  le.SetEventObject( GetParent() );
-  GetParent()->GetEventHandler()->ProcessEvent( le );
+    wxWindow *parent = GetParent();
   
-/*
-  if (event.KeyCode() == WXK_TAB)
-  {
-    if (event.ShiftDown())
-      TravPrev( &event );
-    else
-      TravNext( &event );
-    return;
-  }
-*/
-  if ( !m_current )
-  {
-      event.Skip();
-      return;
-  }
-
-  switch (event.KeyCode())
-  {
-    case WXK_UP:
-    {
-      wxNode *node = m_lines.Member( m_current )->Previous();
-      if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      break;
-    }
-    case WXK_DOWN:
-    {
-      wxNode *node = m_lines.Member( m_current )->Next();
-      if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      break;
-    }
-    case WXK_END:
-    {
-      wxNode *node = m_lines.Last();
-      OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      break;
-    }
-    case WXK_HOME:
-    {
-      wxNode *node = m_lines.First();
-      OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      break;
-    }
-    case WXK_PRIOR:
-    {
-      int steps = 0;
-      if (m_mode & wxLC_REPORT) { steps = m_visibleLines-1; }
-      else
-      {
-        int pos = 0;
-        wxNode *node = m_lines.First();
-        for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }
-        steps = pos % m_visibleLines;
-      }
-      wxNode *node = m_lines.Member( m_current );
-      for (int i = 0; i < steps; i++) if (node->Previous()) node = node->Previous();
-      if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      break;
-    }
-    case WXK_NEXT:
-    {
-      int steps = 0;
-      if (m_mode & wxLC_REPORT) { steps = m_visibleLines-1; }
-      else
-      {
-        int pos = 0; wxNode *node = m_lines.First();
-        for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }
-        steps = m_visibleLines-(pos % m_visibleLines)-1;
-      }
-      wxNode *node = m_lines.Member( m_current );
-      for (int i = 0; i < steps; i++) if (node->Next()) node = node->Next();
-      if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      break;
-    }
-    case WXK_LEFT:
-    {
-      if (!(m_mode & wxLC_REPORT))
-      {
-        wxNode *node = m_lines.Member( m_current );
-        for (int i = 0; i <m_visibleLines; i++) if (node->Previous()) node = node->Previous();
-        if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      }
-      break;
-    }
-    case WXK_RIGHT:
-    {
-      if (!(m_mode & wxLC_REPORT))
-      {
-        wxNode *node = m_lines.Member( m_current );
-        for (int i = 0; i <m_visibleLines; i++) if (node->Next()) node = node->Next();
-        if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
-      }
-      break;
-    }
-    case WXK_SPACE:
-    {
-      m_current->ReverseHilight();
-      RefreshLine( m_current );
-    }
-    break;
-    case WXK_INSERT:
+    /* we send a list_key event up */
+    wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetParent()->GetId() );
+    le.m_code = event.KeyCode();
+    le.SetEventObject( parent );
+    parent->GetEventHandler()->ProcessEvent( le );
+
+    /* we propagate the char event up */
+    wxKeyEvent ke( wxEVT_CHAR );
+    ke.m_shiftDown = event.m_shiftDown;
+    ke.m_controlDown = event.m_controlDown;
+    ke.m_altDown = event.m_altDown;
+    ke.m_metaDown = event.m_metaDown;
+    ke.m_keyCode = event.m_keyCode;
+    ke.m_x = event.m_x;
+    ke.m_y = event.m_y;
+    ke.SetEventObject( parent );
+    if (parent->GetEventHandler()->ProcessEvent( ke )) return;
+  
+    if (event.KeyCode() == WXK_TAB)
     {
-      if (!(m_mode & wxLC_SINGLE_SEL))
-      {
-        wxListLineData *oldCurrent = m_current;
-        m_current->ReverseHilight();
-        wxNode *node = m_lines.Member( m_current )->Next();
-        if (node) m_current = (wxListLineData*)node->Data();
-        MoveToFocus();
-        RefreshLine( oldCurrent );
-        RefreshLine( m_current );
-        UnfocusLine( oldCurrent );
-        FocusLine( m_current );
-      }
+        wxNavigationKeyEvent nevent;
+        nevent.SetDirection( !event.ShiftDown() );
+        nevent.SetCurrentFocus( m_parent );
+        if (m_parent->GetEventHandler()->ProcessEvent( nevent )) return;
     }
-    break;
-    case WXK_RETURN:
-    case WXK_EXECUTE:
+  
+    /* no item -> nothing to do */
+    if (!m_current)
     {
-      wxListEvent le( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, GetParent()->GetId() );
-      le.SetEventObject( GetParent() );
-      le.m_itemIndex = GetIndexOfLine( m_current );
-      m_current->GetItem( 0, le.m_item );
-      GetParent()->GetEventHandler()->ProcessEvent( le );
+        event.Skip();
+        return;
     }
-    break;
-    default:
+
+    switch (event.KeyCode())
     {
-      event.Skip();
-      return;
+        case WXK_UP:
+        {
+            wxNode *node = m_lines.Member( m_current )->Previous();
+            if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            break;
+        }
+        case WXK_DOWN:
+        {
+            wxNode *node = m_lines.Member( m_current )->Next();
+            if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            break;
+        }
+        case WXK_END:
+        {
+            wxNode *node = m_lines.Last();
+            OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            break;
+        }
+        case WXK_HOME:
+        {
+            wxNode *node = m_lines.First();
+            OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            break;
+        }
+        case WXK_PRIOR:
+        {
+            int steps = 0;
+            if (m_mode & wxLC_REPORT) 
+           { 
+               steps = m_visibleLines-1; 
+           }
+            else
+            {
+                int pos = 0;
+                wxNode *node = m_lines.First();
+                for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }
+                steps = pos % m_visibleLines;
+            }
+            wxNode *node = m_lines.Member( m_current );
+            for (int i = 0; i < steps; i++) if (node->Previous()) node = node->Previous();
+            if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            break;
+        }
+        case WXK_NEXT:
+        {
+            int steps = 0;
+            if (m_mode & wxLC_REPORT) 
+           { 
+               steps = m_visibleLines-1; 
+           }
+            else
+            {
+                int pos = 0; wxNode *node = m_lines.First();
+                for (;;) { if (m_current == (wxListLineData*)node->Data()) break; pos++; node = node->Next(); }
+                steps = m_visibleLines-(pos % m_visibleLines)-1;
+            }
+            wxNode *node = m_lines.Member( m_current );
+            for (int i = 0; i < steps; i++) if (node->Next()) node = node->Next();
+            if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            break;
+        }
+        case WXK_LEFT:
+        {
+            if (!(m_mode & wxLC_REPORT))
+            {
+                wxNode *node = m_lines.Member( m_current );
+                for (int i = 0; i <m_visibleLines; i++) if (node->Previous()) node = node->Previous();
+                if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            }
+            break;
+        }
+        case WXK_RIGHT:
+        {
+            if (!(m_mode & wxLC_REPORT))
+            {
+                wxNode *node = m_lines.Member( m_current );
+                for (int i = 0; i <m_visibleLines; i++) if (node->Next()) node = node->Next();
+                if (node) OnArrowChar( (wxListLineData*)node->Data(), event.ShiftDown() );
+            }
+            break;
+        }
+        case WXK_SPACE:
+        {
+            m_current->ReverseHilight();
+            RefreshLine( m_current );
+            break;
+        }
+        case WXK_INSERT:
+        {
+            if (!(m_mode & wxLC_SINGLE_SEL))
+            {
+                wxListLineData *oldCurrent = m_current;
+                m_current->ReverseHilight();
+                wxNode *node = m_lines.Member( m_current )->Next();
+                if (node) m_current = (wxListLineData*)node->Data();
+                MoveToFocus();
+                RefreshLine( oldCurrent );
+                RefreshLine( m_current );
+                UnfocusLine( oldCurrent );
+                FocusLine( m_current );
+            }
+            break;
+        }
+        case WXK_RETURN:
+        case WXK_EXECUTE:
+        {
+            wxListEvent le( wxEVT_COMMAND_LIST_ITEM_ACTIVATED, GetParent()->GetId() );
+            le.SetEventObject( GetParent() );
+            le.m_itemIndex = GetIndexOfLine( m_current );
+            m_current->GetItem( 0, le.m_item );
+            GetParent()->GetEventHandler()->ProcessEvent( le );
+            break;
+        }
+        default:
+        {
+            event.Skip();
+            return;
+        }
     }
-  }
-  m_usedKeys = TRUE;
+    m_usedKeys = TRUE;
 }
 
 void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
@@ -1536,7 +1589,7 @@ void wxListMainWindow::OnSize( wxSizeEvent &WXUNUSED(event) )
 */
 }
 
-void wxListMainWindow::DrawImage( int index, wxPaintDC *dc, int x, int y )
+void wxListMainWindow::DrawImage( int index, wxDC *dc, int x, int y )
 {
     if ((m_mode & wxLC_ICON) && (m_normal_image_list))
     {
@@ -1577,7 +1630,7 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height )
 
 int wxListMainWindow::GetTextLength( wxString &s )
 {
-    wxPaintDC dc( this );
+    wxClientDC dc( this );
     long lw = 0;
     long lh = 0;
     dc.GetTextExtent( s, &lw, &lh );
@@ -1642,7 +1695,44 @@ void wxListMainWindow::SetColumnWidth( int col, int width )
 
     m_dirty = TRUE;
 
-    wxNode *node = m_columns.Nth( col );
+    wxNode *node = (wxNode*) NULL;
+
+    if (width == wxLIST_AUTOSIZE_USEHEADER) width = 80;
+    if (width == wxLIST_AUTOSIZE)
+    {
+        wxClientDC dc(this);
+        dc.SetFont( GetFont() );
+        int max = 10;
+        node = m_lines.First();
+        while (node)
+        {
+            wxListLineData *line = (wxListLineData*)node->Data();
+            wxNode *n = line->m_items.Nth( col );
+            if (n)
+            {
+                wxListItemData *item = (wxListItemData*)n->Data();
+               int current = 0, ix = 0, iy = 0;
+               long lx = 0, ly = 0;
+               if (item->HasImage())
+               {
+                    GetImageSize( item->GetImage(), ix, iy );
+                   current = ix + 5;
+               }
+               if (item->HasText())
+               {
+                   wxString str;
+                   item->GetText( str );
+                   dc.GetTextExtent( str, &lx, &ly );
+                   current += lx;
+               }
+               if (current > max) max = current;
+            }
+            node = node->Next();
+        }
+       width = max+10;
+    }
+
+    node = m_columns.Nth( col );
     if (node)
     {
         wxListHeaderData *column = (wxListHeaderData*)node->Data();
@@ -1736,7 +1826,7 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask )
             m_current = line;
             FocusLine( m_current );
             RefreshLine( m_current );
-            RefreshLine( oldCurrent );
+            if (oldCurrent) RefreshLine( oldCurrent );
         }
     }
 
@@ -1754,9 +1844,9 @@ void wxListMainWindow::SetItemState( long item, long state, long stateMask )
                 UnfocusLine( m_current );
                 m_current = line;
                 FocusLine( m_current );
-                oldCurrent->Hilight( FALSE );
+                if (oldCurrent) oldCurrent->Hilight( FALSE );
                 RefreshLine( m_current );
-                RefreshLine( oldCurrent );
+                if (oldCurrent) RefreshLine( oldCurrent );
             }
             bool on = state & wxLIST_STATE_SELECTED;
            if (on != line->IsHilighted())
@@ -1814,7 +1904,7 @@ int wxListMainWindow::GetItemCount( void )
     return m_lines.Number();
 }
 
-void wxListMainWindow::GetItemRect( long index, wxRectangle &rect )
+void wxListMainWindow::GetItemRect( long index, wxRect &rect )
 {
     wxNode *node = m_lines.Nth( index );
     if (node)
@@ -1836,7 +1926,7 @@ bool wxListMainWindow::GetItemPosition(long item, wxPoint& pos)
     wxNode *node = m_lines.Nth( item );
     if (node)
     {
-        wxRectangle rect;
+        wxRect rect;
         wxListLineData *line = (wxListLineData*)node->Data();
         line->GetRect( rect );
         pos.x = rect.x;
@@ -1891,7 +1981,7 @@ void wxListMainWindow::CalculatePositions( void )
 {
     if (!m_lines.First()) return;
 
-    wxPaintDC dc( this );
+    wxClientDC dc( this );
     dc.SetFont( GetFont() );
 
     int iconSpacing = 0;
@@ -2009,6 +2099,7 @@ long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state
 {
     long ret = 0;
     if (item > 0) ret = item;
+    if(ret >= GetItemCount()) return -1;
     wxNode *node = m_lines.Nth( ret );
     while (node)
     {
@@ -2037,155 +2128,160 @@ void wxListMainWindow::DeleteItem( long index )
 
 void wxListMainWindow::DeleteColumn( int col )
 {
-  wxCHECK_RET( col < (int)m_columns.GetCount(),
-               "attempting to delete inexistent column in wxListView" );
+    wxCHECK_RET( col < (int)m_columns.GetCount(),
+               _T("attempting to delete inexistent column in wxListView") );
 
-  m_dirty = TRUE;
-  wxNode *node = m_columns.Nth( col );
-  if (node) m_columns.DeleteNode( node );
+    m_dirty = TRUE;
+    wxNode *node = m_columns.Nth( col );
+    if (node) m_columns.DeleteNode( node );
 }
 
 void wxListMainWindow::DeleteAllItems( void )
 {
-  m_dirty = TRUE;
-  m_current = (wxListLineData *) NULL;
-  wxNode *node = m_lines.First();
-  while (node)
-  {
-    wxListLineData *line = (wxListLineData*)node->Data();
-    DeleteLine( line );
-    node = node->Next();
-  }
-  m_lines.Clear();
+    m_dirty = TRUE;
+    m_current = (wxListLineData *) NULL;
+    wxNode *node = m_lines.First();
+    while (node)
+    {
+        wxListLineData *line = (wxListLineData*)node->Data();
+        DeleteLine( line );
+        node = node->Next();
+    }
+    m_lines.Clear();
 }
 
 void wxListMainWindow::DeleteEverything( void )
 {
-  m_dirty = TRUE;
-  m_current = (wxListLineData *) NULL;
-  wxNode *node = m_lines.First();
-  while (node)
-  {
-    wxListLineData *line = (wxListLineData*)node->Data();
-    DeleteLine( line );
-    node = node->Next();
-  }
-  m_lines.Clear();
-  m_current = (wxListLineData *) NULL;
-  m_columns.Clear();
+    m_dirty = TRUE;
+    m_current = (wxListLineData *) NULL;
+    wxNode *node = m_lines.First();
+    while (node)
+    {
+        wxListLineData *line = (wxListLineData*)node->Data();
+        DeleteLine( line );
+        node = node->Next();
+    }
+    m_lines.Clear();
+    m_current = (wxListLineData *) NULL;
+    m_columns.Clear();
 }
 
 void wxListMainWindow::EnsureVisible( long index )
 {
-  wxListLineData *oldCurrent = m_current;
-  m_current = (wxListLineData *) NULL;
-  int i = index;
-  wxNode *node = m_lines.Nth( i );
-  if (node) m_current = (wxListLineData*)node->Data();
-  if (m_current) MoveToFocus();
-  m_current = oldCurrent;
+    wxListLineData *oldCurrent = m_current;
+    m_current = (wxListLineData *) NULL;
+    int i = index;
+    wxNode *node = m_lines.Nth( i );
+    if (node) m_current = (wxListLineData*)node->Data();
+    if (m_current) MoveToFocus();
+    m_current = oldCurrent;
 }
 
 long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(partial) )
 {
-  long pos = start;
-  wxString tmp = str;
-  if (pos < 0) pos = 0;
-  wxNode *node = m_lines.Nth( pos );
-  while (node)
-  {
-    wxListLineData *line = (wxListLineData*)node->Data();
-    wxString s = "";
-    line->GetText( 0, s );
-    if (s == tmp) return pos;
-    node = node->Next();
-    pos++;
-  }
-  return -1;
+    long pos = start;
+    wxString tmp = str;
+    if (pos < 0) pos = 0;
+    wxNode *node = m_lines.Nth( pos );
+    while (node)
+    {
+        wxListLineData *line = (wxListLineData*)node->Data();
+        wxString s = "";
+        line->GetText( 0, s );
+        if (s == tmp) return pos;
+        node = node->Next();
+        pos++;
+    }
+    return -1;
 }
 
 long wxListMainWindow::FindItem(long start, long data)
 {
-  long pos = start;
-  if (pos < 0) pos = 0;
-  wxNode *node = m_lines.Nth( pos );
-  while (node)
-  {
-    wxListLineData *line = (wxListLineData*)node->Data();
-    wxListItem item;
-    line->GetItem( 0, item );
-    if (item.m_data == data) return pos;
-    node = node->Next();
-    pos++;
-  }
-  return -1;
+    long pos = start;
+    if (pos < 0) pos = 0;
+    wxNode *node = m_lines.Nth( pos );
+    while (node)
+    {
+        wxListLineData *line = (wxListLineData*)node->Data();
+        wxListItem item;
+        line->GetItem( 0, item );
+        if (item.m_data == data) return pos;
+        node = node->Next();
+        pos++;
+    }
+    return -1;
 }
 
 long wxListMainWindow::HitTest( int x, int y, int &flags )
 {
-  wxNode *node = m_lines.First();
-  int count = 0;
-  while (node)
-  {
-    wxListLineData *line = (wxListLineData*)node->Data();
-    long ret = line->IsHit( x, y );
-    if (ret & flags)
+    wxNode *node = m_lines.First();
+    int count = 0;
+    while (node)
     {
-      flags = ret;
-      return count;
+        wxListLineData *line = (wxListLineData*)node->Data();
+        long ret = line->IsHit( x, y );
+        if (ret & flags)
+        {
+            flags = ret;
+            return count;
+        }
+        node = node->Next();
+        count++;
     }
-    node = node->Next();
-    count++;
-  }
-  return -1;
+    return -1;
 }
 
 void wxListMainWindow::InsertItem( wxListItem &item )
 {
-  m_dirty = TRUE;
-  int mode = 0;
-  if (m_mode & wxLC_REPORT) mode = wxLC_REPORT;
-  else if (m_mode & wxLC_LIST) mode = wxLC_LIST;
-  else if (m_mode & wxLC_ICON) mode = wxLC_ICON;
-  else if (m_mode & wxLC_SMALL_ICON) mode = wxLC_ICON;  // no typo
-  wxListLineData *line = new wxListLineData( this, mode, m_hilightBrush );
-  if (m_mode & wxLC_REPORT)
-  {
-    line->InitItems( GetColumnCount() );
-    item.m_width = GetColumnWidth( 0 )-3;
-  }
-  else
-    line->InitItems( 1 );
-  line->SetItem( 0, item );
-  if ((item.m_itemId >= 0) && (item.m_itemId < (int)m_lines.GetCount()))
-  {
-     wxNode *node = m_lines.Nth( item.m_itemId );
-     if (node) m_lines.Insert( node, line );
-  }
-  else
-  {
-    m_lines.Append( line );
-  }
+    m_dirty = TRUE;
+    int mode = 0;
+    if (m_mode & wxLC_REPORT) mode = wxLC_REPORT;
+    else if (m_mode & wxLC_LIST) mode = wxLC_LIST;
+    else if (m_mode & wxLC_ICON) mode = wxLC_ICON;
+    else if (m_mode & wxLC_SMALL_ICON) mode = wxLC_ICON;  // no typo
+    
+    wxListLineData *line = new wxListLineData( this, mode, m_hilightBrush );
+    
+    if (m_mode & wxLC_REPORT)
+    {
+        line->InitItems( GetColumnCount() );
+        item.m_width = GetColumnWidth( 0 )-3;
+    }
+    else
+    {
+        line->InitItems( 1 );
+    }
+    
+    line->SetItem( 0, item );
+    if ((item.m_itemId >= 0) && (item.m_itemId < (int)m_lines.GetCount()))
+    {
+        wxNode *node = m_lines.Nth( item.m_itemId );
+        if (node) m_lines.Insert( node, line );
+    }
+    else
+    {
+        m_lines.Append( line );
+    }
 }
 
 void wxListMainWindow::InsertColumn( long col, wxListItem &item )
 {
-  m_dirty = TRUE;
-  if (m_mode & wxLC_REPORT)
-  {
-    if (item.m_width == wxLIST_AUTOSIZE_USEHEADER) item.m_width = GetTextLength( item.m_text );
-    wxListHeaderData *column = new wxListHeaderData( item );
-    if ((col >= 0) && (col < (int)m_columns.GetCount()))
-    {
-      wxNode *node = m_columns.Nth( col );
-      if (node)
-        m_columns.Insert( node, column );
-    }
-    else
+    m_dirty = TRUE;
+    if (m_mode & wxLC_REPORT)
     {
-      m_columns.Append( column );
+        if (item.m_width == wxLIST_AUTOSIZE_USEHEADER) item.m_width = GetTextLength( item.m_text );
+        wxListHeaderData *column = new wxListHeaderData( item );
+        if ((col >= 0) && (col < (int)m_columns.GetCount()))
+        {
+            wxNode *node = m_columns.Nth( col );
+            if (node)
+                 m_columns.Insert( node, column );
+        }
+        else
+        {
+            m_columns.Append( column );
+        }
     }
-  }
 }
 
 wxListCtrlCompare list_ctrl_compare_func_2;
@@ -2193,21 +2289,21 @@ long              list_ctrl_compare_data;
 
 int list_ctrl_compare_func_1( const void *arg1, const void *arg2 )
 {
-  wxListLineData *line1 = *((wxListLineData**)arg1);
-  wxListLineData *line2 = *((wxListLineData**)arg2);
-  wxListItem item;
-  line1->GetItem( 0, item );
-  long data1 = item.m_data;
-  line2->GetItem( 0, item );
-  long data2 = item.m_data;
-  return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data );
+    wxListLineData *line1 = *((wxListLineData**)arg1);
+    wxListLineData *line2 = *((wxListLineData**)arg2);
+    wxListItem item;
+    line1->GetItem( 0, item );
+    long data1 = item.m_data;
+    line2->GetItem( 0, item );
+    long data2 = item.m_data;
+    return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data );
 }
 
 void wxListMainWindow::SortItems( wxListCtrlCompare fn, long data )
 {
-  list_ctrl_compare_func_2 = fn;
-  list_ctrl_compare_data = data;
-  m_lines.Sort( list_ctrl_compare_func_1 );
+    list_ctrl_compare_func_2 = fn;
+    list_ctrl_compare_data = data;
+    m_lines.Sort( list_ctrl_compare_func_1 );
 }
 
 // -------------------------------------------------------------------------------------
@@ -2239,13 +2335,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent)
 wxListEvent::wxListEvent( wxEventType commandType, int id ):
   wxNotifyEvent( commandType, id )
 {
-  m_code = 0;
-  m_itemIndex = 0;
-  m_oldItemIndex = 0;
-  m_col = 0;
-  m_cancelled = FALSE;
-  m_pointDrag.x = 0;
-  m_pointDrag.y = 0;
+    m_code = 0;
+    m_itemIndex = 0;
+    m_oldItemIndex = 0;
+    m_col = 0;
+    m_cancelled = FALSE;
+    m_pointDrag.x = 0;
+    m_pointDrag.y = 0;
 }
 
 // -------------------------------------------------------------------------------------
@@ -2261,11 +2357,11 @@ END_EVENT_TABLE()
 
 wxListCtrl::wxListCtrl(void)
 {
-  m_imageListNormal = (wxImageList *) NULL;
-  m_imageListSmall = (wxImageList *) NULL;
-  m_imageListState = (wxImageList *) NULL;
-  m_mainWin = (wxListMainWindow*) NULL;
-  m_headerWin = (wxListHeaderWindow*) NULL;
+    m_imageListNormal = (wxImageList *) NULL;
+    m_imageListSmall = (wxImageList *) NULL;
+    m_imageListState = (wxImageList *) NULL;
+    m_mainWin = (wxListMainWindow*) NULL;
+    m_headerWin = (wxListHeaderWindow*) NULL;
 }
 
 wxListCtrl::~wxListCtrl(void)
@@ -2277,124 +2373,129 @@ bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
       long style, const wxValidator &validator,
       const wxString &name )
 {
-  m_imageListNormal = (wxImageList *) NULL;
-  m_imageListSmall = (wxImageList *) NULL;
-  m_imageListState = (wxImageList *) NULL;
-  m_mainWin = (wxListMainWindow*) NULL;
-  m_headerWin = (wxListHeaderWindow*) NULL;
+    m_imageListNormal = (wxImageList *) NULL;
+    m_imageListSmall = (wxImageList *) NULL;
+    m_imageListState = (wxImageList *) NULL;
+    m_mainWin = (wxListMainWindow*) NULL;
+    m_headerWin = (wxListHeaderWindow*) NULL;
 
-  long s = style;
+    long s = style;
 
-  if ((s & wxLC_REPORT == 0) &&
-      (s & wxLC_LIST == 0) &&
-      (s & wxLC_ICON == 0))
-    s = s | wxLC_LIST;
+    if ((s & wxLC_REPORT == 0) &&
+        (s & wxLC_LIST == 0) &&
+        (s & wxLC_ICON == 0))
+    {
+        s = s | wxLC_LIST;
+    }
 
-  bool ret = wxControl::Create( parent, id, pos, size, s, name );
+    bool ret = wxControl::Create( parent, id, pos, size, s, name );
 
-  SetValidator( validator );
+    SetValidator( validator );
   
-  if (s & wxSUNKEN_BORDER) s -= wxSUNKEN_BORDER;
+    if (s & wxSUNKEN_BORDER) s -= wxSUNKEN_BORDER;
+
+    m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s );
 
-  m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s );
+    if (HasFlag(wxLC_REPORT))
+        m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL );
+    else
+        m_headerWin = (wxListHeaderWindow *) NULL;
 
-  if (GetWindowStyleFlag() & wxLC_REPORT)
-    m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL );
-  else
-    m_headerWin = (wxListHeaderWindow *) NULL;
+    SetBackgroundColour( *wxWHITE );
 
-  return ret;
+    return ret;
 }
 
 void wxListCtrl::OnSize( wxSizeEvent &WXUNUSED(event) )
 {
-  // handled in OnIdle
+    /* handled in OnIdle */
 
-  if (m_mainWin) m_mainWin->m_dirty = TRUE;
+    if (m_mainWin) m_mainWin->m_dirty = TRUE;
 }
 
 void wxListCtrl::SetSingleStyle( long style, bool add )
 {
-  long flag = GetWindowStyleFlag();
+    long flag = GetWindowStyle();
 
-  if (add)
-  {
-    if (style & wxLC_MASK_TYPE)  flag = flag & ~wxLC_MASK_TYPE;
-    if (style & wxLC_MASK_ALIGN) flag = flag & ~wxLC_MASK_ALIGN;
-    if (style & wxLC_MASK_SORT) flag = flag & ~wxLC_MASK_SORT;
-  }
+    if (add)
+    {
+        if (style & wxLC_MASK_TYPE)  flag = flag & ~wxLC_MASK_TYPE;
+        if (style & wxLC_MASK_ALIGN) flag = flag & ~wxLC_MASK_ALIGN;
+        if (style & wxLC_MASK_SORT) flag = flag & ~wxLC_MASK_SORT;
+    }
 
-  if (add)
-  {
-    flag |= style;
-  }
-  else
-  {
-    if (flag & style) flag -= style;
-  }
+    if (add)
+    {
+        flag |= style;
+    }
+    else
+    {
+        if (flag & style) flag -= style;
+    }
 
-  SetWindowStyleFlag( flag );
+    SetWindowStyleFlag( flag );
 }
 
 void wxListCtrl::SetWindowStyleFlag( long flag )
 {
-  m_mainWin->DeleteEverything();
+    if (m_mainWin)
+    {
+        m_mainWin->DeleteEverything();
 
-  int width = 0;
-  int height = 0;
-  GetClientSize( &width, &height );
+        int width = 0;
+        int height = 0;
+        GetClientSize( &width, &height );
 
-  m_mainWin->SetMode( flag );
+        m_mainWin->SetMode( flag );
 
-  if (flag & wxLC_REPORT)
-  {
-    if (!(GetWindowStyleFlag() & wxLC_REPORT))
-    {
-//      m_mainWin->SetSize( 0, 24, width, height-24 );
-      if (!m_headerWin)
-      {
-        m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
-      }
-      else
-      {
-//        m_headerWin->SetSize( 0, 0, width, 23 );
-        m_headerWin->Show( TRUE );
-      }
-    }
-  }
-  else
-  {
-    if (GetWindowStyleFlag() & wxLC_REPORT)
-    {
-//      m_mainWin->SetSize( 0, 0, width, height );
-      m_headerWin->Show( FALSE );
+        if (flag & wxLC_REPORT)
+        {
+            if (!HasFlag(wxLC_REPORT))
+            {
+                if (!m_headerWin)
+                {
+                    m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, 
+                     wxPoint(0,0), wxSize(width,23), wxTAB_TRAVERSAL );
+                }
+                else
+                {  
+                    m_headerWin->Show( TRUE );
+                } 
+            }
+        }
+        else
+        {
+            if (HasFlag(wxLC_REPORT))
+            {
+                m_headerWin->Show( FALSE );
+            }
+       }
     }
-  }
-
-  wxWindow::SetWindowStyleFlag( flag );
+    
+    wxWindow::SetWindowStyleFlag( flag );
 }
 
 bool wxListCtrl::GetColumn(int col, wxListItem &item) const
 {
-  m_mainWin->GetColumn( col, item );
-  return TRUE;
+    m_mainWin->GetColumn( col, item );
+    return TRUE;
 }
 
 bool wxListCtrl::SetColumn( int col, wxListItem& item )
 {
-  m_mainWin->SetColumn( col, item );
-  return TRUE;
+    m_mainWin->SetColumn( col, item );
+    return TRUE;
 }
 
 int wxListCtrl::GetColumnWidth( int col ) const
 {
-  return m_mainWin->GetColumnWidth( col );
+    return m_mainWin->GetColumnWidth( col );
 }
 
 bool wxListCtrl::SetColumnWidth( int col, int width )
 {
-  m_mainWin->SetColumnWidth( col, width );
-  return TRUE;
+    m_mainWin->SetColumnWidth( col, width );
+    return TRUE;
 }
 
 int wxListCtrl::GetCountPerPage(void) const
@@ -2410,129 +2511,128 @@ wxText& wxListCtrl::GetEditControl(void) const
 
 bool wxListCtrl::GetItem( wxListItem &info ) const
 {
-  m_mainWin->GetItem( info );
-  return TRUE;
+    m_mainWin->GetItem( info );
+    return TRUE;
 }
 
 bool wxListCtrl::SetItem( wxListItem &info )
 {
-  m_mainWin->SetItem( info );
-  return TRUE;
+    m_mainWin->SetItem( info );
+    return TRUE;
 }
 
 long wxListCtrl::SetItem( long index, int col, const wxString& label, int imageId )
 {
-  wxListItem info;
-  info.m_text = label;
-  info.m_mask = wxLIST_MASK_TEXT;
-  info.m_itemId = index;
-  info.m_col = col;
-  if ( imageId > -1 )
-  {
-    info.m_image = imageId;
-    info.m_mask |= wxLIST_MASK_IMAGE;
-  }
-;
-  m_mainWin->SetItem(info);
-  return TRUE;
+    wxListItem info;
+    info.m_text = label;
+    info.m_mask = wxLIST_MASK_TEXT;
+    info.m_itemId = index;
+    info.m_col = col;
+    if ( imageId > -1 )
+    {
+        info.m_image = imageId;
+        info.m_mask |= wxLIST_MASK_IMAGE;
+    };
+    m_mainWin->SetItem(info);
+    return TRUE;
 }
 
 int wxListCtrl::GetItemState( long item, long stateMask ) const
 {
-  return m_mainWin->GetItemState( item, stateMask );
+    return m_mainWin->GetItemState( item, stateMask );
 }
 
 bool wxListCtrl::SetItemState( long item, long state, long stateMask )
 {
-  m_mainWin->SetItemState( item, state, stateMask );
-  return TRUE;
+    m_mainWin->SetItemState( item, state, stateMask );
+    return TRUE;
 }
 
 bool wxListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) )
 {
-  wxListItem info;
-  info.m_image = image;
-  info.m_mask = wxLIST_MASK_IMAGE;
-  info.m_itemId = item;
-  m_mainWin->SetItem( info );
-  return TRUE;
+    wxListItem info;
+    info.m_image = image;
+    info.m_mask = wxLIST_MASK_IMAGE;
+    info.m_itemId = item;
+    m_mainWin->SetItem( info );
+    return TRUE;
 }
 
 wxString wxListCtrl::GetItemText( long item ) const
 {
-  wxListItem info;
-  info.m_itemId = item;
-  m_mainWin->GetItem( info );
-  return info.m_text;
+    wxListItem info;
+    info.m_itemId = item;
+    m_mainWin->GetItem( info );
+    return info.m_text;
 }
 
 void wxListCtrl::SetItemText( long item, const wxString &str )
 {
-  wxListItem info;
-  info.m_mask = wxLIST_MASK_TEXT;
-  info.m_itemId = item;
-  info.m_text = str;
-  m_mainWin->SetItem( info );
+    wxListItem info;
+    info.m_mask = wxLIST_MASK_TEXT;
+    info.m_itemId = item;
+    info.m_text = str;
+    m_mainWin->SetItem( info );
 }
 
 long wxListCtrl::GetItemData( long item ) const
 {
-  wxListItem info;
-  info.m_itemId = item;
-  m_mainWin->GetItem( info );
-  return info.m_data;
+    wxListItem info;
+    info.m_itemId = item;
+    m_mainWin->GetItem( info );
+    return info.m_data;
 }
 
 bool wxListCtrl::SetItemData( long item, long data )
 {
-  wxListItem info;
-  info.m_mask = wxLIST_MASK_DATA;
-  info.m_itemId = item;
-  info.m_data = data;
-  m_mainWin->SetItem( info );
-  return TRUE;
+    wxListItem info;
+    info.m_mask = wxLIST_MASK_DATA;
+    info.m_itemId = item;
+    info.m_data = data;
+    m_mainWin->SetItem( info );
+    return TRUE;
 }
 
-bool wxListCtrl::GetItemRect( long item, wxRectangle &rect,  int WXUNUSED(code) ) const
+bool wxListCtrl::GetItemRect( long item, wxRect &rect,  int WXUNUSED(code) ) const
 {
-  m_mainWin->GetItemRect( item, rect );
-  return TRUE;
+    m_mainWin->GetItemRect( item, rect );
+    return TRUE;
 }
 
 bool wxListCtrl::GetItemPosition( long item, wxPoint& pos ) const
 {
-  m_mainWin->GetItemPosition( item, pos );
-  return TRUE;
+    m_mainWin->GetItemPosition( item, pos );
+    return TRUE;
 }
 
 bool wxListCtrl::SetItemPosition( long WXUNUSED(item), const wxPoint& WXUNUSED(pos) )
 {
-  return 0;
+    return 0;
 }
 
 int wxListCtrl::GetItemCount(void) const
 {
-  return m_mainWin->GetItemCount();
+    return m_mainWin->GetItemCount();
 }
 
 int wxListCtrl::GetColumnCount(void) const
 {
-  return m_mainWin->GetColumnCount();
+    return m_mainWin->GetColumnCount();
 }
 
 void wxListCtrl::SetItemSpacing( int spacing, bool isSmall )
 {
-  m_mainWin->SetItemSpacing( spacing, isSmall );
+    m_mainWin->SetItemSpacing( spacing, isSmall );
 }
 
 int wxListCtrl::GetItemSpacing( bool isSmall ) const
 {
-  return m_mainWin->GetItemSpacing( isSmall );
+    return m_mainWin->GetItemSpacing( isSmall );
 }
 
 int wxListCtrl::GetSelectedItemCount(void) const
 {
-  return m_mainWin->GetSelectedItemCount();
+    return m_mainWin->GetSelectedItemCount();
 }
 
 /*
@@ -2547,51 +2647,51 @@ void wxListCtrl::SetTextColour(const wxColour& WXUNUSED(col))
 
 long wxListCtrl::GetTopItem(void) const
 {
-  return 0;
+    return 0;
 }
 
 long wxListCtrl::GetNextItem( long item, int geom, int state ) const
 {
-  return m_mainWin->GetNextItem( item, geom, state );
+    return m_mainWin->GetNextItem( item, geom, state );
 }
 
 wxImageList *wxListCtrl::GetImageList(int which) const
 {
-  if (which == wxIMAGE_LIST_NORMAL)
-  {
-    return m_imageListNormal;
-  }
-  else if (which == wxIMAGE_LIST_SMALL)
-  {
-    return m_imageListSmall;
-  }
-  else if (which == wxIMAGE_LIST_STATE)
-  {
-    return m_imageListState;
-  }
-  return (wxImageList *) NULL;
+    if (which == wxIMAGE_LIST_NORMAL)
+    {
+        return m_imageListNormal;
+    }
+    else if (which == wxIMAGE_LIST_SMALL)
+    {
+        return m_imageListSmall;
+    }
+    else if (which == wxIMAGE_LIST_STATE)
+    {
+        return m_imageListState;
+    }
+    return (wxImageList *) NULL;
 }
 
 void wxListCtrl::SetImageList( wxImageList *imageList, int which )
 {
-  m_mainWin->SetImageList( imageList, which );
+    m_mainWin->SetImageList( imageList, which );
 }
 
 bool wxListCtrl::Arrange( int WXUNUSED(flag) )
 {
-  return 0;
+    return 0;
 }
 
 bool wxListCtrl::DeleteItem( long item )
 {
-  m_mainWin->DeleteItem( item );
-  return TRUE;
+    m_mainWin->DeleteItem( item );
+    return TRUE;
 }
 
 bool wxListCtrl::DeleteAllItems(void)
 {
-  m_mainWin->DeleteAllItems();
-  return TRUE;
+    m_mainWin->DeleteAllItems();
+    return TRUE;
 }
 
 bool wxListCtrl::DeleteAllColumns()
@@ -2599,18 +2699,18 @@ bool wxListCtrl::DeleteAllColumns()
     for ( size_t n = 0; n < m_mainWin->m_columns.GetCount(); n++ )
         DeleteColumn(n);
        
-   return TRUE;
+    return TRUE;
 }
 
 void wxListCtrl::ClearAll()
 {
-  m_mainWin->DeleteEverything();
+    m_mainWin->DeleteEverything();
 }
 
 bool wxListCtrl::DeleteColumn( int col )
 {
-  m_mainWin->DeleteColumn( col );
-  return TRUE;
+    m_mainWin->DeleteColumn( col );
+    return TRUE;
 }
 
 /*
@@ -2621,91 +2721,90 @@ wxText& wxListCtrl::Edit( long WXUNUSED(item ) )
 
 bool wxListCtrl::EnsureVisible( long item )
 {
-  m_mainWin->EnsureVisible( item );
-  return TRUE;
+    m_mainWin->EnsureVisible( item );
+    return TRUE;
 }
 
 long wxListCtrl::FindItem( long start, const wxString& str,  bool partial )
 {
-  return m_mainWin->FindItem( start, str, partial );
+    return m_mainWin->FindItem( start, str, partial );
 }
 
 long wxListCtrl::FindItem( long start, long data )
 {
-  return m_mainWin->FindItem( start, data );
+    return m_mainWin->FindItem( start, data );
 }
 
 long wxListCtrl::FindItem( long WXUNUSED(start), const wxPoint& WXUNUSED(pt),
                            int WXUNUSED(direction))
 {
-  return 0;
+    return 0;
 }
 
 long wxListCtrl::HitTest( const wxPoint &point, int &flags )
 {
-  return m_mainWin->HitTest( (int)point.x, (int)point.y, flags );
+    return m_mainWin->HitTest( (int)point.x, (int)point.y, flags );
 }
 
 long wxListCtrl::InsertItem( wxListItem& info )
 {
-  m_mainWin->InsertItem( info );
-  return 0;
+    m_mainWin->InsertItem( info );
+    return 0;
 }
 
 long wxListCtrl::InsertItem( long index, const wxString &label )
 {
-  wxListItem info;
-  info.m_text = label;
-  info.m_mask = wxLIST_MASK_TEXT;
-  info.m_itemId = index;
-  return InsertItem( info );
+    wxListItem info;
+    info.m_text = label;
+    info.m_mask = wxLIST_MASK_TEXT;
+    info.m_itemId = index;
+    return InsertItem( info );
 }
 
 long wxListCtrl::InsertItem( long index, int imageIndex )
 {
-  wxListItem info;
-  info.m_mask = wxLIST_MASK_IMAGE;
-  info.m_image = imageIndex;
-  info.m_itemId = index;
-  return InsertItem( info );
+    wxListItem info;
+    info.m_mask = wxLIST_MASK_IMAGE;
+    info.m_image = imageIndex;
+    info.m_itemId = index;
+    return InsertItem( info );
 }
 
 long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex )
 {
-  wxListItem info;
-  info.m_text = label;
-  info.m_image = imageIndex;
-  info.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE;
-  info.m_itemId = index;
-  return InsertItem( info );
+    wxListItem info;
+    info.m_text = label;
+    info.m_image = imageIndex;
+    info.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_IMAGE;
+    info.m_itemId = index;
+    return InsertItem( info );
 }
 
 long wxListCtrl::InsertColumn( long col, wxListItem &item )
 {
-  m_mainWin->InsertColumn( col, item );
-  return 0;
+    m_mainWin->InsertColumn( col, item );
+    return 0;
 }
 
 long wxListCtrl::InsertColumn( long col, const wxString &heading,
                                int format, int width )
 {
-  wxListItem item;
-  item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT;
-  item.m_text = heading;
-  if (width >= -2)
-  {
-    item.m_mask |= wxLIST_MASK_WIDTH;
-    item.m_width = width;
-  }
-;
-  item.m_format = format;
+    wxListItem item;
+    item.m_mask = wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT;
+    item.m_text = heading;
+    if (width >= -2)
+    {
+        item.m_mask |= wxLIST_MASK_WIDTH;
+        item.m_width = width;
+    }
+    item.m_format = format;
 
-  return InsertColumn( col, item );
+    return InsertColumn( col, item );
 }
 
 bool wxListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) )
 {
-  return 0;
+    return 0;
 }
 
 // Sort items.
@@ -2720,79 +2819,103 @@ bool wxListCtrl::ScrollList( int WXUNUSED(dx), int WXUNUSED(dy) )
 
 bool wxListCtrl::SortItems( wxListCtrlCompare fn, long data )
 {
-  m_mainWin->SortItems( fn, data );
-  return TRUE;
+    m_mainWin->SortItems( fn, data );
+    return TRUE;
 }
 
 void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
 {
-  if (!m_mainWin->m_dirty) return;
+    if (!m_mainWin->m_dirty) return;
 
-  int cw = 0;
-  int ch = 0;
-  GetClientSize( &cw, &ch );
+    int cw = 0;
+    int ch = 0;
+    GetClientSize( &cw, &ch );
 
-  int x = 0;
-  int y = 0;
-  int w = 0;
-  int h = 0;
+    int x = 0;
+    int y = 0;
+    int w = 0;
+    int h = 0;
 
-  if (GetWindowStyleFlag() & wxLC_REPORT)
-  {
-    m_headerWin->GetPosition( &x, &y );
-    m_headerWin->GetSize( &w, &h );
-    if ((x != 0) || (y != 0) || (w != cw) || (h != 23))
-      m_headerWin->SetSize( 0, 0, cw, 23 );
-
-    m_mainWin->GetPosition( &x, &y );
-    m_mainWin->GetSize( &w, &h );
-    if ((x != 0) || (y != 24) || (w != cw) || (h != ch-24))
-      m_mainWin->SetSize( 0, 24, cw, ch-24 );
-  }
-  else
-  {
-    m_mainWin->GetPosition( &x, &y );
-    m_mainWin->GetSize( &w, &h );
-    if ((x != 0) || (y != 24) || (w != cw) || (h != ch))
-      m_mainWin->SetSize( 0, 0, cw, ch );
-  }
+    if (HasFlag(wxLC_REPORT))
+    {
+        m_headerWin->GetPosition( &x, &y );
+        m_headerWin->GetSize( &w, &h );
+        if ((x != 0) || (y != 0) || (w != cw) || (h != 23))
+            m_headerWin->SetSize( 0, 0, cw, 23 );
 
-  m_mainWin->CalculatePositions();
-  m_mainWin->RealizeChanges();
-  m_mainWin->m_dirty = FALSE;
-  m_mainWin->Refresh();
+        m_mainWin->GetPosition( &x, &y );
+        m_mainWin->GetSize( &w, &h );
+        if ((x != 0) || (y != 24) || (w != cw) || (h != ch-24))
+            m_mainWin->SetSize( 0, 24, cw, ch-24 );
+    }
+    else
+    {
+        m_mainWin->GetPosition( &x, &y );
+        m_mainWin->GetSize( &w, &h );
+        if ((x != 0) || (y != 24) || (w != cw) || (h != ch))
+            m_mainWin->SetSize( 0, 0, cw, ch );
+    }
+
+    m_mainWin->CalculatePositions();
+    m_mainWin->RealizeChanges();
+    m_mainWin->m_dirty = FALSE;
+    m_mainWin->Refresh();
 }
 
-void wxListCtrl::SetBackgroundColour( const wxColour &colour )
+bool wxListCtrl::SetBackgroundColour( const wxColour &colour )
 {
-  if (m_mainWin)
-  {
-    m_mainWin->SetBackgroundColour( colour );
-    m_mainWin->m_dirty = TRUE;
-  }
-  if (m_headerWin)
-    m_headerWin->SetBackgroundColour( colour );
+    if ( !wxWindow::SetBackgroundColour( colour ) )
+        return FALSE;
+
+    if (m_mainWin)
+    {
+        m_mainWin->SetBackgroundColour( colour );
+        m_mainWin->m_dirty = TRUE;
+    }
+    
+    if (m_headerWin)
+    {
+//        m_headerWin->SetBackgroundColour( colour );
+    }
+
+    return TRUE;
 }
 
-void wxListCtrl::SetForegroundColour( const wxColour &colour )
+bool wxListCtrl::SetForegroundColour( const wxColour &colour )
 {
-  if (m_mainWin)
-  {
-    m_mainWin->SetForegroundColour( colour );
-    m_mainWin->m_dirty = TRUE;
-  }
-  if (m_headerWin)
-    m_headerWin->SetForegroundColour( colour );
+    if ( !wxWindow::SetForegroundColour( colour ) )
+        return FALSE;
+    
+    if (m_mainWin)
+    {
+        m_mainWin->SetForegroundColour( colour );
+        m_mainWin->m_dirty = TRUE;
+    }
+    
+    if (m_headerWin)
+    {
+        m_headerWin->SetForegroundColour( colour );
+    }
+
+    return TRUE;
 }
 
-void wxListCtrl::SetFont( const wxFont &font )
+bool wxListCtrl::SetFont( const wxFont &font )
 {
-  if (m_mainWin)
-  {
-    m_mainWin->SetFont( font );
-    m_mainWin->m_dirty = TRUE;
-  }
-  if (m_headerWin)
-    m_headerWin->SetFont( font );
+    if ( !wxWindow::SetFont( font ) )
+        return FALSE;
+    
+    if (m_mainWin)
+    {
+        m_mainWin->SetFont( font );
+        m_mainWin->m_dirty = TRUE;
+    }
+    
+    if (m_headerWin)
+    {
+        m_headerWin->SetFont( font );
+    }
+
+    return TRUE;
 }