]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/univ/theme.h
added wxDC::Set/GetLayoutDirection() and implemented it for wxMSW (patch from Tim...
[wxWidgets.git] / include / wx / univ / theme.h
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: wx/univ/theme.h
3// Purpose: wxTheme class manages all configurable aspects of the
4// application including the look (wxRenderer), feel
5// (wxInputHandler) and the colours (wxColourScheme)
6// Author: Vadim Zeitlin
7// Modified by:
8// Created: 06.08.00
9// RCS-ID: $Id$
10// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
11// Licence: wxWindows licence
12///////////////////////////////////////////////////////////////////////////////
13
14#ifndef _WX_UNIV_THEME_H_
15#define _WX_UNIV_THEME_H_
16
17#include "wx/string.h"
18
19// ----------------------------------------------------------------------------
20// wxTheme
21// ----------------------------------------------------------------------------
22
23class WXDLLEXPORT wxArtProvider;
24class WXDLLEXPORT wxColourScheme;
25class WXDLLEXPORT wxInputConsumer;
26class WXDLLEXPORT wxInputHandler;
27class WXDLLEXPORT wxRenderer;
28struct WXDLLEXPORT wxThemeInfo;
29
30class WXDLLEXPORT wxTheme
31{
32public:
33 // static methods
34 // --------------
35
36 // create the default theme
37 static bool CreateDefault();
38
39 // create the theme by name (will return NULL if not found)
40 static wxTheme *Create(const wxString& name);
41
42 // change the current scheme
43 static wxTheme *Set(wxTheme *theme);
44
45 // get the current theme (never NULL)
46 static wxTheme *Get() { return ms_theme; }
47
48 // the theme methods
49 // -----------------
50
51 // get the renderer implementing all the control-drawing operations in
52 // this theme
53 virtual wxRenderer *GetRenderer() = 0;
54
55 // get the art provider to be used together with this theme
56 virtual wxArtProvider *GetArtProvider() = 0;
57
58 // get the input handler of the given type, forward to the standard one
59 virtual wxInputHandler *GetInputHandler(const wxString& handlerType,
60 wxInputConsumer *consumer) = 0;
61
62 // get the colour scheme for the control with this name
63 virtual wxColourScheme *GetColourScheme() = 0;
64
65 // implementation only from now on
66 // -------------------------------
67
68 virtual ~wxTheme();
69
70private:
71 // the list of descriptions of all known themes
72 static wxThemeInfo *ms_allThemes;
73
74 // the current theme
75 static wxTheme *ms_theme;
76 friend struct WXDLLEXPORT wxThemeInfo;
77};
78
79// ----------------------------------------------------------------------------
80// dynamic theme creation helpers
81// ----------------------------------------------------------------------------
82
83struct WXDLLEXPORT wxThemeInfo
84{
85 typedef wxTheme *(*Constructor)();
86
87 // theme name and (user readable) description
88 wxString name, desc;
89
90 // the function to create a theme object
91 Constructor ctor;
92
93 // next node in the linked list or NULL
94 wxThemeInfo *next;
95
96 // constructor for the struct itself
97 wxThemeInfo(Constructor ctor, const wxChar *name, const wxChar *desc);
98};
99
100// ----------------------------------------------------------------------------
101// macros
102// ----------------------------------------------------------------------------
103
104// to use a standard theme insert this macro into one of the application files:
105// without it, an over optimizing linker may discard the object module
106// containing the theme implementation entirely
107#define WX_USE_THEME(themename) \
108 /* this indirection makes it possible to pass macro as the argument */ \
109 WX_USE_THEME_IMPL(themename)
110
111#define WX_USE_THEME_IMPL(themename) \
112 extern WXDLLEXPORT_DATA(bool) wxThemeUse##themename; \
113 static struct wxThemeUserFor##themename \
114 { \
115 wxThemeUserFor##themename() { wxThemeUse##themename = true; } \
116 } wxThemeDoUse##themename
117
118// to declare a new theme, this macro must be used in the class declaration
119#define WX_DECLARE_THEME(themename) \
120 private: \
121 static wxThemeInfo ms_info##themename; \
122 public: \
123 const wxThemeInfo *GetThemeInfo() const \
124 { return &ms_info##themename; }
125
126// and this one must be inserted in the source file
127#define WX_IMPLEMENT_THEME(classname, themename, themedesc) \
128 WXDLLEXPORT_DATA(bool) wxThemeUse##themename = true; \
129 wxTheme *wxCtorFor##themename() { return new classname; } \
130 wxThemeInfo classname::ms_info##themename(wxCtorFor##themename, \
131 wxT( #themename ), themedesc)
132
133// ----------------------------------------------------------------------------
134// determine default theme
135// ----------------------------------------------------------------------------
136
137#if wxUSE_ALL_THEMES
138 #undef wxUSE_THEME_WIN32
139 #define wxUSE_THEME_WIN32 1
140 #undef wxUSE_THEME_GTK
141 #define wxUSE_THEME_GTK 1
142 #undef wxUSE_THEME_MONO
143 #define wxUSE_THEME_MONO 1
144 #undef wxUSE_THEME_METAL
145 #define wxUSE_THEME_METAL 1
146#endif // wxUSE_ALL_THEMES
147
148// determine the default theme to use:
149#if defined(__WXGTK__) && wxUSE_THEME_GTK
150 #define wxUNIV_DEFAULT_THEME gtk
151#elif defined(__WXDFB__) && wxUSE_THEME_MONO
152 // use mono theme for DirectFB port because it cannot correctly
153 // render neither win32 nor gtk themes yet:
154 #define wxUNIV_DEFAULT_THEME mono
155#endif
156
157// if no theme was picked, get any theme compiled in (sorted by
158// quality/completeness of the theme):
159#ifndef wxUNIV_DEFAULT_THEME
160 #if wxUSE_THEME_WIN32
161 #define wxUNIV_DEFAULT_THEME win32
162 #elif wxUSE_THEME_GTK
163 #define wxUNIV_DEFAULT_THEME gtk
164 #elif wxUSE_THEME_MONO
165 #define wxUNIV_DEFAULT_THEME mono
166 #endif
167 // If nothing matches, no themes are compiled and the app must provide
168 // some theme itself
169 // (note that wxUSE_THEME_METAL depends on win32 theme, so we don't have to
170 // try it)
171 //
172#endif // !wxUNIV_DEFAULT_THEME
173
174#endif // _WX_UNIV_THEME_H_