X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..07fb285c521527e383f2d1090f7f41f561bcd8fd:/src/generic/gridsel.cpp?ds=sidebyside diff --git a/src/generic/gridsel.cpp b/src/generic/gridsel.cpp index 6877aefa6e..e79f7f2031 100644 --- a/src/generic/gridsel.cpp +++ b/src/generic/gridsel.cpp @@ -1,14 +1,20 @@ /////////////////////////////////////////////////////////////////////////// -// Name: generic/gridsel.cpp +// Name: src/generic/gridsel.cpp // Purpose: wxGridSelection // Author: Stefan Neis // Modified by: // Created: 20/02/1999 -// RCS-ID: $Id$ // Copyright: (c) Stefan Neis (Stefan.Neis@t-online.de) -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + // ============================================================================ // declarations // ============================================================================ @@ -17,23 +23,11 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "gridsel.h" -#endif - -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" - -#include "wx/defs.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - #if wxUSE_GRID #include "wx/generic/gridsel.h" + // Some explanation for the members of the class: // m_cellSelection stores individual selected cells // -- this is only used if m_selectionMode == wxGridSelectCells @@ -56,7 +50,7 @@ bool wxGridSelection::IsSelection() m_rowSelection.GetCount() || m_colSelection.GetCount() ); } -bool wxGridSelection::IsInSelection ( int row, int col ) +bool wxGridSelection::IsInSelection( int row, int col ) { size_t count; @@ -69,7 +63,7 @@ bool wxGridSelection::IsInSelection ( int row, int col ) { wxGridCellCoords& coords = m_cellSelection[n]; if ( row == coords.GetRow() && col == coords.GetCol() ) - return TRUE; + return true; } } @@ -83,7 +77,7 @@ bool wxGridSelection::IsInSelection ( int row, int col ) if ( BlockContainsCell(coords1.GetRow(), coords1.GetCol(), coords2.GetRow(), coords2.GetCol(), row, col ) ) - return TRUE; + return true; } // Now check whether the given cell is @@ -91,11 +85,11 @@ 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] ) - return TRUE; + return true; } } @@ -104,18 +98,19 @@ 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] ) - return TRUE; + return true; } } - return FALSE; + + return false; } // Change the selection mode -void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) +void wxGridSelection::SetSelectionMode( wxGrid::wxGridSelectionModes selmode ) { // if selection mode is unchanged return immediately if (selmode == m_selectionMode) @@ -148,8 +143,8 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) SelectCol( col ); } - for (n = 0; n < m_blockSelectionTopLeft.GetCount(); n++) // Note that m_blockSelectionTopLeft's size may be changing! + for (n = 0; n < m_blockSelectionTopLeft.GetCount(); n++) { wxGridCellCoords& coords = m_blockSelectionTopLeft[n]; int topRow = coords.GetRow(); @@ -157,15 +152,15 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) coords = m_blockSelectionBottomRight[n]; int bottomRow = coords.GetRow(); int rightCol = coords.GetCol(); + if (selmode == wxGrid::wxGridSelectRows) { if (leftCol != 0 || rightCol != m_grid->GetNumberCols() - 1 ) { m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - SelectBlock( topRow, 0, - bottomRow, m_grid->GetNumberCols() - 1, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent( topRow, 0, + bottomRow, m_grid->GetNumberCols() - 1); } } else // selmode == wxGridSelectColumns) @@ -174,22 +169,21 @@ void wxGridSelection::SetSelectionMode(wxGrid::wxGridSelectionModes selmode) { m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - SelectBlock( 0, leftCol, - m_grid->GetNumberRows() - 1, rightCol, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(0, leftCol, + m_grid->GetNumberRows() - 1, rightCol); } } } + m_selectionMode = selmode; } } -void wxGridSelection::SelectRow( int row, - bool ControlDown, bool ShiftDown, - bool AltDown, bool MetaDown ) +void wxGridSelection::SelectRow(int row, const wxKeyboardState& kbd) { if ( m_selectionMode == wxGrid::wxGridSelectColumns ) return; + size_t count, n; // Remove single cells contained in newly selected block. @@ -203,14 +197,16 @@ void wxGridSelection::SelectRow( int row, coords.GetRow(), coords.GetCol() ) ) { m_cellSelection.RemoveAt(n); - n--; count--; + n--; + count--; } } } // Simplify list of selected blocks (if possible) count = m_blockSelectionTopLeft.GetCount(); - bool done = FALSE; + bool done = false; + for ( n = 0; n < count; n++ ) { wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; @@ -221,7 +217,8 @@ void wxGridSelection::SelectRow( int row, { m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; + n--; + count--; } else if ( coords1.GetCol() == 0 && coords2.GetCol() == m_grid->GetNumberCols() - 1 ) @@ -233,12 +230,12 @@ void wxGridSelection::SelectRow( int row, else if ( coords1.GetRow() == row + 1) { coords1.SetRow(row); - done = TRUE; + done = true; } else if ( coords2.GetRow() == row - 1) { coords2.SetRow(row); - done = TRUE; + done = true; } } } @@ -263,7 +260,7 @@ void wxGridSelection::SelectRow( int row, { wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); } // Send Event @@ -272,16 +269,13 @@ void wxGridSelection::SelectRow( int row, m_grid, wxGridCellCoords( row, 0 ), wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ), - TRUE, - ControlDown, ShiftDown, - AltDown, MetaDown ); + true, + kbd); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); } -void wxGridSelection::SelectCol( int col, - bool ControlDown, bool ShiftDown, - bool AltDown, bool MetaDown ) +void wxGridSelection::SelectCol(int col, const wxKeyboardState& kbd) { if ( m_selectionMode == wxGrid::wxGridSelectRows ) return; @@ -298,14 +292,15 @@ void wxGridSelection::SelectCol( int col, coords.GetRow(), coords.GetCol() ) ) { m_cellSelection.RemoveAt(n); - n--; count--; + n--; + count--; } } } // Simplify list of selected blocks (if possible) count = m_blockSelectionTopLeft.GetCount(); - bool done = FALSE; + bool done = false; for ( n = 0; n < count; n++ ) { wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; @@ -316,7 +311,8 @@ void wxGridSelection::SelectCol( int col, { m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; + n--; + count--; } else if ( coords1.GetRow() == 0 && coords2.GetRow() == m_grid->GetNumberRows() - 1 ) @@ -328,12 +324,12 @@ void wxGridSelection::SelectCol( int col, else if ( coords1.GetCol() == col + 1) { coords1.SetCol(col); - done = TRUE; + done = true; } else if ( coords2.GetCol() == col - 1) { coords2.SetCol(col); - done = TRUE; + done = true; } } } @@ -358,7 +354,7 @@ void wxGridSelection::SelectCol( int col, { wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); } // Send Event @@ -367,30 +363,44 @@ void wxGridSelection::SelectCol( int col, m_grid, wxGridCellCoords( 0, col ), wxGridCellCoords( m_grid->GetNumberRows() - 1, col ), - TRUE, - ControlDown, ShiftDown, - AltDown, MetaDown ); + true, + kbd ); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); } void wxGridSelection::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol, - bool ControlDown, bool ShiftDown, - bool AltDown, bool MetaDown, + const wxKeyboardState& kbd, bool sendEvent ) { // Fix the coordinates of the block if needed. - if ( m_selectionMode == wxGrid::wxGridSelectRows ) - { - leftCol = 0; - rightCol = m_grid->GetNumberCols() - 1; - } - else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) + switch ( m_selectionMode ) { - topRow = 0; - bottomRow = m_grid->GetNumberRows() - 1; + default: + wxFAIL_MSG( "unknown selection mode" ); + // fall through + + case wxGrid::wxGridSelectCells: + // nothing to do -- in this mode arbitrary blocks can be selected + break; + + case wxGrid::wxGridSelectRows: + leftCol = 0; + rightCol = m_grid->GetNumberCols() - 1; + break; + + case wxGrid::wxGridSelectColumns: + topRow = 0; + bottomRow = m_grid->GetNumberRows() - 1; + break; + + case wxGrid::wxGridSelectRowsOrColumns: + // block selection doesn't make sense for this mode, we could only + // select the entire grid but this wouldn't be useful + return; } + if ( topRow > bottomRow ) { int temp = topRow; @@ -411,168 +421,234 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol, // grid only has 1 col) if ( m_selectionMode == wxGrid::wxGridSelectCells && topRow == bottomRow && leftCol == rightCol ) - SelectCell( topRow, leftCol, ControlDown, ShiftDown, - AltDown, MetaDown, sendEvent ); + { + SelectCell( topRow, leftCol, kbd, sendEvent ); + } size_t count, n; - // Remove single cells contained in newly selected block. - if ( m_selectionMode == wxGrid::wxGridSelectCells ) + + if ( m_selectionMode == wxGrid::wxGridSelectRows ) { - count = m_cellSelection.GetCount(); - for ( n = 0; n < count; n++ ) + // find out which rows are already selected: + wxArrayInt alreadyselected; + alreadyselected.Add(0,bottomRow-topRow+1); + for( n = 0; n < m_rowSelection.GetCount(); n++) { - wxGridCellCoords& coords = m_cellSelection[n]; - if ( BlockContainsCell( topRow, leftCol, bottomRow, rightCol, - coords.GetRow(), coords.GetCol() ) ) + int row = m_rowSelection[n]; + if( (row >= topRow) && (row <= bottomRow) ) { - m_cellSelection.RemoveAt(n); - n--; count--; + alreadyselected[ row - topRow ]=1; } } - } - - // If a block containing the selection is already selected, return, - // if a block contained in the selection is found, remove it. - count = m_blockSelectionTopLeft.GetCount(); - for ( n = 0; n < count; n++ ) - { - wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; - wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; - switch ( BlockContain( coords1.GetRow(), coords1.GetCol(), - coords2.GetRow(), coords2.GetCol(), - topRow, leftCol, bottomRow, rightCol ) ) + // add the newly selected rows: + for ( int row = topRow; row <= bottomRow; row++ ) { - case 1: - return; - case -1: - m_blockSelectionTopLeft.RemoveAt(n); - m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; - default: - ; + if ( alreadyselected[ row - topRow ] == 0 ) + { + m_rowSelection.Add( row ); + } } } + else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) + { + // find out which columns are already selected: + wxArrayInt alreadyselected; + alreadyselected.Add(0,rightCol-leftCol+1); + for( n = 0; n < m_colSelection.GetCount(); n++) + { + int col = m_colSelection[n]; + if( (col >= leftCol) && (col <= rightCol) ) + { + alreadyselected[ col - leftCol ]=1; + } + } - // If a row containing the selection is already selected, return, - // if a row contained in newly selected block is found, remove it. - if ( m_selectionMode != wxGrid::wxGridSelectColumns ) + // add the newly selected columns: + for ( int col = leftCol; col <= rightCol; col++ ) + { + if ( alreadyselected[ col - leftCol ] == 0 ) + { + m_colSelection.Add( col ); + } + } + } + else { + // Remove single cells contained in newly selected block. + if ( m_selectionMode == wxGrid::wxGridSelectCells ) + { + count = m_cellSelection.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords = m_cellSelection[n]; + if ( BlockContainsCell( topRow, leftCol, bottomRow, rightCol, + coords.GetRow(), coords.GetCol() ) ) + { + m_cellSelection.RemoveAt(n); + n--; + count--; + } + } + } + + // If a block containing the selection is already selected, return, + // if a block contained in the selection is found, remove it. + + count = m_blockSelectionTopLeft.GetCount(); + for ( n = 0; n < count; n++ ) + { + wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; + wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; + + switch ( BlockContain( coords1.GetRow(), coords1.GetCol(), + coords2.GetRow(), coords2.GetCol(), + topRow, leftCol, bottomRow, rightCol ) ) + { + case 1: + return; + + case -1: + m_blockSelectionTopLeft.RemoveAt(n); + m_blockSelectionBottomRight.RemoveAt(n); + n--; + count--; + break; + + default: + break; + } + } + + // If a row containing the selection is already selected, return, + // if a row contained in newly selected block is found, remove it. count = m_rowSelection.GetCount(); for ( n = 0; n < count; n++ ) { switch ( BlockContain( m_rowSelection[n], 0, - m_rowSelection[n], m_grid->GetNumberCols()-1, + 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; } } - } - if ( m_selectionMode != wxGrid::wxGridSelectRows ) - { + + // Same for columns. count = m_colSelection.GetCount(); 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; } } - } - m_blockSelectionTopLeft.Add( wxGridCellCoords( topRow, leftCol ) ); - m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) ); + m_blockSelectionTopLeft.Add( wxGridCellCoords( topRow, leftCol ) ); + m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) ); + } // Update View: if ( !m_grid->GetBatchCount() ) { wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( topRow, leftCol ), wxGridCellCoords( bottomRow, rightCol ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); } // 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); + wxEVT_GRID_RANGE_SELECT, + m_grid, + wxGridCellCoords( topRow, leftCol ), + wxGridCellCoords( bottomRow, rightCol ), + true, + kbd); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); } } void wxGridSelection::SelectCell( int row, int col, - bool ControlDown, bool ShiftDown, - bool AltDown, bool MetaDown, + const wxKeyboardState& kbd, bool sendEvent ) { + if ( IsInSelection ( row, col ) ) + return; + + wxGridCellCoords selectedTopLeft, selectedBottomRight; if ( m_selectionMode == wxGrid::wxGridSelectRows ) { - SelectBlock(row, 0, row, m_grid->GetNumberCols() - 1, - ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); - return; + m_rowSelection.Add( row ); + selectedTopLeft = wxGridCellCoords( row, 0 ); + selectedBottomRight = wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ); } else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) { - SelectBlock(0, col, m_grid->GetNumberRows() - 1, col, - ControlDown, ShiftDown, AltDown, MetaDown, sendEvent); - return; + m_colSelection.Add( col ); + selectedTopLeft = wxGridCellCoords( 0, col ); + selectedBottomRight = wxGridCellCoords( m_grid->GetNumberRows() - 1, col ); + } + else + { + m_cellSelection.Add( wxGridCellCoords( row, col ) ); + selectedTopLeft = wxGridCellCoords( row, col ); + selectedBottomRight = wxGridCellCoords( row, col ); } - else if ( IsInSelection ( row, col ) ) - return; - m_cellSelection.Add( wxGridCellCoords( row, col ) ); // Update View: if ( !m_grid->GetBatchCount() ) { - wxRect r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), - wxGridCellCoords( row, col ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + wxRect r = m_grid->BlockToDeviceRect( + selectedTopLeft, + selectedBottomRight ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); } // 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); + wxEVT_GRID_RANGE_SELECT, + m_grid, + selectedTopLeft, + selectedBottomRight, + true, + kbd); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); } } -void wxGridSelection::ToggleCellSelection( int row, int col, - bool ControlDown, bool ShiftDown, - bool AltDown, bool MetaDown ) +void +wxGridSelection::ToggleCellSelection(int row, int col, + const wxKeyboardState& kbd) { // if the cell is not selected, select it if ( !IsInSelection ( row, col ) ) { - SelectCell( row, col, ControlDown, ShiftDown, - AltDown, MetaDown ); + SelectCell(row, col, kbd); + return; } @@ -590,15 +666,15 @@ 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() ) { wxGridCellCoords coords = m_cellSelection[n]; m_cellSelection.RemoveAt(n); if ( !m_grid->GetBatchCount() ) { wxRect r = m_grid->BlockToDeviceRect( coords, coords ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); } // Send event @@ -607,10 +683,10 @@ void wxGridSelection::ToggleCellSelection( int row, int col, m_grid, wxGridCellCoords( row, col ), wxGridCellCoords( row, col ), - FALSE, - ControlDown, ShiftDown, - AltDown, MetaDown ); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); + false, + kbd ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + return; } } @@ -637,42 +713,42 @@ void wxGridSelection::ToggleCellSelection( int row, int col, count = m_blockSelectionTopLeft.GetCount(); for ( n = 0; n < count; n++ ) - { + { wxGridCellCoords& coords1 = m_blockSelectionTopLeft[n]; wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; int topRow = coords1.GetRow(); int leftCol = coords1.GetCol(); int bottomRow = coords2.GetRow(); int rightCol = coords2.GetCol(); - if ( BlockContainsCell( topRow, leftCol, bottomRow, rightCol, - row, col ) ) + + if ( BlockContainsCell( topRow, leftCol, bottomRow, rightCol, row, col ) ) { // remove the block m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; + n--; + count--; + // add up to 4 smaller blocks and set update region if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { if ( topRow < row ) - SelectBlock( topRow, leftCol, row - 1, rightCol, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(topRow, leftCol, row - 1, rightCol); if ( bottomRow > row ) - SelectBlock( row + 1, leftCol, bottomRow, rightCol, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(row + 1, leftCol, bottomRow, rightCol); } + if ( m_selectionMode != wxGrid::wxGridSelectRows ) { if ( leftCol < col ) - SelectBlock( row, leftCol, row, col - 1, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(row, leftCol, row, col - 1); if ( rightCol > col ) - SelectBlock( row, col + 1, row, rightCol, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(row, col + 1, row, rightCol); } } } + bool rowSelectionWasChanged = false; // remove a cell from a row, adding up to two new blocks if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { @@ -682,21 +758,24 @@ void wxGridSelection::ToggleCellSelection( int row, int col, if ( m_rowSelection[n] == row ) { m_rowSelection.RemoveAt(n); - n--; count--; + n--; + count--; + + rowSelectionWasChanged = true; + if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( col > 0 ) - SelectBlock( row, 0, row, col - 1, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(row, 0, row, col - 1); if ( col < m_grid->GetNumberCols() - 1 ) - SelectBlock( row, col + 1, - row, m_grid->GetNumberCols() - 1, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent( row, col + 1, + row, m_grid->GetNumberCols() - 1); } } } } + bool colSelectionWasChanged = false; // remove a cell from a column, adding up to two new blocks if ( m_selectionMode != wxGrid::wxGridSelectRows ) { @@ -706,16 +785,18 @@ void wxGridSelection::ToggleCellSelection( int row, int col, if ( m_colSelection[n] == col ) { m_colSelection.RemoveAt(n); - n--; count--; + n--; + count--; + + colSelectionWasChanged = true; + if (m_selectionMode == wxGrid::wxGridSelectCells) { if ( row > 0 ) - SelectBlock( 0, col, row - 1, col, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(0, col, row - 1, col); if ( row < m_grid->GetNumberRows() - 1 ) - SelectBlock( row + 1, col, - m_grid->GetNumberRows() - 1, col, - FALSE, FALSE, FALSE, FALSE, FALSE ); + SelectBlockNoEvent(row + 1, col, + m_grid->GetNumberRows() - 1, col); } } } @@ -724,68 +805,92 @@ void 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() ) - { - r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, col ), - wxGridCellCoords( row, col ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); - } + 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: - { - 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, col ), + wxGridCellCoords( row, col ), + false, + kbd ); + m_grid->GetEventHandler()->ProcessEvent( gridEvt ); + } + else // rows/columns selection mode + { + if ( m_selectionMode != wxGrid::wxGridSelectColumns && + rowSelectionWasChanged ) + { + int numCols = m_grid->GetNumberCols(); + for ( int colFrom = 0, colTo = 0; colTo <= numCols; ++colTo ) + { + 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, - ControlDown, ShiftDown, - AltDown, MetaDown ); - m_grid->GetEventHandler()->ProcessEvent(gridEvt); - break; - } - case wxGrid::wxGridSelectColumns: - { - 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 ); - } + colFrom = colTo + 1; + } + } + } - 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_selectionMode != wxGrid::wxGridSelectRows && + colSelectionWasChanged ) + { + int numRows = m_grid->GetNumberRows(); + for ( int rowFrom = 0, rowTo = 0; rowTo <= numRows; ++rowTo ) + { + 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 ); + } + + rowFrom = rowTo + 1; + } + } + } } } @@ -795,10 +900,10 @@ void wxGridSelection::ClearSelection() wxRect r; wxGridCellCoords coords1, coords2; - // deselect all invidiual cells and update the screen + // deselect all individual cells and update the screen if ( m_selectionMode == wxGrid::wxGridSelectCells ) { - while( ( n = m_cellSelection.GetCount() ) > 0) + while ( ( n = m_cellSelection.GetCount() ) > 0) { n--; coords1 = m_cellSelection[n]; @@ -806,13 +911,17 @@ void wxGridSelection::ClearSelection() if ( !m_grid->GetBatchCount() ) { r = m_grid->BlockToDeviceRect( coords1, coords1 ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((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) + while ( ( n = m_blockSelectionTopLeft.GetCount() ) > 0) { n--; coords1 = m_blockSelectionTopLeft[n]; @@ -822,14 +931,18 @@ void wxGridSelection::ClearSelection() if ( !m_grid->GetBatchCount() ) { r = m_grid->BlockToDeviceRect( coords1, coords2 ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif } } // deselect all rows and update the screen if ( m_selectionMode != wxGrid::wxGridSelectColumns ) { - while( ( n = m_rowSelection.GetCount() ) > 0) + while ( ( n = m_rowSelection.GetCount() ) > 0) { n--; int row = m_rowSelection[n]; @@ -838,7 +951,11 @@ void wxGridSelection::ClearSelection() { r = m_grid->BlockToDeviceRect( wxGridCellCoords( row, 0 ), wxGridCellCoords( row, m_grid->GetNumberCols() - 1 ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif } } } @@ -846,7 +963,7 @@ void wxGridSelection::ClearSelection() // deselect all columns and update the screen if ( m_selectionMode != wxGrid::wxGridSelectRows ) { - while( ( n = m_colSelection.GetCount() ) > 0) + while ( ( n = m_colSelection.GetCount() ) > 0) { n--; int col = m_colSelection[n]; @@ -855,7 +972,11 @@ void wxGridSelection::ClearSelection() { r = m_grid->BlockToDeviceRect( wxGridCellCoords( 0, col ), wxGridCellCoords( m_grid->GetNumberRows() - 1, col ) ); - ((wxWindow *)m_grid->m_gridWin)->Refresh( FALSE, &r ); + ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); + +#ifdef __WXMAC__ + ((wxWindow *)m_grid->m_gridWin)->Update(); +#endif } } } @@ -867,9 +988,10 @@ void wxGridSelection::ClearSelection() wxEVT_GRID_RANGE_SELECT, m_grid, wxGridCellCoords( 0, 0 ), - wxGridCellCoords( m_grid->GetNumberRows() - 1, - m_grid->GetNumberCols() - 1 ), - FALSE ); + wxGridCellCoords( + m_grid->GetNumberRows() - 1, + m_grid->GetNumberCols() - 1 ), + false ); m_grid->GetEventHandler()->ProcessEvent(gridEvt); } @@ -902,7 +1024,8 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) { // ...or remove the attribute m_cellSelection.RemoveAt(n); - n--; count--; + n--; + count--; } } } @@ -915,14 +1038,15 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; wxCoord row1 = coords1.GetRow(); wxCoord row2 = coords2.GetRow(); + if ((size_t)row2 >= pos) { if (numRows > 0) { // If rows inserted, increase row counter where necessary - coords2.SetRow(row2 + numRows); - if ( (size_t)row1 >= pos ) - coords1.SetRow(row1 + numRows); + coords2.SetRow( row2 + numRows ); + if ((size_t)row1 >= pos) + coords1.SetRow( row1 + numRows ); } else if (numRows < 0) { @@ -930,22 +1054,23 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) if ((size_t)row2 >= pos - numRows) { // ...either decrement row counter (if row still exists)... - coords2.SetRow(row2 + numRows); - if ( (size_t) row1 >= pos) - coords1.SetRow( wxMax(row1 + numRows, (int) pos) ); + coords2.SetRow( row2 + numRows ); + if ((size_t)row1 >= pos) + coords1.SetRow( wxMax(row1 + numRows, (int)pos) ); } else { - if ( (size_t) row1 >= pos) + if ((size_t)row1 >= pos) { // ...or remove the attribute m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; + n--; + count--; } else - coords2.SetRow(pos); + coords2.SetRow( pos ); } } } @@ -954,21 +1079,21 @@ void wxGridSelection::UpdateRows( size_t pos, int numRows ) count = m_rowSelection.GetCount(); for ( n = 0; n < count; n++ ) { - int rowOrCol_ = m_rowSelection [ n ]; + int rowOrCol_ = m_rowSelection[n]; - if ( ( size_t ) rowOrCol_ >= pos ) + if ((size_t) rowOrCol_ >= pos) { if ( numRows > 0 ) { - m_rowSelection [ n ] += numRows; + m_rowSelection[n] += numRows; } else if ( numRows < 0 ) { - if ( ( size_t ) rowOrCol_ >= ( pos - numRows ) ) - m_rowSelection [ n ] += numRows; + if ((size_t)rowOrCol_ >= (pos - numRows)) + m_rowSelection[n] += numRows; else { - m_rowSelection.RemoveAt ( n ); + m_rowSelection.RemoveAt( n ); n--; count--; } @@ -987,6 +1112,7 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) { size_t count = m_cellSelection.GetCount(); size_t n; + for ( n = 0; n < count; n++ ) { wxGridCellCoords& coords = m_cellSelection[n]; @@ -1010,7 +1136,8 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) { // ...or remove the attribute m_cellSelection.RemoveAt(n); - n--; count--; + n--; + count--; } } } @@ -1023,13 +1150,14 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) wxGridCellCoords& coords2 = m_blockSelectionBottomRight[n]; wxCoord col1 = coords1.GetCol(); wxCoord col2 = coords2.GetCol(); + if ((size_t)col2 >= pos) { if (numCols > 0) { // If rows inserted, increase row counter where necessary coords2.SetCol(col2 + numCols); - if ( (size_t)col1 >= pos ) + if ((size_t)col1 >= pos) coords1.SetCol(col1 + numCols); } else if (numCols < 0) @@ -1040,17 +1168,18 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) // ...either decrement col counter (if col still exists)... coords2.SetCol(col2 + numCols); if ( (size_t) col1 >= pos) - coords1.SetCol( wxMax(col1 + numCols, (int) pos) ); + coords1.SetCol( wxMax(col1 + numCols, (int)pos) ); } else { - if ( (size_t) col1 >= pos) + if ((size_t)col1 >= pos) { // ...or remove the attribute m_blockSelectionTopLeft.RemoveAt(n); m_blockSelectionBottomRight.RemoveAt(n); - n--; count--; + n--; + count--; } else coords2.SetCol(pos); @@ -1062,25 +1191,24 @@ void wxGridSelection::UpdateCols( size_t pos, int numCols ) count = m_colSelection.GetCount(); for ( n = 0; n < count; n++ ) { + int rowOrCol = m_colSelection[n]; - int rowOrCol = m_colSelection [ n ]; - if ( ( size_t ) rowOrCol >= pos ) + if ((size_t)rowOrCol >= pos) { if ( numCols > 0 ) - m_colSelection [ n ] += numCols; + m_colSelection[n] += numCols; else if ( numCols < 0 ) { - if ( ( size_t ) rowOrCol >= ( pos -numCols ) ) - m_colSelection [ n ] += numCols; + if ((size_t)rowOrCol >= (pos - numCols)) + m_colSelection[n] += numCols; else { - m_colSelection.RemoveAt ( n ); + m_colSelection.RemoveAt( n ); n--; count--; } } } - } // No need to touch selected rows, unless we removed _all_ @@ -1089,7 +1217,6 @@ 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, @@ -1104,6 +1231,7 @@ int wxGridSelection::BlockContain( int topRow1, int leftCol1, else if ( topRow2 <= topRow1 && bottomRow1 <= bottomRow2 && leftCol2 <= leftCol1 && rightCol1 <= rightCol2 ) return -1; + return 0; }