aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/ScintillaWin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win32/ScintillaWin.cxx')
-rw-r--r--win32/ScintillaWin.cxx37
1 files changed, 25 insertions, 12 deletions
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);
}
/**