X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ae0f022346389cf69cc5bd9f8b1409a49d61358b..29c99ad3597ad722ed540b1e600f3ae3afe0f872:/src/generic/vscroll.cpp?ds=inline diff --git a/src/generic/vscroll.cpp b/src/generic/vscroll.cpp index 1b346e8077..fa8bf24b05 100644 --- a/src/generic/vscroll.cpp +++ b/src/generic/vscroll.cpp @@ -17,6 +17,17 @@ // headers // ---------------------------------------------------------------------------- +#if defined(__GNUG__) && !defined(__APPLE__) +#pragma implementation "vscroll.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + #include "wx/vscroll.h" // ---------------------------------------------------------------------------- @@ -53,6 +64,38 @@ void wxVScrolledWindow::Init() // various helpers // ---------------------------------------------------------------------------- +wxCoord wxVScrolledWindow::EstimateTotalHeight() const +{ + // estimate the total height: it is impossible to call + // OnGetLineHeight() for every line because there may be too many of + // them, so we just make a guess using some lines in the beginning, + // some in the end and some in the middle + static const size_t NUM_LINES_TO_SAMPLE = 10; + + wxCoord heightTotal; + if ( m_lineMax < 3*NUM_LINES_TO_SAMPLE ) + { + // in this case calculating exactly is faster and more correct than + // guessing + heightTotal = GetLinesHeight(0, m_lineMax); + } + else // too many lines to calculate exactly + { + // look at some lines in the beginning/middle/end + heightTotal = + GetLinesHeight(0, NUM_LINES_TO_SAMPLE) + + GetLinesHeight(m_lineMax - NUM_LINES_TO_SAMPLE, m_lineMax) + + GetLinesHeight(m_lineMax/2 - NUM_LINES_TO_SAMPLE/2, + m_lineMax/2 + NUM_LINES_TO_SAMPLE/2); + + // use the height of the lines we looked as the average + heightTotal = (wxCoord) + (((float)m_heightTotal / (3*NUM_LINES_TO_SAMPLE)) * m_lineMax); + } + + return heightTotal; +} + wxCoord wxVScrolledWindow::GetLinesHeight(size_t lineMin, size_t lineMax) const { if ( lineMin == lineMax ) @@ -147,33 +190,8 @@ void wxVScrolledWindow::SetLineCount(size_t count) // save the number of lines m_lineMax = count; - - // estimate the total height: it is impossible to call - // OnGetLineHeight() for every line because there may be too many of - // them, so we just make a guess using some lines in the beginning, - // some in the end and some in the middle - static const size_t NUM_LINES_TO_SAMPLE = 10; - - if ( count < 3*NUM_LINES_TO_SAMPLE ) - { - // in this case calculating exactly is faster and more correct than - // guessing - m_heightTotal = GetLinesHeight(0, m_lineMax); - } - else // too many lines to calculate exactly - { - // look at some lines in the beginning/middle/end - m_heightTotal = - GetLinesHeight(0, NUM_LINES_TO_SAMPLE) + - GetLinesHeight(count - NUM_LINES_TO_SAMPLE, count) + - GetLinesHeight(count/2 - NUM_LINES_TO_SAMPLE/2, - count/2 + NUM_LINES_TO_SAMPLE/2); - - // use the height of the lines we looked as the average - m_heightTotal = (wxCoord) - (((float)m_heightTotal / (3*NUM_LINES_TO_SAMPLE)) * m_lineMax); - } - + // and our estimate for their total height + m_heightTotal = EstimateTotalHeight(); // recalculate the scrollbars parameters m_lineFirst = 1; // make sure it is != 0 @@ -222,7 +240,7 @@ void wxVScrolledWindow::RefreshLines(size_t from, size_t to) rect.y += OnGetLineHeight(nBefore); } - for ( size_t nBetween = from; nBetween < to; nBetween++ ) + for ( size_t nBetween = from; nBetween <= to; nBetween++ ) { rect.height += OnGetLineHeight(nBetween); }