X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/723d1b1da1d9bc3b1a15a66a2c5ab6337bfcbf7f..1978421a6d8b81c1f8a961da4b8ddf544fec7b1b:/src/generic/gridsel.cpp diff --git a/src/generic/gridsel.cpp b/src/generic/gridsel.cpp index d3d2222a0d..8fcdcde92f 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,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "gridsel.h" #endif @@ -30,7 +30,7 @@ #pragma hdrstop #endif -#if defined(wxUSE_NEW_GRID) && (wxUSE_NEW_GRID) +#if wxUSE_GRID #include "wx/generic/gridsel.h" @@ -165,7 +165,7 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) m_blockSelectionBottomRight.RemoveAt(n); SelectBlock( topRow, 0, bottomRow, m_grid->GetNumberCols() - 1, - 0, FALSE ); + FALSE, FALSE, FALSE, FALSE, FALSE ); } } else // selmode == wxGridSelectColumns) @@ -176,7 +176,7 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) m_blockSelectionBottomRight.RemoveAt(n); SelectBlock( 0, leftCol, m_grid->GetNumberRows() - 1, rightCol, - 0, FALSE ); + FALSE, FALSE, FALSE, FALSE, FALSE ); } } } @@ -402,7 +402,11 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, } // Handle single cell selection in SelectCell. - if ( topRow == bottomRow && leftCol == rightCol ) + // (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 ); @@ -517,12 +521,14 @@ void wxGridSelection::SelectCell( int row, int col, { 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 ) ) @@ -538,14 +544,14 @@ void wxGridSelection::SelectCell( int row, int col, // Send event if (sendEvent) { - wxGridEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_SELECT_CELL, - m_grid, - row, col, - -1, -1, - TRUE, - ControlDown, ShiftDown, - AltDown, MetaDown); + 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); } } @@ -588,12 +594,14 @@ void wxGridSelection::ToggleCellSelection( int row, int col, ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); // Send event - wxGridEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_SELECT_CELL, - m_grid, - row, col, -1, -1, FALSE, - ControlDown, ShiftDown, - AltDown, MetaDown ); + 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; } @@ -639,18 +647,20 @@ void wxGridSelection::ToggleCellSelection( int row, int col, if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { if ( topRow < row ) - SelectBlock( topRow, leftCol, - row - 1, rightCol, 0, FALSE ); + SelectBlock( topRow, leftCol, row - 1, rightCol, + FALSE, FALSE, FALSE, FALSE, FALSE ); if ( bottomRow > row ) - SelectBlock( row + 1, leftCol, - bottomRow, rightCol, 0, FALSE ); + 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, 0, FALSE ); + SelectBlock( row, leftCol, row, col - 1, + FALSE, FALSE, FALSE, FALSE, FALSE ); if ( rightCol > col ) - SelectBlock( row, col + 1, row, rightCol, 0, FALSE ); + SelectBlock( row, col + 1, row, rightCol, + FALSE, FALSE, FALSE, FALSE, FALSE ); } } } @@ -668,11 +678,12 @@ void wxGridSelection::ToggleCellSelection( int row, int col, if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( col > 0 ) - SelectBlock( row, 0, row, col - 1, 0, FALSE ); + 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, - 0, FALSE ); + FALSE, FALSE, FALSE, FALSE, FALSE ); } } } @@ -691,11 +702,12 @@ void wxGridSelection::ToggleCellSelection( int row, int col, if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( row > 0 ) - SelectBlock( 0, col, row - 1, col, 0, FALSE ); + 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, - 0, FALSE ); + FALSE, FALSE, FALSE, FALSE, FALSE ); } } } @@ -712,12 +724,14 @@ void wxGridSelection::ToggleCellSelection( int row, int col, wxGridCellCoords( row, col ) ); if ( !m_grid->GetBatchCount() ) ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); - wxGridEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_SELECT_CELL, - m_grid, - row, col, -1, -1, FALSE, - ControlDown, ShiftDown, - AltDown, MetaDown ); + 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; } @@ -760,7 +774,6 @@ void wxGridSelection::ToggleCellSelection( int row, int col, void wxGridSelection::ClearSelection() { - // Should this send deselection events? size_t n; // deselect all invidiual cells and update the screen @@ -823,6 +836,19 @@ void wxGridSelection::ClearSelection() ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); } } + + // 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); } @@ -926,6 +952,10 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) } } } + // 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 ) @@ -1028,6 +1058,11 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) } } } + + // 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, @@ -1048,3 +1083,4 @@ int wxGridSelection::BlockContain( int topRow1, int leftCol1, } #endif +