// Purpose: implementation of classes in wx/rearrangectrl.h
// Author: Vadim Zeitlin
// Created: 2008-12-15
-// RCS-ID: $Id$
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
void wxRearrangeList::Swap(int pos1, int pos2)
{
+ // update the internally stored order
wxSwap(m_order[pos1], m_order[pos2]);
- const wxString stringTmp = GetString(pos1);
- const bool checkedTmp = IsChecked(pos1);
- SetString(pos1, GetString(pos2));
- Check(pos1, IsChecked(pos2));
+ // and now also swap all the attributes of the items
+ // first the label
+ const wxString stringTmp = GetString(pos1);
+ SetString(pos1, GetString(pos2));
SetString(pos2, stringTmp);
+
+ // then the checked state
+ const bool checkedTmp = IsChecked(pos1);
+ Check(pos1, IsChecked(pos2));
Check(pos2, checkedTmp);
+
+ // and finally the client data, if necessary
+ switch ( GetClientDataType() )
+ {
+ case wxClientData_None:
+ // nothing to do
+ break;
+
+ case wxClientData_Object:
+ {
+ wxClientData * const dataTmp = DetachClientObject(pos1);
+ SetClientObject(pos1, DetachClientObject(pos2));
+ SetClientObject(pos2, dataTmp);
+ }
+ break;
+
+ case wxClientData_Void:
+ {
+ void * const dataTmp = GetClientData(pos1);
+ SetClientData(pos1, GetClientData(pos2));
+ SetClientData(pos2, dataTmp);
+ }
+ break;
+ }
}
void wxRearrangeList::OnCheck(wxCommandEvent& event)
// notice that the items in this sizer should be inserted accordingly to
// wxRearrangeDialogSizerPositions order
wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
- sizerTop->Add(new wxStaticText(this, wxID_ANY, message),
- wxSizerFlags().Border());
+
+ if ( !message.empty() )
+ {
+ sizerTop->Add(new wxStaticText(this, wxID_ANY, message),
+ wxSizerFlags().Border());
+ }
+ else
+ {
+ // for convenience of other wxRearrangeDialog code that depends on
+ // positions of sizer items, insert a dummy zero-sized item
+ sizerTop->AddSpacer(0);
+ }
+
sizerTop->Add(m_ctrl,
wxSizerFlags(1).Expand().Border());
sizerTop->Add(CreateSeparatedButtonSizer(wxOK | wxCANCEL),