diff options
author | Neil <nyamatongwe@gmail.com> | 2022-09-29 13:46:49 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2022-09-29 13:46:49 +1000 |
commit | 2873f7302a29c5e60317e24f973713d658081bb0 (patch) | |
tree | fa6b791881a5d8a39447d561ba053f0258a00414 | |
parent | a68a99a856e6818e4269b03c3fd97d84bf98d165 (diff) | |
download | scintilla-mirror-2873f7302a29c5e60317e24f973713d658081bb0.tar.gz |
Ensure page and step clicks on horizontal scroll bar do not overshoot document width.
-rw-r--r-- | doc/ScintillaHistory.html | 3 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 37 |
2 files changed, 28 insertions, 12 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index c14fcc59a..5b6b21158 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -601,6 +601,9 @@ On Win32 implement horizontal scrolling mouse wheel. <a href="https://sourceforge.net/p/scintilla/feature-requests/1450/">Feature #1450</a>. </li> + <li> + On Win32 ensure page and step clicks on horizontal scroll bar do not overshoot document width. + </li> </ul> <h3> <a href="https://www.scintilla.org/scintilla530.zip">Release 5.3.0</a> diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 9f1cbe53f..5f989b781 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -276,6 +276,11 @@ public: } }; +struct HorizontalScrollRange { + int pageWidth; + int documentWidth; +}; + } namespace Scintilla::Internal { @@ -404,6 +409,8 @@ class ScintillaWin : void UpdateSystemCaret() override; void SetVerticalScrollPos() override; void SetHorizontalScrollPos() override; + void HorizontalScrollToClamped(int xPos); + HorizontalScrollRange GetHorizontalScrollRange() const; bool ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) override; void NotifyChange() override; void NotifyFocus(bool focus) override; @@ -2368,6 +2375,20 @@ bool ScintillaWin::ChangeScrollRange(int nBar, int nMin, int nMax, UINT nPage) n return false; } +void ScintillaWin::HorizontalScrollToClamped(int xPos) { + const HorizontalScrollRange range = GetHorizontalScrollRange(); + HorizontalScrollTo(std::clamp(xPos, 0, range.documentWidth - range.pageWidth + 1)); +} + +HorizontalScrollRange ScintillaWin::GetHorizontalScrollRange() const { + const PRectangle rcText = GetTextRectangle(); + int pageWidth = static_cast<int>(rcText.Width()); + const int horizEndPreferred = std::max({ scrollWidth, pageWidth - 1, 0 }); + if (!horizontalScrollBarVisible || Wrapping()) + pageWidth = horizEndPreferred + 1; + return { pageWidth, horizEndPreferred }; +} + bool ScintillaWin::ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) { if (!IsVisible()) { return false; @@ -2380,15 +2401,10 @@ bool ScintillaWin::ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) { if (ChangeScrollRange(SB_VERT, 0, static_cast<int>(vertEndPreferred), static_cast<unsigned int>(nPage))) { modified = true; } - - const PRectangle rcText = GetTextRectangle(); - int pageWidth = static_cast<int>(rcText.Width()); - const int horizEndPreferred = std::max({scrollWidth, pageWidth - 1, 0}); - if (!horizontalScrollBarVisible || Wrapping()) - pageWidth = horizEndPreferred + 1; - if (ChangeScrollRange(SB_HORZ, 0, horizEndPreferred, pageWidth)) { + const HorizontalScrollRange range = GetHorizontalScrollRange(); + if (ChangeScrollRange(SB_HORZ, 0, range.documentWidth, range.pageWidth)) { modified = true; - if (scrollWidth < pageWidth) { + if (scrollWidth < range.pageWidth) { HorizontalScrollTo(0); } } @@ -3231,9 +3247,6 @@ void ScintillaWin::HorizontalScrollMessage(WPARAM wParam) { break; case SB_PAGEDOWN: xPos += pageWidth; - if (xPos > scrollWidth - rcText.Width()) { // Hit the end exactly - xPos = scrollWidth - static_cast<int>(rcText.Width()); - } break; case SB_TOP: xPos = 0; @@ -3253,7 +3266,7 @@ void ScintillaWin::HorizontalScrollMessage(WPARAM wParam) { } break; } - HorizontalScrollTo(xPos); + HorizontalScrollToClamped(xPos); } /** |