From 7e1b64a2eb6ef5b0ad3dc5b77c8102ff86315a75 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Fri, 28 Apr 2017 21:03:23 +0200 Subject: [PATCH] Order array has to have the same size as item list in wxRearrangeList Number of indices stored in the internal order array has to be the same as number of the items, so whenever item is added or removed, order array has to be adjusted accordingly. Closes #17836. --- include/wx/rearrangectrl.h | 4 ++++ src/common/rearrangectrl.cpp | 44 ++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/include/wx/rearrangectrl.h b/include/wx/rearrangectrl.h index f9d7c324fe..7d6e1b0fbc 100644 --- a/include/wx/rearrangectrl.h +++ b/include/wx/rearrangectrl.h @@ -99,6 +99,10 @@ public: // Override this to keep our m_order array in sync with the real item state. virtual void Check(unsigned int item, bool check = true) wxOVERRIDE; + int DoInsertOneItem(const wxString& item, unsigned int pos) wxOVERRIDE; + void DoDeleteOneItem(unsigned int n) wxOVERRIDE; + void DoClear() wxOVERRIDE; + private: // swap two items at the given positions in the listbox void Swap(int pos1, int pos2); diff --git a/src/common/rearrangectrl.cpp b/src/common/rearrangectrl.cpp index 98cddb55fc..bbd9564fe3 100644 --- a/src/common/rearrangectrl.cpp +++ b/src/common/rearrangectrl.cpp @@ -70,6 +70,7 @@ bool wxRearrangeList::Create(wxWindow *parent, } // do create the real control + m_order.reserve(count); if ( !wxCheckListBox::Create(parent, id, pos, size, itemsInOrder, style, validator, name) ) return false; @@ -83,10 +84,9 @@ bool wxRearrangeList::Create(wxWindow *parent, // which would also update m_order itself. wxCheckListBox::Check(n); } + m_order[n] = order[n]; } - m_order = order; - return true; } @@ -188,6 +188,46 @@ void wxRearrangeList::OnCheck(wxCommandEvent& event) m_order[n] = ~m_order[n]; } +int wxRearrangeList::DoInsertOneItem(const wxString& item, unsigned int pos) +{ + wxCheckListBox::DoInsertOneItem(item, pos); + // Item is not checked initially. + const int idx = ~m_order.size(); + m_order.Insert(idx, pos); + return pos; +} + +void wxRearrangeList::DoDeleteOneItem(unsigned int n) +{ + wxCheckListBox::DoDeleteOneItem(n); + int idxDeleted = m_order[n]; + if ( idxDeleted < 0 ) + idxDeleted = ~idxDeleted; + m_order.RemoveAt(n); + // Remaining items have to be reindexed. + for( size_t i = 0; i < m_order.size(); i++ ) + { + int idx = m_order[i]; + if ( idx < 0 ) + { + idx = ~idx; + if ( idx > idxDeleted ) + m_order[i] = ~(idx-1); + } + else + { + if ( idx > idxDeleted ) + m_order[i] = idx-1; + } + } +} + +void wxRearrangeList::DoClear() +{ + wxCheckListBox::DoClear(); + m_order.Clear(); +} + // ============================================================================ // wxRearrangeCtrl implementation // ============================================================================