From f66553919504e2d24a1846960a547ff1fd52eb67 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 14 Dec 2008 21:56:38 +0000 Subject: [PATCH] no changes, just refactoring: extracted the code to update the column indices array when the number of columns changes to the common code to be able to reuse it from the MSW version git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/headerctrl.h | 5 +++++ src/common/headerctrlcmn.cpp | 37 ++++++++++++++++++++++++++++++++++++ src/generic/headerctrlg.cpp | 29 ++-------------------------- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/include/wx/headerctrl.h b/include/wx/headerctrl.h index 1557f0fb64..10ae50118c 100644 --- a/include/wx/headerctrl.h +++ b/include/wx/headerctrl.h @@ -140,6 +140,11 @@ protected: // columns in the control changes virtual void OnColumnCountChanging(unsigned int WXUNUSED(count)) { } + + // helper function for the derived classes: update the array of column + // indices after the number of columns changed + void DoResizeColumnIndices(wxArrayInt& colIndices, unsigned int count); + private: // methods implementing our public API and defined in platform-specific // implementations diff --git a/src/common/headerctrlcmn.cpp b/src/common/headerctrlcmn.cpp index d1adf1fce1..67b81cf962 100644 --- a/src/common/headerctrlcmn.cpp +++ b/src/common/headerctrlcmn.cpp @@ -66,6 +66,9 @@ void wxHeaderCtrlBase::ScrollWindow(int dx, void wxHeaderCtrlBase::SetColumnCount(unsigned int count) { + if ( count == GetColumnCount() ) + return; + OnColumnCountChanging(count); DoSetCount(count); @@ -189,6 +192,40 @@ void wxHeaderCtrlBase::MoveColumnInOrderArray(wxArrayInt& order, order.swap(orderNew); } +void +wxHeaderCtrlBase::DoResizeColumnIndices(wxArrayInt& colIndices, unsigned int count) +{ + // update the column indices array if necessary + const unsigned countOld = colIndices.size(); + if ( count > countOld ) + { + // all new columns have default positions equal to their indices + for ( unsigned n = countOld; n < count; n++ ) + colIndices.push_back(n); + } + else if ( count < countOld ) + { + // filter out all the positions which are invalid now while keeping the + // order of the remaining ones + wxArrayInt colIndicesNew; + colIndicesNew.reserve(count); + for ( unsigned n = 0; n < countOld; n++ ) + { + const unsigned idx = colIndices[n]; + if ( idx < count ) + colIndicesNew.push_back(idx); + } + + colIndices.swap(colIndicesNew); + } + else // count didn't really change, we shouldn't even be called + { + wxFAIL_MSG( "useless call to DoResizeColumnIndices()" ); + } + + wxASSERT_MSG( colIndices.size() == count, "logic error" ); +} + // ============================================================================ // wxHeaderCtrlSimple implementation // ============================================================================ diff --git a/src/generic/headerctrlg.cpp b/src/generic/headerctrlg.cpp index 961c42b5d4..5d040b69d9 100644 --- a/src/generic/headerctrlg.cpp +++ b/src/generic/headerctrlg.cpp @@ -92,33 +92,8 @@ wxHeaderCtrl::~wxHeaderCtrl() void wxHeaderCtrl::DoSetCount(unsigned int count) { - // update the column indices array if necessary - if ( count > m_numColumns ) - { - // all new columns have default positions equal to their indices - for ( unsigned n = m_numColumns; n < count; n++ ) - m_colIndices.push_back(n); - } - else if ( count < m_numColumns ) - { - // filter out all the positions which are invalid now while keeping the - // order of the remaining ones - wxArrayInt colIndices; - for ( unsigned n = 0; n < m_numColumns; n++ ) - { - const unsigned idx = m_colIndices[n]; - if ( idx < count ) - colIndices.push_back(idx); - } - - wxASSERT_MSG( colIndices.size() == count, "logic error" ); - - m_colIndices = colIndices; - } - else // count didn't really change - { - return; - } + // update the column indices order array before changing m_numColumns + DoResizeColumnIndices(m_colIndices, count); m_numColumns = count; -- 2.45.2