X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/234b1c01470c3e88931f97bb7ed4fdceead196bf..88a7a4e10ed18f81a576dcd866cfbf02bf404c00:/src/generic/vscroll.cpp?ds=sidebyside diff --git a/src/generic/vscroll.cpp b/src/generic/vscroll.cpp index 083e26c801..609d6e0f52 100644 --- a/src/generic/vscroll.cpp +++ b/src/generic/vscroll.cpp @@ -24,6 +24,10 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/sizer.h" +#endif + #include "wx/vscroll.h" // ---------------------------------------------------------------------------- @@ -171,6 +175,25 @@ void wxVScrolledWindow::UpdateScrollbar() h += OnGetLineHeight(line); } + // if we still have remaining space below, maybe we can fit everything? + if ( h < hWindow ) + { + wxCoord hAll = h; + for ( size_t lineFirst = m_lineFirst; lineFirst > 0; lineFirst-- ) + { + hAll += OnGetLineHeight(m_lineFirst - 1); + if ( hAll > hWindow ) + break; + } + + if ( hAll < hWindow ) + { + // we don't need scrollbar at all + m_lineFirst = 0; + SetScrollbar(wxVERTICAL, 0, 0, 0); + } + } + m_nVisible = line - m_lineFirst; int pageSize = m_nVisible; @@ -263,6 +286,27 @@ void wxVScrolledWindow::RefreshAll() Refresh(); } +bool wxVScrolledWindow::Layout() +{ + if ( GetSizer() ) + { + // adjust the sizer dimensions/position taking into account the + // virtual size and scrolled position of the window. + + int w, h; + GetVirtualSize(&w, &h); + + // x is always 0 so no variable needed + int y = -GetLinesHeight(0, GetFirstVisibleLine()); + + GetSizer()->SetDimension(0, y, w, h); + return true; + } + + // fall back to default for LayoutConstraints + return wxPanel::Layout(); +} + int wxVScrolledWindow::HitTest(wxCoord WXUNUSED(x), wxCoord y) const { const size_t lineMax = GetVisibleEnd();