X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cf7d6329530d0a9f181ac24dcc722d276885f05e..b9efe021b554fa3967d1442cf758435c5cd5ae8f:/include/wx/vscroll.h diff --git a/include/wx/vscroll.h b/include/wx/vscroll.h index 9bf5cce2d9..5ac9a142c0 100644 --- a/include/wx/vscroll.h +++ b/include/wx/vscroll.h @@ -5,13 +5,17 @@ // Modified by: // Created: 30.05.03 // RCS-ID: $Id$ -// Copyright: (c) 2003 Vadim Zeitlin +// Copyright: (c) 2003 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_VSCROLL_H_ #define _WX_VSCROLL_H_ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) +#pragma interface "vscroll.h" +#endif + #include "wx/panel.h" // base class // ---------------------------------------------------------------------------- @@ -32,7 +36,7 @@ horizontal scrolling; it can't scroll another window nor only a rectangle of the window and not its entire client area. */ -class wxVScrolledWindow : public wxPanel +class WXDLLEXPORT wxVScrolledWindow : public wxPanel { public: // constructors and such @@ -62,7 +66,7 @@ public: // just as with the ctor above, wxVSCROLL style is always used, there is no // need to specify it bool Create(wxWindow *parent, - wxWindowID id, + wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, @@ -90,6 +94,21 @@ public: virtual bool ScrollLines(int lines); virtual bool ScrollPages(int pages); + // redraw the specified line + virtual void RefreshLine(size_t line); + + // redraw all lines in the specified range (inclusive) + virtual void RefreshLines(size_t from, size_t to); + + // return the item at the specified (in physical coordinates) position or. + + // wxNOT_FOUND if none, i.e. if it is below the last item + int HitTest(wxCoord x, wxCoord y) const; + int HitTest(const wxPoint& pt) const { return HitTest(pt.x, pt.y); } + + // recalculate all our parameters and redisplay all lines + virtual void RefreshAll(); + // accessors // --------- @@ -99,13 +118,29 @@ public: size_t GetLineCount() const { return m_lineMax; } // get the first currently visible line + size_t GetVisibleBegin() const { return m_lineFirst; } + + // 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 >= 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 - size_t GetLastVisibleLine() const { return m_lineFirst + m_nVisible - 1; } + // + // 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: +protected: // this function must be overridden in the derived class and it should // return the height of the given line in pixels virtual wxCoord OnGetLineHeight(size_t n) const = 0; @@ -123,16 +158,30 @@ public: // // finally note that lineMin is inclusive, while lineMax is exclusive, as // usual - virtual void OnGetLinesHint(size_t lineMin, size_t lineMax) const { } + virtual void OnGetLinesHint(size_t WXUNUSED(lineMin), + size_t WXUNUSED(lineMax)) const { } + + // when the number of lines changes, we try to estimate the total height + // of all lines which is a rather expensive operation in terms of lines + // access, so if the user code may estimate the average height + // better/faster than we do, it should override this function to implement + // its own logic + // + // this function should return the best guess for the total height it may + // make + virtual wxCoord EstimateTotalHeight() const; + -protected: // the event handlers void OnSize(wxSizeEvent& event); void OnScroll(wxScrollWinEvent& event); +#if wxUSE_MOUSEWHEEL + void OnMouseWheel(wxMouseEvent& event); +#endif // find the index of the line we need to show at the top of the window such - // that the last line shown is the given one - size_t FindFirstFromBottom(size_t lineLast); + // that the last (fully or partially) visible line is the given one + size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false); // get the total height of the lines between lineMin (inclusive) and // lineMax (exclusive) @@ -159,8 +208,14 @@ private: // partly, visible one) size_t m_nVisible; + // accumulated mouse wheel rotation +#if wxUSE_MOUSEWHEEL + int m_sumWheelRotation; +#endif DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxVScrolledWindow) + DECLARE_ABSTRACT_CLASS(wxVScrolledWindow) }; #endif // _WX_VSCROLL_H_