refactored wxGTK scrolling: it has now fully-functioning wxScrollHelper and a lot of duplicate code was removed
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35875 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -17,19 +17,44 @@
|
||||
class WXDLLEXPORT wxScrollHelperEvtHandler;
|
||||
class WXDLLEXPORT wxTimer;
|
||||
|
||||
WXDLLEXPORT_DATA(extern const wxChar*) wxPanelNameStr;
|
||||
|
||||
// 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
|
||||
@@ -163,6 +188,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);
|
||||
@@ -170,6 +202,7 @@ protected:
|
||||
// delete the event handler we installed
|
||||
void DeleteEvtHandler();
|
||||
|
||||
|
||||
double m_scaleX;
|
||||
double m_scaleY;
|
||||
|
||||
@@ -201,38 +234,71 @@ 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() \
|
||||
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(); } \
|
||||
virtual wxSize GetWindowSizeForVirtualSize(const wxSize& size) const \
|
||||
{ return ScrollGetWindowSizeForVirtualSize(size); }
|
||||
|
||||
// include the declaration of wxScrollHelperNative if needed
|
||||
#if defined(__WXGTK__) && !defined(__WXUNIVERSAL__)
|
||||
#include "wx/gtk/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)
|
||||
{
|
||||
}
|
||||
Create(parent, winid, pos, size, style, name);
|
||||
}
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow)
|
||||
};
|
||||
virtual ~wxScrolledWindow();
|
||||
|
||||
#define wxSCROLLED_WINDOW_IS_GENERIC 1
|
||||
#endif
|
||||
bool Create(wxWindow *parent,
|
||||
wxWindowID winid,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxScrolledWindowStyle,
|
||||
const wxString& name = wxPanelNameStr);
|
||||
|
||||
#endif
|
||||
// _WX_SCROLWIN_H_BASE_
|
||||
WX_FORWARD_TO_SCROLL_HELPER()
|
||||
|
||||
protected:
|
||||
// this is needed for wxEVT_PAINT processing hack described in
|
||||
// wxScrollHelperEvtHandler::ProcessEvent()
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
|
||||
// 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__
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow)
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif // _WX_SCROLWIN_H_BASE_
|
||||
|
||||
|
Reference in New Issue
Block a user