]> git.saurik.com Git - wxWidgets.git/blame - include/wx/renderer.h
Return smaller images for wxART_MENU/BUTTON under OS X.
[wxWidgets.git] / include / wx / renderer.h
CommitLineData
9c7f49f5
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/renderer.h
3// Purpose: wxRendererNative class declaration
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 20.07.2003
7// RCS-ID: $Id$
77ffb593 8// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
65571936 9// Licence: wxWindows licence
9c7f49f5
VZ
10///////////////////////////////////////////////////////////////////////////////
11
12/*
77ffb593 13 Renderers are used in wxWidgets for two similar but different things:
9c7f49f5
VZ
14 (a) wxUniversal uses them to draw everything, i.e. all the control
15 (b) all the native ports use them to draw generic controls only
16
17 wxUniversal needs more functionality than what is included in the base class
18 as it needs to draw stuff like scrollbars which are never going to be
19 generic. So we put the bare minimum needed by the native ports here and the
20 full wxRenderer class is declared in wx/univ/renderer.h and is only used by
21 wxUniveral (although note that native ports can load wxRenderer objects from
22 theme DLLs and use them as wxRendererNative ones, of course).
23 */
24
25#ifndef _WX_RENDERER_H_
26#define _WX_RENDERER_H_
27
b5dbe15d
VS
28class WXDLLIMPEXP_FWD_CORE wxDC;
29class WXDLLIMPEXP_FWD_CORE wxWindow;
38c4cb6a 30
e8759560 31#include "wx/gdicmn.h" // for wxPoint, wxSize
0856300f
WS
32#include "wx/colour.h"
33#include "wx/font.h"
34#include "wx/bitmap.h"
35#include "wx/string.h"
7df07b10 36
f0244295 37// some platforms have their own renderers, others use the generic one
ac9e3f1f 38#if defined(__WXMSW__) || ( defined(__WXMAC__) && wxOSX_USE_COCOA_OR_CARBON ) || defined(__WXGTK__)
f0244295
VZ
39 #define wxHAS_NATIVE_RENDERER
40#else
41 #undef wxHAS_NATIVE_RENDERER
42#endif
43
b50d93d1
VZ
44// only MSW currently provides DrawTitleBarBitmap() method
45#if defined(__WXMSW__)
46 #define wxHAS_DRAW_TITLE_BAR_BITMAP
47#endif
48
9c7f49f5
VZ
49// ----------------------------------------------------------------------------
50// constants
51// ----------------------------------------------------------------------------
52
53// control state flags used in wxRenderer and wxColourScheme
54enum
55{
56 wxCONTROL_DISABLED = 0x00000001, // control is disabled
57 wxCONTROL_FOCUSED = 0x00000002, // currently has keyboard focus
58 wxCONTROL_PRESSED = 0x00000004, // (button) is pressed
fb61f58a
VZ
59 wxCONTROL_SPECIAL = 0x00000008, // control-specific bit:
60 wxCONTROL_ISDEFAULT = wxCONTROL_SPECIAL, // only for the buttons
61 wxCONTROL_ISSUBMENU = wxCONTROL_SPECIAL, // only for the menu items
62 wxCONTROL_EXPANDED = wxCONTROL_SPECIAL, // only for the tree items
63 wxCONTROL_SIZEGRIP = wxCONTROL_SPECIAL, // only for the status bar panes
8a461249 64 wxCONTROL_FLAT = wxCONTROL_SPECIAL, // checkboxes only: flat border
9c7f49f5
VZ
65 wxCONTROL_CURRENT = 0x00000010, // mouse is currently over the control
66 wxCONTROL_SELECTED = 0x00000020, // selected item in e.g. listbox
67 wxCONTROL_CHECKED = 0x00000040, // (check/radio button) is checked
68 wxCONTROL_CHECKABLE = 0x00000080, // (menu) item can be checked
415a0ff1 69 wxCONTROL_UNDETERMINED = wxCONTROL_CHECKABLE, // (check) undetermined state
9c7f49f5 70
a61c9122 71 wxCONTROL_FLAGS_MASK = 0x000000ff,
9c7f49f5
VZ
72
73 // this is a pseudo flag not used directly by wxRenderer but rather by some
74 // controls internally
75 wxCONTROL_DIRTY = 0x80000000
76};
77
b50d93d1
VZ
78// title bar buttons supported by DrawTitleBarBitmap()
79//
80// NB: they have the same values as wxTOPLEVEL_BUTTON_XXX constants in
81// wx/univ/toplevel.h as they really represent the same things
82enum wxTitleBarButton
83{
84 wxTITLEBAR_BUTTON_CLOSE = 0x01000000,
85 wxTITLEBAR_BUTTON_MAXIMIZE = 0x02000000,
86 wxTITLEBAR_BUTTON_ICONIZE = 0x04000000,
87 wxTITLEBAR_BUTTON_RESTORE = 0x08000000,
88 wxTITLEBAR_BUTTON_HELP = 0x10000000
89};
90
af99040c
VZ
91// ----------------------------------------------------------------------------
92// helper structs
93// ----------------------------------------------------------------------------
94
95// wxSplitterWindow parameters
53a2db12 96struct WXDLLIMPEXP_CORE wxSplitterRenderParams
af99040c
VZ
97{
98 // the only way to initialize this struct is by using this ctor
99 wxSplitterRenderParams(wxCoord widthSash_, wxCoord border_, bool isSens_)
100 : widthSash(widthSash_), border(border_), isHotSensitive(isSens_)
101 {
102 }
103
104 // the width of the splitter sash
105 const wxCoord widthSash;
106
107 // the width of the border of the splitter window
108 const wxCoord border;
109
110 // true if the splitter changes its appearance when the mouse is over it
111 const bool isHotSensitive;
112};
113
4b94ddc4
RD
114
115// extra optional parameters for DrawHeaderButton
53a2db12 116struct WXDLLIMPEXP_CORE wxHeaderButtonParams
4b94ddc4
RD
117{
118 wxHeaderButtonParams()
119 : m_labelAlignment(wxALIGN_LEFT)
120 { }
0856300f 121
4b94ddc4
RD
122 wxColour m_arrowColour;
123 wxColour m_selectionColour;
124 wxString m_labelText;
125 wxFont m_labelFont;
126 wxColour m_labelColour;
127 wxBitmap m_labelBitmap;
128 int m_labelAlignment;
129};
130
1e417065
VZ
131enum wxHeaderSortIconType
132{
80752b57 133 wxHDR_SORT_ICON_NONE, // Header button has no sort arrow
1e417065
VZ
134 wxHDR_SORT_ICON_UP, // Header button an up sort arrow icon
135 wxHDR_SORT_ICON_DOWN // Header button a down sort arrow icon
80752b57
RD
136};
137
4b94ddc4 138
04857cb7 139// wxRendererNative interface version
53a2db12 140struct WXDLLIMPEXP_CORE wxRendererVersion
04857cb7
VZ
141{
142 wxRendererVersion(int version_, int age_) : version(version_), age(age_) { }
143
144 // default copy ctor, assignment operator and dtor are ok
145
146 // the current version and age of wxRendererNative interface: different
147 // versions are incompatible (in both ways) while the ages inside the same
148 // version are upwards compatible, i.e. the version of the renderer must
149 // match the version of the main program exactly while the age may be
150 // highergreater or equal to it
151 //
152 // NB: don't forget to increment age after adding any new virtual function!
153 enum
154 {
155 Current_Version = 1,
156 Current_Age = 5
157 };
158
159
160 // check if the given version is compatible with the current one
161 static bool IsCompatible(const wxRendererVersion& ver)
162 {
163 return ver.version == Current_Version && ver.age >= Current_Age;
164 }
165
166 const int version;
167 const int age;
168};
169
9c7f49f5
VZ
170// ----------------------------------------------------------------------------
171// wxRendererNative: abstracts drawing methods needed by the native controls
172// ----------------------------------------------------------------------------
173
53a2db12 174class WXDLLIMPEXP_CORE wxRendererNative
9c7f49f5
VZ
175{
176public:
177 // drawing functions
178 // -----------------
179
c97c9952
RD
180 // draw the header control button (used by wxListCtrl) Returns optimal
181 // width for the label contents.
182 virtual int DrawHeaderButton(wxWindow *win,
9c7f49f5
VZ
183 wxDC& dc,
184 const wxRect& rect,
4b94ddc4 185 int flags = 0,
80752b57 186 wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE,
4b94ddc4
RD
187 wxHeaderButtonParams* params=NULL) = 0;
188
189
190 // Draw the contents of a header control button (label, sort arrows, etc.)
191 // Normally only called by DrawHeaderButton.
c97c9952 192 virtual int DrawHeaderButtonContents(wxWindow *win,
4b94ddc4
RD
193 wxDC& dc,
194 const wxRect& rect,
195 int flags = 0,
80752b57 196 wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE,
4b94ddc4
RD
197 wxHeaderButtonParams* params=NULL) = 0;
198
199 // Returns the default height of a header button, either a fixed platform
200 // height if available, or a generic height based on the window's font.
201 virtual int GetHeaderButtonHeight(wxWindow *win) = 0;
202
9c7f49f5
VZ
203
204 // draw the expanded/collapsed icon for a tree control item
205 virtual void DrawTreeItemButton(wxWindow *win,
206 wxDC& dc,
207 const wxRect& rect,
208 int flags = 0) = 0;
209
b3208e11
VZ
210 // draw the border for sash window: this border must be such that the sash
211 // drawn by DrawSash() blends into it well
212 virtual void DrawSplitterBorder(wxWindow *win,
213 wxDC& dc,
af99040c
VZ
214 const wxRect& rect,
215 int flags = 0) = 0;
b3208e11
VZ
216
217 // draw a (vertical) sash
218 virtual void DrawSplitterSash(wxWindow *win,
219 wxDC& dc,
220 const wxSize& size,
62dc9cb4 221 wxCoord position,
af99040c
VZ
222 wxOrientation orient,
223 int flags = 0) = 0;
b3208e11 224
f33cef9f
VZ
225 // draw a combobox dropdown button
226 //
4c85ab75 227 // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT
f33cef9f
VZ
228 virtual void DrawComboBoxDropButton(wxWindow *win,
229 wxDC& dc,
230 const wxRect& rect,
231 int flags = 0) = 0;
232
4c85ab75
VZ
233 // draw a dropdown arrow
234 //
235 // flags may use wxCONTROL_PRESSED and wxCONTROL_CURRENT
236 virtual void DrawDropArrow(wxWindow *win,
237 wxDC& dc,
238 const wxRect& rect,
239 int flags = 0) = 0;
b3208e11 240
862d8041
RR
241 // draw check button
242 //
243 // flags may use wxCONTROL_CHECKED, wxCONTROL_UNDETERMINED and wxCONTROL_CURRENT
90b903c2
WS
244 virtual void DrawCheckBox(wxWindow *win,
245 wxDC& dc,
246 const wxRect& rect,
247 int flags = 0) = 0;
2209baae 248
e8759560 249 // Returns the default size of a check box.
191e43fd 250 virtual wxSize GetCheckBoxSize(wxWindow *win) = 0;
e8759560 251
2209baae
RR
252 // draw blank button
253 //
254 // flags may use wxCONTROL_PRESSED, wxCONTROL_CURRENT and wxCONTROL_ISDEFAULT
255 virtual void DrawPushButton(wxWindow *win,
256 wxDC& dc,
257 const wxRect& rect,
258 int flags = 0) = 0;
259
daebb44c
RR
260 // draw rectangle indicating that an item in e.g. a list control
261 // has been selected or focused
262 //
0856300f 263 // flags may use
daebb44c
RR
264 // wxCONTROL_SELECTED (item is selected, e.g. draw background)
265 // wxCONTROL_CURRENT (item is the current item, e.g. dotted border)
266 // wxCONTROL_FOCUSED (the whole control has focus, e.g. blue background vs. grey otherwise)
267 virtual void DrawItemSelectionRect(wxWindow *win,
268 wxDC& dc,
269 const wxRect& rect,
270 int flags = 0) = 0;
271
6d789987
JS
272 // draw the focus rectangle around the label contained in the given rect
273 //
274 // only wxCONTROL_SELECTED makes sense in flags here
99c4be68
VZ
275 virtual void DrawFocusRect(wxWindow* win,
276 wxDC& dc,
277 const wxRect& rect,
278 int flags = 0) = 0;
6d789987 279
e4131985 280 // Draw a native wxChoice
99c4be68
VZ
281 virtual void DrawChoice(wxWindow* win,
282 wxDC& dc,
283 const wxRect& rect,
284 int flags = 0) = 0;
e4131985
KO
285
286 // Draw a native wxComboBox
99c4be68
VZ
287 virtual void DrawComboBox(wxWindow* win,
288 wxDC& dc,
289 const wxRect& rect,
290 int flags = 0) = 0;
e4131985
KO
291
292 // Draw a native wxTextCtrl frame
99c4be68
VZ
293 virtual void DrawTextCtrl(wxWindow* win,
294 wxDC& dc,
295 const wxRect& rect,
296 int flags = 0) = 0;
e4131985 297
6e6b532c
VZ
298 // Draw a native wxRadioButton bitmap
299 virtual void DrawRadioBitmap(wxWindow* win,
300 wxDC& dc,
301 const wxRect& rect,
302 int flags = 0) = 0;
e4131985 303
b50d93d1
VZ
304#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
305 // Draw one of the standard title bar buttons
306 //
307 // This is currently implemented only for MSW because there is no way to
308 // render standard title bar buttons under the other platforms, the best
309 // can be done is to use normal (only) images which wxArtProvider provides
310 // for wxART_HELP and wxART_CLOSE (but not any other title bar buttons)
311 virtual void DrawTitleBarBitmap(wxWindow *win,
312 wxDC& dc,
313 const wxRect& rect,
314 wxTitleBarButton button,
315 int flags = 0) = 0;
316#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
317
318
b3208e11
VZ
319 // geometry functions
320 // ------------------
321
322 // get the splitter parameters: the x field of the returned point is the
323 // sash width and the y field is the border width
af99040c 324 virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0;
b3208e11 325
9c7f49f5
VZ
326
327 // pseudo constructors
328 // -------------------
329
330 // return the currently used renderer
331 static wxRendererNative& Get();
332
333 // return the generic implementation of the renderer
334 static wxRendererNative& GetGeneric();
f0244295
VZ
335
336 // return the default (native) implementation for this platform
337 static wxRendererNative& GetDefault();
9f2be125
VZ
338
339
340 // changing the global renderer
341 // ----------------------------
342
343#if wxUSE_DYNLIB_CLASS
344 // load the renderer from the specified DLL, the returned pointer must be
345 // deleted by caller if not NULL when it is not used any more
346 static wxRendererNative *Load(const wxString& name);
347#endif // wxUSE_DYNLIB_CLASS
348
349 // set the renderer to use, passing NULL reverts to using the default
350 // renderer
351 //
352 // return the previous renderer used with Set() or NULL if none
353 static wxRendererNative *Set(wxRendererNative *renderer);
04857cb7
VZ
354
355
356 // miscellaneous stuff
357 // -------------------
358
359 // this function is used for version checking: Load() refuses to load any
360 // DLLs implementing an older or incompatible version; it should be
361 // implemented simply by returning wxRendererVersion::Current_XXX values
362 virtual wxRendererVersion GetVersion() const = 0;
363
364 // virtual dtor for any base class
365 virtual ~wxRendererNative();
9c7f49f5
VZ
366};
367
368// ----------------------------------------------------------------------------
369// wxDelegateRendererNative: allows reuse of renderers code
370// ----------------------------------------------------------------------------
371
53a2db12 372class WXDLLIMPEXP_CORE wxDelegateRendererNative : public wxRendererNative
9c7f49f5
VZ
373{
374public:
375 wxDelegateRendererNative()
376 : m_rendererNative(GetGeneric()) { }
377
378 wxDelegateRendererNative(wxRendererNative& rendererNative)
379 : m_rendererNative(rendererNative) { }
380
381
c97c9952 382 virtual int DrawHeaderButton(wxWindow *win,
9c7f49f5
VZ
383 wxDC& dc,
384 const wxRect& rect,
4b94ddc4 385 int flags = 0,
80752b57 386 wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE,
4b94ddc4 387 wxHeaderButtonParams* params = NULL)
c97c9952 388 { return m_rendererNative.DrawHeaderButton(win, dc, rect, flags, sortArrow, params); }
0856300f 389
c97c9952 390 virtual int DrawHeaderButtonContents(wxWindow *win,
4b94ddc4
RD
391 wxDC& dc,
392 const wxRect& rect,
393 int flags = 0,
80752b57 394 wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE,
4b94ddc4 395 wxHeaderButtonParams* params = NULL)
c97c9952 396 { return m_rendererNative.DrawHeaderButtonContents(win, dc, rect, flags, sortArrow, params); }
0856300f 397
4b94ddc4
RD
398 virtual int GetHeaderButtonHeight(wxWindow *win)
399 { return m_rendererNative.GetHeaderButtonHeight(win); }
b3208e11 400
9c7f49f5
VZ
401 virtual void DrawTreeItemButton(wxWindow *win,
402 wxDC& dc,
403 const wxRect& rect,
404 int flags = 0)
405 { m_rendererNative.DrawTreeItemButton(win, dc, rect, flags); }
406
b3208e11
VZ
407 virtual void DrawSplitterBorder(wxWindow *win,
408 wxDC& dc,
af99040c
VZ
409 const wxRect& rect,
410 int flags = 0)
2c0e6de1 411 { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); }
b3208e11
VZ
412
413 virtual void DrawSplitterSash(wxWindow *win,
414 wxDC& dc,
415 const wxSize& size,
62dc9cb4 416 wxCoord position,
af99040c
VZ
417 wxOrientation orient,
418 int flags = 0)
2c0e6de1
VZ
419 { m_rendererNative.DrawSplitterSash(win, dc, size,
420 position, orient, flags); }
b3208e11 421
f33cef9f
VZ
422 virtual void DrawComboBoxDropButton(wxWindow *win,
423 wxDC& dc,
424 const wxRect& rect,
425 int flags = 0)
426 { m_rendererNative.DrawComboBoxDropButton(win, dc, rect, flags); }
427
4c85ab75
VZ
428 virtual void DrawDropArrow(wxWindow *win,
429 wxDC& dc,
430 const wxRect& rect,
431 int flags = 0)
432 { m_rendererNative.DrawDropArrow(win, dc, rect, flags); }
b3208e11 433
90b903c2
WS
434 virtual void DrawCheckBox(wxWindow *win,
435 wxDC& dc,
436 const wxRect& rect,
99c4be68 437 int flags = 0)
90b903c2 438 { m_rendererNative.DrawCheckBox( win, dc, rect, flags ); }
2209baae 439
191e43fd
FM
440 virtual wxSize GetCheckBoxSize(wxWindow *win)
441 { return m_rendererNative.GetCheckBoxSize(win); }
e8759560 442
2209baae
RR
443 virtual void DrawPushButton(wxWindow *win,
444 wxDC& dc,
445 const wxRect& rect,
99c4be68 446 int flags = 0)
2209baae
RR
447 { m_rendererNative.DrawPushButton( win, dc, rect, flags ); }
448
daebb44c
RR
449 virtual void DrawItemSelectionRect(wxWindow *win,
450 wxDC& dc,
451 const wxRect& rect,
99c4be68 452 int flags = 0)
daebb44c
RR
453 { m_rendererNative.DrawItemSelectionRect( win, dc, rect, flags ); }
454
99c4be68
VZ
455 virtual void DrawFocusRect(wxWindow* win,
456 wxDC& dc,
457 const wxRect& rect,
458 int flags = 0)
6d789987
JS
459 { m_rendererNative.DrawFocusRect( win, dc, rect, flags ); }
460
99c4be68
VZ
461 virtual void DrawChoice(wxWindow* win,
462 wxDC& dc,
463 const wxRect& rect,
464 int flags = 0)
e4131985
KO
465 { m_rendererNative.DrawChoice( win, dc, rect, flags); }
466
99c4be68
VZ
467 virtual void DrawComboBox(wxWindow* win,
468 wxDC& dc,
469 const wxRect& rect,
470 int flags = 0)
e4131985
KO
471 { m_rendererNative.DrawComboBox( win, dc, rect, flags); }
472
99c4be68
VZ
473 virtual void DrawTextCtrl(wxWindow* win,
474 wxDC& dc,
475 const wxRect& rect,
476 int flags = 0)
e4131985
KO
477 { m_rendererNative.DrawTextCtrl( win, dc, rect, flags); }
478
6e6b532c
VZ
479 virtual void DrawRadioBitmap(wxWindow* win,
480 wxDC& dc,
481 const wxRect& rect,
482 int flags = 0)
483 { m_rendererNative.DrawRadioBitmap(win, dc, rect, flags); }
e4131985 484
b50d93d1
VZ
485#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
486 virtual void DrawTitleBarBitmap(wxWindow *win,
487 wxDC& dc,
488 const wxRect& rect,
489 wxTitleBarButton button,
490 int flags = 0)
491 { m_rendererNative.DrawTitleBarBitmap(win, dc, rect, button, flags); }
492#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
493
af99040c
VZ
494 virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
495 { return m_rendererNative.GetSplitterParams(win); }
b3208e11 496
04857cb7
VZ
497 virtual wxRendererVersion GetVersion() const
498 { return m_rendererNative.GetVersion(); }
499
9c7f49f5
VZ
500protected:
501 wxRendererNative& m_rendererNative;
fc7a2a60 502
c0c133e1 503 wxDECLARE_NO_COPY_CLASS(wxDelegateRendererNative);
9c7f49f5
VZ
504};
505
f0244295
VZ
506// ----------------------------------------------------------------------------
507// inline functions implementation
508// ----------------------------------------------------------------------------
509
510#ifndef wxHAS_NATIVE_RENDERER
511
512// default native renderer is the generic one then
513/* static */ inline
514wxRendererNative& wxRendererNative::GetDefault()
515{
516 return GetGeneric();
517}
518
519#endif // !wxHAS_NATIVE_RENDERER
520
9c7f49f5 521#endif // _WX_RENDERER_H_