]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextctrl.cpp
updates from Adrián González Alba
[wxWidgets.git] / src / richtext / richtextctrl.cpp
index 0bb40c3e34eed5e522e74df85844a8a25941ba54..c312aed560f796ba1f02dcdc067ad60e08dd6cf7 100644 (file)
 #include "wx/richtext/richtextctrl.h"
 
 #ifndef WX_PRECOMP
-    #include "wx/wx.h"
     #include "wx/settings.h"
+    #include "wx/menu.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/stopwatch.h"
 #endif
 
 #include "wx/textfile.h"
@@ -155,7 +158,7 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va
     RecreateBuffer(size);
 
     SetCursor(wxCursor(wxCURSOR_IBEAM));
-    
+
     if (!value.IsEmpty())
         SetValue(value);
 
@@ -212,6 +215,8 @@ void wxRichTextCtrl::Clear()
     m_caretAtLineStart = false;
     m_selectionRange.SetRange(-2, -2);
 
+    SetScrollbars(0, 0, 0, 0, 0, 0);
+
     if (m_freezeCount == 0)
     {
         SetupScrollbars();
@@ -709,16 +714,16 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode)
     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);
-    sx = 0;
+    int sxUnits = 0;
+    int syUnits = 0;
     if (ppuY != 0)
-        sy = sy/ppuY;
+        syUnits = sy/ppuY;
 
     wxRect rect = line->GetRect();
 
@@ -734,11 +739,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);
-            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;
             }
         }
@@ -747,11 +756,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 ;
-            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;
             }
         }
@@ -764,11 +773,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 ;
-            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;
             }
         }
@@ -777,11 +786,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);
-            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;
             }
         }
@@ -1439,19 +1452,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.
-    int pixelsPerUnit = 5; // 10;
+    int pixelsPerUnit = 5;
     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 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
@@ -1634,7 +1648,7 @@ wxRichTextCtrl::HitTest(const wxPoint& pt,
 {
     wxClientDC dc((wxRichTextCtrl*) this);
     ((wxRichTextCtrl*)this)->PrepareDC(dc);
-    
+
     // Buffer uses logical position (relative to start of buffer)
     // so convert
     wxPoint pt2 = GetLogicalPoint(pt);
@@ -2211,7 +2225,7 @@ const wxTextAttrEx& wxRichTextCtrl::GetDefaultStyleEx() const
 
 const wxTextAttr& wxRichTextCtrl::GetDefaultStyle() const
 {
-    return GetBuffer().GetDefaultStyle();    
+    return GetBuffer().GetDefaultStyle();
 }
 
 bool wxRichTextCtrl::GetStyle(long position, wxTextAttr& style) const