Returns the index of the first currently visible line.
+This is same as \helpref{GetVisibleBegin}{wxvscrolledwindowgetvisiblebegin} and
+exists only for symmetry with \helpref{GetLastVisibleLine}{wxvscrolledwindowgetlastvisibleline}.
+
\membersection{wxVScrolledWindow::GetLastVisibleLine}\label{wxvscrolledwindowgetlastvisibleline}
\constfunc{size\_t}{GetLastVisibleLine}{\void}
-Returns the index of the last currently visible line.
+Returns the index of the last currently visible line. Note that this method
+returns \texttt{(size\_t)-1} (i.e. a huge positive number) if the control is
+empty so if this is possible you should use \helpref{GetVisibleEnd}{wxvscrolledwindowgetvisibleend}
+instead.
+
+\wxheading{See also}
+
+\helpref{GetFirstVisibleLine}{wxvscrolledwindowgetfirstvisibleline}
\membersection{wxVScrolledWindow::GetLineCount}\label{wxvscrolledwindowgetlinecount}
\helpref{SetLineCount()}{wxvscrolledwindowsetlinecount})
+\membersection{wxVScrolledWindow::GetVisibleBegin}\label{wxvscrolledwindowgetvisiblebegin}
+
+\constfunc{size\_t}{GetVisibleBegin}{\void}
+
+Returns the index of the first currently visible line.
+
+\wxheading{See also}
+
+\helpref{GetVisibleEnd}{wxvscrolledwindowgetvisibleend}
+
+
+\membersection{wxVScrolledWindow::GetVisibleEnd}\label{wxvscrolledwindowgetvisibleend}
+
+\constfunc{size\_t}{GetVisibleEnd}{\void}
+
+Returns the index of the first line after the currently visible one. If the
+return value is $0$ it means that no lines are currently shown (which only
+happens if the control is empty). Note that the index returned by this method
+is not always a valid index as it may be equal to \helpref{GetLineCount}{wxvscrolledwindowsetlinecount}.
+
+\wxheading{See also}
+
+\helpref{GetVisibleBegin}{wxvscrolledwindowgetvisiblebegin}
+
+
\membersection{wxVScrolledWindow::HitTest}\label{wxvscrolledwindowhittest}
\constfunc{int}{HitTest}{\param{wxCoord }{x}, \param{wxCoord }{y}}
size_t GetLineCount() const { return m_lineMax; }
// get the first currently visible line
- size_t GetFirstVisibleLine() const { return m_lineFirst; }
+ size_t GetVisibleBegin() const { return m_lineFirst; }
- // get the last currently visible line
- size_t GetLastVisibleLine() const { return m_lineFirst + m_nVisible - 1; }
+ // get the first currently visible line
+ size_t GetVisibleEnd() const { return m_lineFirst + m_nVisible; }
// is this line currently visible?
bool IsVisible(size_t line) const
- { return line >= m_lineFirst && line <= GetLastVisibleLine(); }
+ { return line >= GetVisibleBegin() && line < GetVisibleEnd(); }
+
+
+ // this is the same as GetVisibleBegin(), exists to match
+ // GetLastVisibleLine() and for backwards compatibility only
+ size_t GetFirstVisibleLine() const { return m_lineFirst; }
+
+ // get the last currently visible line
+ //
+ // this function is unsafe as it returns (size_t)-1 (i.e. a huge positive
+ // number) if the control is empty, use GetVisibleEnd() instead, this one
+ // is kept for backwards compatibility
+ size_t GetLastVisibleLine() const { return GetVisibleEnd() - 1; }
protected:
wxRect rect;
rect.width = GetClientSize().x;
rect.height = OnGetLineHeight(line);
- for ( size_t n = GetFirstVisibleLine(); n < line; n++ )
+ for ( size_t n = GetVisibleBegin(); n < line; n++ )
{
rect.y += OnGetLineHeight(n);
}
// clump the range to just the visible lines -- it is useless to refresh
// the other ones
- if ( from < GetFirstVisibleLine() )
- from = GetFirstVisibleLine();
+ if ( from < GetVisibleBegin() )
+ from = GetVisibleBegin();
- if ( to > GetLastVisibleLine() )
- to = GetLastVisibleLine();
+ if ( to >= GetVisibleEnd() )
+ to = GetVisibleEnd();
+ else
+ to++;
// calculate the rect occupied by these lines on screen
wxRect rect;
rect.width = GetClientSize().x;
- for ( size_t nBefore = GetFirstVisibleLine(); nBefore < from; nBefore++ )
+ for ( size_t nBefore = GetVisibleBegin(); nBefore < from; nBefore++ )
{
rect.y += OnGetLineHeight(nBefore);
}
- for ( size_t nBetween = from; nBetween <= to; nBetween++ )
+ for ( size_t nBetween = from; nBetween < to; nBetween++ )
{
rect.height += OnGetLineHeight(nBetween);
}
int wxVScrolledWindow::HitTest(wxCoord WXUNUSED(x), wxCoord y) const
{
- const size_t lineMax = GetLastVisibleLine();
- for ( size_t line = GetFirstVisibleLine(); line <= lineMax; line++ )
+ const size_t lineMax = GetVisibleEnd();
+ for ( size_t line = GetVisibleBegin(); line < lineMax; line++ )
{
y -= OnGetLineHeight(line);
if ( y < 0 )
// remember the currently shown lines for the refresh code below
- size_t lineFirstOld = GetFirstVisibleLine(),
- lineLastOld = GetLastVisibleLine();
+ size_t lineFirstOld = GetVisibleBegin(),
+ lineLastOld = GetVisibleEnd();
m_lineFirst = line;
// finally refresh the display -- but only redraw as few lines as possible
// to avoid flicker
- if ( GetFirstVisibleLine() > lineLastOld ||
- GetLastVisibleLine() < lineFirstOld )
+ if ( GetVisibleBegin() >= lineLastOld ||
+ GetVisibleEnd() <= lineFirstOld )
{
// the simplest case: we don't have any old lines left, just redraw
// everything
}
else // overlap between the lines we showed before and should show now
{
- ScrollWindow(0, GetLinesHeight(GetFirstVisibleLine(), lineFirstOld));
+ ScrollWindow(0, GetLinesHeight(GetVisibleBegin(), lineFirstOld));
}
return true;
int line;
if ( pages > 0 )
{
- line = GetLastVisibleLine();
+ line = GetVisibleEnd();
+ if ( line )
+ line--;
pages--;
}
else // pages < 0
{
- line = FindFirstFromBottom(GetFirstVisibleLine());
+ line = FindFirstFromBottom(GetVisibleBegin());
pages++;
}
}
else if ( evtType == wxEVT_SCROLLWIN_PAGEDOWN )
{
- lineFirstNew = GetLastVisibleLine();
+ lineFirstNew = GetVisibleEnd();
+ if ( lineFirstNew )
+ lineFirstNew--;
}
else if ( evtType == wxEVT_SCROLLWIN_THUMBRELEASE )
{