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.
- Support font-family/style, text-decoration in wxHtmlWindow (Blake Oleander).
- Show ribbon tools help strings in tooltips (John Roberts).
- Improve row/column selection modes in wxGrid (joostn).
GTK:

View File

@@ -428,6 +428,54 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
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.
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 contained in newly selected block is found, remove it.
if ( m_selectionMode != wxGrid::wxGridSelectColumns )
{
count = m_rowSelection.GetCount();
for ( n = 0; n < count; n++ )
{
@@ -497,10 +543,8 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
break;
}
}
}
if ( m_selectionMode != wxGrid::wxGridSelectRows )
{
// Same for columns.
count = m_colSelection.GetCount();
for ( n = 0; n < count; n++ )
{
@@ -521,11 +565,10 @@ void wxGridSelection::SelectBlock( int topRow, int leftCol,
break;
}
}
}
m_blockSelectionTopLeft.Add( wxGridCellCoords( topRow, leftCol ) );
m_blockSelectionBottomRight.Add( wxGridCellCoords( bottomRow, rightCol ) );
}
// Update View:
if ( !m_grid->GetBatchCount() )
{
@@ -552,29 +595,35 @@ void wxGridSelection::SelectCell( int row, int col,
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, kbd, 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, kbd, sendEvent);
return;
m_colSelection.Add( col );
selectedTopLeft = wxGridCellCoords( 0, col );
selectedBottomRight = wxGridCellCoords( m_grid->GetNumberRows() - 1, col );
}
else if ( IsInSelection ( row, col ) )
return;
else
{
m_cellSelection.Add( wxGridCellCoords( row, col ) );
selectedTopLeft = wxGridCellCoords( row, col );
selectedBottomRight = wxGridCellCoords( row, col );
}
// Update View:
if ( !m_grid->GetBatchCount() )
{
wxRect r = m_grid->BlockToDeviceRect(
wxGridCellCoords( row, col ),
wxGridCellCoords( row, col ) );
selectedTopLeft,
selectedBottomRight );
((wxWindow *)m_grid->m_gridWin)->Refresh( false, &r );
}
@@ -584,8 +633,8 @@ void wxGridSelection::SelectCell( int row, int col,
wxGridRangeSelectEvent gridEvt( m_grid->GetId(),
wxEVT_GRID_RANGE_SELECT,
m_grid,
wxGridCellCoords( row, col ),
wxGridCellCoords( row, col ),
selectedTopLeft,
selectedBottomRight,
true,
kbd);
m_grid->GetEventHandler()->ProcessEvent( gridEvt );