From: Jaakko Salli Date: Sun, 28 Feb 2010 10:16:49 +0000 (+0000) Subject: Sometimes change in varscrollable window's size can result in unused empty space... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0fa9b2ed61307e4cc7ccf19441b1c047daee2a7f Sometimes change in varscrollable window's size can result in unused empty space after the last item. Fix it by decrementing first visible item position as long there is available space (fixes #11758). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63570 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/generic/vscroll.cpp b/src/generic/vscroll.cpp index 7ce1079c42..809ae48576 100644 --- a/src/generic/vscroll.cpp +++ b/src/generic/vscroll.cpp @@ -674,6 +674,39 @@ bool wxVarScrollHelperBase::DoScrollPages(int pages) void wxVarScrollHelperBase::HandleOnSize(wxSizeEvent& event) { + if ( m_unitMax ) + { + // sometimes change in varscrollable window's size can result in + // unused empty space after the last item. Fix it by decrementing + // first visible item position according to the available space. + + // determine free space + const wxCoord sWindow = GetOrientationTargetSize(); + wxCoord s = 0; + size_t unit; + for ( unit = m_unitFirst; unit < m_unitMax; ++unit ) + { + if ( s > sWindow ) + break; + + s += OnGetUnitSize(unit); + } + wxCoord freeSpace = sWindow - s; + + // decrement first visible item index as long as there is free space + size_t idealUnitFirst; + for ( idealUnitFirst = m_unitFirst; + idealUnitFirst > 0; + idealUnitFirst-- ) + { + wxCoord us = OnGetUnitSize(idealUnitFirst-1); + if ( freeSpace < us ) + break; + freeSpace -= us; + } + m_unitFirst = idealUnitFirst; + } + UpdateScrollbar(); event.Skip();