X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b5f6d9d47549e88538e0e6bf734ce4bc30c9093..c02f03d563e895258dcac98a2ade423a1acbf7f9:/src/generic/gridsel.cpp diff --git a/src/generic/gridsel.cpp b/src/generic/gridsel.cpp index f87c037888..495478bb05 100644 --- a/src/generic/gridsel.cpp +++ b/src/generic/gridsel.cpp @@ -700,6 +700,7 @@ wxGridSelection::ToggleCellSelection(int row, int col, } } + bool rowSelectionWasChanged = false; // remove a cell from a row, adding up to two new blocks if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { @@ -712,6 +713,8 @@ wxGridSelection::ToggleCellSelection(int row, int col, n--; count--; + rowSelectionWasChanged = true; + if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( col > 0 ) @@ -724,6 +727,7 @@ wxGridSelection::ToggleCellSelection(int row, int col, } } + bool colSelectionWasChanged = false; // remove a cell from a column, adding up to two new blocks if ( m_selectionMode != wxGrid::wxGridSelectRows ) { @@ -736,6 +740,8 @@ wxGridSelection::ToggleCellSelection(int row, int col, n--; count--; + colSelectionWasChanged = true; + if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( row > 0 ) @@ -751,73 +757,92 @@ wxGridSelection::ToggleCellSelection(int row, int col, // 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) + if ( m_selectionMode == wxGrid::wxGridSelectCells ) { - case wxGrid::wxGridSelectCells: + if ( !m_grid->GetBatchCount() ) { - 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 ), + r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), - false, - kbd ); - m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + wxGridCellCoords( row, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); } - break; - case wxGrid::wxGridSelectRows: + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, col ), + wxGridCellCoords( row, col ), + false, + kbd ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } + else // rows/columns selection mode + { + if ( m_selectionMode != wxGrid::wxGridSelectColumns && + rowSelectionWasChanged ) { - if ( !m_grid->GetBatchCount() ) + int numCols = m_grid->GetNumberCols(); + for ( int colFrom = 0, colTo = 0; colTo <= numCols; ++colTo ) { - r = m_grid->BlockToDeviceRect( - wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); - } + if ( m_colSelection.Index(colTo) >= 0 || colTo == numCols ) + { + if ( colFrom < colTo ) + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( + wxGridCellCoords( row, colFrom ), + wxGridCellCoords( row, colTo-1 ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( row, colFrom ), + wxGridCellCoords( row, colTo - 1 ), + false, + kbd ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } - wxGridRangeSelectEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_RANGE_SELECT, - m_grid, - wxGridCellCoords( row, 0 ), - wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), - false, - kbd ); - m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + colFrom = colTo + 1; + } + } } - break; - case wxGrid::wxGridSelectColumns: + if ( m_selectionMode != wxGrid::wxGridSelectRows && + colSelectionWasChanged ) { - if ( !m_grid->GetBatchCount() ) + int numRows = m_grid->GetNumberRows(); + for ( int rowFrom = 0, rowTo = 0; rowTo <= numRows; ++rowTo ) { - r = m_grid->BlockToDeviceRect( - wxGridCellCoords( 0, col ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); - } + if ( m_rowSelection.Index(rowTo) >= 0 || rowTo == numRows ) + { + if (rowFrom < rowTo) + { + if ( !m_grid->GetBatchCount() ) + { + r = m_grid->BlockToDeviceRect( + wxGridCellCoords( rowFrom, col ), + wxGridCellCoords( rowTo - 1, col ) ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + } + + wxGridRangeSelectEvent gridEvt( m_grid->GetId(), + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( rowFrom, col ), + wxGridCellCoords( rowTo - 1, col ), + false, + kbd ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } - wxGridRangeSelectEvent gridEvt( m_grid->GetId(), - wxEVT_GRID_RANGE_SELECT, - m_grid, - wxGridCellCoords( 0, col ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), - false, - kbd ); - m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + rowFrom = rowTo + 1; + } + } } - break; - - default: - break; } }