Fix to make wxGrid::SelectBlock do what it says.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7912 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Michael Bedward
2000-08-02 04:12:43 +00:00
parent 80ccc1282c
commit c8da1e98e8
2 changed files with 176 additions and 143 deletions

View File

@@ -1290,12 +1290,27 @@ public:
void SelectRow( int row, bool addToSelected = FALSE ); void SelectRow( int row, bool addToSelected = FALSE );
void SelectCol( int col, bool addToSelected = FALSE ); void SelectCol( int col, bool addToSelected = FALSE );
void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ); // MB: This ugly confusion of SelectBlock functions will be absent
// in post wx-2.2 releases
//
void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol,
bool addToSelected );
void SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol )
{ SelectBlock( topRow, leftCol, bottomRow, rightCol, FALSE ); }
void SelectBlock( const wxGridCellCoords& topLeft,
const wxGridCellCoords& bottomRight,
bool addToSelected )
{ SelectBlock( topLeft.GetRow(), topLeft.GetCol(),
bottomRight.GetRow(), bottomRight.GetCol(),
addToSelected ); }
void SelectBlock( const wxGridCellCoords& topLeft, void SelectBlock( const wxGridCellCoords& topLeft,
const wxGridCellCoords& bottomRight ) const wxGridCellCoords& bottomRight )
{ SelectBlock( topLeft.GetRow(), topLeft.GetCol(), { SelectBlock( topLeft.GetRow(), topLeft.GetCol(),
bottomRight.GetRow(), bottomRight.GetCol() ); } bottomRight.GetRow(), bottomRight.GetCol(),
FALSE ); }
void SelectAll(); void SelectAll();
@@ -1724,6 +1739,12 @@ protected:
void SetCurrentCell( int row, int col ) void SetCurrentCell( int row, int col )
{ SetCurrentCell( wxGridCellCoords(row, col) ); } { SetCurrentCell( wxGridCellCoords(row, col) ); }
void HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCol );
void HighlightBlock( const wxGridCellCoords& topLeft,
const wxGridCellCoords& bottomRight )
{ HighlightBlock( topLeft.GetRow(), topLeft.GetCol(),
bottomRight.GetRow(), bottomRight.GetCol() ); }
// ------ functions to get/send data (see also public functions) // ------ functions to get/send data (see also public functions)
// //

View File

@@ -4675,17 +4675,17 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
{ {
if ( m_selectingKeyboard == wxGridNoCellCoords) if ( m_selectingKeyboard == wxGridNoCellCoords)
m_selectingKeyboard = coords; m_selectingKeyboard = coords;
SelectBlock ( m_selectingKeyboard, coords ); HighlightBlock ( m_selectingKeyboard, coords );
} }
else else
{ {
if ( !IsSelection() ) if ( !IsSelection() )
{ {
SelectBlock( coords, coords ); HighlightBlock( coords, coords );
} }
else else
{ {
SelectBlock( m_currentCellCoords, coords ); HighlightBlock( m_currentCellCoords, coords );
} }
} }
@@ -4817,7 +4817,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
SetCurrentCell( coords ); SetCurrentCell( coords );
if ( m_selection->GetSelectionMode() if ( m_selection->GetSelectionMode()
!= wxGrid::wxGridSelectCells) != wxGrid::wxGridSelectCells)
SelectBlock( coords, coords ); HighlightBlock( coords, coords );
} }
m_waitForSlowClick = TRUE; m_waitForSlowClick = TRUE;
} }
@@ -5624,6 +5624,140 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
} }
void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCol )
{
int temp;
wxGridCellCoords updateTopLeft, updateBottomRight;
if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectRows )
{
leftCol = 0;
rightCol = GetNumberCols() - 1;
}
else if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectColumns )
{
topRow = 0;
bottomRow = GetNumberRows() - 1;
}
if ( topRow > bottomRow )
{
temp = topRow;
topRow = bottomRow;
bottomRow = temp;
}
if ( leftCol > rightCol )
{
temp = leftCol;
leftCol = rightCol;
rightCol = temp;
}
updateTopLeft = wxGridCellCoords( topRow, leftCol );
updateBottomRight = wxGridCellCoords( bottomRow, rightCol );
if ( m_selectingTopLeft != updateTopLeft ||
m_selectingBottomRight != updateBottomRight )
{
// Compute two optimal update rectangles:
// Either one rectangle is a real subset of the
// other, or they are (almost) disjoint!
wxRect rect[4];
bool need_refresh[4];
need_refresh[0] =
need_refresh[1] =
need_refresh[2] =
need_refresh[3] = FALSE;
int i;
// Store intermediate values
wxCoord oldLeft = m_selectingTopLeft.GetCol();
wxCoord oldTop = m_selectingTopLeft.GetRow();
wxCoord oldRight = m_selectingBottomRight.GetCol();
wxCoord oldBottom = m_selectingBottomRight.GetRow();
// Determine the outer/inner coordinates.
if (oldLeft > leftCol)
{
temp = oldLeft;
oldLeft = leftCol;
leftCol = temp;
}
if (oldTop > topRow )
{
temp = oldTop;
oldTop = topRow;
topRow = temp;
}
if (oldRight < rightCol )
{
temp = oldRight;
oldRight = rightCol;
rightCol = temp;
}
if (oldBottom < bottomRow)
{
temp = oldBottom;
oldBottom = bottomRow;
bottomRow = temp;
}
// Now, either the stuff marked old is the outer
// rectangle or we don't have a situation where one
// is contained in the other.
if ( oldLeft < leftCol )
{
need_refresh[0] = TRUE;
rect[0] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
oldLeft ),
wxGridCellCoords ( oldBottom,
leftCol - 1 ) );
}
if ( oldTop < topRow )
{
need_refresh[1] = TRUE;
rect[1] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
leftCol ),
wxGridCellCoords ( topRow - 1,
rightCol ) );
}
if ( oldRight > rightCol )
{
need_refresh[2] = TRUE;
rect[2] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
rightCol + 1 ),
wxGridCellCoords ( oldBottom,
oldRight ) );
}
if ( oldBottom > bottomRow )
{
need_refresh[3] = TRUE;
rect[3] = BlockToDeviceRect( wxGridCellCoords ( bottomRow + 1,
leftCol ),
wxGridCellCoords ( oldBottom,
rightCol ) );
}
// Change Selection
m_selectingTopLeft = updateTopLeft;
m_selectingBottomRight = updateBottomRight;
// various Refresh() calls
for (i = 0; i < 4; i++ )
if ( need_refresh[i] && rect[i] != wxGridNoCellRect )
m_gridWin->Refresh( FALSE, &(rect[i]) );
}
// never generate an event as it will be generated from
// wxGridSelection::SelectBlock!
// (old comment from when this was the body of SelectBlock)
}
// //
// ------ functions to get/send data (see also public functions) // ------ functions to get/send data (see also public functions)
// //
@@ -6610,7 +6744,7 @@ bool wxGrid::MoveCursorUp( bool expandSelection )
m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() - 1 ); m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() - 1 );
MakeCellVisible( m_selectingKeyboard.GetRow(), MakeCellVisible( m_selectingKeyboard.GetRow(),
m_selectingKeyboard.GetCol() ); m_selectingKeyboard.GetCol() );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
} }
else if ( m_currentCellCoords.GetRow() > 0 ) else if ( m_currentCellCoords.GetRow() > 0 )
@@ -6644,7 +6778,7 @@ bool wxGrid::MoveCursorDown( bool expandSelection )
m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() + 1 ); m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() + 1 );
MakeCellVisible( m_selectingKeyboard.GetRow(), MakeCellVisible( m_selectingKeyboard.GetRow(),
m_selectingKeyboard.GetCol() ); m_selectingKeyboard.GetCol() );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
} }
else if ( m_currentCellCoords.GetRow() < m_numRows - 1 ) else if ( m_currentCellCoords.GetRow() < m_numRows - 1 )
@@ -6678,7 +6812,7 @@ bool wxGrid::MoveCursorLeft( bool expandSelection )
m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() - 1 ); m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() - 1 );
MakeCellVisible( m_selectingKeyboard.GetRow(), MakeCellVisible( m_selectingKeyboard.GetRow(),
m_selectingKeyboard.GetCol() ); m_selectingKeyboard.GetCol() );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
} }
else if ( m_currentCellCoords.GetCol() > 0 ) else if ( m_currentCellCoords.GetCol() > 0 )
@@ -6712,7 +6846,7 @@ bool wxGrid::MoveCursorRight( bool expandSelection )
m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() + 1 ); m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() + 1 );
MakeCellVisible( m_selectingKeyboard.GetRow(), MakeCellVisible( m_selectingKeyboard.GetRow(),
m_selectingKeyboard.GetCol() ); m_selectingKeyboard.GetCol() );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
} }
else if ( m_currentCellCoords.GetCol() < m_numCols - 1 ) else if ( m_currentCellCoords.GetCol() < m_numCols - 1 )
@@ -6842,7 +6976,7 @@ bool wxGrid::MoveCursorUpBlock( bool expandSelection )
if ( expandSelection ) if ( expandSelection )
{ {
m_selectingKeyboard = wxGridCellCoords( row, col ); m_selectingKeyboard = wxGridCellCoords( row, col );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
else else
{ {
@@ -6905,7 +7039,7 @@ bool wxGrid::MoveCursorDownBlock( bool expandSelection )
if ( expandSelection ) if ( expandSelection )
{ {
m_selectingKeyboard = wxGridCellCoords( row, col ); m_selectingKeyboard = wxGridCellCoords( row, col );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
else else
{ {
@@ -6969,7 +7103,7 @@ bool wxGrid::MoveCursorLeftBlock( bool expandSelection )
if ( expandSelection ) if ( expandSelection )
{ {
m_selectingKeyboard = wxGridCellCoords( row, col ); m_selectingKeyboard = wxGridCellCoords( row, col );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
else else
{ {
@@ -7033,7 +7167,7 @@ bool wxGrid::MoveCursorRightBlock( bool expandSelection )
if ( expandSelection ) if ( expandSelection )
{ {
m_selectingKeyboard = wxGridCellCoords( row, col ); m_selectingKeyboard = wxGridCellCoords( row, col );
SelectBlock( m_currentCellCoords, m_selectingKeyboard ); HighlightBlock( m_currentCellCoords, m_selectingKeyboard );
} }
else else
{ {
@@ -8069,139 +8203,17 @@ void wxGrid::SelectCol( int col, bool addToSelected )
} }
void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ) void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol,
bool addToSelected )
{ {
int temp; if ( IsSelection() && !addToSelected )
wxGridCellCoords updateTopLeft, updateBottomRight; ClearSelection();
if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectRows ) m_selection->SelectBlock( topRow, leftCol, bottomRow, rightCol,
{ FALSE, addToSelected );
leftCol = 0;
rightCol = GetNumberCols() - 1;
}
else if ( m_selection->GetSelectionMode() == wxGrid::wxGridSelectColumns )
{
topRow = 0;
bottomRow = GetNumberRows() - 1;
}
if ( topRow > bottomRow )
{
temp = topRow;
topRow = bottomRow;
bottomRow = temp;
}
if ( leftCol > rightCol )
{
temp = leftCol;
leftCol = rightCol;
rightCol = temp;
}
updateTopLeft = wxGridCellCoords( topRow, leftCol );
updateBottomRight = wxGridCellCoords( bottomRow, rightCol );
if ( m_selectingTopLeft != updateTopLeft ||
m_selectingBottomRight != updateBottomRight )
{
// Compute two optimal update rectangles:
// Either one rectangle is a real subset of the
// other, or they are (almost) disjoint!
wxRect rect[4];
bool need_refresh[4];
need_refresh[0] =
need_refresh[1] =
need_refresh[2] =
need_refresh[3] = FALSE;
int i;
// Store intermediate values
wxCoord oldLeft = m_selectingTopLeft.GetCol();
wxCoord oldTop = m_selectingTopLeft.GetRow();
wxCoord oldRight = m_selectingBottomRight.GetCol();
wxCoord oldBottom = m_selectingBottomRight.GetRow();
// Determine the outer/inner coordinates.
if (oldLeft > leftCol)
{
temp = oldLeft;
oldLeft = leftCol;
leftCol = temp;
}
if (oldTop > topRow )
{
temp = oldTop;
oldTop = topRow;
topRow = temp;
}
if (oldRight < rightCol )
{
temp = oldRight;
oldRight = rightCol;
rightCol = temp;
}
if (oldBottom < bottomRow)
{
temp = oldBottom;
oldBottom = bottomRow;
bottomRow = temp;
}
// Now, either the stuff marked old is the outer
// rectangle or we don't have a situation where one
// is contained in the other.
if ( oldLeft < leftCol )
{
need_refresh[0] = TRUE;
rect[0] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
oldLeft ),
wxGridCellCoords ( oldBottom,
leftCol - 1 ) );
}
if ( oldTop < topRow )
{
need_refresh[1] = TRUE;
rect[1] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
leftCol ),
wxGridCellCoords ( topRow - 1,
rightCol ) );
}
if ( oldRight > rightCol )
{
need_refresh[2] = TRUE;
rect[2] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
rightCol + 1 ),
wxGridCellCoords ( oldBottom,
oldRight ) );
}
if ( oldBottom > bottomRow )
{
need_refresh[3] = TRUE;
rect[3] = BlockToDeviceRect( wxGridCellCoords ( bottomRow + 1,
leftCol ),
wxGridCellCoords ( oldBottom,
rightCol ) );
}
// Change Selection
m_selectingTopLeft = updateTopLeft;
m_selectingBottomRight = updateBottomRight;
// various Refresh() calls
for (i = 0; i < 4; i++ )
if ( need_refresh[i] && rect[i] != wxGridNoCellRect )
m_gridWin->Refresh( FALSE, &(rect[i]) );
}
// never generate an event as it will be generated from
// wxGridSelection::SelectBlock!
} }
void wxGrid::SelectAll() void wxGrid::SelectAll()
{ {
m_selection->SelectBlock( 0, 0, m_numRows-1, m_numCols-1 ); m_selection->SelectBlock( 0, 0, m_numRows-1, m_numCols-1 );