1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        src/univ/themes/mono.cpp
3 // Purpose:     wxUniversal theme for monochrome displays
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     2006-08-27
7 // Copyright:   (c) 2006 REA Elektronik GmbH
8 // Licence:     wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10 
11 // ===========================================================================
12 // declarations
13 // ===========================================================================
14 
15 // ---------------------------------------------------------------------------
16 // headers
17 // ---------------------------------------------------------------------------
18 
19 // for compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21 
22 #ifdef __BORLANDC__
23     #pragma hdrstop
24 #endif
25 
26 #include "wx/univ/theme.h"
27 
28 #if wxUSE_THEME_MONO
29 
30 #ifndef WX_PRECOMP
31     #include "wx/window.h"
32     #include "wx/dc.h"
33 #endif // WX_PRECOMP
34 
35 #include "wx/artprov.h"
36 #include "wx/univ/stdrend.h"
37 #include "wx/univ/inphand.h"
38 #include "wx/univ/colschem.h"
39 
40 class wxMonoColourScheme;
41 
42 #define wxMONO_BG_COL   (*wxWHITE)
43 #define wxMONO_FG_COL   (*wxBLACK)
44 
45 // ----------------------------------------------------------------------------
46 // wxMonoRenderer: draw the GUI elements in simplest possible way
47 // ----------------------------------------------------------------------------
48 
49 // Warning: many of the methods here are not implemented, the code won't work
50 // if any but a few wxUSE_XXXs are on
51 class wxMonoRenderer : public wxStdRenderer
52 {
53 public:
54     wxMonoRenderer(const wxColourScheme *scheme);
55 
56     virtual void DrawLabel(wxDC& dc,
57                            const wxString& label,
58                            const wxRect& rect,
59                            int flags = 0,
60                            int alignment = wxALIGN_LEFT | wxALIGN_TOP,
61                            int indexAccel = -1,
62                            wxRect *rectBounds = NULL);
63     virtual void DrawButtonLabel(wxDC& dc,
64                                  const wxString& label,
65                                  const wxBitmap& image,
66                                  const wxRect& rect,
67                                  int flags = 0,
68                                  int alignment = wxALIGN_LEFT | wxALIGN_TOP,
69                                  int indexAccel = -1,
70                                  wxRect *rectBounds = NULL);
71 
72     virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
73 
74     virtual void DrawButtonBorder(wxDC& dc,
75                                   const wxRect& rect,
76                                   int flags = 0,
77                                   wxRect *rectIn = NULL);
78 
79     virtual void DrawHorizontalLine(wxDC& dc,
80                                     wxCoord y, wxCoord x1, wxCoord x2);
81 
82     virtual void DrawVerticalLine(wxDC& dc,
83                                   wxCoord x, wxCoord y1, wxCoord y2);
84 
85     virtual void DrawArrow(wxDC& dc,
86                            wxDirection dir,
87                            const wxRect& rect,
88                            int flags = 0);
89     virtual void DrawScrollbarThumb(wxDC& dc,
90                                     wxOrientation orient,
91                                     const wxRect& rect,
92                                     int flags = 0);
93     virtual void DrawScrollbarShaft(wxDC& dc,
94                                     wxOrientation orient,
95                                     const wxRect& rect,
96                                     int flags = 0);
97 
98 #if wxUSE_TOOLBAR
99     virtual void DrawToolBarButton(wxDC& dc,
100                                    const wxString& label,
101                                    const wxBitmap& bitmap,
102                                    const wxRect& rect,
103                                    int flags = 0,
104                                    long style = 0,
105                                    int tbarStyle = 0);
106 #endif // wxUSE_TOOLBAR
107 
108 #if wxUSE_NOTEBOOK
109     virtual void DrawTab(wxDC& dc,
110                          const wxRect& rect,
111                          wxDirection dir,
112                          const wxString& label,
113                          const wxBitmap& bitmap = wxNullBitmap,
114                          int flags = 0,
115                          int indexAccel = -1);
116 #endif // wxUSE_NOTEBOOK
117 
118 #if wxUSE_SLIDER
119     virtual void DrawSliderShaft(wxDC& dc,
120                                  const wxRect& rect,
121                                  int lenThumb,
122                                  wxOrientation orient,
123                                  int flags = 0,
124                                  long style = 0,
125                                  wxRect *rectShaft = NULL);
126 
127     virtual void DrawSliderThumb(wxDC& dc,
128                                  const wxRect& rect,
129                                  wxOrientation orient,
130                                  int flags = 0,
131                                  long style = 0);
132 
133     virtual void DrawSliderTicks(wxDC& dc,
134                                  const wxRect& rect,
135                                  int lenThumb,
136                                  wxOrientation orient,
137                                  int start,
138                                  int end,
139                                  int step = 1,
140                                  int flags = 0,
141                                  long style = 0);
142 #endif // wxUSE_SLIDER
143 
144 #if wxUSE_MENUS
145     virtual void DrawMenuBarItem(wxDC& dc,
146                                  const wxRect& rect,
147                                  const wxString& label,
148                                  int flags = 0,
149                                  int indexAccel = -1);
150 
151     virtual void DrawMenuItem(wxDC& dc,
152                               wxCoord y,
153                               const wxMenuGeometryInfo& geometryInfo,
154                               const wxString& label,
155                               const wxString& accel,
156                               const wxBitmap& bitmap = wxNullBitmap,
157                               int flags = 0,
158                               int indexAccel = -1);
159 
160     virtual void DrawMenuSeparator(wxDC& dc,
161                                    wxCoord y,
162                                    const wxMenuGeometryInfo& geomInfo);
163 #endif // wxUSE_MENUS
164 
165 #if wxUSE_COMBOBOX
166     virtual void GetComboBitmaps(wxBitmap *bmpNormal,
167                                  wxBitmap *bmpFocus,
168                                  wxBitmap *bmpPressed,
169                                  wxBitmap *bmpDisabled);
170 #endif // wxUSE_COMBOBOX
171 
172 
173     virtual wxRect GetBorderDimensions(wxBorder border) const;
174 
175 #if wxUSE_SCROLLBAR
GetScrollbarArrowSize() const176     virtual wxSize GetScrollbarArrowSize() const { return GetStdBmpSize(); }
177 #endif // wxUSE_SCROLLBAR
178 
GetCheckBitmapSize() const179     virtual wxSize GetCheckBitmapSize() const { return GetStdBmpSize(); }
GetRadioBitmapSize() const180     virtual wxSize GetRadioBitmapSize() const { return GetStdBmpSize(); }
181 
182 #if wxUSE_TOOLBAR
183     virtual wxSize GetToolBarButtonSize(wxCoord *separator) const;
184 
185     virtual wxSize GetToolBarMargin() const;
186 #endif // wxUSE_TOOLBAR
187 
188 #if wxUSE_NOTEBOOK
189     virtual wxSize GetTabIndent() const;
190 
191     virtual wxSize GetTabPadding() const;
192 #endif // wxUSE_NOTEBOOK
193 
194 #if wxUSE_SLIDER
195     virtual wxCoord GetSliderDim() const;
196 
197     virtual wxCoord GetSliderTickLen() const;
198 
199     virtual wxRect GetSliderShaftRect(const wxRect& rect,
200                                       int lenThumb,
201                                       wxOrientation orient,
202                                       long style = 0) const;
203 
204     virtual wxSize GetSliderThumbSize(const wxRect& rect,
205                                       int lenThumb,
206                                       wxOrientation orient) const;
207 #endif // wxUSE_SLIDER
208 
209     virtual wxSize GetProgressBarStep() const;
210 
211 #if wxUSE_MENUS
212     virtual wxSize GetMenuBarItemSize(const wxSize& sizeText) const;
213 
214     virtual wxMenuGeometryInfo *GetMenuGeometry(wxWindow *win,
215                                                 const wxMenu& menu) const;
216 #endif // wxUSE_MENUS
217 
218 #if wxUSE_STATUSBAR
219     virtual wxCoord GetStatusBarBorderBetweenFields() const;
220 
221     virtual wxSize GetStatusBarFieldMargins() const;
222 #endif // wxUSE_STATUSBAR
223 
224 protected:
225     // override base class border drawing routines: we always draw just a
226     // single simple border
DrawSimpleBorder(wxDC & dc,wxRect * rect)227     void DrawSimpleBorder(wxDC& dc, wxRect *rect)
228         { DrawRect(dc, rect, m_penFg); }
229 
DrawRaisedBorder(wxDC & dc,wxRect * rect)230     virtual void DrawRaisedBorder(wxDC& dc, wxRect *rect)
231         { DrawSimpleBorder(dc, rect); }
DrawSunkenBorder(wxDC & dc,wxRect * rect)232     virtual void DrawSunkenBorder(wxDC& dc, wxRect *rect)
233         { DrawSimpleBorder(dc, rect); }
DrawAntiSunkenBorder(wxDC & dc,wxRect * rect)234     virtual void DrawAntiSunkenBorder(wxDC& dc, wxRect *rect)
235         { DrawSimpleBorder(dc, rect); }
DrawBoxBorder(wxDC & dc,wxRect * rect)236     virtual void DrawBoxBorder(wxDC& dc, wxRect *rect)
237         { DrawSimpleBorder(dc, rect); }
DrawStaticBorder(wxDC & dc,wxRect * rect)238     virtual void DrawStaticBorder(wxDC& dc, wxRect *rect)
239         { DrawSimpleBorder(dc, rect); }
DrawExtraBorder(wxDC & WXUNUSED (dc),wxRect * WXUNUSED (rect))240     virtual void DrawExtraBorder(wxDC& WXUNUSED(dc), wxRect * WXUNUSED(rect))
241         { /* no extra borders for us */ }
242 
243     // all our XPMs are of this size
GetStdBmpSize()244     static wxSize GetStdBmpSize() { return wxSize(8, 8); }
245 
246     wxBitmap GetIndicator(IndicatorType indType, int flags);
GetCheckBitmap(int flags)247     virtual wxBitmap GetCheckBitmap(int flags)
248         { return GetIndicator(IndicatorType_Check, flags); }
GetRadioBitmap(int flags)249     virtual wxBitmap GetRadioBitmap(int flags)
250         { return GetIndicator(IndicatorType_Radio, flags); }
251 
252     virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type);
253     virtual int GetFrameBorderWidth(int flags) const;
254 
255 private:
256     // the bitmaps returned by GetIndicator()
257     wxBitmap m_bmpIndicators[IndicatorType_MaxCtrl]
258                             [IndicatorState_MaxCtrl]
259                             [IndicatorStatus_Max];
260 
261     static const char **ms_xpmIndicators[IndicatorType_MaxCtrl]
262                                         [IndicatorState_MaxCtrl]
263                                         [IndicatorStatus_Max];
264 
265     // the arrow bitmaps used by DrawArrow()
266     wxBitmap m_bmpArrows[Arrow_Max];
267 
268     static const char **ms_xpmArrows[Arrow_Max];
269 
270     // the close bitmap for the frame for GetFrameButtonBitmap()
271     wxBitmap m_bmpFrameClose;
272 
273     // pen used for foreground drawing
274     wxPen m_penFg;
275 };
276 
277 // ----------------------------------------------------------------------------
278 // standard bitmaps
279 // ----------------------------------------------------------------------------
280 
281 static const char *xpmUnchecked[] = {
282 /* columns rows colors chars-per-pixel */
283 "8 8 2 1",
284 "  c white",
285 "X c black",
286 /* pixels */
287 "XXXXXXXX",
288 "X      X",
289 "X      X",
290 "X      X",
291 "X      X",
292 "X      X",
293 "X      X",
294 "XXXXXXXX",
295 };
296 
297 static const char *xpmChecked[] = {
298 /* columns rows colors chars-per-pixel */
299 "8 8 2 1",
300 "  c white",
301 "X c black",
302 /* pixels */
303 "XXXXXXXX",
304 "X      X",
305 "X X  X X",
306 "X  XX  X",
307 "X  XX  X",
308 "X X  X X",
309 "X      X",
310 "XXXXXXXX",
311 };
312 
313 static const char *xpmUndeterminate[] = {
314 /* columns rows colors chars-per-pixel */
315 "8 8 2 1",
316 "  c white",
317 "X c black",
318 /* pixels */
319 "XXXXXXXX",
320 "X X X XX",
321 "XX X X X",
322 "X X X XX",
323 "XX X X X",
324 "X X X XX",
325 "XX X X X",
326 "XXXXXXXX",
327 };
328 
329 static const char *xpmRadioUnchecked[] = {
330 /* columns rows colors chars-per-pixel */
331 "8 8 2 1",
332 "  c white",
333 "X c black",
334 /* pixels */
335 "XXXXXXXX",
336 "X      X",
337 "X  XX  X",
338 "X X  X X",
339 "X X  X X",
340 "X  XX  X",
341 "X      X",
342 "XXXXXXXX",
343 };
344 
345 static const char *xpmRadioChecked[] = {
346 /* columns rows colors chars-per-pixel */
347 "8 8 2 1",
348 "  c white",
349 "X c black",
350 /* pixels */
351 "XXXXXXXX",
352 "X      X",
353 "X  XX  X",
354 "X XXXX X",
355 "X XXXX X",
356 "X  XX  X",
357 "X      X",
358 "XXXXXXXX",
359 };
360 
361 const char **wxMonoRenderer::ms_xpmIndicators[IndicatorType_MaxCtrl]
362                                              [IndicatorState_MaxCtrl]
363                                              [IndicatorStatus_Max] =
364 {
365     // checkboxes first
366     {
367         // normal state
368         { xpmChecked, xpmUnchecked, xpmUndeterminate },
369 
370         // pressed state
371         { xpmUndeterminate, xpmUndeterminate, xpmUndeterminate },
372 
373         // disabled state
374         { xpmUndeterminate, xpmUndeterminate, xpmUndeterminate },
375     },
376 
377     // radio
378     {
379         // normal state
380         { xpmRadioChecked, xpmRadioUnchecked, xpmUndeterminate },
381 
382         // pressed state
383         { xpmUndeterminate, xpmUndeterminate, xpmUndeterminate },
384 
385         // disabled state
386         { xpmUndeterminate, xpmUndeterminate, xpmUndeterminate },
387     },
388 };
389 
390 static const char *xpmLeftArrow[] = {
391 /* columns rows colors chars-per-pixel */
392 "8 8 2 1",
393 "  c white",
394 "X c black",
395 /* pixels */
396 "   X    ",
397 "  XX    ",
398 " XXX    ",
399 "XXXX    ",
400 "XXXX    ",
401 " XXX    ",
402 "  XX    ",
403 "   X    ",
404 };
405 
406 static const char *xpmRightArrow[] = {
407 /* columns rows colors chars-per-pixel */
408 "8 8 2 1",
409 "  c white",
410 "X c black",
411 /* pixels */
412 "    X   ",
413 "    XX  ",
414 "    XXX ",
415 "    XXXX",
416 "    XXXX",
417 "    XXX ",
418 "    XX  ",
419 "    X   ",
420 };
421 
422 static const char *xpmUpArrow[] = {
423 /* columns rows colors chars-per-pixel */
424 "8 8 2 1",
425 "  c white",
426 "X c black",
427 /* pixels */
428 "        ",
429 "   XX   ",
430 "  XXXX  ",
431 " XXXXXX ",
432 "XXXXXXXX",
433 "        ",
434 "        ",
435 "        ",
436 };
437 
438 static const char *xpmDownArrow[] = {
439 /* columns rows colors chars-per-pixel */
440 "8 8 2 1",
441 "  c white",
442 "X c black",
443 /* pixels */
444 "        ",
445 "        ",
446 "        ",
447 "XXXXXXXX",
448 " XXXXXX ",
449 "  XXXX  ",
450 "   XX   ",
451 "        ",
452 };
453 
454 const char **wxMonoRenderer::ms_xpmArrows[Arrow_Max] =
455 {
456     xpmLeftArrow, xpmRightArrow, xpmUpArrow, xpmDownArrow,
457 };
458 
459 // ----------------------------------------------------------------------------
460 // wxMonoColourScheme: uses just white and black
461 // ----------------------------------------------------------------------------
462 
463 class wxMonoColourScheme : public wxColourScheme
464 {
465 public:
466     // we use only 2 colours, white and black, but we avoid referring to them
467     // like this, instead use the functions below
GetFg() const468     wxColour GetFg() const { return wxMONO_FG_COL; }
GetBg() const469     wxColour GetBg() const { return wxMONO_BG_COL; }
470 
471     // implement base class pure virtuals
472     virtual wxColour Get(StdColour col) const;
473     virtual wxColour GetBackground(wxWindow *win) const;
474 };
475 
476 // ----------------------------------------------------------------------------
477 // wxMonoArtProvider
478 // ----------------------------------------------------------------------------
479 
480 class wxMonoArtProvider : public wxArtProvider
481 {
482 protected:
483     virtual wxBitmap CreateBitmap(const wxArtID& id,
484                                   const wxArtClient& client,
485                                   const wxSize& size);
486 };
487 
488 // ----------------------------------------------------------------------------
489 // wxMonoTheme
490 // ----------------------------------------------------------------------------
491 
492 class wxMonoTheme : public wxTheme
493 {
494 public:
495     wxMonoTheme();
496     virtual ~wxMonoTheme();
497 
498     virtual wxRenderer *GetRenderer();
499     virtual wxArtProvider *GetArtProvider();
500     virtual wxInputHandler *GetInputHandler(const wxString& control,
501                                             wxInputConsumer *consumer);
502     virtual wxColourScheme *GetColourScheme();
503 
504 private:
505     wxMonoRenderer *m_renderer;
506     wxMonoArtProvider *m_artProvider;
507     wxMonoColourScheme *m_scheme;
508 
509     WX_DECLARE_THEME(mono)
510 };
511 
512 // ============================================================================
513 // implementation
514 // ============================================================================
515 
516 WX_IMPLEMENT_THEME(wxMonoTheme, mono, wxTRANSLATE("Simple monochrome theme"));
517 
518 // ----------------------------------------------------------------------------
519 // wxMonoTheme
520 // ----------------------------------------------------------------------------
521 
wxMonoTheme()522 wxMonoTheme::wxMonoTheme()
523 {
524     m_scheme = NULL;
525     m_renderer = NULL;
526     m_artProvider = NULL;
527 }
528 
~wxMonoTheme()529 wxMonoTheme::~wxMonoTheme()
530 {
531     delete m_renderer;
532     delete m_scheme;
533     delete m_artProvider;
534 }
535 
GetRenderer()536 wxRenderer *wxMonoTheme::GetRenderer()
537 {
538     if ( !m_renderer )
539     {
540         m_renderer = new wxMonoRenderer(GetColourScheme());
541     }
542 
543     return m_renderer;
544 }
545 
GetArtProvider()546 wxArtProvider *wxMonoTheme::GetArtProvider()
547 {
548     if ( !m_artProvider )
549     {
550         m_artProvider = new wxMonoArtProvider;
551     }
552 
553     return m_artProvider;
554 }
555 
GetColourScheme()556 wxColourScheme *wxMonoTheme::GetColourScheme()
557 {
558     if ( !m_scheme )
559     {
560         m_scheme = new wxMonoColourScheme;
561     }
562 
563     return m_scheme;
564 }
565 
GetInputHandler(const wxString & WXUNUSED (control),wxInputConsumer * consumer)566 wxInputHandler *wxMonoTheme::GetInputHandler(const wxString& WXUNUSED(control),
567                                              wxInputConsumer *consumer)
568 {
569     // no special input handlers so far
570     return consumer->DoGetStdInputHandler(NULL);
571 }
572 
573 // ============================================================================
574 // wxMonoColourScheme
575 // ============================================================================
576 
GetBackground(wxWindow * win) const577 wxColour wxMonoColourScheme::GetBackground(wxWindow *win) const
578 {
579     wxColour col;
580     if ( win->UseBgCol() )
581     {
582         // use the user specified colour
583         col = win->GetBackgroundColour();
584     }
585 
586     // doesn't depend on the state
587     if ( !col.IsOk() )
588     {
589         col = GetBg();
590     }
591 
592     return col;
593 }
594 
Get(wxMonoColourScheme::StdColour col) const595 wxColour wxMonoColourScheme::Get(wxMonoColourScheme::StdColour col) const
596 {
597     switch ( col )
598     {
599         case WINDOW:
600         case CONTROL:
601         case CONTROL_PRESSED:
602         case CONTROL_CURRENT:
603         case SCROLLBAR:
604         case SCROLLBAR_PRESSED:
605         case GAUGE:
606         case TITLEBAR:
607         case TITLEBAR_ACTIVE:
608         case HIGHLIGHT_TEXT:
609         case DESKTOP:
610         case FRAME:
611             return GetBg();
612 
613         case MAX:
614         default:
615             wxFAIL_MSG(wxT("invalid standard colour"));
616             // fall through
617 
618         case SHADOW_DARK:
619         case SHADOW_HIGHLIGHT:
620         case SHADOW_IN:
621         case SHADOW_OUT:
622         case CONTROL_TEXT:
623         case CONTROL_TEXT_DISABLED:
624         case CONTROL_TEXT_DISABLED_SHADOW:
625         case TITLEBAR_TEXT:
626         case TITLEBAR_ACTIVE_TEXT:
627         case HIGHLIGHT:
628             return GetFg();
629 
630     }
631 }
632 
633 // ============================================================================
634 // wxMonoRenderer
635 // ============================================================================
636 
637 // ----------------------------------------------------------------------------
638 // construction
639 // ----------------------------------------------------------------------------
640 
wxMonoRenderer(const wxColourScheme * scheme)641 wxMonoRenderer::wxMonoRenderer(const wxColourScheme *scheme)
642               : wxStdRenderer(scheme)
643 {
644     m_penFg = wxPen(wxMONO_FG_COL);
645 }
646 
647 // ----------------------------------------------------------------------------
648 // borders
649 // ----------------------------------------------------------------------------
650 
GetBorderDimensions(wxBorder border) const651 wxRect wxMonoRenderer::GetBorderDimensions(wxBorder border) const
652 {
653     wxCoord width;
654     switch ( border )
655     {
656         case wxBORDER_SIMPLE:
657         case wxBORDER_STATIC:
658         case wxBORDER_RAISED:
659         case wxBORDER_SUNKEN:
660         case wxBORDER_THEME:
661             width = 1;
662             break;
663   /*
664         case wxBORDER_DOUBLE:
665             width = 2;
666             break;
667    */
668         default:
669             wxFAIL_MSG(wxT("unknown border type"));
670             // fall through
671 
672         case wxBORDER_DEFAULT:
673         case wxBORDER_NONE:
674             width = 0;
675             break;
676     }
677 
678     wxRect rect;
679     rect.x =
680     rect.y =
681     rect.width =
682     rect.height = width;
683 
684     return rect;
685 }
686 
DrawButtonBorder(wxDC & dc,const wxRect & rect,int flags,wxRect * rectIn)687 void wxMonoRenderer::DrawButtonBorder(wxDC& dc,
688                                      const wxRect& rect,
689                                      int flags,
690                                      wxRect *rectIn)
691 {
692     DrawBorder(dc, wxBORDER_SIMPLE, rect, flags, rectIn);
693 }
694 
695 // ----------------------------------------------------------------------------
696 // lines and frames
697 // ----------------------------------------------------------------------------
698 
699 void
DrawHorizontalLine(wxDC & dc,wxCoord y,wxCoord x1,wxCoord x2)700 wxMonoRenderer::DrawHorizontalLine(wxDC& dc, wxCoord y, wxCoord x1, wxCoord x2)
701 {
702     dc.SetPen(m_penFg);
703     dc.DrawLine(x1, y, x2 + 1, y);
704 }
705 
706 void
DrawVerticalLine(wxDC & dc,wxCoord x,wxCoord y1,wxCoord y2)707 wxMonoRenderer::DrawVerticalLine(wxDC& dc, wxCoord x, wxCoord y1, wxCoord y2)
708 {
709     dc.SetPen(m_penFg);
710     dc.DrawLine(x, y1, x, y2 + 1);
711 }
712 
DrawFocusRect(wxWindow * WXUNUSED (win),wxDC & dc,const wxRect & rect,int flags)713 void wxMonoRenderer::DrawFocusRect(wxWindow* WXUNUSED(win), wxDC& dc, const wxRect& rect, int flags)
714 {
715     // no need to draw the focus rect for selected items, it would be invisible
716     // anyhow
717     if ( !(flags & wxCONTROL_SELECTED) )
718     {
719         dc.SetPen(m_penFg);
720         dc.SetBrush(*wxTRANSPARENT_BRUSH);
721         dc.DrawRectangle(rect);
722     }
723 }
724 
725 // ----------------------------------------------------------------------------
726 // label
727 // ----------------------------------------------------------------------------
728 
DrawLabel(wxDC & dc,const wxString & label,const wxRect & rect,int WXUNUSED (flags),int alignment,int indexAccel,wxRect * rectBounds)729 void wxMonoRenderer::DrawLabel(wxDC& dc,
730                                const wxString& label,
731                                const wxRect& rect,
732                                int WXUNUSED(flags),
733                                int alignment,
734                                int indexAccel,
735                                wxRect *rectBounds)
736 {
737     dc.DrawLabel(label, wxNullBitmap, rect, alignment, indexAccel, rectBounds);
738 }
739 
DrawButtonLabel(wxDC & dc,const wxString & label,const wxBitmap & image,const wxRect & rect,int flags,int alignment,int indexAccel,wxRect * rectBounds)740 void wxMonoRenderer::DrawButtonLabel(wxDC& dc,
741                                      const wxString& label,
742                                      const wxBitmap& image,
743                                      const wxRect& rect,
744                                      int flags,
745                                      int alignment,
746                                      int indexAccel,
747                                      wxRect *rectBounds)
748 {
749     dc.DrawLabel(label, image, rect, alignment, indexAccel, rectBounds);
750 
751     if ( flags & wxCONTROL_DISABLED )
752     {
753         // this is ugly but I don't know how to show disabled button visually
754         // in monochrome theme otherwise, so cross it out
755         dc.SetPen(m_penFg);
756         dc.DrawLine(rect.GetTopLeft(), rect.GetBottomRight());
757         dc.DrawLine(rect.GetTopRight(), rect.GetBottomLeft());
758     }
759 }
760 
761 // ----------------------------------------------------------------------------
762 // bitmaps
763 // ----------------------------------------------------------------------------
764 
GetIndicator(IndicatorType indType,int flags)765 wxBitmap wxMonoRenderer::GetIndicator(IndicatorType indType, int flags)
766 {
767     IndicatorState indState;
768     IndicatorStatus indStatus;
769     GetIndicatorsFromFlags(flags, indState, indStatus);
770 
771     wxBitmap& bmp = m_bmpIndicators[indType][indState][indStatus];
772     if ( !bmp.IsOk() )
773     {
774         const char **xpm = ms_xpmIndicators[indType][indState][indStatus];
775         if ( xpm )
776         {
777             // create and cache it
778             bmp = wxBitmap(xpm);
779         }
780     }
781 
782     return bmp;
783 }
784 
GetFrameButtonBitmap(FrameButtonType type)785 wxBitmap wxMonoRenderer::GetFrameButtonBitmap(FrameButtonType type)
786 {
787     if ( type == FrameButton_Close )
788     {
789         if ( !m_bmpFrameClose.IsOk() )
790         {
791             static const char *xpmFrameClose[] = {
792             /* columns rows colors chars-per-pixel */
793             "8 8 2 1",
794             "  c white",
795             "X c black",
796             /* pixels */
797             "        ",
798             " XX  XX ",
799             "  X  X  ",
800             "   XX   ",
801             "   XX   ",
802             "  X  X  ",
803             " XX  XX ",
804             "        ",
805             };
806 
807             m_bmpFrameClose = wxBitmap(xpmFrameClose);
808         }
809 
810         return m_bmpFrameClose;
811     }
812 
813     // we don't show any other buttons than close
814     return wxNullBitmap;
815 }
816 
817 // ----------------------------------------------------------------------------
818 // toolbar
819 // ----------------------------------------------------------------------------
820 
821 #if wxUSE_TOOLBAR
822 
DrawToolBarButton(wxDC & WXUNUSED (dc),const wxString & WXUNUSED (label),const wxBitmap & WXUNUSED (bitmap),const wxRect & WXUNUSED (rect),int WXUNUSED (flags),long WXUNUSED (style),int WXUNUSED (tbarStyle))823 void wxMonoRenderer::DrawToolBarButton(wxDC& WXUNUSED(dc),
824                                        const wxString& WXUNUSED(label),
825                                        const wxBitmap& WXUNUSED(bitmap),
826                                        const wxRect& WXUNUSED(rect),
827                                        int WXUNUSED(flags),
828                                        long WXUNUSED(style),
829                                        int WXUNUSED(tbarStyle))
830 {
831     wxFAIL_MSG(wxT("TODO"));
832 }
833 
GetToolBarButtonSize(wxCoord * WXUNUSED (separator)) const834 wxSize wxMonoRenderer::GetToolBarButtonSize(wxCoord *WXUNUSED(separator)) const
835 {
836     wxFAIL_MSG(wxT("TODO"));
837 
838     return wxSize();
839 }
840 
GetToolBarMargin() const841 wxSize wxMonoRenderer::GetToolBarMargin() const
842 {
843     wxFAIL_MSG(wxT("TODO"));
844 
845     return wxSize();
846 }
847 
848 #endif // wxUSE_TOOLBAR
849 
850 // ----------------------------------------------------------------------------
851 // notebook
852 // ----------------------------------------------------------------------------
853 
854 #if wxUSE_NOTEBOOK
855 
DrawTab(wxDC & WXUNUSED (dc),const wxRect & WXUNUSED (rect),wxDirection WXUNUSED (dir),const wxString & WXUNUSED (label),const wxBitmap & WXUNUSED (bitmap),int WXUNUSED (flags),int WXUNUSED (indexAccel))856 void wxMonoRenderer::DrawTab(wxDC& WXUNUSED(dc),
857                              const wxRect& WXUNUSED(rect),
858                              wxDirection WXUNUSED(dir),
859                              const wxString& WXUNUSED(label),
860                              const wxBitmap& WXUNUSED(bitmap),
861                              int WXUNUSED(flags),
862                              int WXUNUSED(indexAccel))
863 {
864     wxFAIL_MSG(wxT("TODO"));
865 }
866 
GetTabIndent() const867 wxSize wxMonoRenderer::GetTabIndent() const
868 {
869     wxFAIL_MSG(wxT("TODO"));
870 
871     return wxSize();
872 }
873 
GetTabPadding() const874 wxSize wxMonoRenderer::GetTabPadding() const
875 {
876     wxFAIL_MSG(wxT("TODO"));
877 
878     return wxSize();
879 }
880 
881 #endif // wxUSE_NOTEBOOK
882 
883 // ----------------------------------------------------------------------------
884 // combobox
885 // ----------------------------------------------------------------------------
886 
887 #if wxUSE_COMBOBOX
888 
GetComboBitmaps(wxBitmap * WXUNUSED (bmpNormal),wxBitmap * WXUNUSED (bmpFocus),wxBitmap * WXUNUSED (bmpPressed),wxBitmap * WXUNUSED (bmpDisabled))889 void wxMonoRenderer::GetComboBitmaps(wxBitmap *WXUNUSED(bmpNormal),
890                                      wxBitmap *WXUNUSED(bmpFocus),
891                                      wxBitmap *WXUNUSED(bmpPressed),
892                                      wxBitmap *WXUNUSED(bmpDisabled))
893 {
894     wxFAIL_MSG(wxT("TODO"));
895 }
896 
897 #endif // wxUSE_COMBOBOX
898 
899 // ----------------------------------------------------------------------------
900 // menus
901 // ----------------------------------------------------------------------------
902 
903 #if wxUSE_MENUS
904 
DrawMenuBarItem(wxDC & WXUNUSED (dc),const wxRect & WXUNUSED (rect),const wxString & WXUNUSED (label),int WXUNUSED (flags),int WXUNUSED (indexAccel))905 void wxMonoRenderer::DrawMenuBarItem(wxDC& WXUNUSED(dc),
906                                      const wxRect& WXUNUSED(rect),
907                                      const wxString& WXUNUSED(label),
908                                      int WXUNUSED(flags),
909                                      int WXUNUSED(indexAccel))
910 {
911     wxFAIL_MSG(wxT("TODO"));
912 }
913 
DrawMenuItem(wxDC & WXUNUSED (dc),wxCoord WXUNUSED (y),const wxMenuGeometryInfo & WXUNUSED (geometryInfo),const wxString & WXUNUSED (label),const wxString & WXUNUSED (accel),const wxBitmap & WXUNUSED (bitmap),int WXUNUSED (flags),int WXUNUSED (indexAccel))914 void wxMonoRenderer::DrawMenuItem(wxDC& WXUNUSED(dc),
915                                   wxCoord WXUNUSED(y),
916                                   const wxMenuGeometryInfo& WXUNUSED(geometryInfo),
917                                   const wxString& WXUNUSED(label),
918                                   const wxString& WXUNUSED(accel),
919                                   const wxBitmap& WXUNUSED(bitmap),
920                                   int WXUNUSED(flags),
921                                   int WXUNUSED(indexAccel))
922 {
923     wxFAIL_MSG(wxT("TODO"));
924 }
925 
DrawMenuSeparator(wxDC & WXUNUSED (dc),wxCoord WXUNUSED (y),const wxMenuGeometryInfo & WXUNUSED (geomInfo))926 void wxMonoRenderer::DrawMenuSeparator(wxDC& WXUNUSED(dc),
927                                        wxCoord WXUNUSED(y),
928                                        const wxMenuGeometryInfo& WXUNUSED(geomInfo))
929 {
930     wxFAIL_MSG(wxT("TODO"));
931 }
932 
GetMenuBarItemSize(const wxSize & WXUNUSED (sizeText)) const933 wxSize wxMonoRenderer::GetMenuBarItemSize(const wxSize& WXUNUSED(sizeText)) const
934 {
935     wxFAIL_MSG(wxT("TODO"));
936 
937     return wxSize();
938 }
939 
GetMenuGeometry(wxWindow * WXUNUSED (win),const wxMenu & WXUNUSED (menu)) const940 wxMenuGeometryInfo *wxMonoRenderer::GetMenuGeometry(wxWindow *WXUNUSED(win),
941                                                     const wxMenu& WXUNUSED(menu)) const
942 {
943     wxFAIL_MSG(wxT("TODO"));
944 
945     return NULL;
946 }
947 
948 #endif // wxUSE_MENUS
949 
950 // ----------------------------------------------------------------------------
951 // slider
952 // ----------------------------------------------------------------------------
953 
954 #if wxUSE_SLIDER
955 
DrawSliderShaft(wxDC & WXUNUSED (dc),const wxRect & WXUNUSED (rect),int WXUNUSED (lenThumb),wxOrientation WXUNUSED (orient),int WXUNUSED (flags),long WXUNUSED (style),wxRect * WXUNUSED (rectShaft))956 void wxMonoRenderer::DrawSliderShaft(wxDC& WXUNUSED(dc),
957                                      const wxRect& WXUNUSED(rect),
958                                      int WXUNUSED(lenThumb),
959                                      wxOrientation WXUNUSED(orient),
960                                      int WXUNUSED(flags),
961                                      long WXUNUSED(style),
962                                      wxRect *WXUNUSED(rectShaft))
963 {
964     wxFAIL_MSG(wxT("TODO"));
965 }
966 
967 
DrawSliderThumb(wxDC & WXUNUSED (dc),const wxRect & WXUNUSED (rect),wxOrientation WXUNUSED (orient),int WXUNUSED (flags),long WXUNUSED (style))968 void wxMonoRenderer::DrawSliderThumb(wxDC& WXUNUSED(dc),
969                                      const wxRect& WXUNUSED(rect),
970                                      wxOrientation WXUNUSED(orient),
971                                      int WXUNUSED(flags),
972                                      long WXUNUSED(style))
973 {
974     wxFAIL_MSG(wxT("TODO"));
975 }
976 
DrawSliderTicks(wxDC & WXUNUSED (dc),const wxRect & WXUNUSED (rect),int WXUNUSED (lenThumb),wxOrientation WXUNUSED (orient),int WXUNUSED (start),int WXUNUSED (end),int WXUNUSED (step),int WXUNUSED (flags),long WXUNUSED (style))977 void wxMonoRenderer::DrawSliderTicks(wxDC& WXUNUSED(dc),
978                                      const wxRect& WXUNUSED(rect),
979                                      int WXUNUSED(lenThumb),
980                                      wxOrientation WXUNUSED(orient),
981                                      int WXUNUSED(start),
982                                      int WXUNUSED(end),
983                                      int WXUNUSED(step),
984                                      int WXUNUSED(flags),
985                                      long WXUNUSED(style))
986 {
987     wxFAIL_MSG(wxT("TODO"));
988 }
989 
GetSliderDim() const990 wxCoord wxMonoRenderer::GetSliderDim() const
991 {
992     wxFAIL_MSG(wxT("TODO"));
993 
994     return 0;
995 }
996 
GetSliderTickLen() const997 wxCoord wxMonoRenderer::GetSliderTickLen() const
998 {
999     wxFAIL_MSG(wxT("TODO"));
1000 
1001     return 0;
1002 }
1003 
1004 
GetSliderShaftRect(const wxRect & WXUNUSED (rect),int WXUNUSED (lenThumb),wxOrientation WXUNUSED (orient),long WXUNUSED (style)) const1005 wxRect wxMonoRenderer::GetSliderShaftRect(const wxRect& WXUNUSED(rect),
1006                                           int WXUNUSED(lenThumb),
1007                                           wxOrientation WXUNUSED(orient),
1008                                           long WXUNUSED(style)) const
1009 {
1010     wxFAIL_MSG(wxT("TODO"));
1011 
1012     return wxRect();
1013 }
1014 
GetSliderThumbSize(const wxRect & WXUNUSED (rect),int WXUNUSED (lenThumb),wxOrientation WXUNUSED (orient)) const1015 wxSize wxMonoRenderer::GetSliderThumbSize(const wxRect& WXUNUSED(rect),
1016                                           int WXUNUSED(lenThumb),
1017                                           wxOrientation WXUNUSED(orient)) const
1018 {
1019     wxFAIL_MSG(wxT("TODO"));
1020 
1021     return wxSize();
1022 }
1023 
1024 #endif // wxUSE_SLIDER
1025 
GetProgressBarStep() const1026 wxSize wxMonoRenderer::GetProgressBarStep() const
1027 {
1028     wxFAIL_MSG(wxT("TODO"));
1029 
1030     return wxSize();
1031 }
1032 
1033 
1034 // ----------------------------------------------------------------------------
1035 // scrollbar
1036 // ----------------------------------------------------------------------------
1037 
DrawArrow(wxDC & dc,wxDirection dir,const wxRect & rect,int WXUNUSED (flags))1038 void wxMonoRenderer::DrawArrow(wxDC& dc,
1039                                wxDirection dir,
1040                                const wxRect& rect,
1041                                int WXUNUSED(flags))
1042 {
1043     ArrowDirection arrowDir = GetArrowDirection(dir);
1044     wxCHECK_RET( arrowDir != Arrow_Max, wxT("invalid arrow direction") );
1045 
1046     wxBitmap& bmp = m_bmpArrows[arrowDir];
1047     if ( !bmp.IsOk() )
1048     {
1049         bmp = wxBitmap(ms_xpmArrows[arrowDir]);
1050     }
1051 
1052     wxRect rectArrow(0, 0, bmp.GetWidth(), bmp.GetHeight());
1053     dc.DrawBitmap(bmp, rectArrow.CentreIn(rect).GetPosition(), true /* use mask */);
1054 }
1055 
DrawScrollbarThumb(wxDC & dc,wxOrientation WXUNUSED (orient),const wxRect & rect,int WXUNUSED (flags))1056 void wxMonoRenderer::DrawScrollbarThumb(wxDC& dc,
1057                                         wxOrientation WXUNUSED(orient),
1058                                         const wxRect& rect,
1059                                         int WXUNUSED(flags))
1060 {
1061     DrawSolidRect(dc, wxMONO_BG_COL, rect);
1062 
1063     // manually draw stipple pattern (wxDFB doesn't implement the wxSTIPPLE
1064     // brush style):
1065     dc.SetPen(m_penFg);
1066     for ( wxCoord y = rect.GetTop(); y <= rect.GetBottom(); y++ )
1067     {
1068         for ( wxCoord x = rect.GetLeft() + (y % 2); x <= rect.GetRight(); x+=2 )
1069         {
1070             dc.DrawPoint(x, y);
1071         }
1072     }
1073 }
1074 
DrawScrollbarShaft(wxDC & dc,wxOrientation WXUNUSED (orient),const wxRect & rect,int WXUNUSED (flags))1075 void wxMonoRenderer::DrawScrollbarShaft(wxDC& dc,
1076                                         wxOrientation WXUNUSED(orient),
1077                                         const wxRect& rect,
1078                                         int WXUNUSED(flags))
1079 {
1080     DrawSolidRect(dc, wxMONO_BG_COL, rect);
1081 }
1082 
1083 // ----------------------------------------------------------------------------
1084 // status bar
1085 // ----------------------------------------------------------------------------
1086 
1087 #if wxUSE_STATUSBAR
1088 
GetStatusBarBorderBetweenFields() const1089 wxCoord wxMonoRenderer::GetStatusBarBorderBetweenFields() const
1090 {
1091     return 1;
1092 }
1093 
GetStatusBarFieldMargins() const1094 wxSize wxMonoRenderer::GetStatusBarFieldMargins() const
1095 {
1096     return wxSize(1, 1);
1097 }
1098 
1099 #endif // wxUSE_STATUSBAR
1100 
1101 // ----------------------------------------------------------------------------
1102 // top level windows
1103 // ----------------------------------------------------------------------------
1104 
GetFrameBorderWidth(int WXUNUSED (flags)) const1105 int wxMonoRenderer::GetFrameBorderWidth(int WXUNUSED(flags)) const
1106 {
1107     // all our borders are simple
1108     return 1;
1109 }
1110 
1111 // ----------------------------------------------------------------------------
1112 // wxMonoArtProvider
1113 // ----------------------------------------------------------------------------
1114 
CreateBitmap(const wxArtID & WXUNUSED (id),const wxArtClient & WXUNUSED (client),const wxSize & WXUNUSED (size))1115 wxBitmap wxMonoArtProvider::CreateBitmap(const wxArtID& WXUNUSED(id),
1116                                          const wxArtClient& WXUNUSED(client),
1117                                          const wxSize& WXUNUSED(size))
1118 {
1119     return wxNullBitmap;
1120 }
1121 
1122 #endif // wxUSE_THEME_MONO
1123