]> git.saurik.com Git - wxWidgets.git/commitdiff
don't duplicate the column reordering in generic wxHeaderCtrl and wxGrid, extract...
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 11 Dec 2008 22:27:02 +0000 (22:27 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 11 Dec 2008 22:27:02 +0000 (22:27 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57264 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/headerctrl.h
interface/wx/headerctrl.h
src/common/headerctrlcmn.cpp
src/generic/grid.cpp
src/generic/headerctrlg.cpp

index b242b9c920a9ed3b0c574d8a31969c3d75237e9d..512171a3db19a3682bf2e214e0a1be70c1a42b5b 100644 (file)
@@ -98,6 +98,14 @@ public:
     // get the position at which this column is currently displayed
     unsigned int GetColumnPos(unsigned int idx) const;
 
+    // helper function used by the generic version of this control and also
+    // wxGrid: reshuffles the array of column indices indexed by positions
+    // (i.e. using the same convention as for SetColumnsOrder()) so that the
+    // column with the given index is found at the specified position
+    static void MoveColumnInOrderArray(wxArrayInt& order,
+                                       unsigned int idx,
+                                       unsigned int pos);
+
 
     // implementation only from now on
     // -------------------------------
index 1feaa0d01fb02bca769faddb32a41db61ec1041d..4bf92248e47fc15f1ac1438faeb7cd4e9f0f790e 100644 (file)
@@ -272,6 +272,26 @@ public:
      */
     unsigned int GetColumnPos(unsigned int idx) const;
 
+    /**
+        Helper function to manipulate the array of column indices.
+
+        This function reshuffles the array of column indices indexed by
+        positions (i.e. using the same convention as for SetColumnsOrder()) so
+        that the column with the given index is found at the specified
+        position.
+
+        @param order
+            Array containing the indices of columns in order of their
+            positions.
+        @param idx
+            The index of the column to move.
+        @param pos
+            The new position for the column @a idx.
+     */
+    static void MoveColumnInOrderArray(wxArrayInt& order,
+                                       unsigned int idx,
+                                       unsigned int pos);
+
 protected:
     /**
         Method to be implemented by the derived classes to return the
index 03e2c35cdd07ee51c075ec79c33fd5e4c6136e46..66548a1ff998e490fea32b76b0a0d7a07bde3ce1 100644 (file)
@@ -147,6 +147,38 @@ unsigned int wxHeaderCtrlBase::GetColumnPos(unsigned int idx) const
     return wxNO_COLUMN;
 }
 
+/* static */
+void wxHeaderCtrlBase::MoveColumnInOrderArray(wxArrayInt& order,
+                                              unsigned int idx,
+                                              unsigned int pos)
+{
+    const unsigned count = order.size();
+
+    wxArrayInt orderNew;
+    orderNew.reserve(count);
+    for ( unsigned n = 0; ; n++ )
+    {
+        // NB: order of checks is important for this to work when the new
+        //     column position is the same as the old one
+
+        // insert the column at its new position
+        if ( orderNew.size() == pos )
+            orderNew.push_back(idx);
+
+        if ( n == count )
+            break;
+
+        // delete the column from its old position
+        const unsigned idxOld = order[n];
+        if ( idxOld == idx )
+            continue;
+
+        orderNew.push_back(idxOld);
+    }
+
+    order.swap(orderNew);
+}
+
 // ============================================================================
 // wxHeaderCtrlSimple implementation
 // ============================================================================
index 03204f839bf24998c090378fcdd4912d10acd574..8d2bf5c27876e22e0008f2faf3e6a1b7457f2606 100644 (file)
@@ -6781,37 +6781,15 @@ void wxGrid::DoEndDragMoveCol()
 
 void wxGrid::SetColPos(int idx, int pos)
 {
+    // we're going to need m_colAt now, initialize it if needed
     if ( m_colAt.empty() )
     {
-        // we're going to need m_colAt now, initialize it
         m_colAt.reserve(m_numCols);
         for ( int i = 0; i < m_numCols; i++ )
             m_colAt.push_back(i);
     }
 
-    // create the updated copy of m_colAt
-    const unsigned count = m_colAt.size();
-
-    wxArrayInt colAt;
-    colAt.reserve(count);
-    for ( unsigned n = 0; n < count; n++ )
-    {
-        // NB: order of checks is important for this to work when the new
-        //     column position is the same as the old one
-
-        // insert the column at its new position
-        if ( colAt.size() == static_cast<unsigned>(pos) )
-            colAt.push_back(idx);
-
-        // delete the column from its old position
-        const int idxOld = m_colAt[n];
-        if ( idxOld == idx )
-            continue;
-
-        colAt.push_back(idxOld);
-    }
-
-    m_colAt = colAt;
+    wxHeaderCtrl::MoveColumnInOrderArray(m_colAt, idx, pos);
 
     // also recalculate the column rights
     if ( !m_colWidths.IsEmpty() )
index f1a98083c2a933480181e9075da2a33de59ec30b..4ec2a61120618eb18e1a8336d77d635297f63962 100644 (file)
@@ -473,28 +473,7 @@ wxArrayInt wxHeaderCtrl::DoGetColumnsOrder() const
 
 void wxHeaderCtrl::DoMoveCol(unsigned int idx, unsigned int pos)
 {
-    const unsigned count = m_colIndices.size();
-
-    wxArrayInt colIndices;
-    colIndices.reserve(count);
-    for ( unsigned n = 0; n < count; n++ )
-    {
-        // NB: order of checks is important for this to work when the new
-        //     column position is the same as the old one
-
-        // insert the column at its new position
-        if ( colIndices.size() == pos )
-            colIndices.push_back(idx);
-
-        // delete the column from its old position
-        const unsigned idxOld = m_colIndices[n];
-        if ( idxOld == idx )
-            continue;
-
-        colIndices.push_back(idxOld);
-    }
-
-    m_colIndices = colIndices;
+    MoveColumnInOrderArray(m_colIndices, idx, pos);
 
     Refresh();
 }