diff options
| -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);  }  /**  | 
