X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..d154ab3d291c0c1463d77818f07fb8a5bfe6bfb0:/include/wx/scrolwin.h diff --git a/include/wx/scrolwin.h b/include/wx/scrolwin.h index 486050a29d..e7660e93ea 100644 --- a/include/wx/scrolwin.h +++ b/include/wx/scrolwin.h @@ -12,30 +12,54 @@ #ifndef _WX_SCROLWIN_H_BASE_ #define _WX_SCROLWIN_H_BASE_ -#include "wx/window.h" +#include "wx/panel.h" -class WXDLLEXPORT wxScrollHelperEvtHandler; -class WXDLLEXPORT wxTimer; +class WXDLLIMPEXP_FWD_CORE wxScrollHelperEvtHandler; +class WXDLLIMPEXP_FWD_CORE wxTimer; + +// default scrolled window style: scroll in both directions +#define wxScrolledWindowStyle (wxHSCROLL | wxVSCROLL) // ---------------------------------------------------------------------------- -// wxScrollHelper: this class implements the scrolling logic which is used by -// wxScrolledWindow and wxScrolledControl. It is a mix-in: just derive from it -// to implement scrolling in your class. +// The hierarchy of scrolling classes is a bit complicated because we want to +// put as much functionality as possible in a mix-in class not deriving from +// wxWindow so that other classes could derive from the same base class on all +// platforms irrespectively of whether they are native controls (and hence +// don't use our scrolling) or not. +// +// So we have +// +// wxScrollHelper +// | +// | +// \|/ +// wxWindow wxScrollHelperNative +// | \ / / +// | \ / / +// | _| |_ / +// | wxScrolledWindow / +// | / +// \|/ / +// wxControl / +// \ / +// \ / +// _| |_ +// wxScrolledControl +// // ---------------------------------------------------------------------------- class WXDLLEXPORT wxScrollHelper { public: - // ctor and dtor - wxScrollHelper(wxWindow *winToScroll = (wxWindow *)NULL); - void SetWindow(wxWindow *winToScroll); + // ctor must be given the associated window + wxScrollHelper(wxWindow *winToScroll); virtual ~wxScrollHelper(); // configure the scrolling virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, int noUnitsX, int noUnitsY, int xPos = 0, int yPos = 0, - bool noRefresh = FALSE ); + bool noRefresh = false ); // scroll to the given (in logical coords) position virtual void Scroll(int x, int y); @@ -44,6 +68,10 @@ public: int GetScrollPageSize(int orient) const; void SetScrollPageSize(int orient, int pageSize); + // get the number of lines the window can scroll, + // returns 0 if no scrollbars are there. + int GetScrollLines( int orient ) const; + // Set the x, y scrolling increments. void SetScrollRate( int xstep, int ystep ); @@ -51,9 +79,9 @@ public: virtual void GetScrollPixelsPerUnit(int *pixelsPerUnitX, int *pixelsPerUnitY) const; - // Enable/disable Windows scrolling in either direction. If TRUE, wxWidgets + // Enable/disable Windows scrolling in either direction. If true, wxWidgets // scrolls the canvas and only a bit of the canvas is invalidated; no - // Clear() is necessary. If FALSE, the whole canvas is invalidated and a + // Clear() is necessary. If false, the whole canvas is invalidated and a // Clear() is necessary. Disable for when the scroll increment is used to // actually scroll a non-constant distance virtual void EnableScrolling(bool x_scrolling, bool y_scrolling); @@ -121,7 +149,7 @@ public: // stop the timer, so it will be called repeatedly and will typically // return different values depending on the current mouse position // - // the base class version just returns TRUE + // the base class version just returns true virtual bool SendAutoScrollEvents(wxScrollWinEvent& event) const; // the methods to be called from the window event handlers @@ -139,11 +167,6 @@ public: // once it is fixed! void OnScroll(wxScrollWinEvent& event) { HandleOnScroll(event); } -#if WXWIN_COMPATIBILITY_2_2 - // Compatibility only, don't use - void ViewStart(int *x, int *y) const { GetViewStart( x, y ); } -#endif // WXWIN_COMPATIBILITY_2_2 - protected: // get pointer to our scroll rect if we use it or NULL const wxRect *GetScrollRect() const @@ -158,7 +181,7 @@ protected: : m_targetWindow->GetClientSize(); } - void GetTargetSize(int *w, int *h) + void GetTargetSize(int *w, int *h) const { wxSize size = GetTargetSize(); if ( w ) @@ -167,6 +190,13 @@ protected: *h = size.y; } + // implementations of various wxWindow virtual methods which should be + // forwarded to us (this can be done by WX_FORWARD_TO_SCROLL_HELPER()) + bool ScrollLayout(); + void ScrollDoSetVirtualSize(int x, int y); + wxSize ScrollGetBestVirtualSize() const; + wxSize ScrollGetWindowSizeForVirtualSize(const wxSize& size) const; + // change just the target window (unlike SetWindow which changes m_win as // well) void DoSetTargetWindow(wxWindow *target); @@ -174,6 +204,10 @@ protected: // delete the event handler we installed void DeleteEvtHandler(); + + double m_scaleX; + double m_scaleY; + wxWindow *m_win, *m_targetWindow; @@ -193,9 +227,6 @@ protected: bool m_xScrollingEnabled; bool m_yScrollingEnabled; - double m_scaleX; - double m_scaleY; - #if wxUSE_MOUSEWHEEL int m_wheelRotation; #endif // wxUSE_MOUSEWHEEL @@ -205,36 +236,75 @@ protected: DECLARE_NO_COPY_CLASS(wxScrollHelper) }; +// this macro can be used in a wxScrollHelper-derived class to forward wxWindow +// methods to corresponding wxScrollHelper methods +#define WX_FORWARD_TO_SCROLL_HELPER() \ +public: \ + virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \ + virtual bool Layout() { return ScrollLayout(); } \ + virtual void DoSetVirtualSize(int x, int y) \ + { ScrollDoSetVirtualSize(x, y); } \ + virtual wxSize GetBestVirtualSize() const \ + { return ScrollGetBestVirtualSize(); } \ +protected: \ + virtual wxSize GetWindowSizeForVirtualSize(const wxSize& size) const \ + { return ScrollGetWindowSizeForVirtualSize(size); } + +// include the declaration of wxScrollHelperNative if needed +#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk/scrolwin.h" +#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__) + #include "wx/gtk1/scrolwin.h" +#else + typedef wxScrollHelper wxScrollHelperNative; +#endif + // ---------------------------------------------------------------------------- // wxScrolledWindow: a wxWindow which knows how to scroll // ---------------------------------------------------------------------------- -#if defined(__WXGTK__) && !defined(__WXUNIVERSAL__) - #include "wx/gtk/scrolwin.h" -#else // !wxGTK - #include "wx/generic/scrolwin.h" - - class WXDLLEXPORT wxScrolledWindow : public wxGenericScrolledWindow +class WXDLLEXPORT wxScrolledWindow : public wxPanel, + public wxScrollHelperNative +{ +public: + wxScrolledWindow() : wxScrollHelperNative(this) { } + wxScrolledWindow(wxWindow *parent, + wxWindowID winid = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr) + : wxScrollHelperNative(this) { - public: - wxScrolledWindow() { } - wxScrolledWindow(wxWindow *parent, - wxWindowID winid = -1, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxScrolledWindowStyle, - const wxString& name = wxPanelNameStr) - : wxGenericScrolledWindow(parent, winid, pos, size, style, name) - { - } - - private: - DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow) - }; - - #define wxSCROLLED_WINDOW_IS_GENERIC 1 -#endif + Create(parent, winid, pos, size, style, name); + } -#endif - // _WX_SCROLWIN_H_BASE_ + virtual ~wxScrolledWindow(); + + bool Create(wxWindow *parent, + wxWindowID winid, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxScrolledWindowStyle, + const wxString& name = wxPanelNameStr); + + // we need to return a special WM_GETDLGCODE value to process just the + // arrows but let the other navigation characters through +#ifdef __WXMSW__ + virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); +#endif // __WXMSW__ + + WX_FORWARD_TO_SCROLL_HELPER() + +protected: + // this is needed for wxEVT_PAINT processing hack described in + // wxScrollHelperEvtHandler::ProcessEvent() + void OnPaint(wxPaintEvent& event); + +private: + DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow) + DECLARE_EVENT_TABLE() +}; + +#endif // _WX_SCROLWIN_H_BASE_