]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
Listctrl should now send char and key_down events.
[wxWidgets.git] / src / generic / listctrl.cpp
index 5b7d3480f4fe4cf41ffb879481f8fc3d4a00bcc6..e319bca803cd03265c1201d6a77c8f7e8aa0bbe1 100644 (file)
@@ -942,6 +942,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 +1357,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 +1382,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 +1411,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;
@@ -2330,11 +2350,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 +2369,7 @@ void wxListCtrl::OnSize( wxSizeEvent &WXUNUSED(event) )
 
 void wxListCtrl::SetSingleStyle( long style, bool add )
 {
-    long flag = GetWindowStyleFlag();
+    long flag = GetWindowStyle();
 
     if (add)
     {
@@ -2370,39 +2392,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 +2790,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 +2816,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 );
@@ -2805,10 +2831,15 @@ void wxListCtrl::SetBackgroundColour( const wxColour &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 +2850,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 +2869,7 @@ void wxListCtrl::SetFont( const wxFont &font )
     {
         m_headerWin->SetFont( font );
     }
+
+    return TRUE;
 }