#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"
RecreateBuffer(size);
SetCursor(wxCursor(wxCURSOR_IBEAM));
-
+
if (!value.IsEmpty())
SetValue(value);
m_caretAtLineStart = false;
m_selectionRange.SetRange(-2, -2);
+ SetScrollbars(0, 0, 0, 0, 0, 0);
+
if (m_freezeCount == 0)
{
SetupScrollbars();
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();
// 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;
}
}
// 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;
}
}
// 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;
}
}
// 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;
}
}
// 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
{
wxClientDC dc((wxRichTextCtrl*) this);
((wxRichTextCtrl*)this)->PrepareDC(dc);
-
+
// Buffer uses logical position (relative to start of buffer)
// so convert
wxPoint pt2 = GetLogicalPoint(pt);
const wxTextAttr& wxRichTextCtrl::GetDefaultStyle() const
{
- return GetBuffer().GetDefaultStyle();
+ return GetBuffer().GetDefaultStyle();
}
bool wxRichTextCtrl::GetStyle(long position, wxTextAttr& style) const