]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/rearrangectrl.cpp
Update all controls using in-place editors to handle Escape/Return correctly.
[wxWidgets.git] / src / common / rearrangectrl.cpp
index 33df826505db94dfdcb4bb55b06d5ca5fccd6bb4..2e0ba1bcc6795b1b57d24c3541374bca3722f049 100644 (file)
@@ -23,6 +23,8 @@
     #pragma hdrstop
 #endif
 
+#if wxUSE_REARRANGECTRL
+
 #ifndef WX_PRECOMP
     #include "wx/button.h"
     #include "wx/stattext.h"
@@ -123,16 +125,45 @@ bool wxRearrangeList::MoveCurrentDown()
 
 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)
@@ -254,8 +285,19 @@ bool wxRearrangeDialog::Create(wxWindow *parent,
     // 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),
@@ -294,3 +336,5 @@ wxArrayInt wxRearrangeDialog::GetOrder() const
 
     return m_ctrl->GetList()->GetCurrentOrder();
 }
+
+#endif // wxUSE_REARRANGECTRL