]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
Added OS/2 patches to wxGTK.
[wxWidgets.git] / src / generic / listctrl.cpp
index ed1c2e255b19ee191a45e3fabaf1127506e48818..25364ef23fb0d50a37278fa331394b0cfcffae98 100644 (file)
@@ -685,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,
@@ -697,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 )
@@ -780,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 );
 
@@ -796,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
@@ -837,7 +838,7 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
 
     if (event.LeftDown() && hit_border)
     {
-        m_isDraging = TRUE;
+        m_isDragging = TRUE;
         m_currentX = x;
         DrawCurrent();
         CaptureMouse();
@@ -942,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()
@@ -1356,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(); }
     }
 }
 
@@ -1381,6 +1383,25 @@ 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 )
 {
     wxWindow *parent = GetParent();
@@ -1391,8 +1412,8 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
     le.SetEventObject( parent );
     parent->GetEventHandler()->ProcessEvent( le );
 
-    /* we propagate the key event up */
-    wxKeyEvent ke( wxEVT_KEY_DOWN );
+    /* 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;
@@ -1403,6 +1424,14 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
     ke.SetEventObject( parent );
     if (parent->GetEventHandler()->ProcessEvent( ke )) return;
   
+    if (event.KeyCode() == WXK_TAB)
+    {
+        wxNavigationKeyEvent nevent;
+        nevent.SetDirection( !event.ShiftDown() );
+        nevent.SetCurrentFocus( m_parent );
+        if (m_parent->GetEventHandler()->ProcessEvent( nevent )) return;
+    }
+  
     /* no item -> nothing to do */
     if (!m_current)
     {
@@ -1666,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();
@@ -1760,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 );
         }
     }
 
@@ -1778,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())
@@ -2033,7 +2099,7 @@ long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state
 {
     long ret = 0;
     if (item > 0) ret = item;
-    if(item >= GetItemCount()) return -1;
+    if(ret >= GetItemCount()) return -1;
     wxNode *node = m_lines.Nth( ret );
     while (node)
     {
@@ -2063,7 +2129,7 @@ void wxListMainWindow::DeleteItem( long index )
 void wxListMainWindow::DeleteColumn( int col )
 {
     wxCHECK_RET( col < (int)m_columns.GetCount(),
-               "attempting to delete inexistent column in wxListView" );
+               _T("attempting to delete inexistent column in wxListView") );
 
     m_dirty = TRUE;
     wxNode *node = m_columns.Nth( col );
@@ -2330,11 +2396,13 @@ bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
 
     m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s );
 
-    if (GetWindowStyleFlag() & wxLC_REPORT)
+    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;
 
+    SetBackgroundColour( *wxWHITE );
+
     return ret;
 }
 
@@ -2347,7 +2415,7 @@ void wxListCtrl::OnSize( wxSizeEvent &WXUNUSED(event) )
 
 void wxListCtrl::SetSingleStyle( long style, bool add )
 {
-    long flag = GetWindowStyleFlag();
+    long flag = GetWindowStyle();
 
     if (add)
     {
@@ -2370,39 +2438,40 @@ void wxListCtrl::SetSingleStyle( long style, bool add )
 
 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))
+        if (flag & wxLC_REPORT)
         {
-//          m_mainWin->SetSize( 0, 24, width, height-24 );
-            if (!m_headerWin)
+            if (!HasFlag(wxLC_REPORT))
             {
-                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 );
+                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 (GetWindowStyleFlag() & wxLC_REPORT)
+        else
         {
-//          m_mainWin->SetSize( 0, 0, width, height );
-            m_headerWin->Show( FALSE );
-        }
+            if (HasFlag(wxLC_REPORT))
+            {
+                m_headerWin->Show( FALSE );
+            }
+       }
     }
-
+    
     wxWindow::SetWindowStyleFlag( flag );
 }
 
@@ -2767,7 +2836,7 @@ void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
     int w = 0;
     int h = 0;
 
-    if (GetWindowStyleFlag() & wxLC_REPORT)
+    if (HasFlag(wxLC_REPORT))
     {
         m_headerWin->GetPosition( &x, &y );
         m_headerWin->GetSize( &w, &h );
@@ -2793,8 +2862,11 @@ void wxListCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
     m_mainWin->Refresh();
 }
 
-void wxListCtrl::SetBackgroundColour( const wxColour &colour )
+bool wxListCtrl::SetBackgroundColour( const wxColour &colour )
 {
+    if ( !wxWindow::SetBackgroundColour( colour ) )
+        return FALSE;
+
     if (m_mainWin)
     {
         m_mainWin->SetBackgroundColour( colour );
@@ -2803,12 +2875,17 @@ void wxListCtrl::SetBackgroundColour( const wxColour &colour )
     
     if (m_headerWin)
     {
-        m_headerWin->SetBackgroundColour( colour );
+//        m_headerWin->SetBackgroundColour( colour );
     }
+
+    return TRUE;
 }
 
-void wxListCtrl::SetForegroundColour( const wxColour &colour )
+bool wxListCtrl::SetForegroundColour( const wxColour &colour )
 {
+    if ( !wxWindow::SetForegroundColour( colour ) )
+        return FALSE;
+    
     if (m_mainWin)
     {
         m_mainWin->SetForegroundColour( colour );
@@ -2819,10 +2896,15 @@ void wxListCtrl::SetForegroundColour( const wxColour &colour )
     {
         m_headerWin->SetForegroundColour( colour );
     }
+
+    return TRUE;
 }
 
-void wxListCtrl::SetFont( const wxFont &font )
+bool wxListCtrl::SetFont( const wxFont &font )
 {
+    if ( !wxWindow::SetFont( font ) )
+        return FALSE;
+    
     if (m_mainWin)
     {
         m_mainWin->SetFont( font );
@@ -2833,5 +2915,7 @@ void wxListCtrl::SetFont( const wxFont &font )
     {
         m_headerWin->SetFont( font );
     }
+
+    return TRUE;
 }