X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..9f4ed8613c2853dbf8b190b41dbdafa960b33a85:/src/generic/gridsel.cpp diff --git a/src/generic/gridsel.cpp b/src/generic/gridsel.cpp index f6e4b2ba71..17e8f0ecbc 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 ); } } } @@ -222,7 +222,7 @@ void wxGridSelection::SelectRow( int row, m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); n--; count--; - } + } else if ( coords1.GetCol() == 0 && coords2.GetCol() == m_grid->GetNumberCols() - 1 ) { @@ -239,7 +239,7 @@ void wxGridSelection::SelectRow( int row, { coords2.SetRow(row); done = TRUE; - } + } } } @@ -332,7 +332,7 @@ void wxGridSelection::SelectCol( int col, { coords2.SetCol(col); done = TRUE; - } + } } } @@ -373,7 +373,7 @@ void wxGridSelection::SelectCol( int col, void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, bool ControlDown, bool ShiftDown, - bool AltDown, bool MetaDown, + bool AltDown, bool MetaDown, bool sendEvent ) { // Fix the coordinates of the block if needed. @@ -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 ); @@ -473,7 +477,7 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, 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: @@ -518,13 +522,13 @@ void wxGridSelection::SelectCell( int row, int col, if ( m_selectionMode == wxGrid::wxGridSelectRows ) { SelectBlock(row, 0, row, m_grid->GetNumberCols() - 1, - ControlDown, ShiftDown, AltDown, MetaDown); + ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); return; } else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) { SelectBlock(0, col, m_grid->GetNumberRows() - 1, col, - ControlDown, ShiftDown, AltDown, MetaDown); + ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); return; } else if ( IsInSelection ( row, col ) ) @@ -545,7 +549,7 @@ void wxGridSelection::SelectCell( int row, int col, m_grid, wxGridCellCoords( row, col ), wxGridCellCoords( row, col ), - TRUE, + TRUE, ControlDown, ShiftDown, AltDown, MetaDown); m_grid->GetEventHandler()->ProcessEvent(gridEvt); @@ -585,7 +589,6 @@ void wxGridSelection::ToggleCellSelection( int row, int col, r = m_grid->BlockToDeviceRect( m_cellSelection[n], m_cellSelection[n] ); m_cellSelection.RemoveAt(n); - n--; count--; if ( !m_grid->GetBatchCount() ) ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); @@ -643,18 +646,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 ); } } } @@ -672,11 +677,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 ); } } } @@ -695,11 +701,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 ); } } } @@ -771,7 +778,7 @@ void wxGridSelection::ClearSelection() // deselect all invidiual cells and update the screen if ( m_selectionMode == wxGrid::wxGridSelectCells ) { - + while( ( n = m_cellSelection.GetCount() ) > 0) { wxRect r; @@ -794,7 +801,7 @@ void wxGridSelection::ClearSelection() m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); } // deselect all rows and update the screen @@ -809,7 +816,7 @@ void wxGridSelection::ClearSelection() wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); m_rowSelection.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); } } @@ -825,7 +832,7 @@ void wxGridSelection::ClearSelection() wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); m_colSelection.RemoveAt(n); if ( !m_grid->GetBatchCount() ) - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); } } @@ -902,7 +909,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 { @@ -923,33 +930,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(); @@ -1008,7 +1017,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 { @@ -1029,26 +1038,25 @@ 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_ @@ -1057,6 +1065,7 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) m_rowSelection.Clear(); } + int wxGridSelection::BlockContain( int topRow1, int leftCol1, int bottomRow1, int rightCol1, int topRow2, int leftCol2,