]> git.saurik.com Git - wxWidgets.git/blame - include/wx/univ/renderer.h
Make wxMouseState's alt and meta match those in events
[wxWidgets.git] / include / wx / univ / renderer.h
CommitLineData
1e6feb95
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/univ/renderer.h
3// Purpose: wxRenderer class declaration
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 06.08.00
7// RCS-ID: $Id$
442b35b5 8// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
65571936 9// Licence: wxWindows licence
1e6feb95
VZ
10///////////////////////////////////////////////////////////////////////////////
11
20ceebaa
MW
12#ifndef _WX_UNIV_RENDERER_H_
13#define _WX_UNIV_RENDERER_H_
14
1e6feb95 15/*
77ffb593 16 wxRenderer class is used to draw all wxWidgets controls. This is an ABC and
1e6feb95
VZ
17 the look of the application is determined by the concrete derivation of
18 wxRenderer used in the program.
19
20 It also contains a few static methods which may be used by the concrete
21 renderers and provide the functionality which is often similar or identical
22 in all renderers (using inheritance here would be more restrictive as the
23 given concrete renderer may need an arbitrary subset of the base class
9c7f49f5
VZ
24 methods).
25
26 Finally note that wxRenderer supersedes wxRendererNative in wxUniv build and
27 includes the latters functionality (which it may delegate to the generic
28 implementation of the latter or reimplement itself).
1e6feb95
VZ
29 */
30
9c7f49f5
VZ
31#include "wx/renderer.h"
32
9a6384ca 33class WXDLLEXPORT wxWindow;
1e6feb95
VZ
34class WXDLLEXPORT wxDC;
35class WXDLLEXPORT wxCheckListBox;
9a6384ca
WS
36
37#if wxUSE_LISTBOX
38 class WXDLLEXPORT wxListBox;
39#endif // wxUSE_LISTBOX
40
41#if wxUSE_MENUS
42 class WXDLLEXPORT wxMenu;
43 class WXDLLEXPORT wxMenuGeometryInfo;
44#endif // wxUSE_MENUS
45
1e6feb95 46class WXDLLEXPORT wxScrollBar;
9a6384ca
WS
47
48#if wxUSE_TEXTCTRL
49 class WXDLLEXPORT wxTextCtrl;
50#endif
51
8cb172b4 52#if wxUSE_GAUGE
9a6384ca 53 class WXDLLEXPORT wxGauge;
8cb172b4 54#endif // wxUSE_GAUGE
1e6feb95
VZ
55
56#include "wx/string.h"
57#include "wx/gdicmn.h"
df028524 58#include "wx/icon.h"
1e6feb95
VZ
59#include "wx/scrolbar.h" // for wxScrollBar::Element
60
71e03035
VZ
61// helper class used by wxMenu-related functions
62class WXDLLEXPORT wxMenuGeometryInfo
63{
64public:
65 // get the total size of the menu
66 virtual wxSize GetSize() const = 0;
67
68 virtual ~wxMenuGeometryInfo();
69};
70
1e6feb95
VZ
71// ----------------------------------------------------------------------------
72// wxRenderer: abstract renderers interface
73// ----------------------------------------------------------------------------
74
9c7f49f5 75class WXDLLEXPORT wxRenderer : public wxDelegateRendererNative
1e6feb95
VZ
76{
77public:
78 // drawing functions
79 // -----------------
80
81 // draw the controls background
82 virtual void DrawBackground(wxDC& dc,
83 const wxColour& col,
84 const wxRect& rect,
193e19cf
RR
85 int flags,
86 wxWindow *window = NULL ) = 0;
87
88 // draw the button surface
89 virtual void DrawButtonSurface(wxDC& dc,
90 const wxColour& col,
91 const wxRect& rect,
92 int flags )
93 { DrawBackground( dc, col, rect, flags ); }
a290fa5a 94
1e6feb95
VZ
95
96 // draw the label inside the given rectangle with the specified alignment
97 // and optionally emphasize the character with the given index
98 virtual void DrawLabel(wxDC& dc,
99 const wxString& label,
100 const wxRect& rect,
101 int flags = 0,
102 int alignment = wxALIGN_LEFT | wxALIGN_TOP,
103 int indexAccel = -1,
104 wxRect *rectBounds = NULL) = 0;
105
106 // same but also draw a bitmap if it is valid
107 virtual void DrawButtonLabel(wxDC& dc,
108 const wxString& label,
109 const wxBitmap& image,
110 const wxRect& rect,
111 int flags = 0,
112 int alignment = wxALIGN_LEFT | wxALIGN_TOP,
113 int indexAccel = -1,
114 wxRect *rectBounds = NULL) = 0;
115
116 // draw the border and optionally return the rectangle containing the
117 // region inside the border
118 virtual void DrawBorder(wxDC& dc,
119 wxBorder border,
120 const wxRect& rect,
121 int flags = 0,
122 wxRect *rectIn = (wxRect *)NULL) = 0;
123
124 // draw text control border (I hate to have a separate method for this but
34621cc5 125 // it is needed to accommodate GTK+)
1e6feb95
VZ
126 virtual void DrawTextBorder(wxDC& dc,
127 wxBorder border,
128 const wxRect& rect,
129 int flags = 0,
130 wxRect *rectIn = (wxRect *)NULL) = 0;
131
132 // draw push button border and return the rectangle left for the label
133 virtual void DrawButtonBorder(wxDC& dc,
134 const wxRect& rect,
135 int flags = 0,
136 wxRect *rectIn = (wxRect *)NULL) = 0;
137
138 // draw a horizontal line
139 virtual void DrawHorizontalLine(wxDC& dc,
140 wxCoord y, wxCoord x1, wxCoord x2) = 0;
141
142 // draw a vertical line
143 virtual void DrawVerticalLine(wxDC& dc,
144 wxCoord x, wxCoord y1, wxCoord y2) = 0;
145
146 // draw a frame with the label (horizontal alignment can be specified)
147 virtual void DrawFrame(wxDC& dc,
148 const wxString& label,
149 const wxRect& rect,
150 int flags = 0,
151 int alignment = wxALIGN_LEFT,
152 int indexAccel = -1) = 0;
153
154 // draw an arrow in the given direction
155 virtual void DrawArrow(wxDC& dc,
156 wxDirection dir,
157 const wxRect& rect,
158 int flags = 0) = 0;
159
160 // draw a scrollbar arrow (may be the same as arrow but may be not)
161 virtual void DrawScrollbarArrow(wxDC& dc,
162 wxDirection dir,
163 const wxRect& rect,
164 int flags = 0) = 0;
165
166 // draw the scrollbar thumb
167 virtual void DrawScrollbarThumb(wxDC& dc,
168 wxOrientation orient,
169 const wxRect& rect,
170 int flags = 0) = 0;
171
172 // draw a (part of) scrollbar shaft
173 virtual void DrawScrollbarShaft(wxDC& dc,
174 wxOrientation orient,
175 const wxRect& rect,
176 int flags = 0) = 0;
177
178 // draw the rectangle in the corner between two scrollbars
179 virtual void DrawScrollCorner(wxDC& dc,
180 const wxRect& rect) = 0;
181
182 // draw an item of a wxListBox
183 virtual void DrawItem(wxDC& dc,
184 const wxString& label,
185 const wxRect& rect,
186 int flags = 0) = 0;
187
188 // draw an item of a wxCheckListBox
189 virtual void DrawCheckItem(wxDC& dc,
190 const wxString& label,
191 const wxBitmap& bitmap,
192 const wxRect& rect,
193 int flags = 0) = 0;
194
195 // draw a checkbutton (bitmap may be invalid to use default one)
196 virtual void DrawCheckButton(wxDC& dc,
197 const wxString& label,
198 const wxBitmap& bitmap,
199 const wxRect& rect,
200 int flags = 0,
201 wxAlignment align = wxALIGN_LEFT,
202 int indexAccel = -1) = 0;
203
204 // draw a radio button
205 virtual void DrawRadioButton(wxDC& dc,
206 const wxString& label,
207 const wxBitmap& bitmap,
208 const wxRect& rect,
209 int flags = 0,
210 wxAlignment align = wxALIGN_LEFT,
211 int indexAccel = -1) = 0;
212
9a6384ca 213#if wxUSE_TOOLBAR
3216dbf5
VZ
214 // draw a toolbar button (label may be empty, bitmap may be invalid, if
215 // both conditions are true this function draws a separator)
216 virtual void DrawToolBarButton(wxDC& dc,
217 const wxString& label,
218 const wxBitmap& bitmap,
219 const wxRect& rect,
a8f4cabe 220 int flags = 0,
370efbe7
WS
221 long style = 0,
222 int tbarStyle = 0) = 0;
9a6384ca 223#endif // wxUSE_TOOLBAR
3216dbf5 224
1e6feb95
VZ
225 // draw a (part of) line in the text control
226 virtual void DrawTextLine(wxDC& dc,
227 const wxString& text,
228 const wxRect& rect,
229 int selStart = -1,
230 int selEnd = -1,
231 int flags = 0) = 0;
232
233 // draw a line wrap indicator
234 virtual void DrawLineWrapMark(wxDC& dc, const wxRect& rect) = 0;
235
236 // draw a notebook tab
237 virtual void DrawTab(wxDC& dc,
238 const wxRect& rect,
239 wxDirection dir,
240 const wxString& label,
241 const wxBitmap& bitmap = wxNullBitmap,
242 int flags = 0,
243 int indexAccel = -1) = 0;
244
9a6384ca
WS
245#if wxUSE_SLIDER
246
1e6feb95
VZ
247 // draw the slider shaft
248 virtual void DrawSliderShaft(wxDC& dc,
249 const wxRect& rect,
6766e5d1 250 int lenThumb,
1e6feb95
VZ
251 wxOrientation orient,
252 int flags = 0,
6766e5d1 253 long style = 0,
1e6feb95
VZ
254 wxRect *rectShaft = NULL) = 0;
255
256 // draw the slider thumb
257 virtual void DrawSliderThumb(wxDC& dc,
258 const wxRect& rect,
259 wxOrientation orient,
6766e5d1
JS
260 int flags = 0,
261 long style = 0) = 0;
1e6feb95
VZ
262
263 // draw the slider ticks
264 virtual void DrawSliderTicks(wxDC& dc,
265 const wxRect& rect,
6766e5d1 266 int lenThumb,
1e6feb95
VZ
267 wxOrientation orient,
268 int start,
269 int end,
270 int step = 1,
6766e5d1
JS
271 int flags = 0,
272 long style = 0) = 0;
9a6384ca 273#endif // wxUSE_SLIDER
1e6feb95 274
9a6384ca 275#if wxUSE_MENUS
1e6feb95
VZ
276 // draw a menu bar item
277 virtual void DrawMenuBarItem(wxDC& dc,
278 const wxRect& rect,
279 const wxString& label,
280 int flags = 0,
281 int indexAccel = -1) = 0;
282
283 // draw a menu item (also used for submenus if flags has ISSUBMENU flag)
284 //
285 // the geometryInfo is calculated by GetMenuGeometry() function from below
286 virtual void DrawMenuItem(wxDC& dc,
287 wxCoord y,
288 const wxMenuGeometryInfo& geometryInfo,
289 const wxString& label,
290 const wxString& accel,
291 const wxBitmap& bitmap = wxNullBitmap,
292 int flags = 0,
293 int indexAccel = -1) = 0;
294
295 // draw a menu bar separator
296 virtual void DrawMenuSeparator(wxDC& dc,
297 wxCoord y,
298 const wxMenuGeometryInfo& geomInfo) = 0;
9a6384ca 299#endif // wxUSE_MENUS
71e03035 300
9a6384ca 301#if wxUSE_STATUSBAR
71e03035
VZ
302 // draw a status bar field: wxCONTROL_ISDEFAULT bit in the flags is
303 // interpreted specially and means "draw the status bar grip" here
304 virtual void DrawStatusField(wxDC& dc,
305 const wxRect& rect,
306 const wxString& label,
c2919ab3 307 int flags = 0, int style = 0) = 0;
9a6384ca 308#endif // wxUSE_STATUSBAR
71e03035 309
24a23c35
VS
310 // draw complete frame/dialog titlebar
311 virtual void DrawFrameTitleBar(wxDC& dc,
312 const wxRect& rect,
313 const wxString& title,
314 const wxIcon& icon,
315 int flags,
813edf09
VS
316 int specialButton = 0,
317 int specialButtonFlags = 0) = 0;
71e03035 318
24a23c35
VS
319 // draw frame borders
320 virtual void DrawFrameBorder(wxDC& dc,
321 const wxRect& rect,
322 int flags) = 0;
323
324 // draw frame titlebar background
325 virtual void DrawFrameBackground(wxDC& dc,
326 const wxRect& rect,
327 int flags) = 0;
328
329 // draw frame title
330 virtual void DrawFrameTitle(wxDC& dc,
331 const wxRect& rect,
332 const wxString& title,
333 int flags) = 0;
334
335 // draw frame icon
336 virtual void DrawFrameIcon(wxDC& dc,
337 const wxRect& rect,
338 const wxIcon& icon,
339 int flags) = 0;
340
341 // draw frame buttons
342 virtual void DrawFrameButton(wxDC& dc,
343 wxCoord x, wxCoord y,
344 int button,
345 int flags = 0) = 0;
346
1e6feb95
VZ
347 // misc functions
348 // --------------
349
350 // return the bitmaps to use for combobox button
351 virtual void GetComboBitmaps(wxBitmap *bmpNormal,
e4606ed9 352 wxBitmap *bmpFocus,
1e6feb95
VZ
353 wxBitmap *bmpPressed,
354 wxBitmap *bmpDisabled) = 0;
355
356 // geometry functions
357 // ------------------
358
359 // get the dimensions of the border: rect.x/y contain the width/height of
360 // the left/top side, width/heigh - of the right/bottom one
361 virtual wxRect GetBorderDimensions(wxBorder border) const = 0;
362
363 // the scrollbars may be drawn either inside the window border or outside
364 // it - this function is used to decide how to draw them
365 virtual bool AreScrollbarsInsideBorder() const = 0;
366
367 // adjust the size of the control of the given class: for most controls,
368 // this just takes into account the border, but for some (buttons, for
369 // example) it is more complicated - the result being, in any case, that
370 // the control looks "nice" if it uses the adjusted rectangle
371 virtual void AdjustSize(wxSize *size, const wxWindow *window) = 0;
372
9a6384ca
WS
373#if wxUSE_SCROLLBAR
374
1e6feb95
VZ
375 // get the size of a scrollbar arrow
376 virtual wxSize GetScrollbarArrowSize() const = 0;
377
378 // gets the bounding box for a scrollbar element for the given (by default
379 // - current) thumb position
380 virtual wxRect GetScrollbarRect(const wxScrollBar *scrollbar,
381 wxScrollBar::Element elem,
382 int thumbPos = -1) const = 0;
383
384 // returns the size of the scrollbar shaft excluding the arrows
385 virtual wxCoord GetScrollbarSize(const wxScrollBar *scrollbar) = 0;
386
387 // returns one of wxHT_SCROLLBAR_XXX constants
388 virtual wxHitTest HitTestScrollbar(const wxScrollBar *scrollbar,
389 const wxPoint& pt) const = 0;
390
391 // translate the scrollbar position (in logical units) into physical
392 // coordinate (in pixels) and the other way round
393 virtual wxCoord ScrollbarToPixel(const wxScrollBar *scrollbar,
394 int thumbPos = -1) = 0;
395 virtual int PixelToScrollbar(const wxScrollBar *scrollbar,
396 wxCoord coord) = 0;
397
9a6384ca
WS
398#endif // wxUSE_SCROLLBAR
399
1e6feb95
VZ
400 // get the height of a listbox item from the base font height
401 virtual wxCoord GetListboxItemHeight(wxCoord fontHeight) = 0;
402
403 // get the size of a checkbox/radio button bitmap
404 virtual wxSize GetCheckBitmapSize() const = 0;
405 virtual wxSize GetRadioBitmapSize() const = 0;
406 virtual wxCoord GetCheckItemMargin() const = 0;
407
3216dbf5
VZ
408 // get the standard size of a toolbar button and also return the size of
409 // a toolbar separator in the provided pointer
410 virtual wxSize GetToolBarButtonSize(wxCoord *separator) const = 0;
411
412 // get the margins between/around the toolbar buttons
413 virtual wxSize GetToolBarMargin() const = 0;
414
9a6384ca 415#if wxUSE_TEXTCTRL
1e6feb95
VZ
416 // convert between text rectangle and client rectangle for text controls:
417 // the former is typicall smaller to leave margins around text
418 virtual wxRect GetTextTotalArea(const wxTextCtrl *text,
3216dbf5 419 const wxRect& rectText) const = 0;
1e6feb95
VZ
420
421 // extra space is for line indicators
422 virtual wxRect GetTextClientArea(const wxTextCtrl *text,
423 const wxRect& rectTotal,
3216dbf5 424 wxCoord *extraSpaceBeyond) const = 0;
9a6384ca 425#endif // wxUSE_TEXTCTRL
1e6feb95
VZ
426
427 // get the overhang of a selected tab
428 virtual wxSize GetTabIndent() const = 0;
429
430 // get the padding around the text in a tab
431 virtual wxSize GetTabPadding() const = 0;
432
9a6384ca 433#if wxUSE_SLIDER
1e6feb95
VZ
434 // get the default size of the slider in lesser dimension (i.e. height of a
435 // horizontal slider or width of a vertical one)
436 virtual wxCoord GetSliderDim() const = 0;
437
438 // get the length of the slider ticks displayed along side slider
439 virtual wxCoord GetSliderTickLen() const = 0;
440
441 // get the slider shaft rect from the total slider rect
442 virtual wxRect GetSliderShaftRect(const wxRect& rect,
6766e5d1
JS
443 int lenThumb,
444 wxOrientation orient,
445 long style = 0) const = 0;
1e6feb95
VZ
446
447 // get the size of the slider thumb for the given total slider rect
448 virtual wxSize GetSliderThumbSize(const wxRect& rect,
6766e5d1 449 int lenThumb,
1e6feb95 450 wxOrientation orient) const = 0;
9a6384ca 451#endif // wxUSE_SLIDER
1e6feb95
VZ
452
453 // get the size of one progress bar step (in horz and vertical directions)
454 virtual wxSize GetProgressBarStep() const = 0;
455
9a6384ca 456#if wxUSE_MENUS
1e6feb95
VZ
457 // get the size of rectangle to use in the menubar for the given text rect
458 virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const = 0;
459
460 // get the struct storing all layout info needed to draw all menu items
461 // (this can't be calculated for each item separately as they should be
462 // aligned)
463 //
464 // the returned pointer must be deleted by the caller
465 virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
466 const wxMenu& menu) const = 0;
9a6384ca 467#endif // wxUSE_MENUS
71e03035 468
9a6384ca 469#if wxUSE_STATUSBAR
71e03035
VZ
470 // get the borders around the status bar fields (x and y fields of the
471 // return value) and also, optionally, the border between the fields
472 virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const = 0;
9a6384ca 473#endif // wxUSE_STATUSBAR
24a23c35
VS
474
475 // get client area rectangle of top level window (i.e. subtract
476 // decorations from given rectangle)
477 virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const = 0;
71e03035 478
24a23c35
VS
479 // get size of whole top level window, given size of its client area size
480 virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const = 0;
71e03035 481
e7dda1ff
VS
482 // get the minimal size of top level window
483 virtual wxSize GetFrameMinSize(int flags) const = 0;
484
24a23c35
VS
485 // get titlebar icon size
486 virtual wxSize GetFrameIconSize() const = 0;
71e03035 487
813edf09
VS
488 // returns one of wxHT_TOPLEVEL_XXX constants
489 virtual int HitTestFrame(const wxRect& rect,
490 const wxPoint& pt,
71e03035 491 int flags = 0) const = 0;
24a23c35 492
1e6feb95
VZ
493 // virtual dtor for any base class
494 virtual ~wxRenderer();
495
9c7f49f5 496
1e6feb95
VZ
497protected:
498 // draw a frame around rectFrame rectangle but not touching the rectLabel
499 // one: this is used by DrawFrame()
500 void StandardDrawFrame(wxDC& dc,
501 const wxRect& rectFrame,
502 const wxRect& rectLabel);
503
504 // standard text line drawing: just use DrawText() and highlight the
505 // selected part
506 static void StandardDrawTextLine(wxDC& dc,
507 const wxString& text,
508 const wxRect& rect,
509 int selStart, int selEnd,
510 int flags);
511
9a6384ca 512#if wxUSE_SCROLLBAR
1e6feb95
VZ
513 // standard scrollbar hit testing: this assumes that it only has 2 arrows
514 // and a thumb, so the themes which have more complicated scrollbars (e.g.
515 // BeOS) can't use this method
516 static wxRect StandardGetScrollbarRect(const wxScrollBar *scrollbar,
517 wxScrollBar::Element elem,
518 int thumbPos,
519 const wxSize& sizeArrow);
520 static wxHitTest StandardHitTestScrollbar(const wxScrollBar *scrollbar,
521 const wxPoint& pt,
522 const wxSize& sizeArrow);
523 static wxCoord StandardScrollbarToPixel(const wxScrollBar *scrollbar,
524 int thumbPos,
525 const wxSize& sizeArrow);
526 static int StandardPixelToScrollbar(const wxScrollBar *scrollbar,
527 wxCoord coord,
528 const wxSize& sizeArrow);
529 static wxCoord StandardScrollBarSize(const wxScrollBar *scrollbar,
530 const wxSize& sizeArrow);
531 static void StandardScrollBarThumbSize(wxCoord lenBar,
532 int thumbPos,
533 int thumbSize,
534 int range,
535 wxCoord *thumbStart,
536 wxCoord *thumbEnd);
9a6384ca
WS
537#endif // wxUSE_SCROLLBAR
538
1e6feb95
VZ
539};
540
541// ----------------------------------------------------------------------------
542// wxDelegateRenderer: it is impossible to inherit from any of standard
543// renderers as their declarations are in private code, but you can use this
544// class to override only some of the Draw() functions - all the other ones
545// will be left to the original renderer
546// ----------------------------------------------------------------------------
547
548class WXDLLEXPORT wxDelegateRenderer : public wxRenderer
549{
550public:
551 wxDelegateRenderer(wxRenderer *renderer) : m_renderer(renderer) { }
552
553 virtual void DrawBackground(wxDC& dc,
554 const wxColour& col,
555 const wxRect& rect,
193e19cf
RR
556 int flags,
557 wxWindow *window = NULL )
558 { m_renderer->DrawBackground(dc, col, rect, flags, window ); }
1e6feb95
VZ
559 virtual void DrawLabel(wxDC& dc,
560 const wxString& label,
561 const wxRect& rect,
562 int flags = 0,
563 int align = wxALIGN_LEFT | wxALIGN_TOP,
564 int indexAccel = -1,
565 wxRect *rectBounds = NULL)
566 { m_renderer->DrawLabel(dc, label, rect,
567 flags, align, indexAccel, rectBounds); }
568 virtual void DrawButtonLabel(wxDC& dc,
569 const wxString& label,
570 const wxBitmap& image,
571 const wxRect& rect,
572 int flags = 0,
573 int align = wxALIGN_LEFT | wxALIGN_TOP,
574 int indexAccel = -1,
575 wxRect *rectBounds = NULL)
576 { m_renderer->DrawButtonLabel(dc, label, image, rect,
577 flags, align, indexAccel, rectBounds); }
578 virtual void DrawBorder(wxDC& dc,
579 wxBorder border,
580 const wxRect& rect,
581 int flags = 0,
582 wxRect *rectIn = (wxRect *)NULL)
583 { m_renderer->DrawBorder(dc, border, rect, flags, rectIn); }
584 virtual void DrawTextBorder(wxDC& dc,
585 wxBorder border,
586 const wxRect& rect,
587 int flags = 0,
588 wxRect *rectIn = (wxRect *)NULL)
589 { m_renderer->DrawTextBorder(dc, border, rect, flags, rectIn); }
590 virtual void DrawButtonBorder(wxDC& dc,
591 const wxRect& rect,
592 int flags = 0,
593 wxRect *rectIn = (wxRect *)NULL)
594 { m_renderer->DrawButtonBorder(dc, rect, flags, rectIn); }
595 virtual void DrawFrame(wxDC& dc,
596 const wxString& label,
597 const wxRect& rect,
598 int flags = 0,
599 int align = wxALIGN_LEFT,
600 int indexAccel = -1)
601 { m_renderer->DrawFrame(dc, label, rect, flags, align, indexAccel); }
602 virtual void DrawHorizontalLine(wxDC& dc,
603 wxCoord y, wxCoord x1, wxCoord x2)
604 { m_renderer->DrawHorizontalLine(dc, y, x1, x2); }
605 virtual void DrawVerticalLine(wxDC& dc,
606 wxCoord x, wxCoord y1, wxCoord y2)
607 { m_renderer->DrawVerticalLine(dc, x, y1, y2); }
608 virtual void DrawArrow(wxDC& dc,
609 wxDirection dir,
610 const wxRect& rect,
611 int flags = 0)
612 { m_renderer->DrawArrow(dc, dir, rect, flags); }
613 virtual void DrawScrollbarArrow(wxDC& dc,
614 wxDirection dir,
615 const wxRect& rect,
616 int flags = 0)
617 { m_renderer->DrawScrollbarArrow(dc, dir, rect, flags); }
618 virtual void DrawScrollbarThumb(wxDC& dc,
619 wxOrientation orient,
620 const wxRect& rect,
621 int flags = 0)
622 { m_renderer->DrawScrollbarThumb(dc, orient, rect, flags); }
623 virtual void DrawScrollbarShaft(wxDC& dc,
624 wxOrientation orient,
625 const wxRect& rect,
626 int flags = 0)
627 { m_renderer->DrawScrollbarShaft(dc, orient, rect, flags); }
628 virtual void DrawScrollCorner(wxDC& dc,
629 const wxRect& rect)
630 { m_renderer->DrawScrollCorner(dc, rect); }
631 virtual void DrawItem(wxDC& dc,
632 const wxString& label,
633 const wxRect& rect,
634 int flags = 0)
635 { m_renderer->DrawItem(dc, label, rect, flags); }
636 virtual void DrawCheckItem(wxDC& dc,
637 const wxString& label,
638 const wxBitmap& bitmap,
639 const wxRect& rect,
640 int flags = 0)
641 { m_renderer->DrawCheckItem(dc, label, bitmap, rect, flags); }
642 virtual void DrawCheckButton(wxDC& dc,
643 const wxString& label,
644 const wxBitmap& bitmap,
645 const wxRect& rect,
646 int flags = 0,
647 wxAlignment align = wxALIGN_LEFT,
648 int indexAccel = -1)
649 { m_renderer->DrawCheckButton(dc, label, bitmap, rect,
650 flags, align, indexAccel); }
651 virtual void DrawRadioButton(wxDC& dc,
652 const wxString& label,
653 const wxBitmap& bitmap,
654 const wxRect& rect,
655 int flags = 0,
656 wxAlignment align = wxALIGN_LEFT,
657 int indexAccel = -1)
658 { m_renderer->DrawRadioButton(dc, label, bitmap, rect,
659 flags, align, indexAccel); }
9a6384ca 660#if wxUSE_TOOLBAR
3216dbf5
VZ
661 virtual void DrawToolBarButton(wxDC& dc,
662 const wxString& label,
663 const wxBitmap& bitmap,
664 const wxRect& rect,
a8f4cabe 665 int flags = 0,
370efbe7
WS
666 long style = 0,
667 int tbarStyle = 0)
668 { m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style, tbarStyle); }
9a6384ca 669#endif // wxUSE_TOOLBAR
1e6feb95
VZ
670 virtual void DrawTextLine(wxDC& dc,
671 const wxString& text,
672 const wxRect& rect,
673 int selStart = -1,
9979fbba
MB
674 int selEnd = -1,
675 int flags = 0)
676 { m_renderer->DrawTextLine(dc, text, rect, selStart, selEnd, flags); }
1e6feb95
VZ
677 virtual void DrawLineWrapMark(wxDC& dc, const wxRect& rect)
678 { m_renderer->DrawLineWrapMark(dc, rect); }
679
680 virtual void DrawTab(wxDC& dc,
681 const wxRect& rect,
682 wxDirection dir,
683 const wxString& label,
684 const wxBitmap& bitmap = wxNullBitmap,
685 int flags = 0,
686 int accel = -1)
687 { m_renderer->DrawTab(dc, rect, dir, label, bitmap, flags, accel); }
688
9a6384ca
WS
689#if wxUSE_SLIDER
690
1e6feb95
VZ
691 virtual void DrawSliderShaft(wxDC& dc,
692 const wxRect& rect,
6766e5d1 693 int lenThumb,
1e6feb95
VZ
694 wxOrientation orient,
695 int flags = 0,
6766e5d1 696 long style = 0,
1e6feb95 697 wxRect *rectShaft = NULL)
6766e5d1 698 { m_renderer->DrawSliderShaft(dc, rect, lenThumb, orient, flags, style, rectShaft); }
1e6feb95
VZ
699 virtual void DrawSliderThumb(wxDC& dc,
700 const wxRect& rect,
701 wxOrientation orient,
6766e5d1
JS
702 int flags = 0,
703 long style = 0)
704 { m_renderer->DrawSliderThumb(dc, rect, orient, flags, style); }
1e6feb95
VZ
705 virtual void DrawSliderTicks(wxDC& dc,
706 const wxRect& rect,
6766e5d1 707 int lenThumb,
1e6feb95
VZ
708 wxOrientation orient,
709 int start,
710 int end,
61fef19b 711 int WXUNUSED(step) = 1,
6766e5d1
JS
712 int flags = 0,
713 long style = 0)
714 { m_renderer->DrawSliderTicks(dc, rect, lenThumb, orient,
715 start, end, start, flags, style); }
9a6384ca 716#endif // wxUSE_SLIDER
1e6feb95 717
9a6384ca 718#if wxUSE_MENUS
1e6feb95
VZ
719 virtual void DrawMenuBarItem(wxDC& dc,
720 const wxRect& rect,
721 const wxString& label,
722 int flags = 0,
723 int indexAccel = -1)
724 { m_renderer->DrawMenuBarItem(dc, rect, label, flags, indexAccel); }
725 virtual void DrawMenuItem(wxDC& dc,
726 wxCoord y,
727 const wxMenuGeometryInfo& gi,
728 const wxString& label,
729 const wxString& accel,
730 const wxBitmap& bitmap = wxNullBitmap,
731 int flags = 0,
732 int indexAccel = -1)
733 { m_renderer->DrawMenuItem(dc, y, gi, label, accel,
734 bitmap, flags, indexAccel); }
735 virtual void DrawMenuSeparator(wxDC& dc,
736 wxCoord y,
737 const wxMenuGeometryInfo& geomInfo)
738 { m_renderer->DrawMenuSeparator(dc, y, geomInfo); }
9a6384ca 739#endif // wxUSE_MENUS
71e03035 740
9a6384ca 741#if wxUSE_STATUSBAR
71e03035
VZ
742 virtual void DrawStatusField(wxDC& dc,
743 const wxRect& rect,
744 const wxString& label,
e5aa044b 745 int flags = 0, int style = 0)
c2919ab3 746 { m_renderer->DrawStatusField(dc, rect, label, flags, style); }
9a6384ca 747#endif // wxUSE_STATUSBAR
71e03035 748
24a23c35
VS
749 virtual void DrawFrameTitleBar(wxDC& dc,
750 const wxRect& rect,
751 const wxString& title,
752 const wxIcon& icon,
753 int flags,
813edf09
VS
754 int specialButton = 0,
755 int specialButtonFlag = 0)
71e03035 756 { m_renderer->DrawFrameTitleBar(dc, rect, title, icon, flags,
813edf09 757 specialButton, specialButtonFlag); }
24a23c35
VS
758 virtual void DrawFrameBorder(wxDC& dc,
759 const wxRect& rect,
760 int flags)
761 { m_renderer->DrawFrameBorder(dc, rect, flags); }
762 virtual void DrawFrameBackground(wxDC& dc,
763 const wxRect& rect,
764 int flags)
765 { m_renderer->DrawFrameBackground(dc, rect, flags); }
766 virtual void DrawFrameTitle(wxDC& dc,
767 const wxRect& rect,
768 const wxString& title,
769 int flags)
770 { m_renderer->DrawFrameTitle(dc, rect, title, flags); }
771 virtual void DrawFrameIcon(wxDC& dc,
772 const wxRect& rect,
773 const wxIcon& icon,
774 int flags)
775 { m_renderer->DrawFrameIcon(dc, rect, icon, flags); }
776 virtual void DrawFrameButton(wxDC& dc,
777 wxCoord x, wxCoord y,
778 int button,
779 int flags = 0)
780 { m_renderer->DrawFrameButton(dc, x, y, button, flags); }
781
1e6feb95 782 virtual void GetComboBitmaps(wxBitmap *bmpNormal,
e4606ed9 783 wxBitmap *bmpFocus,
1e6feb95 784 wxBitmap *bmpPressed,
9979fbba 785 wxBitmap *bmpDisabled)
e4606ed9
VZ
786 { m_renderer->GetComboBitmaps(bmpNormal, bmpFocus,
787 bmpPressed, bmpDisabled); }
1e6feb95
VZ
788
789 virtual void AdjustSize(wxSize *size, const wxWindow *window)
790 { m_renderer->AdjustSize(size, window); }
791 virtual wxRect GetBorderDimensions(wxBorder border) const
792 { return m_renderer->GetBorderDimensions(border); }
793 virtual bool AreScrollbarsInsideBorder() const
794 { return m_renderer->AreScrollbarsInsideBorder(); }
795
9a6384ca 796#if wxUSE_SCROLLBAR
1e6feb95
VZ
797 virtual wxSize GetScrollbarArrowSize() const
798 { return m_renderer->GetScrollbarArrowSize(); }
799 virtual wxRect GetScrollbarRect(const wxScrollBar *scrollbar,
800 wxScrollBar::Element elem,
801 int thumbPos = -1) const
802 { return m_renderer->GetScrollbarRect(scrollbar, elem, thumbPos); }
803 virtual wxCoord GetScrollbarSize(const wxScrollBar *scrollbar)
804 { return m_renderer->GetScrollbarSize(scrollbar); }
805 virtual wxHitTest HitTestScrollbar(const wxScrollBar *scrollbar,
806 const wxPoint& pt) const
807 { return m_renderer->HitTestScrollbar(scrollbar, pt); }
808 virtual wxCoord ScrollbarToPixel(const wxScrollBar *scrollbar,
809 int thumbPos = -1)
810 { return m_renderer->ScrollbarToPixel(scrollbar, thumbPos); }
811 virtual int PixelToScrollbar(const wxScrollBar *scrollbar,
812 wxCoord coord)
813 { return m_renderer->PixelToScrollbar(scrollbar, coord); }
9a6384ca
WS
814#endif // wxUSE_SCROLLBAR
815
1e6feb95
VZ
816 virtual wxCoord GetListboxItemHeight(wxCoord fontHeight)
817 { return m_renderer->GetListboxItemHeight(fontHeight); }
818 virtual wxSize GetCheckBitmapSize() const
819 { return m_renderer->GetCheckBitmapSize(); }
820 virtual wxSize GetRadioBitmapSize() const
821 { return m_renderer->GetRadioBitmapSize(); }
822 virtual wxCoord GetCheckItemMargin() const
823 { return m_renderer->GetCheckItemMargin(); }
824
3216dbf5
VZ
825 virtual wxSize GetToolBarButtonSize(wxCoord *separator) const
826 { return m_renderer->GetToolBarButtonSize(separator); }
827 virtual wxSize GetToolBarMargin() const
828 { return m_renderer->GetToolBarMargin(); }
829
9a6384ca 830#if wxUSE_TEXTCTRL
3216dbf5
VZ
831 virtual wxRect GetTextTotalArea(const wxTextCtrl *text,
832 const wxRect& rect) const
1e6feb95
VZ
833 { return m_renderer->GetTextTotalArea(text, rect); }
834 virtual wxRect GetTextClientArea(const wxTextCtrl *text,
835 const wxRect& rect,
3216dbf5 836 wxCoord *extraSpaceBeyond) const
1e6feb95 837 { return m_renderer->GetTextClientArea(text, rect, extraSpaceBeyond); }
9a6384ca 838#endif // wxUSE_TEXTCTRL
1e6feb95
VZ
839
840 virtual wxSize GetTabIndent() const { return m_renderer->GetTabIndent(); }
841 virtual wxSize GetTabPadding() const { return m_renderer->GetTabPadding(); }
842
9a6384ca 843#if wxUSE_SLIDER
1e6feb95
VZ
844 virtual wxCoord GetSliderDim() const
845 { return m_renderer->GetSliderDim(); }
846 virtual wxCoord GetSliderTickLen() const
847 { return m_renderer->GetSliderTickLen(); }
9a6384ca 848
1e6feb95 849 virtual wxRect GetSliderShaftRect(const wxRect& rect,
6766e5d1
JS
850 int lenThumb,
851 wxOrientation orient,
852 long style = 0) const
853 { return m_renderer->GetSliderShaftRect(rect, lenThumb, orient, style); }
1e6feb95 854 virtual wxSize GetSliderThumbSize(const wxRect& rect,
6766e5d1 855 int lenThumb,
1e6feb95 856 wxOrientation orient) const
6766e5d1 857 { return m_renderer->GetSliderThumbSize(rect, lenThumb, orient); }
9a6384ca
WS
858#endif // wxUSE_SLIDER
859
1e6feb95
VZ
860 virtual wxSize GetProgressBarStep() const
861 { return m_renderer->GetProgressBarStep(); }
9a6384ca
WS
862
863#if wxUSE_MENUS
1e6feb95
VZ
864 virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const
865 { return m_renderer->GetMenuBarItemSize(sizeText); }
866 virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
867 const wxMenu& menu) const
868 { return m_renderer->GetMenuGeometry(win, menu); }
9a6384ca
WS
869#endif // wxUSE_MENUS
870
871#if wxUSE_STATUSBAR
71e03035
VZ
872 virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const
873 { return m_renderer->GetStatusBarBorders(borderBetweenFields); }
9a6384ca 874#endif // wxUSE_STATUSBAR
24a23c35
VS
875 virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const
876 { return m_renderer->GetFrameClientArea(rect, flags); }
877 virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const
878 { return m_renderer->GetFrameTotalSize(clientSize, flags); }
e7dda1ff
VS
879 virtual wxSize GetFrameMinSize(int flags) const
880 { return m_renderer->GetFrameMinSize(flags); }
24a23c35
VS
881 virtual wxSize GetFrameIconSize() const
882 { return m_renderer->GetFrameIconSize(); }
813edf09
VS
883 virtual int HitTestFrame(const wxRect& rect,
884 const wxPoint& pt,
885 int flags) const
886 { return m_renderer->HitTestFrame(rect, pt, flags); }
24a23c35 887
9c7f49f5
VZ
888 virtual void DrawHeaderButton(wxWindow *win,
889 wxDC& dc,
890 const wxRect& rect,
891 int flags = 0)
892 { m_renderer->DrawHeaderButton(win, dc, rect, flags); }
893 virtual void DrawTreeItemButton(wxWindow *win,
894 wxDC& dc,
895 const wxRect& rect,
896 int flags = 0)
897 { m_renderer->DrawTreeItemButton(win, dc, rect, flags); }
898
1e6feb95
VZ
899protected:
900 wxRenderer *m_renderer;
901};
902
903// ----------------------------------------------------------------------------
904// wxControlRenderer: wraps the wxRenderer functions in a form easy to use from
905// OnPaint()
906// ----------------------------------------------------------------------------
907
908class WXDLLEXPORT wxControlRenderer
909{
910public:
911 // create a renderer for this dc with this "fundamental" renderer
912 wxControlRenderer(wxWindow *control, wxDC& dc, wxRenderer *renderer);
913
914 // operations
915 void DrawLabel(const wxBitmap& bitmap = wxNullBitmap,
916 wxCoord marginX = 0, wxCoord marginY = 0);
917#if wxUSE_LISTBOX
918 void DrawItems(const wxListBox *listbox,
919 size_t itemFirst, size_t itemLast);
920#endif // wxUSE_LISTBOX
921#if wxUSE_CHECKLISTBOX
922 void DrawCheckItems(const wxCheckListBox *listbox,
923 size_t itemFirst, size_t itemLast);
924#endif // wxUSE_CHECKLISTBOX
925 void DrawButtonBorder();
926 // the line must be either horizontal or vertical
927 void DrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2);
928 void DrawFrame();
929 void DrawBitmap(const wxBitmap& bitmap);
930 void DrawBackgroundBitmap();
931 void DrawScrollbar(const wxScrollBar *scrollbar, int thumbPosOld);
932#if wxUSE_GAUGE
933 void DrawProgressBar(const wxGauge *gauge);
934#endif // wxUSE_GAUGE
935
936 // accessors
937 wxWindow *GetWindow() const { return m_window; }
938 wxRenderer *GetRenderer() const { return m_renderer; }
939
940 wxDC& GetDC() { return m_dc; }
941
942 const wxRect& GetRect() const { return m_rect; }
943 wxRect& GetRect() { return m_rect; }
944
945 // static helpers
946 static void DrawBitmap(wxDC &dc,
947 const wxBitmap& bitmap,
948 const wxRect& rect,
949 int alignment = wxALIGN_CENTRE |
950 wxALIGN_CENTRE_VERTICAL,
951 wxStretch stretch = wxSTRETCH_NOT);
952
953private:
9a6384ca
WS
954
955#if wxUSE_LISTBOX
1e6feb95
VZ
956 // common part of DrawItems() and DrawCheckItems()
957 void DoDrawItems(const wxListBox *listbox,
958 size_t itemFirst, size_t itemLast,
a290fa5a 959 bool isCheckLbox = false);
9a6384ca 960#endif // wxUSE_LISTBOX
1e6feb95
VZ
961
962 wxWindow *m_window;
963 wxRenderer *m_renderer;
964 wxDC& m_dc;
965 wxRect m_rect;
966};
967
968#endif // _WX_UNIV_RENDERER_H_