#ifndef _WX_SCROLWIN_H_BASE_
#define _WX_SCROLWIN_H_BASE_
-#include "wx/window.h"
+#include "wx/panel.h"
class WXDLLEXPORT wxScrollHelperEvtHandler;
class WXDLLEXPORT 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
+//
// ----------------------------------------------------------------------------
-#if !defined(__WXGTK__) || defined(__WXUNIVERSAL__)
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
*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);
// delete the event handler we installed
void DeleteEvtHandler();
+
double m_scaleX;
double m_scaleY;
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 = wxID_ANY,
- 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_