Skip to content

Commit

Permalink
Order array has to have the same size as item list in wxRearrangeList
Browse files Browse the repository at this point in the history
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 wxWidgets#17836.
  • Loading branch information
a-wi committed Apr 28, 2017
1 parent 7542632 commit 7e1b64a
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 2 deletions.
4 changes: 4 additions & 0 deletions include/wx/rearrangectrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ class WXDLLIMPEXP_CORE wxRearrangeList : public wxCheckListBox
// 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);
Expand Down
44 changes: 42 additions & 2 deletions src/common/rearrangectrl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

Expand Down Expand Up @@ -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
// ============================================================================
Expand Down

0 comments on commit 7e1b64a

Please sign in to comment.