X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0912bee1aa204f0de28d81509a29d68593fb84af..53e46b61bbe4ce72b92c8898907f0a879d5f012b:/src/generic/gridsel.cpp diff --git a/src/generic/gridsel.cpp b/src/generic/gridsel.cpp index 93a69d49c7..2781694fb5 100644 --- a/src/generic/gridsel.cpp +++ b/src/generic/gridsel.cpp @@ -184,7 +184,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; @@ -267,12 +269,17 @@ void wxGridSelection::SelectRow( int row, bool addToSelected ) wxEVT_GRID_RANGE_SELECT, m_grid, wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); + 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; @@ -355,14 +362,19 @@ void wxGridSelection::SelectCol( int col, bool addToSelected ) wxEVT_GRID_RANGE_SELECT, m_grid, wxGridCellCoords( 0, col ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, 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, - wxMouseEvent* mouseEv, bool sendEvent ) + bool ControlDown, bool ShiftDown, + bool AltDown, bool MetaDown, + bool sendEvent ) { // Fix the coordinates of the block if needed. if ( m_selectionMode == wxGrid::wxGridSelectRows ) @@ -390,8 +402,13 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, } // Handle single cell selection in SelectCell. - if ( topRow == bottomRow && leftCol == rightCol ) - SelectCell( topRow, leftCol, sendEvent ); + // (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. @@ -485,42 +502,33 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, // Send Event, if not disabled. if ( sendEvent ) { - if ( mouseEv == 0) - { - wxGridRangeSelectEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_RANGE_SELECT, - m_grid, - wxGridCellCoords( topRow, leftCol ), - wxGridCellCoords( bottomRow, rightCol ) ); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); - } - else - { - wxGridRangeSelectEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_RANGE_SELECT, - m_grid, - wxGridCellCoords( topRow, leftCol ), - wxGridCellCoords( bottomRow, rightCol ), - TRUE, - mouseEv->ControlDown(), - mouseEv->ShiftDown(), - mouseEv->AltDown(), - mouseEv->MetaDown() ); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); - } + 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, bool sendEvent ) +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); 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); return; } else if ( IsInSelection ( row, col ) ) @@ -534,19 +542,29 @@ void wxGridSelection::SelectCell( int row, int col, bool sendEvent ) ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); // Send event - wxGridEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_SELECT_CELL, - m_grid, - row, col ); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); + 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; } @@ -574,14 +592,18 @@ void wxGridSelection::ToggleCellSelection( int row, int col) n--; count--; if ( !m_grid->GetBatchCount() ) ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); - return; // Send event - wxGridEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_SELECT_CELL, - m_grid, - row, col, -1, -1, FALSE ); + 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; } } } @@ -698,10 +720,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 ); + 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; } @@ -716,7 +742,9 @@ void wxGridSelection::ToggleCellSelection( int row, int col) m_grid, wxGridCellCoords( row, 0 ), wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), - FALSE ); + FALSE, + ControlDown, ShiftDown, + AltDown, MetaDown ); m_grid->GetEventHandler()->ProcessEvent(gridEvt); break; } @@ -731,7 +759,9 @@ void wxGridSelection::ToggleCellSelection( int row, int col) m_grid, wxGridCellCoords( 0, col ), wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), - FALSE ); + FALSE, + ControlDown, ShiftDown, + AltDown, MetaDown ); m_grid->GetEventHandler()->ProcessEvent(gridEvt); break; } @@ -740,7 +770,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 @@ -803,6 +832,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); } @@ -906,6 +948,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 ) @@ -1008,6 +1054,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,