X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8253c7fda19e5f1c58326fa4fa076ca21684aade..0bd55cfa2c5c18d4e9241cf90195e30d0be5d905:/src/generic/listctrl.cpp?ds=sidebyside diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 098346f76a..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". @@ -2330,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; - wxNode *node = m_lines.Nth( (size_t)++ret ); + 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; } @@ -2552,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)