Store row/column selection more appropriately in wxGrid.

Use wxGridSelection::m_rowSelection and m_colSelection for storing the
selected rows/columns respectively instead of storing them in m_blockXXX
arrays. This makes more sense and allows to easily implement the proper
handling of Ctrl-clicking in the row or column selection modes.

Closes #12638.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70177 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-12-29 22:05:23 +00:00
parent 144a67054a
commit be8fbbff66
2 changed files with 108 additions and 58 deletions

View File

@@ -460,6 +460,7 @@ All (GUI):
- Fix item alignment in icon view in the generic wxListCtrl. - Fix item alignment in icon view in the generic wxListCtrl.
- Support font-family/style, text-decoration in wxHtmlWindow (Blake Oleander). - Support font-family/style, text-decoration in wxHtmlWindow (Blake Oleander).
- Show ribbon tools help strings in tooltips (John Roberts). - Show ribbon tools help strings in tooltips (John Roberts).
- Improve row/column selection modes in wxGrid (joostn).
GTK: GTK:

View File

@@ -428,6 +428,54 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
size_t count, n; size_t count, n;
if ( m_selectionMode == wxGrid::wxGridSelectRows )
{
// find out which rows are already selected:
wxArrayInt alreadyselected;
alreadyselected.Add(0,bottomRow-topRow+1);
for( n = 0; n < m_rowSelection.GetCount(); n++)
{
int row = m_rowSelection[n];
if( (row >= topRow) && (row <= bottomRow) )
{
alreadyselected[ row - topRow ]=1;
}
}
// add the newly selected rows:
for ( int row = topRow; row <= bottomRow; row++ )
{
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;
}
}
// 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. // Remove single cells contained in newly selected block.
if ( m_selectionMode == wxGrid::wxGridSelectCells ) if ( m_selectionMode == wxGrid::wxGridSelectCells )
{ {
@@ -475,8 +523,6 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
// If a row containing the selection is already selected, return, // If a row containing the selection is already selected, return,
// if a row contained in newly selected block is found, remove it. // if a row contained in newly selected block is found, remove it.
if ( m_selectionMode != wxGrid::wxGridSelectColumns )
{
count = m_rowSelection.GetCount(); count = m_rowSelection.GetCount();
for ( n = 0; n < count; n++ ) for ( n = 0; n < count; n++ )
{ {
@@ -497,10 +543,8 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
break; break;
} }
} }
}
if ( m_selectionMode != wxGrid::wxGridSelectRows ) // Same for columns.
{
count = m_colSelection.GetCount(); count = m_colSelection.GetCount();
for ( n = 0; n < count; n++ ) for ( n = 0; n < count; n++ )
{ {
@@ -521,11 +565,10 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
break; break;
} }
} }
}
m_blockSelectionTopLeft.Add( wxGridCellCoords( topRow, leftCol ) ); m_blockSelectionTopLeft.Add( wxGridCellCoords( topRow, leftCol ) );
m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) ); m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) );
}
// Update View: // Update View:
if ( !m_grid->GetBatchCount() ) if ( !m_grid->GetBatchCount() )
{ {
@@ -552,29 +595,35 @@ void wxGridSelection::SelectCell( int row, int col,
const wxKeyboardState& kbd, const wxKeyboardState& kbd,
bool sendEvent ) bool sendEvent )
{ {
if ( IsInSelection ( row, col ) )
return;
wxGridCellCoords selectedTopLeft, selectedBottomRight;
if ( m_selectionMode == wxGrid::wxGridSelectRows ) if ( m_selectionMode == wxGrid::wxGridSelectRows )
{ {
SelectBlock(row, 0, row, m_grid->GetNumberCols() - 1, kbd, sendEvent); m_rowSelection.Add( row );
selectedTopLeft = wxGridCellCoords( row, 0 );
return; selectedBottomRight = wxGridCellCoords( row, m_grid->GetNumberCols() - 1 );
} }
else if ( m_selectionMode == wxGrid::wxGridSelectColumns ) else if ( m_selectionMode == wxGrid::wxGridSelectColumns )
{ {
SelectBlock(0, col, m_grid->GetNumberRows() - 1, col, kbd, sendEvent); m_colSelection.Add( col );
selectedTopLeft = wxGridCellCoords( 0, col );
return; selectedBottomRight = wxGridCellCoords( m_grid->GetNumberRows() - 1, col );
} }
else if ( IsInSelection ( row, col ) ) else
return; {
m_cellSelection.Add( wxGridCellCoords( row, col ) ); m_cellSelection.Add( wxGridCellCoords( row, col ) );
selectedTopLeft = wxGridCellCoords( row, col );
selectedBottomRight = wxGridCellCoords( row, col );
}
// Update View: // Update View:
if ( !m_grid->GetBatchCount() ) if ( !m_grid->GetBatchCount() )
{ {
wxRect r = m_grid->BlockToDeviceRect( wxRect r = m_grid->BlockToDeviceRect(
wxGridCellCoords( row, col ), selectedTopLeft,
wxGridCellCoords( row, col ) ); selectedBottomRight );
((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r ); ((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r );
} }
@@ -584,8 +633,8 @@ void wxGridSelection::SelectCell( int row, int col,
wxGridRangeSelectEvent gridEvt( m_grid->GetId(), wxGridRangeSelectEvent gridEvt( m_grid->GetId(),
wxEVT_GRID_RANGE_SELECT, wxEVT_GRID_RANGE_SELECT,
m_grid, m_grid,
wxGridCellCoords( row, col ), selectedTopLeft,
wxGridCellCoords( row, col ), selectedBottomRight,
true, true,
kbd); kbd);
m_grid->GetEventHandler()->ProcessEvent( gridEvt ); m_grid->GetEventHandler()->ProcessEvent( gridEvt );