From ff0ac260ef1740529862aba813127359f292ecf6 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Wed, 21 Jan 2009 12:05:11 +0000 Subject: [PATCH] wxRTC now properly honours margin size Added wxRE_CENTRE_CARET style to centre the caret line vertically git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@58256 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 22 +++++++------ docs/latex/wx/richtextctrl.tex | 11 ++++++- include/wx/richtext/richtextctrl.h | 2 ++ src/richtext/richtextctrl.cpp | 53 ++++++++++++++++++++++++++---- 4 files changed, 71 insertions(+), 17 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index bbe8c47fec..60ee92489c 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -104,19 +104,21 @@ All: All (GUI): -- Fixed wxRichTextCtrl input that uses Alt on Mac OS X, for example - Polish Pro input. +- wxRTC: fixed input that uses Alt on Mac OS X, for example Polish Pro input. Also fixed a bug whereby e.g. Croatian keys didn't work, by moving more code to key down handler. -- Fixed a problem with HTML list generation for wxRichTextCtrl. -- wxRichTextCtrl no longer deletes a character when content is selected - before pressing Delete. -- Fixed inability to select no superscript and no subscript in wxRichTextCtrl's +- wxRTC: fixed a problem with HTML list generation. +- wxRTC: no longer deletes a character when content is selected before + pressing Delete. +- wxRTC: fixed inability to select no superscript and no subscript in formatting dialog. -- Fixed centering and right-justification when combined with left indentation. -- Fixed lack of right margin when centering or right-justifying in a wxRTC. -- Fixed wrong wxRTC descent when wrapping lines with different font sizes. -- Fixed wrapping problem for long lines. +- wxRTC: fixed centering and right-justification when combined with left + indentation. +- wxRTC: fixed lack of right margin when centering or right-justifying. +- wxRTC: fixed wrong descent when wrapping lines with different font sizes. +- wxRTC: fixed wrapping problem for long lines. +- wxRTC: all buffer margins now respected. +- wxRTC: Added wxRE_CENTRE_CARET to centre the caret line vertically. - Fixed wxHTML's pagebreaks computation in tables (D.J.Stauffer). - Fixed wxHtmlWindow::SelectionToText() to correctly insert newlines after single-cell paragraphs. diff --git a/docs/latex/wx/richtextctrl.tex b/docs/latex/wx/richtextctrl.tex index 76bfa45b1e..610d77e8f3 100644 --- a/docs/latex/wx/richtextctrl.tex +++ b/docs/latex/wx/richtextctrl.tex @@ -17,7 +17,16 @@ wxTextCtrlBase -\wxheading{Data structures} +\wxheading{Window styles} + +\twocolwidtha{5cm} +\begin{twocollist}\itemsep=0pt +\twocolitem{\windowstyle{wxRE\_READONLY}}{The text will not be user-editable.} +\twocolitem{\windowstyle{wxRE\_CENTRE\_CARET}}{The control will try to keep the current caret line centred vertically.} +\twocolitem{\windowstyle{wxRE\_CENTER\_CARET}}{The same as wxRE\_CENTRE\_CARET.} +\end{twocollist} + +See also \helpref{window styles overview}{windowstyles}. \latexignore{\rtfignore{\wxheading{Members}}} diff --git a/include/wx/richtext/richtextctrl.h b/include/wx/richtext/richtextctrl.h index b10cc7fe0e..493fefc2a9 100644 --- a/include/wx/richtext/richtextctrl.h +++ b/include/wx/richtext/richtextctrl.h @@ -38,6 +38,8 @@ class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextStyleDefinition; #define wxRE_READONLY 0x0010 #define wxRE_MULTILINE 0x0020 +#define wxRE_CENTRE_CARET 0x8000 +#define wxRE_CENTER_CARET wxRE_CENTRE_CARET /* Flags */ diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index a19859f306..9aa77be824 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -216,6 +216,9 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } + // No physical scrolling, so we can preserve margins + EnableScrolling(false, false); + if (style & wxTE_READONLY) SetEditable(false); @@ -388,8 +391,18 @@ void wxRichTextCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) SetupScrollbars(); } + wxRect clipRect(availableSpace); + clipRect.x += GetBuffer().GetLeftMargin(); + clipRect.y += GetBuffer().GetTopMargin(); + clipRect.width -= (GetBuffer().GetLeftMargin() + GetBuffer().GetRightMargin()); + clipRect.height -= (GetBuffer().GetTopMargin() + GetBuffer().GetBottomMargin()); + clipRect.SetPosition(GetLogicalPoint(clipRect.GetPosition())); + dc.SetClippingRegion(clipRect); + GetBuffer().Draw(dc, GetBuffer().GetRange(), GetInternalSelectionRange(), drawingArea, 0 /* descent */, 0 /* flags */); + dc.DestroyClippingRegion(); + #if wxRICHTEXT_USE_OWN_CARET if (GetCaret()->IsVisible()) { @@ -1224,6 +1237,27 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode) bool scrolled = false; wxSize clientSize = GetClientSize(); + clientSize.y -= GetBuffer().GetBottomMargin(); + + if (GetWindowStyle() & wxRE_CENTRE_CARET) + { + int y = rect.y - GetClientSize().y/2; + int yUnits = (int) (0.5 + ((float) y)/(float) ppuY); + if (y >= 0 && (y + clientSize.y) < GetBuffer().GetCachedSize().y) + { + if (startYUnits != yUnits) + { + SetScrollbars(ppuX, ppuY, sxUnits, syUnits, 0, yUnits); + scrolled = true; + } +#if !wxRICHTEXT_USE_OWN_CARET + if (scrolled) +#endif + PositionCaret(); + + return scrolled; + } + } // Going down if (keyCode == WXK_DOWN || keyCode == WXK_NUMPAD_DOWN || @@ -1248,11 +1282,11 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode) scrolled = true; } } - else if (rect.y < startY) + else if (rect.y < (startY + GetBuffer().GetTopMargin())) { // Make it scroll so this item is at the top // of the window - int y = rect.y ; + int y = rect.y - GetBuffer().GetTopMargin(); int yUnits = (int) (0.5 + ((float) y)/(float) ppuY); if (startYUnits != yUnits) @@ -1268,11 +1302,11 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode) keyCode == WXK_HOME || keyCode == WXK_NUMPAD_HOME || keyCode == WXK_PAGEUP || keyCode == WXK_NUMPAD_PAGEUP ) { - if (rect.y < startY) + if (rect.y < (startY + GetBuffer().GetBottomMargin())) { // Make it scroll so this item is at the top // of the window - int y = rect.y ; + int y = rect.y - GetBuffer().GetTopMargin(); int yUnits = (int) (0.5 + ((float) y)/(float) ppuY); if (startYUnits != yUnits) @@ -1326,8 +1360,9 @@ bool wxRichTextCtrl::IsPositionVisible(long pos) const wxRect rect = line->GetRect(); wxSize clientSize = GetClientSize(); + clientSize.y -= GetBuffer().GetBottomMargin(); - return (rect.GetBottom() > startY) && (rect.GetTop() < (startY + clientSize.y)); + return (rect.GetBottom() > (startY + GetBuffer().GetTopMargin())) && (rect.GetTop() < (startY + clientSize.y)); } void wxRichTextCtrl::SetCaretPosition(long position, bool showAtLineStart) @@ -1974,7 +2009,7 @@ void wxRichTextCtrl::SetupScrollbars(bool atTop) int pixelsPerUnit = 5; wxSize clientSize = GetClientSize(); - int maxHeight = GetBuffer().GetCachedSize().y; + int maxHeight = GetBuffer().GetCachedSize().y + GetBuffer().GetTopMargin(); // Round up so we have at least maxHeight pixels int unitsY = (int) (((float)maxHeight/(float)pixelsPerUnit) + 0.5); @@ -2941,6 +2976,12 @@ void wxRichTextCtrl::PositionCaret() GetCaret()->Hide(); if (GetCaret()->GetSize() != newSz) GetCaret()->SetSize(newSz); + + int halfSize = newSz.y/2; + // If the caret is beyond the margin, hide it by moving it out of the way + if (((pt.y + halfSize) < GetBuffer().GetTopMargin()) || ((pt.y + halfSize) > (GetClientSize().y - GetBuffer().GetBottomMargin()))) + pt.y = -200; + GetCaret()->Move(pt); GetCaret()->Show(); }