X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5dd26b083956439f0147c134e9365c222fba3726..b6c588e1a65704bd5f3707b0e691a957ad43a148:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 95bad0445e..c6c67c9613 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -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". @@ -1622,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 */ @@ -2329,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; } @@ -2551,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) @@ -2715,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 );