]> git.saurik.com Git - wxWidgets.git/commitdiff
Some refresh optimizations.
authorStefan Neis <Stefan.Neis@t-online.de>
Sat, 7 Sep 2002 12:28:03 +0000 (12:28 +0000)
committerStefan Neis <Stefan.Neis@t-online.de>
Sat, 7 Sep 2002 12:28:03 +0000 (12:28 +0000)
Untabified.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@17038 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/grid.cpp

index 9c4fea03b6176232cd1c4ba0fe669d6c7b926c4b..c4b05561617078324b35cd9242fd4b08b381db5f 100644 (file)
@@ -6073,7 +6073,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
         if ( IsVisible( m_currentCellCoords, FALSE ) )
         {
             wxRect r;
-            r = BlockToDeviceRect(m_currentCellCoords, coords);
+            r = BlockToDeviceRect(m_currentCellCoords, m_currentCellCoords);
             if ( !m_gridLinesEnabled )
             {
                 r.x--;
@@ -6082,7 +6082,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords )
                 r.height++;
             }
 
-             wxGridCellCoordsArray cells = CalcCellsExposed( r );
+            wxGridCellCoordsArray cells = CalcCellsExposed( r );
 
             // Otherwise refresh redraws the highlight!
             m_currentCellCoords = coords;
@@ -6136,8 +6136,18 @@ void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCo
     updateTopLeft = wxGridCellCoords( topRow, leftCol );
     updateBottomRight = wxGridCellCoords( bottomRow, rightCol );
 
-    if ( m_selectingTopLeft != updateTopLeft ||
-         m_selectingBottomRight != updateBottomRight )
+    // First the case that we selected a completely new area
+    if ( m_selectingTopLeft == wxGridNoCellCoords ||
+         m_selectingBottomRight == wxGridNoCellCoords )
+    {
+        wxRect rect;
+        rect = BlockToDeviceRect( wxGridCellCoords ( topRow, leftCol ),
+                                  wxGridCellCoords ( bottomRow, rightCol ) );
+        m_gridWin->Refresh( FALSE, &rect );     
+    }
+    // Now handle changing an existing selection area.
+    else if ( m_selectingTopLeft != updateTopLeft ||
+              m_selectingBottomRight != updateBottomRight )
     {
         // Compute two optimal update rectangles:
         // Either one rectangle is a real subset of the
@@ -6188,6 +6198,8 @@ void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCo
 
         if ( oldLeft < leftCol )
         {
+            // Refresh the newly selected or deselected
+            // area to the left of the old or new selection.
             need_refresh[0] = TRUE;
             rect[0] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
                                                             oldLeft ),
@@ -6197,6 +6209,8 @@ void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCo
 
         if ( oldTop  < topRow )
         {
+            // Refresh the newly selected or deselected
+            // area above the old or new selection.
             need_refresh[1] = TRUE;
             rect[1] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
                                                             leftCol ),
@@ -6206,6 +6220,8 @@ void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCo
 
         if ( oldRight > rightCol )
         {
+            // Refresh the newly selected or deselected
+            // area to the right of the old or new selection.
             need_refresh[2] = TRUE;
             rect[2] = BlockToDeviceRect( wxGridCellCoords ( oldTop,
                                                             rightCol + 1 ),
@@ -6215,6 +6231,8 @@ void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCo
 
         if ( oldBottom > bottomRow )
         {
+            // Refresh the newly selected or deselected
+            // area below the old or new selection.
             need_refresh[3] = TRUE;
             rect[3] = BlockToDeviceRect( wxGridCellCoords ( bottomRow + 1,
                                                             leftCol ),
@@ -6222,20 +6240,14 @@ void wxGrid::HighlightBlock( int topRow, int leftCol, int bottomRow, int rightCo
                                                             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)
+    // Change Selection
+    m_selectingTopLeft = updateTopLeft;
+    m_selectingBottomRight = updateBottomRight;
 }
 
 //
@@ -6306,7 +6318,7 @@ void wxGrid::DrawGridCellArea( wxDC& dc, const wxGridCellCoordsArray& cells )
                 if ( cell == cells[j] )
                 {
                     marked = TRUE;
-                    break;;
+                    break;
                 }
             }
             if (!marked)
@@ -8520,12 +8532,12 @@ wxGridCellAttr *wxGrid::GetCellAttr(int row, int col) const
     // wxNoCellCoords, as this will confuse memory management.
     if ( row >= 0 )
     {
-       if ( !LookupAttr(row, col, &attr) )
-       {
-           attr = m_table ? m_table->GetAttr(row, col , wxGridCellAttr::Any)
-                          : (wxGridCellAttr *)NULL;
-           CacheAttr(row, col, attr);
-       }
+        if ( !LookupAttr(row, col, &attr) )
+        {
+            attr = m_table ? m_table->GetAttr(row, col , wxGridCellAttr::Any)
+                           : (wxGridCellAttr *)NULL;
+            CacheAttr(row, col, attr);
+        }
     }
     if (attr)
     {
@@ -9412,6 +9424,27 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft,
     int rightCol = bottomRight.GetCol();
     int bottomRow = bottomRight.GetRow();
 
+    if (left > right)
+    {
+        i = left;
+        left = right;
+        right = i;
+        i = leftCol;
+        leftCol=rightCol;
+        rightCol = i;
+    }
+
+    if (top > bottom)
+    {
+        i = top;
+        top = bottom;
+        bottom = i;
+        i = topRow;
+        topRow = bottomRow;
+        bottomRow = i;
+    }
+
+
     for ( j = topRow; j <= bottomRow; j++ )
     {
         for ( i = leftCol; i <= rightCol; i++ )
@@ -9429,6 +9462,7 @@ wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft,
                 if (cellRect.y + cellRect.height > bottom)
                     bottom = cellRect.y + cellRect.height;
             }
+            else i = rightCol; // jump over inner cells.
         }
     }