]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/scrolwin.h
Applied patch [ 1447732 ] Fix CVS HEAD for VC6
[wxWidgets.git] / include / wx / scrolwin.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: include/wx/scrolwin.h
3// Purpose: wxScrolledWindow, wxScrolledControl and wxScrollHelper
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 30.08.00
7// RCS-ID: $Id$
8// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_SCROLWIN_H_BASE_
13#define _WX_SCROLWIN_H_BASE_
14
15#include "wx/panel.h"
16
17class WXDLLEXPORT wxScrollHelperEvtHandler;
18class WXDLLEXPORT wxTimer;
19
20// default scrolled window style: scroll in both directions
21#define wxScrolledWindowStyle (wxHSCROLL | wxVSCROLL)
22
23// ----------------------------------------------------------------------------
24// The hierarchy of scrolling classes is a bit complicated because we want to
25// put as much functionality as possible in a mix-in class not deriving from
26// wxWindow so that other classes could derive from the same base class on all
27// platforms irrespectively of whether they are native controls (and hence
28// don't use our scrolling) or not.
29//
30// So we have
31//
32// wxScrollHelper
33// |
34// |
35// \|/
36// wxWindow wxScrollHelperNative
37// | \ / /
38// | \ / /
39// | _| |_ /
40// | wxScrolledWindow /
41// | /
42// \|/ /
43// wxControl /
44// \ /
45// \ /
46// _| |_
47// wxScrolledControl
48//
49// ----------------------------------------------------------------------------
50
51class WXDLLEXPORT wxScrollHelper
52{
53public:
54 // ctor must be given the associated window
55 wxScrollHelper(wxWindow *winToScroll);
56 virtual ~wxScrollHelper();
57
58 // configure the scrolling
59 virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY,
60 int noUnitsX, int noUnitsY,
61 int xPos = 0, int yPos = 0,
62 bool noRefresh = false );
63
64 // scroll to the given (in logical coords) position
65 virtual void Scroll(int x, int y);
66
67 // get/set the page size for this orientation (wxVERTICAL/wxHORIZONTAL)
68 int GetScrollPageSize(int orient) const;
69 void SetScrollPageSize(int orient, int pageSize);
70
71 // Set the x, y scrolling increments.
72 void SetScrollRate( int xstep, int ystep );
73
74 // get the size of one logical unit in physical ones
75 virtual void GetScrollPixelsPerUnit(int *pixelsPerUnitX,
76 int *pixelsPerUnitY) const;
77
78 // Enable/disable Windows scrolling in either direction. If true, wxWidgets
79 // scrolls the canvas and only a bit of the canvas is invalidated; no
80 // Clear() is necessary. If false, the whole canvas is invalidated and a
81 // Clear() is necessary. Disable for when the scroll increment is used to
82 // actually scroll a non-constant distance
83 virtual void EnableScrolling(bool x_scrolling, bool y_scrolling);
84
85 // Get the view start
86 virtual void GetViewStart(int *x, int *y) const;
87
88 // Set the scale factor, used in PrepareDC
89 void SetScale(double xs, double ys) { m_scaleX = xs; m_scaleY = ys; }
90 double GetScaleX() const { return m_scaleX; }
91 double GetScaleY() const { return m_scaleY; }
92
93 // translate between scrolled and unscrolled coordinates
94 void CalcScrolledPosition(int x, int y, int *xx, int *yy) const
95 { DoCalcScrolledPosition(x, y, xx, yy); }
96 wxPoint CalcScrolledPosition(const wxPoint& pt) const
97 {
98 wxPoint p2;
99 DoCalcScrolledPosition(pt.x, pt.y, &p2.x, &p2.y);
100 return p2;
101 }
102
103 void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const
104 { DoCalcUnscrolledPosition(x, y, xx, yy); }
105 wxPoint CalcUnscrolledPosition(const wxPoint& pt) const
106 {
107 wxPoint p2;
108 DoCalcUnscrolledPosition(pt.x, pt.y, &p2.x, &p2.y);
109 return p2;
110 }
111
112 virtual void DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const;
113 virtual void DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const;
114
115 // Adjust the scrollbars
116 virtual void AdjustScrollbars(void);
117
118 // Calculate scroll increment
119 virtual int CalcScrollInc(wxScrollWinEvent& event);
120
121 // Normally the wxScrolledWindow will scroll itself, but in some rare
122 // occasions you might want it to scroll [part of] another window (e.g. a
123 // child of it in order to scroll only a portion the area between the
124 // scrollbars (spreadsheet: only cell area will move).
125 virtual void SetTargetWindow(wxWindow *target);
126 virtual wxWindow *GetTargetWindow() const;
127
128 void SetTargetRect(const wxRect& rect) { m_rectToScroll = rect; }
129 wxRect GetTargetRect() const { return m_rectToScroll; }
130
131 // Override this function to draw the graphic (or just process EVT_PAINT)
132 virtual void OnDraw(wxDC& WXUNUSED(dc)) { }
133
134 // change the DC origin according to the scroll position.
135 virtual void DoPrepareDC(wxDC& dc);
136
137 // are we generating the autoscroll events?
138 bool IsAutoScrolling() const { return m_timerAutoScroll != NULL; }
139
140 // stop generating the scroll events when mouse is held outside the window
141 void StopAutoScrolling();
142
143 // this method can be overridden in a derived class to forbid sending the
144 // auto scroll events - note that unlike StopAutoScrolling() it doesn't
145 // stop the timer, so it will be called repeatedly and will typically
146 // return different values depending on the current mouse position
147 //
148 // the base class version just returns true
149 virtual bool SendAutoScrollEvents(wxScrollWinEvent& event) const;
150
151 // the methods to be called from the window event handlers
152 void HandleOnScroll(wxScrollWinEvent& event);
153 void HandleOnSize(wxSizeEvent& event);
154 void HandleOnPaint(wxPaintEvent& event);
155 void HandleOnChar(wxKeyEvent& event);
156 void HandleOnMouseEnter(wxMouseEvent& event);
157 void HandleOnMouseLeave(wxMouseEvent& event);
158#if wxUSE_MOUSEWHEEL
159 void HandleOnMouseWheel(wxMouseEvent& event);
160#endif // wxUSE_MOUSEWHEEL
161
162 // FIXME: this is needed for now for wxPlot compilation, should be removed
163 // once it is fixed!
164 void OnScroll(wxScrollWinEvent& event) { HandleOnScroll(event); }
165
166protected:
167 // get pointer to our scroll rect if we use it or NULL
168 const wxRect *GetScrollRect() const
169 {
170 return m_rectToScroll.width != 0 ? &m_rectToScroll : NULL;
171 }
172
173 // get the size of the target window
174 wxSize GetTargetSize() const
175 {
176 return m_rectToScroll.width != 0 ? m_rectToScroll.GetSize()
177 : m_targetWindow->GetClientSize();
178 }
179
180 void GetTargetSize(int *w, int *h)
181 {
182 wxSize size = GetTargetSize();
183 if ( w )
184 *w = size.x;
185 if ( h )
186 *h = size.y;
187 }
188
189 // implementations of various wxWindow virtual methods which should be
190 // forwarded to us (this can be done by WX_FORWARD_TO_SCROLL_HELPER())
191 bool ScrollLayout();
192 void ScrollDoSetVirtualSize(int x, int y);
193 wxSize ScrollGetBestVirtualSize() const;
194 wxSize ScrollGetWindowSizeForVirtualSize(const wxSize& size) const;
195
196 // change just the target window (unlike SetWindow which changes m_win as
197 // well)
198 void DoSetTargetWindow(wxWindow *target);
199
200 // delete the event handler we installed
201 void DeleteEvtHandler();
202
203
204 double m_scaleX;
205 double m_scaleY;
206
207 wxWindow *m_win,
208 *m_targetWindow;
209
210 wxRect m_rectToScroll;
211
212 wxTimer *m_timerAutoScroll;
213
214 int m_xScrollPixelsPerLine;
215 int m_yScrollPixelsPerLine;
216 int m_xScrollPosition;
217 int m_yScrollPosition;
218 int m_xScrollLines;
219 int m_yScrollLines;
220 int m_xScrollLinesPerPage;
221 int m_yScrollLinesPerPage;
222
223 bool m_xScrollingEnabled;
224 bool m_yScrollingEnabled;
225
226#if wxUSE_MOUSEWHEEL
227 int m_wheelRotation;
228#endif // wxUSE_MOUSEWHEEL
229
230 wxScrollHelperEvtHandler *m_handler;
231
232 DECLARE_NO_COPY_CLASS(wxScrollHelper)
233};
234
235// this macro can be used in a wxScrollHelper-derived class to forward wxWindow
236// methods to corresponding wxScrollHelper methods
237#define WX_FORWARD_TO_SCROLL_HELPER() \
238 virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); } \
239 virtual bool Layout() { return ScrollLayout(); } \
240 virtual void DoSetVirtualSize(int x, int y) \
241 { ScrollDoSetVirtualSize(x, y); } \
242 virtual wxSize GetBestVirtualSize() const \
243 { return ScrollGetBestVirtualSize(); } \
244protected: \
245 virtual wxSize GetWindowSizeForVirtualSize(const wxSize& size) const \
246 { return ScrollGetWindowSizeForVirtualSize(size); }
247
248// include the declaration of wxScrollHelperNative if needed
249#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)
250 #include "wx/gtk/scrolwin.h"
251#elif defined(__WXGTK__) && !defined(__WXUNIVERSAL__)
252 #include "wx/gtk1/scrolwin.h"
253#else
254 typedef wxScrollHelper wxScrollHelperNative;
255#endif
256
257// ----------------------------------------------------------------------------
258// wxScrolledWindow: a wxWindow which knows how to scroll
259// ----------------------------------------------------------------------------
260
261class WXDLLEXPORT wxScrolledWindow : public wxPanel,
262 public wxScrollHelperNative
263{
264public:
265 wxScrolledWindow() : wxScrollHelperNative(this) { }
266 wxScrolledWindow(wxWindow *parent,
267 wxWindowID winid = wxID_ANY,
268 const wxPoint& pos = wxDefaultPosition,
269 const wxSize& size = wxDefaultSize,
270 long style = wxScrolledWindowStyle,
271 const wxString& name = wxPanelNameStr)
272 : wxScrollHelperNative(this)
273 {
274 Create(parent, winid, pos, size, style, name);
275 }
276
277 virtual ~wxScrolledWindow();
278
279 bool Create(wxWindow *parent,
280 wxWindowID winid,
281 const wxPoint& pos = wxDefaultPosition,
282 const wxSize& size = wxDefaultSize,
283 long style = wxScrolledWindowStyle,
284 const wxString& name = wxPanelNameStr);
285
286 // we need to return a special WM_GETDLGCODE value to process just the
287 // arrows but let the other navigation characters through
288#ifdef __WXMSW__
289 virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
290#endif // __WXMSW__
291
292 WX_FORWARD_TO_SCROLL_HELPER()
293
294protected:
295 // this is needed for wxEVT_PAINT processing hack described in
296 // wxScrollHelperEvtHandler::ProcessEvent()
297 void OnPaint(wxPaintEvent& event);
298
299private:
300 DECLARE_DYNAMIC_CLASS_NO_COPY(wxScrolledWindow)
301 DECLARE_EVENT_TABLE()
302};
303
304#endif // _WX_SCROLWIN_H_BASE_
305