Optimized Refresh Area in various functions
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5866 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1592,9 +1592,14 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
|
|||||||
SetRowSize( m_dragRowOrCol, wxMax( y - rowTop, WXGRID_MIN_ROW_HEIGHT ) );
|
SetRowSize( m_dragRowOrCol, wxMax( y - rowTop, WXGRID_MIN_ROW_HEIGHT ) );
|
||||||
if ( !GetBatchCount() )
|
if ( !GetBatchCount() )
|
||||||
{
|
{
|
||||||
// TODO: optimize this
|
// Only needed to get the correct rect.y:
|
||||||
m_rowLabelWin->Refresh();
|
wxRect rect ( CellToRect( m_dragRowOrCol, 0 ) );
|
||||||
m_gridWin->Refresh();
|
rect.x = 0;
|
||||||
|
rect.width = m_rowLabelWidth;
|
||||||
|
rect.height = ch - rect.y;
|
||||||
|
m_rowLabelWin->Refresh( TRUE, &rect );
|
||||||
|
rect.width = cw;
|
||||||
|
m_gridWin->Refresh( TRUE, &rect );
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowCellEditControl();
|
ShowCellEditControl();
|
||||||
@@ -1774,9 +1779,14 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
|
|||||||
|
|
||||||
if ( !GetBatchCount() )
|
if ( !GetBatchCount() )
|
||||||
{
|
{
|
||||||
// TODO: optimize this
|
// Only needed to get the correct rect.x:
|
||||||
m_colLabelWin->Refresh();
|
wxRect rect ( CellToRect( 0, m_dragRowOrCol ) );
|
||||||
m_gridWin->Refresh();
|
rect.y = 0;
|
||||||
|
rect.width = cw - rect.x;
|
||||||
|
rect.height = m_colLabelHeight;
|
||||||
|
m_colLabelWin->Refresh( TRUE, &rect );
|
||||||
|
rect.height = ch;
|
||||||
|
m_gridWin->Refresh( TRUE, &rect );
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowCellEditControl();
|
ShowCellEditControl();
|
||||||
@@ -3922,7 +3932,6 @@ void wxGrid::SetRowLabelAlignment( int horiz, int vert )
|
|||||||
if ( !GetBatchCount() )
|
if ( !GetBatchCount() )
|
||||||
{
|
{
|
||||||
m_rowLabelWin->Refresh();
|
m_rowLabelWin->Refresh();
|
||||||
m_colLabelWin->Refresh();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3940,7 +3949,6 @@ void wxGrid::SetColLabelAlignment( int horiz, int vert )
|
|||||||
|
|
||||||
if ( !GetBatchCount() )
|
if ( !GetBatchCount() )
|
||||||
{
|
{
|
||||||
m_rowLabelWin->Refresh();
|
|
||||||
m_colLabelWin->Refresh();
|
m_colLabelWin->Refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3952,9 +3960,13 @@ void wxGrid::SetRowLabelValue( int row, const wxString& s )
|
|||||||
m_table->SetRowLabelValue( row, s );
|
m_table->SetRowLabelValue( row, s );
|
||||||
if ( !GetBatchCount() )
|
if ( !GetBatchCount() )
|
||||||
{
|
{
|
||||||
// TODO: Optimize this
|
wxRect rect = CellToRect( row, 0);
|
||||||
//
|
if ( rect.height > 0 )
|
||||||
m_rowLabelWin->Refresh();
|
{
|
||||||
|
rect.x = m_left;
|
||||||
|
rect.width = m_rowLabelWidth;
|
||||||
|
m_rowLabelWin->Refresh( TRUE, &rect );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3966,9 +3978,13 @@ void wxGrid::SetColLabelValue( int col, const wxString& s )
|
|||||||
m_table->SetColLabelValue( col, s );
|
m_table->SetColLabelValue( col, s );
|
||||||
if ( !GetBatchCount() )
|
if ( !GetBatchCount() )
|
||||||
{
|
{
|
||||||
// TODO: optimize this
|
wxRect rect = CellToRect( 0, col );
|
||||||
//
|
if ( rect.width > 0 )
|
||||||
m_colLabelWin->Refresh();
|
{
|
||||||
|
rect.y = m_top;
|
||||||
|
rect.height = m_colLabelHeight;
|
||||||
|
m_colLabelWin->Refresh( TRUE, &rect );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4272,21 +4288,56 @@ void wxGrid::SelectRow( int row, bool addToSelected )
|
|||||||
|
|
||||||
if ( IsSelection() && addToSelected )
|
if ( IsSelection() && addToSelected )
|
||||||
{
|
{
|
||||||
if ( m_selectedTopLeft.GetRow() > row )
|
wxRect rect[4];
|
||||||
|
bool need_refresh[4] = { FALSE, FALSE, FALSE, FALSE };
|
||||||
|
int i;
|
||||||
|
|
||||||
|
wxCoord oldLeft = m_selectedTopLeft.GetCol();
|
||||||
|
wxCoord oldTop = m_selectedTopLeft.GetRow();
|
||||||
|
wxCoord oldRight = m_selectedBottomRight.GetCol();
|
||||||
|
wxCoord oldBottom = m_selectedBottomRight.GetRow();
|
||||||
|
|
||||||
|
if ( oldTop > row )
|
||||||
|
{
|
||||||
|
need_refresh[0] = TRUE;
|
||||||
|
rect[0] = BlockToDeviceRect( wxGridCellCoords ( row, 0 ),
|
||||||
|
wxGridCellCoords ( oldTop - 1,
|
||||||
|
m_numCols - 1 ) );
|
||||||
m_selectedTopLeft.SetRow( row );
|
m_selectedTopLeft.SetRow( row );
|
||||||
|
}
|
||||||
|
|
||||||
m_selectedTopLeft.SetCol( 0 );
|
if ( oldLeft > 0 )
|
||||||
|
{
|
||||||
|
need_refresh[1] = TRUE;
|
||||||
|
rect[1] = BlockToDeviceRect( wxGridCellCoords ( oldTop, 0 ),
|
||||||
|
wxGridCellCoords ( oldBottom,
|
||||||
|
oldLeft - 1 ) );
|
||||||
|
|
||||||
if ( m_selectedBottomRight.GetRow() < row )
|
m_selectedTopLeft.SetCol( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( oldBottom < row )
|
||||||
|
{
|
||||||
|
need_refresh[2] = TRUE;
|
||||||
|
rect[2] = BlockToDeviceRect( wxGridCellCoords ( oldBottom + 1, 0 ),
|
||||||
|
wxGridCellCoords ( row,
|
||||||
|
m_numCols - 1 ) );
|
||||||
m_selectedBottomRight.SetRow( row );
|
m_selectedBottomRight.SetRow( row );
|
||||||
|
}
|
||||||
|
|
||||||
m_selectedBottomRight.SetCol( m_numCols - 1 );
|
if ( oldRight < m_numCols - 1 )
|
||||||
|
{
|
||||||
|
need_refresh[3] = TRUE;
|
||||||
|
rect[3] = BlockToDeviceRect( wxGridCellCoords ( oldTop ,
|
||||||
|
oldRight + 1 ),
|
||||||
|
wxGridCellCoords ( oldBottom,
|
||||||
|
m_numCols - 1 ) );
|
||||||
|
m_selectedBottomRight.SetCol( m_numCols - 1 );
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: optimize this so that we only refresh the newly
|
for (i = 0; i < 4; i++ )
|
||||||
// selected cells
|
if ( need_refresh[i] && rect[i] != wxGridNoCellRect )
|
||||||
//
|
m_gridWin->Refresh( TRUE, &(rect[i]) );
|
||||||
r = SelectionToDeviceRect();
|
|
||||||
if ( r != wxGridNoCellRect ) m_gridWin->Refresh( TRUE, &r );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4312,28 +4363,62 @@ void wxGrid::SelectRow( int row, bool addToSelected )
|
|||||||
|
|
||||||
void wxGrid::SelectCol( int col, bool addToSelected )
|
void wxGrid::SelectCol( int col, bool addToSelected )
|
||||||
{
|
{
|
||||||
wxRect r;
|
|
||||||
|
|
||||||
if ( IsSelection() && addToSelected )
|
if ( IsSelection() && addToSelected )
|
||||||
{
|
{
|
||||||
if ( m_selectedTopLeft.GetCol() > col )
|
wxRect rect[4];
|
||||||
|
bool need_refresh[4] = { FALSE, FALSE, FALSE, FALSE };
|
||||||
|
int i;
|
||||||
|
|
||||||
|
wxCoord oldLeft = m_selectedTopLeft.GetCol();
|
||||||
|
wxCoord oldTop = m_selectedTopLeft.GetRow();
|
||||||
|
wxCoord oldRight = m_selectedBottomRight.GetCol();
|
||||||
|
wxCoord oldBottom = m_selectedBottomRight.GetRow();
|
||||||
|
|
||||||
|
if ( oldLeft > col )
|
||||||
|
{
|
||||||
|
need_refresh[0] = TRUE;
|
||||||
|
rect[0] = BlockToDeviceRect( wxGridCellCoords ( 0, col ),
|
||||||
|
wxGridCellCoords ( m_numRows - 1,
|
||||||
|
oldLeft - 1 ) );
|
||||||
m_selectedTopLeft.SetCol( col );
|
m_selectedTopLeft.SetCol( col );
|
||||||
|
}
|
||||||
|
|
||||||
m_selectedTopLeft.SetRow( 0 );
|
if ( oldTop > 0 )
|
||||||
|
{
|
||||||
|
need_refresh[1] = TRUE;
|
||||||
|
rect[1] = BlockToDeviceRect( wxGridCellCoords ( 0, oldLeft ),
|
||||||
|
wxGridCellCoords ( oldTop - 1,
|
||||||
|
oldRight ) );
|
||||||
|
m_selectedTopLeft.SetRow( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
if ( m_selectedBottomRight.GetCol() < col )
|
if ( oldRight < col )
|
||||||
|
{
|
||||||
|
need_refresh[2] = TRUE;
|
||||||
|
rect[2] = BlockToDeviceRect( wxGridCellCoords ( 0, oldRight + 1 ),
|
||||||
|
wxGridCellCoords ( m_numRows - 1,
|
||||||
|
col ) );
|
||||||
m_selectedBottomRight.SetCol( col );
|
m_selectedBottomRight.SetCol( col );
|
||||||
|
}
|
||||||
|
|
||||||
m_selectedBottomRight.SetRow( m_numRows - 1 );
|
if ( oldBottom < m_numRows - 1 )
|
||||||
|
{
|
||||||
|
need_refresh[3] = TRUE;
|
||||||
|
rect[3] = BlockToDeviceRect( wxGridCellCoords ( oldBottom + 1,
|
||||||
|
oldLeft ),
|
||||||
|
wxGridCellCoords ( m_numRows - 1,
|
||||||
|
oldRight ) );
|
||||||
|
m_selectedBottomRight.SetRow( m_numRows - 1 );
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: optimize this so that we only refresh the newly
|
for (i = 0; i < 4; i++ )
|
||||||
// selected cells
|
if ( need_refresh[i] && rect[i] != wxGridNoCellRect )
|
||||||
//
|
m_gridWin->Refresh( TRUE, &(rect[i]) );
|
||||||
r = SelectionToDeviceRect();
|
|
||||||
if ( r != wxGridNoCellRect ) m_gridWin->Refresh( TRUE, &r );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
wxRect r;
|
||||||
|
|
||||||
r = SelectionToDeviceRect();
|
r = SelectionToDeviceRect();
|
||||||
ClearSelection();
|
ClearSelection();
|
||||||
if ( r != wxGridNoCellRect ) m_gridWin->Refresh( TRUE, &r );
|
if ( r != wxGridNoCellRect ) m_gridWin->Refresh( TRUE, &r );
|
||||||
@@ -4357,7 +4442,6 @@ 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 )
|
||||||
{
|
{
|
||||||
int temp;
|
int temp;
|
||||||
bool changed = FALSE;
|
|
||||||
wxGridCellCoords updateTopLeft, updateBottomRight;
|
wxGridCellCoords updateTopLeft, updateBottomRight;
|
||||||
|
|
||||||
if ( topRow > bottomRow )
|
if ( topRow > bottomRow )
|
||||||
@@ -4374,46 +4458,100 @@ void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol )
|
|||||||
rightCol = temp;
|
rightCol = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTopLeft = m_selectedTopLeft;
|
updateTopLeft = wxGridCellCoords( topRow, leftCol );
|
||||||
if (m_selectedTopLeft != wxGridCellCoords( topRow, leftCol ) )
|
updateBottomRight = wxGridCellCoords( bottomRow, rightCol );
|
||||||
{
|
|
||||||
m_selectedTopLeft = wxGridCellCoords( topRow, leftCol );
|
|
||||||
if (updateTopLeft == wxGridNoCellCoords)
|
|
||||||
{
|
|
||||||
updateTopLeft = m_selectedTopLeft;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(updateTopLeft.GetRow() > topRow)
|
|
||||||
updateTopLeft.SetRow(topRow);
|
|
||||||
if (updateTopLeft.GetCol() > leftCol)
|
|
||||||
updateTopLeft.SetCol(leftCol);
|
|
||||||
}
|
|
||||||
changed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateBottomRight = m_selectedBottomRight;
|
if ( m_selectedTopLeft != updateTopLeft ||
|
||||||
if (m_selectedBottomRight != wxGridCellCoords( bottomRow, rightCol ) )
|
m_selectedBottomRight != updateBottomRight )
|
||||||
{
|
{
|
||||||
m_selectedBottomRight = wxGridCellCoords( bottomRow, rightCol );
|
// Compute two optimal update rectangles:
|
||||||
if (updateBottomRight == wxGridNoCellCoords)
|
// Either one rectangle is a real subset of the
|
||||||
{
|
// other, or they are (almost) disjoint!
|
||||||
updateBottomRight = m_selectedBottomRight;
|
wxRect rect[4];
|
||||||
}
|
bool need_refresh[4] = { FALSE, FALSE, FALSE, FALSE };
|
||||||
else
|
int i;
|
||||||
{
|
|
||||||
if (updateBottomRight.GetRow() < bottomRow)
|
|
||||||
updateBottomRight.SetRow(bottomRow);
|
|
||||||
if (updateBottomRight.GetCol() < rightCol)
|
|
||||||
updateBottomRight.SetCol(rightCol);
|
|
||||||
}
|
|
||||||
changed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed)
|
// Store intermediate values
|
||||||
{
|
wxCoord oldLeft = m_selectedTopLeft.GetCol();
|
||||||
wxRect r( BlockToDeviceRect( updateTopLeft, updateBottomRight ) );
|
wxCoord oldTop = m_selectedTopLeft.GetRow();
|
||||||
m_gridWin->Refresh( TRUE, &r );
|
wxCoord oldRight = m_selectedBottomRight.GetCol();
|
||||||
|
wxCoord oldBottom = m_selectedBottomRight.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_selectedTopLeft = updateTopLeft;
|
||||||
|
m_selectedBottomRight = updateBottomRight;
|
||||||
|
|
||||||
|
// various Refresh() calls
|
||||||
|
for (i = 0; i < 4; i++ )
|
||||||
|
if ( need_refresh[i] && rect[i] != wxGridNoCellRect )
|
||||||
|
m_gridWin->Refresh( TRUE, &(rect[i]) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// only generate an event if the block is not being selected by
|
// only generate an event if the block is not being selected by
|
||||||
|
Reference in New Issue
Block a user