]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
fixed memory leaks
[wxWidgets.git] / src / generic / listctrl.cpp
index 43b025202c9a2d51241798f12b797db1b5fef977..c6c67c9613f13f2888f33ce291335213eb696271 100644 (file)
@@ -8,7 +8,8 @@
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "listctrl.h"
+    #pragma implementation "listctrl.h"
+    #pragma implementation "listctrlbase.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
@@ -314,8 +315,13 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
                 m_bound_all.height = lh;
                 if (item->HasImage())
                 {
+#ifdef __WIN16__
+                    int w = 0;
+                    int h = 0;
+#else
                     wxCoord w = 0;
                     wxCoord h = 0;
+#endif
                     m_owner->GetImageSize( item->GetImage(), w, h );
                     m_bound_all.width += 4 + w;
                     if (h > m_bound_all.height) m_bound_all.height = h;
@@ -1617,8 +1623,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
     {
         wxNavigationKeyEvent nevent;
         nevent.SetDirection( !event.ShiftDown() );
+        nevent.SetEventObject( GetParent()->GetParent() );
         nevent.SetCurrentFocus( m_parent );
-        if (m_parent->GetEventHandler()->ProcessEvent( nevent )) return;
+        if (GetParent()->GetParent()->GetEventHandler()->ProcessEvent( nevent )) return;
     }
 
     /* no item -> nothing to do */
@@ -2324,21 +2331,41 @@ void wxListMainWindow::RealizeChanges( void )
     }
 }
 
-long wxListMainWindow::GetNextItem( long item, int WXUNUSED(geometry), int state )
+long wxListMainWindow::GetNextItem( long item,
+                                    int WXUNUSED(geometry),
+                                    int state )
 {
-    long ret = 0;
-    if (item > 0) ret = item;
-    if(ret >= GetItemCount()) return -1;
+    long ret = item,
+         max = GetItemCount();
+    wxCHECK_MSG( (ret == -1) || (ret < max), -1,
+                 _T("invalid listctrl index in GetNextItem()") );
+
+    // notice that we start with the next item (or the first one if item == -1)
+    // and this is intentional to allow writing a simple loop to iterate over
+    // all selected items
+    ret++;
+    if ( ret == max )
+    {
+        // this is not an error because the index was ok initially, just no
+        // such item
+        return -1;
+    }
+
     wxNode *node = m_lines.Nth( (size_t)ret );
     while (node)
     {
         wxListLineData *line = (wxListLineData*)node->Data();
-        if ((state & wxLIST_STATE_FOCUSED) && (line == m_current)) return ret;
-        if ((state & wxLIST_STATE_SELECTED) && (line->IsHilighted())) return ret;
-        if (!state) return ret;
+        if ((state & wxLIST_STATE_FOCUSED) && (line == m_current))
+            return ret;
+        if ((state & wxLIST_STATE_SELECTED) && (line->IsHilighted()))
+            return ret;
+        if (!state)
+            return ret;
         ret++;
+
         node = node->Next();
     }
+
     return -1;
 }
 
@@ -2546,6 +2573,7 @@ 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 );
+    m_dirty = TRUE;
 }
 
 void wxListMainWindow::OnScroll(wxScrollWinEvent& event)
@@ -2710,9 +2738,15 @@ bool wxListCtrl::Create(wxWindow *parent,
     m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, style );
 
     if (HasFlag(wxLC_REPORT))
+    {
         m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL );
+        if (HasFlag(wxLC_NO_HEADER))
+            m_headerWin->Show( FALSE );
+    }
     else
+    {
         m_headerWin = (wxListHeaderWindow *) NULL;
+    }
 
     SetBackgroundColour( *wxWHITE );