X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/043d16b2256f509cf8aa7bd8d7b05c84bb117084..e15f0a5ea372e3a6c693fb6aa4fe73893a9af797:/src/generic/gridsel.cpp diff --git a/src/generic/gridsel.cpp b/src/generic/gridsel.cpp index 69fabe032d..f1d62b07f6 100644 --- a/src/generic/gridsel.cpp +++ b/src/generic/gridsel.cpp @@ -4,7 +4,7 @@ // Author: Stefan Neis // Modified by: // Created: 20/02/1999 -// RCS-ID: $$ +// RCS-ID: $Id$ // Copyright: (c) Stefan Neis (Stefan.Neis@t-online.de) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "gridsel.h" -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -30,7 +26,7 @@ #pragma hdrstop #endif -#if defined(wxUSE_NEW_GRID) && (wxUSE_NEW_GRID) +#if wxUSE_GRID #include "wx/generic/gridsel.h" @@ -91,7 +87,7 @@ bool wxGridSelection::IsInSelection ( int row, int col ) // (unless we are in column selection mode). if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { - size_t count = m_rowSelection.GetCount(); + count = m_rowSelection.GetCount(); for ( size_t n = 0; n < count; n++ ) { if ( row == m_rowSelection[n] ) @@ -104,7 +100,7 @@ bool wxGridSelection::IsInSelection ( int row, int col ) // (unless we are in row selection mode). if ( m_selectionMode != wxGrid::wxGridSelectRows ) { - size_t count = m_colSelection.GetCount(); + count = m_colSelection.GetCount(); for ( size_t n = 0; n < count; n++ ) { if ( col == m_colSelection[n] ) @@ -164,7 +160,8 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); SelectBlock( topRow, 0, - bottomRow, m_grid->GetNumberCols() - 1 ); + bottomRow, m_grid->GetNumberCols() - 1, + false, false, false, false, false ); } } else // selmode == wxGridSelectColumns) @@ -174,7 +171,8 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); SelectBlock( 0, leftCol, - m_grid->GetNumberRows() - 1, rightCol ); + m_grid->GetNumberRows() - 1, rightCol, + false, false, false, false, false ); } } } @@ -182,7 +180,9 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) } } -void wxGridSelection::SelectRow( int row, bool addToSelected ) +void wxGridSelection::SelectRow( int row, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown ) { if ( m_selectionMode == wxGrid::wxGridSelectColumns ) return; @@ -218,7 +218,7 @@ void wxGridSelection::SelectRow( int row, bool addToSelected ) m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); n--; count--; - } + } else if ( coords1.GetCol() == 0 && coords2.GetCol() == m_grid->GetNumberCols() - 1 ) { @@ -235,7 +235,7 @@ void wxGridSelection::SelectRow( int row, bool addToSelected ) { coords2.SetRow(row); done = true; - } + } } } @@ -255,16 +255,29 @@ void wxGridSelection::SelectRow( int row, bool addToSelected ) } // Update View: - wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } - // Possibly send event here? This would imply that no event is sent, - // if the row already was part of the selection. + // Send Event + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + + m_grid->GetEventHandler()->ProcessEvent(gridEvt); } -void wxGridSelection::SelectCol( int col, bool addToSelected ) +void wxGridSelection::SelectCol( int col, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown ) { if ( m_selectionMode == wxGrid::wxGridSelectRows ) return; @@ -317,7 +330,7 @@ void wxGridSelection::SelectCol( int col, bool addToSelected ) { coords2.SetCol(col); done = true; - } + } } } @@ -337,18 +350,33 @@ void wxGridSelection::SelectCol( int col, bool addToSelected ) } // Update View: - wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } - // Possibly send event here? This would imply that no event is sent, - // if the row already was part of the selection. + // Send Event + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + + m_grid->GetEventHandler()->ProcessEvent(gridEvt); } -void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ) +void wxGridSelection::SelectBlock( int topRow, int leftCol, + int bottomRow, int rightCol, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown, + bool sendEvent ) { - // Fix the coordinates of the block if potentially needed + // Fix the coordinates of the block if needed. if ( m_selectionMode == wxGrid::wxGridSelectRows ) { leftCol = 0; @@ -359,10 +387,28 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int r topRow = 0; bottomRow = m_grid->GetNumberRows() - 1; } + if ( topRow > bottomRow ) + { + int temp = topRow; + topRow = bottomRow; + bottomRow = temp; + } + + if ( leftCol > rightCol ) + { + int temp = leftCol; + leftCol = rightCol; + rightCol = temp; + } // Handle single cell selection in SelectCell. - if ( topRow == bottomRow && leftCol == rightCol ) - SelectCell( topRow, leftCol ); + // (MB: added check for selection mode here to prevent + // crashes if, for example, we are select rows and the + // grid only has 1 col) + if ( m_selectionMode == wxGrid::wxGridSelectCells && + topRow == bottomRow && leftCol == rightCol ) + SelectCell( topRow, leftCol, ControlDown, ShiftDown, + AltDown, MetaDown, sendEvent ); size_t count, n; // Remove single cells contained in newly selected block. @@ -393,14 +439,17 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int r coords2.GetRow(), coords2.GetCol(), topRow, leftCol, bottomRow, rightCol ) ) { - case 1: - return; - case -1: - m_blockSelectionTopLeft.RemoveAt(n); - m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; - default: - ; + case 1: + return; + + case -1: + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; count--; + break; + + default: + break; } } @@ -415,13 +464,16 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int r m_rowSelection[n], m_grid->GetNumberCols()-1, topRow, leftCol, bottomRow, rightCol ) ) { - case 1: - return; - case -1: - m_rowSelection.RemoveAt(n); - n--; count--; - default: - ; + case 1: + return; + + case -1: + m_rowSelection.RemoveAt(n); + n--; count--; + break; + + default: + break; } } } @@ -431,16 +483,19 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int r for ( n = 0; n < count; n++ ) { switch ( BlockContain( 0, m_colSelection[n], - m_grid->GetNumberRows()-1, m_colSelection[n], + m_grid->GetNumberRows()-1, m_colSelection[n], topRow, leftCol, bottomRow, rightCol ) ) { - case 1: - return; - case -1: - m_colSelection.RemoveAt(n); - n--; count--; - default: - ; + case 1: + return; + + case -1: + m_colSelection.RemoveAt(n); + n--; count--; + break; + + default: + break; } } } @@ -448,24 +503,43 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int r m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) ); // Update View: - wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( topRow, leftCol ), - wxGridCellCoords( bottomRow, rightCol ) ); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( topRow, leftCol ), + wxGridCellCoords( bottomRow, rightCol ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } - // Possibly send event? + // Send Event, if not disabled. + if ( sendEvent ) + { + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( topRow, leftCol ), + wxGridCellCoords( bottomRow, rightCol ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent(gridEvt); + } } -void wxGridSelection::SelectCell( int row, int col) +void wxGridSelection::SelectCell( int row, int col, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown, + bool sendEvent ) { if ( m_selectionMode == wxGrid::wxGridSelectRows ) { - SelectBlock(row, 0, row, m_grid->GetNumberCols() - 1 ); + SelectBlock(row, 0, row, m_grid->GetNumberCols() - 1, + ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); return; } else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) { - SelectBlock(0, col, m_grid->GetNumberRows() - 1, col ); + SelectBlock(0, col, m_grid->GetNumberRows() - 1, col, + ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); return; } else if ( IsInSelection ( row, col ) ) @@ -473,20 +547,37 @@ void wxGridSelection::SelectCell( int row, int col) m_cellSelection.Add( wxGridCellCoords( row, col ) ); // Update View: - wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), - wxGridCellCoords( row, col ) ); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } - // Possibly send event? + // Send event + if (sendEvent) + { + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + true, + ControlDown, ShiftDown, + AltDown, MetaDown); + m_grid->GetEventHandler()->ProcessEvent(gridEvt); + } } -void wxGridSelection::ToggleCellSelection( int row, int col) +void wxGridSelection::ToggleCellSelection( int row, int col, + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown ) { // if the cell is not selected, select it if ( !IsInSelection ( row, col ) ) { - SelectCell( row, col ); + SelectCell( row, col, ControlDown, ShiftDown, + AltDown, MetaDown ); return; } @@ -504,16 +595,27 @@ void wxGridSelection::ToggleCellSelection( int row, int col) count = m_cellSelection.GetCount(); for ( n = 0; n < count; n++ ) { - wxGridCellCoords& coords = m_cellSelection[n]; - if ( row == coords.GetRow() && col == coords.GetCol() ) + const wxGridCellCoords& sel = m_cellSelection[n]; + if ( row == sel.GetRow() && col == sel.GetCol() ) { - wxRect r; - r = m_grid->BlockToDeviceRect( m_cellSelection[n], - m_cellSelection[n] ); + wxGridCellCoords coords = m_cellSelection[n]; m_cellSelection.RemoveAt(n); - n--; count--; if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + wxRect r = m_grid->BlockToDeviceRect( coords, coords ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + // Send event + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent(gridEvt); return; } } @@ -558,16 +660,20 @@ void wxGridSelection::ToggleCellSelection( int row, int col) if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { if ( topRow < row ) - SelectBlock( topRow, leftCol, row - 1, rightCol ); + SelectBlock( topRow, leftCol, row - 1, rightCol, + false, false, false, false, false ); if ( bottomRow > row ) - SelectBlock( row + 1, leftCol, bottomRow, rightCol ); + SelectBlock( row + 1, leftCol, bottomRow, rightCol, + false, false, false, false, false ); } if ( m_selectionMode != wxGrid::wxGridSelectRows ) { if ( leftCol < col ) - SelectBlock( row, leftCol, row, col - 1 ); + SelectBlock( row, leftCol, row, col - 1, + false, false, false, false, false ); if ( rightCol > col ) - SelectBlock( row, col + 1, row, rightCol ); + SelectBlock( row, col + 1, row, rightCol, + false, false, false, false, false ); } } } @@ -585,9 +691,12 @@ void wxGridSelection::ToggleCellSelection( int row, int col) if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( col > 0 ) - SelectBlock( row, 0, row, col - 1 ); + SelectBlock( row, 0, row, col - 1, + false, false, false, false, false ); if ( col < m_grid->GetNumberCols() - 1 ) - SelectBlock( row, col + 1, row, m_grid->GetNumberCols() - 1 ); + SelectBlock( row, col + 1, + row, m_grid->GetNumberCols() - 1, + false, false, false, false, false ); } } } @@ -606,68 +715,126 @@ void wxGridSelection::ToggleCellSelection( int row, int col) if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( row > 0 ) - SelectBlock( 0, col, row - 1, col ); + SelectBlock( 0, col, row - 1, col, + false, false, false, false, false ); if ( row < m_grid->GetNumberRows() - 1 ) - SelectBlock( row + 1, col, m_grid->GetNumberRows() - 1, col ); + SelectBlock( row + 1, col, + m_grid->GetNumberRows() - 1, col, + false, false, false, false, false ); } } } } - // Refresh the screen; according to m_selectionMode, we - // need to either update only the cell, or the whole row/column. + // Refresh the screen and send the event; according to m_selectionMode, + // we need to either update only the cell, or the whole row/column. wxRect r; switch (m_selectionMode) { case wxGrid::wxGridSelectCells: - r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), - wxGridCellCoords( row, col ) ); - break; + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent(gridEvt); + break; + } case wxGrid::wxGridSelectRows: - r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); - break; + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent(gridEvt); + break; + } case wxGrid::wxGridSelectColumns: - r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); - break; + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), + false, + ControlDown, ShiftDown, + AltDown, MetaDown ); + m_grid->GetEventHandler()->ProcessEvent(gridEvt); + break; + } } - if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); } void wxGridSelection::ClearSelection() { - // Should this send deselection events? size_t n; + wxRect r; + wxGridCellCoords coords1, coords2; // deselect all invidiual cells and update the screen if ( m_selectionMode == wxGrid::wxGridSelectCells ) { - while( ( n = m_cellSelection.GetCount() ) > 0) { - wxRect r; n--; - r = m_grid->BlockToDeviceRect( m_cellSelection[n], - m_cellSelection[n] ); + coords1 = m_cellSelection[n]; m_cellSelection.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + r = m_grid->BlockToDeviceRect( coords1, coords1 ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } } } // deselect all blocks and update the screen while( ( n = m_blockSelectionTopLeft.GetCount() ) > 0) { - wxRect r; n--; - r = m_grid->BlockToDeviceRect( m_blockSelectionTopLeft[n], - m_blockSelectionBottomRight[n] ); + coords1 = m_blockSelectionTopLeft[n]; + coords2 = m_blockSelectionBottomRight[n]; m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + r = m_grid->BlockToDeviceRect( coords1, coords2 ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } } // deselect all rows and update the screen @@ -676,13 +843,17 @@ void wxGridSelection::ClearSelection() while( ( n = m_rowSelection.GetCount() ) > 0) { n--; - int & row = m_rowSelection[n]; - wxRect r; - r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + int row = m_rowSelection[n]; m_rowSelection.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), + wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } } } @@ -692,15 +863,32 @@ void wxGridSelection::ClearSelection() while( ( n = m_colSelection.GetCount() ) > 0) { n--; - int & col = m_colSelection[n]; - wxRect r; - r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + int col = m_colSelection[n]; m_colSelection.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + { + r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif + } } } + + // One deselection event, indicating deselection of _all_ cells. + // (No finer grained events for each of the smaller regions + // deselected above!) + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( 0, 0 ), + wxGridCellCoords( m_grid->GetNumberRows() - 1, + m_grid->GetNumberCols() - 1 ), + false ); + + m_grid->GetEventHandler()->ProcessEvent(gridEvt); } @@ -762,7 +950,7 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) coords2.SetRow(row2 + numRows); if ( (size_t) row1 >= pos) coords1.SetRow( wxMax(row1 + numRows, (int) pos) ); - + } else { @@ -783,29 +971,35 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) count = m_rowSelection.GetCount(); for ( n = 0; n < count; n++ ) { - int & rowOrCol = m_rowSelection[n]; - if ( (size_t)rowOrCol >= pos ) - { - if ( numRows > 0 ) - { - // If rows inserted, include row counter where necessary - rowOrCol += numRows; - } - else if ( numRows < 0) - { - // If rows deleted, either decrement row counter (if row still exists) - if ((size_t)rowOrCol >= pos - numRows) - rowOrCol += numRows; - else - { - m_rowSelection.RemoveAt(n); - n--; count--; - } - } - } + int rowOrCol_ = m_rowSelection [ n ]; + + if ( ( size_t ) rowOrCol_ >= pos ) + { + if ( numRows > 0 ) + { + m_rowSelection [ n ] += numRows; + } + else if ( numRows < 0 ) + { + if ( ( size_t ) rowOrCol_ >= ( pos - numRows ) ) + m_rowSelection [ n ] += numRows; + else + { + m_rowSelection.RemoveAt ( n ); + n--; + count--; + } + } + } } + // No need to touch selected columns, unless we removed _all_ + // rows, in this case, we remove all columns from the selection. + + if ( !m_grid->GetNumberRows() ) + m_colSelection.Clear(); } + void wxGridSelection::UpdateCols( size_t pos, int numCols ) { size_t count = m_cellSelection.GetCount(); @@ -864,7 +1058,7 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) coords2.SetCol(col2 + numCols); if ( (size_t) col1 >= pos) coords1.SetCol( wxMax(col1 + numCols, (int) pos) ); - + } else { @@ -885,29 +1079,34 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) count = m_colSelection.GetCount(); for ( n = 0; n < count; n++ ) { - int & rowOrCol = m_colSelection[n]; - if ( (size_t)rowOrCol >= pos ) + + int rowOrCol = m_colSelection [ n ]; + if ( ( size_t ) rowOrCol >= pos ) { if ( numCols > 0 ) + m_colSelection [ n ] += numCols; + else if ( numCols < 0 ) { - // If cols inserted, include col counter where necessary - rowOrCol += numCols; - } - else if ( numCols < 0) - { - // If cols deleted, either decrement col counter (if col still exists) - if ((size_t)rowOrCol >= pos - numCols) - rowOrCol += numCols; + if ( ( size_t ) rowOrCol >= ( pos -numCols ) ) + m_colSelection [ n ] += numCols; else { - m_colSelection.RemoveAt(n); - n--; count--; + m_colSelection.RemoveAt ( n ); + n--; + count--; } } } + } + + // No need to touch selected rows, unless we removed _all_ + // columns, in this case, we remove all rows from the selection. + if ( !m_grid->GetNumberCols() ) + m_rowSelection.Clear(); } + int wxGridSelection::BlockContain( int topRow1, int leftCol1, int bottomRow1, int rightCol1, int topRow2, int leftCol2,