+ case wxGRIDTABLE_NOTIFY_COLS_INSERTED:
+ {
+ size_t pos = msg.GetCommandInt();
+ int numCols = msg.GetCommandInt2();
+ m_numCols += numCols;
+
+ if ( m_useNativeHeader )
+ GetGridColHeader()->SetColumnCount(m_numCols);
+
+ if ( !m_colAt.IsEmpty() )
+ {
+ //Shift the column IDs
+ for ( i = 0; i < m_numCols - numCols; i++ )
+ {
+ if ( m_colAt[i] >= (int)pos )
+ m_colAt[i] += numCols;
+ }
+
+ m_colAt.Insert( pos, pos, numCols );
+
+ //Set the new columns' positions
+ for ( i = pos + 1; i < (int)pos + numCols; i++ )
+ {
+ m_colAt[i] = i;
+ }
+ }
+
+ if ( !m_colWidths.IsEmpty() )
+ {
+ m_colWidths.Insert( m_defaultColWidth, pos, numCols );
+ m_colRights.Insert( 0, pos, numCols );
+
+ int right = 0;
+ if ( pos > 0 )
+ right = m_colRights[GetColAt( pos - 1 )];
+
+ int colPos;
+ for ( colPos = pos; colPos < m_numCols; colPos++ )
+ {
+ i = GetColAt( colPos );
+
+ right += m_colWidths[i];
+ m_colRights[i] = right;
+ }
+ }
+
+ if ( m_currentCellCoords == wxGridNoCellCoords )
+ {
+ // if we have just inserted cols into an empty grid the current
+ // cell will be undefined...
+ //
+ SetCurrentCell( 0, 0 );
+ }
+
+ if ( m_selection )
+ m_selection->UpdateCols( pos, numCols );
+ wxGridCellAttrProvider * attrProvider = m_table->GetAttrProvider();
+ if (attrProvider)
+ attrProvider->UpdateAttrCols( pos, numCols );
+ if ( !GetBatchCount() )
+ {
+ CalcDimensions();
+ m_colWindow->Refresh();
+ }
+ }
+ result = true;
+ break;
+
+ case wxGRIDTABLE_NOTIFY_COLS_APPENDED:
+ {
+ int numCols = msg.GetCommandInt();
+ int oldNumCols = m_numCols;
+ m_numCols += numCols;
+
+ if ( !m_colAt.IsEmpty() )
+ {
+ m_colAt.Add( 0, numCols );
+
+ //Set the new columns' positions
+ for ( i = oldNumCols; i < m_numCols; i++ )
+ {
+ m_colAt[i] = i;
+ }
+ }
+
+ if ( !m_colWidths.IsEmpty() )
+ {
+ m_colWidths.Add( m_defaultColWidth, numCols );
+ m_colRights.Add( 0, numCols );
+
+ int right = 0;
+ if ( oldNumCols > 0 )
+ right = m_colRights[GetColAt( oldNumCols - 1 )];
+
+ int colPos;
+ for ( colPos = oldNumCols; colPos < m_numCols; colPos++ )
+ {
+ i = GetColAt( colPos );
+
+ right += m_colWidths[i];
+ m_colRights[i] = right;
+ }
+ }
+
+ // Notice that this must be called after updating m_colWidths above
+ // as the native grid control will check whether the new columns
+ // are shown which results in accessing m_colWidths array.
+ if ( m_useNativeHeader )
+ GetGridColHeader()->SetColumnCount(m_numCols);
+
+ if ( m_currentCellCoords == wxGridNoCellCoords )
+ {
+ // if we have just inserted cols into an empty grid the current
+ // cell will be undefined...
+ //
+ SetCurrentCell( 0, 0 );
+ }
+ if ( !GetBatchCount() )
+ {
+ CalcDimensions();
+ m_colWindow->Refresh();
+ }
+ }
+ result = true;
+ break;
+
+ case wxGRIDTABLE_NOTIFY_COLS_DELETED:
+ {
+ size_t pos = msg.GetCommandInt();
+ int numCols = msg.GetCommandInt2();
+ m_numCols -= numCols;
+ if ( m_useNativeHeader )
+ GetGridColHeader()->SetColumnCount(m_numCols);
+
+ if ( !m_colAt.IsEmpty() )
+ {
+ int colID = GetColAt( pos );
+
+ m_colAt.RemoveAt( pos, numCols );
+
+ //Shift the column IDs
+ int colPos;
+ for ( colPos = 0; colPos < m_numCols; colPos++ )
+ {
+ if ( m_colAt[colPos] > colID )
+ m_colAt[colPos] -= numCols;
+ }
+ }
+
+ if ( !m_colWidths.IsEmpty() )
+ {
+ m_colWidths.RemoveAt( pos, numCols );
+ m_colRights.RemoveAt( pos, numCols );
+
+ int w = 0;
+ int colPos;
+ for ( colPos = 0; colPos < m_numCols; colPos++ )
+ {
+ i = GetColAt( colPos );
+
+ w += m_colWidths[i];
+ m_colRights[i] = w;
+ }
+ }
+
+ if ( !m_numCols )
+ {
+ m_currentCellCoords = wxGridNoCellCoords;
+ }
+ else
+ {
+ if ( m_currentCellCoords.GetCol() >= m_numCols )
+ m_currentCellCoords.Set( 0, 0 );
+ }
+
+ if ( m_selection )
+ m_selection->UpdateCols( pos, -((int)numCols) );
+ wxGridCellAttrProvider * attrProvider = m_table->GetAttrProvider();
+ if (attrProvider)
+ {
+ attrProvider->UpdateAttrCols( pos, -((int)numCols) );
+
+// ifdef'd out following patch from Paul Gammans
+#if 0
+ // No need to touch row attributes, unless we
+ // removed _all_ columns, in this case, we remove
+ // all row attributes.
+ // I hate to do this here, but the
+ // needed data is not available inside UpdateAttrCols.
+ if ( !GetNumberCols() )
+ attrProvider->UpdateAttrRows( 0, -GetNumberRows() );
+#endif
+ }
+
+ if ( !GetBatchCount() )
+ {
+ CalcDimensions();
+ m_colWindow->Refresh();
+ }
+ }
+ result = true;
+ break;
+ }
+
+ InvalidateBestSize();
+
+ if (result && !GetBatchCount() )
+ m_gridWin->Refresh();
+
+ return result;
+}
+
+wxArrayInt wxGrid::CalcRowLabelsExposed( const wxRegion& reg ) const