]> git.saurik.com Git - wxWidgets.git/commitdiff
Scrolling improvements
authorJulian Smart <julian@anthemion.co.uk>
Tue, 4 Jul 2006 15:35:34 +0000 (15:35 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Tue, 4 Jul 2006 15:35:34 +0000 (15:35 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39974 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/richtext/richtextctrl.cpp

index 0bb40c3e34eed5e522e74df85844a8a25941ba54..b3cef4837e9a0f8132a00710ea45c493ae0a1c7e 100644 (file)
@@ -212,6 +212,8 @@ void wxRichTextCtrl::Clear()
     m_caretAtLineStart = false;
     m_selectionRange.SetRange(-2, -2);
 
     m_caretAtLineStart = false;
     m_selectionRange.SetRange(-2, -2);
 
+    SetScrollbars(0, 0, 0, 0, 0, 0);
+
     if (m_freezeCount == 0)
     {
         SetupScrollbars();
     if (m_freezeCount == 0)
     {
         SetupScrollbars();
@@ -709,16 +711,16 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode)
     int ppuX, ppuY;
     GetScrollPixelsPerUnit(& ppuX, & ppuY);
 
     int ppuX, ppuY;
     GetScrollPixelsPerUnit(& ppuX, & ppuY);
 
-    int startX, startY;
-    GetViewStart(& startX, & startY);
-    startX = 0;
-    startY = startY * ppuY;
+    int startXUnits, startYUnits;
+    GetViewStart(& startXUnits, & startYUnits);
+    int startY = startYUnits * ppuY;
 
     int sx = 0, sy = 0;
     GetVirtualSize(& sx, & sy);
 
     int sx = 0, sy = 0;
     GetVirtualSize(& sx, & sy);
-    sx = 0;
+    int sxUnits = 0;
+    int syUnits = 0;
     if (ppuY != 0)
     if (ppuY != 0)
-        sy = sy/ppuY;
+        syUnits = sy/ppuY;
 
     wxRect rect = line->GetRect();
 
 
     wxRect rect = line->GetRect();
 
@@ -734,11 +736,15 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode)
             // Make it scroll so this item is at the bottom
             // of the window
             int y = rect.y - (clientSize.y - rect.height);
             // Make it scroll so this item is at the bottom
             // of the window
             int y = rect.y - (clientSize.y - rect.height);
-            y = (int) (0.5 + y/ppuY);
+            int yUnits = (int) (0.5 + ((float) y)/(float) ppuY);
 
 
-            if (startY != y)
+            // If we're still off the screen, scroll another line down
+            if ((rect.y + rect.height) > (clientSize.y + (yUnits*ppuY)))
+                yUnits ++;
+
+            if (startYUnits != yUnits)
             {
             {
-                SetScrollbars(ppuX, ppuY, sx, sy, 0, y);
+                SetScrollbars(ppuX, ppuY, sxUnits, syUnits, 0, yUnits);
                 scrolled = true;
             }
         }
                 scrolled = true;
             }
         }
@@ -747,11 +753,11 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode)
             // Make it scroll so this item is at the top
             // of the window
             int y = rect.y ;
             // Make it scroll so this item is at the top
             // of the window
             int y = rect.y ;
-            y = (int) (0.5 + y/ppuY);
+            int yUnits = (int) (0.5 + ((float) y)/(float) ppuY);
 
 
-            if (startY != y)
+            if (startYUnits != yUnits)
             {
             {
-                SetScrollbars(ppuX, ppuY, sx, sy, 0, y);
+                SetScrollbars(ppuX, ppuY, sxUnits, syUnits, 0, yUnits);
                 scrolled = true;
             }
         }
                 scrolled = true;
             }
         }
@@ -764,11 +770,11 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode)
             // Make it scroll so this item is at the top
             // of the window
             int y = rect.y ;
             // Make it scroll so this item is at the top
             // of the window
             int y = rect.y ;
-            y = (int) (0.5 + y/ppuY);
+            int yUnits = (int) (0.5 + ((float) y)/(float) ppuY);
 
 
-            if (startY != y)
+            if (startYUnits != yUnits)
             {
             {
-                SetScrollbars(ppuX, ppuY, sx, sy, 0, y);
+                SetScrollbars(ppuX, ppuY, sxUnits, syUnits, 0, yUnits);
                 scrolled = true;
             }
         }
                 scrolled = true;
             }
         }
@@ -777,11 +783,15 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode)
             // Make it scroll so this item is at the bottom
             // of the window
             int y = rect.y - (clientSize.y - rect.height);
             // Make it scroll so this item is at the bottom
             // of the window
             int y = rect.y - (clientSize.y - rect.height);
-            y = (int) (0.5 + y/ppuY);
+            int yUnits = (int) (0.5 + ((float) y)/(float) ppuY);
+
+            // If we're still off the screen, scroll another line down
+            if ((rect.y + rect.height) > (clientSize.y + (yUnits*ppuY)))
+                yUnits ++;
 
 
-            if (startY != y)
+            if (startYUnits != yUnits)
             {
             {
-                SetScrollbars(ppuX, ppuY, sx, sy, 0, y);
+                SetScrollbars(ppuX, ppuY, sxUnits, syUnits, 0, yUnits);
                 scrolled = true;
             }
         }
                 scrolled = true;
             }
         }
@@ -1439,19 +1449,20 @@ void wxRichTextCtrl::SetupScrollbars(bool atTop)
 
     // TODO: reimplement scrolling so we scroll by line, not by fixed number
     // of pixels. See e.g. wxVScrolledWindow for ideas.
 
     // TODO: reimplement scrolling so we scroll by line, not by fixed number
     // of pixels. See e.g. wxVScrolledWindow for ideas.
-    int pixelsPerUnit = 5; // 10;
+    int pixelsPerUnit = 5;
     wxSize clientSize = GetClientSize();
 
     int maxHeight = GetBuffer().GetCachedSize().y;
 
     wxSize clientSize = GetClientSize();
 
     int maxHeight = GetBuffer().GetCachedSize().y;
 
-    int unitsY = maxHeight/pixelsPerUnit;
+    // Round up so we have at least maxHeight pixels
+    int unitsY = (int) (((float)maxHeight/(float)pixelsPerUnit) + 0.5);
 
     int startX = 0, startY = 0;
     if (!atTop)
         GetViewStart(& startX, & startY);
 
     int maxPositionX = 0; // wxMax(sz.x - clientSize.x, 0);
 
     int startX = 0, startY = 0;
     if (!atTop)
         GetViewStart(& startX, & startY);
 
     int maxPositionX = 0; // wxMax(sz.x - clientSize.x, 0);
-    int maxPositionY = (wxMax(maxHeight - clientSize.y, 0))/pixelsPerUnit;
+    int maxPositionY = (int) ((((float)(wxMax((unitsY*pixelsPerUnit) - clientSize.y, 0)))/((float)pixelsPerUnit)) + 0.5);
 
     // Move to previous scroll position if
     // possible
 
     // Move to previous scroll position if
     // possible