// 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
void wxHeaderCtrlBase::SetColumnCount(unsigned int count)
{
+ if ( count == GetColumnCount() )
+ return;
+
OnColumnCountChanging(count);
DoSetCount(count);
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
// ============================================================================
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;