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
10 // Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
11 // Licence: wxWindows licence
12 ///////////////////////////////////////////////////////////////////////////////
14 #ifndef _WX_UNIV_THEME_H_
15 #define _WX_UNIV_THEME_H_
17 #include "wx/string.h"
19 // ----------------------------------------------------------------------------
21 // ----------------------------------------------------------------------------
23 class WXDLLEXPORT wxArtProvider
;
24 class WXDLLEXPORT wxColourScheme
;
25 class WXDLLEXPORT wxInputConsumer
;
26 class WXDLLEXPORT wxInputHandler
;
27 class WXDLLEXPORT wxRenderer
;
28 struct WXDLLEXPORT wxThemeInfo
;
30 class WXDLLEXPORT wxTheme
36 // create the default theme
37 static bool CreateDefault();
39 // create the theme by name (will return NULL if not found)
40 static wxTheme
*Create(const wxString
& name
);
42 // change the current scheme
43 static wxTheme
*Set(wxTheme
*theme
);
45 // get the current theme (never NULL)
46 static wxTheme
*Get() { return ms_theme
; }
51 // get the renderer implementing all the control-drawing operations in
53 virtual wxRenderer
*GetRenderer() = 0;
55 // get the art provider to be used together with this theme
56 virtual wxArtProvider
*GetArtProvider() = 0;
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;
62 // get the colour scheme for the control with this name
63 virtual wxColourScheme
*GetColourScheme() = 0;
65 // implementation only from now on
66 // -------------------------------
71 // the list of descriptions of all known themes
72 static wxThemeInfo
*ms_allThemes
;
75 static wxTheme
*ms_theme
;
76 friend struct WXDLLEXPORT wxThemeInfo
;
79 // ----------------------------------------------------------------------------
80 // wxDelegateTheme: it is impossible to inherit from any of standard
81 // themes as their declarations are in private code, but you can use this
82 // class to override only some of their functions - all the other ones
83 // will be left to the original theme
84 // ----------------------------------------------------------------------------
86 class wxDelegateTheme
: public wxTheme
89 wxDelegateTheme(const wxChar
*theme
);
90 virtual ~wxDelegateTheme();
92 virtual wxRenderer
*GetRenderer();
93 virtual wxArtProvider
*GetArtProvider();
94 virtual wxInputHandler
*GetInputHandler(const wxString
& control
,
95 wxInputConsumer
*consumer
);
96 virtual wxColourScheme
*GetColourScheme();
99 // gets or creates theme and sets m_theme to point to it,
100 // returns true on success
101 bool GetOrCreateTheme();
103 wxString m_themeName
;
107 // ----------------------------------------------------------------------------
108 // dynamic theme creation helpers
109 // ----------------------------------------------------------------------------
111 struct WXDLLEXPORT wxThemeInfo
113 typedef wxTheme
*(*Constructor
)();
115 // theme name and (user readable) description
118 // the function to create a theme object
121 // next node in the linked list or NULL
124 // constructor for the struct itself
125 wxThemeInfo(Constructor ctor
, const wxChar
*name
, const wxChar
*desc
);
128 // ----------------------------------------------------------------------------
130 // ----------------------------------------------------------------------------
132 // to use a standard theme insert this macro into one of the application files:
133 // without it, an over optimizing linker may discard the object module
134 // containing the theme implementation entirely
135 #define WX_USE_THEME(themename) \
136 /* this indirection makes it possible to pass macro as the argument */ \
137 WX_USE_THEME_IMPL(themename)
139 #define WX_USE_THEME_IMPL(themename) \
140 extern WXDLLEXPORT_DATA(bool) wxThemeUse##themename; \
141 static struct wxThemeUserFor##themename \
143 wxThemeUserFor##themename() { wxThemeUse##themename = true; } \
144 } wxThemeDoUse##themename
146 // to declare a new theme, this macro must be used in the class declaration
147 #define WX_DECLARE_THEME(themename) \
149 static wxThemeInfo ms_info##themename; \
151 const wxThemeInfo *GetThemeInfo() const \
152 { return &ms_info##themename; }
154 // and this one must be inserted in the source file
155 #define WX_IMPLEMENT_THEME(classname, themename, themedesc) \
156 WXDLLEXPORT_DATA(bool) wxThemeUse##themename = true; \
157 wxTheme *wxCtorFor##themename() { return new classname; } \
158 wxThemeInfo classname::ms_info##themename(wxCtorFor##themename, \
159 wxT( #themename ), themedesc)
161 // ----------------------------------------------------------------------------
162 // determine default theme
163 // ----------------------------------------------------------------------------
166 #undef wxUSE_THEME_WIN32
167 #define wxUSE_THEME_WIN32 1
168 #undef wxUSE_THEME_GTK
169 #define wxUSE_THEME_GTK 1
170 #undef wxUSE_THEME_MONO
171 #define wxUSE_THEME_MONO 1
172 #undef wxUSE_THEME_METAL
173 #define wxUSE_THEME_METAL 1
174 #endif // wxUSE_ALL_THEMES
176 // determine the default theme to use:
177 #if defined(__WXGTK__) && wxUSE_THEME_GTK
178 #define wxUNIV_DEFAULT_THEME gtk
179 #elif defined(__WXDFB__) && wxUSE_THEME_MONO
180 // use mono theme for DirectFB port because it cannot correctly
181 // render neither win32 nor gtk themes yet:
182 #define wxUNIV_DEFAULT_THEME mono
185 // if no theme was picked, get any theme compiled in (sorted by
186 // quality/completeness of the theme):
187 #ifndef wxUNIV_DEFAULT_THEME
188 #if wxUSE_THEME_WIN32
189 #define wxUNIV_DEFAULT_THEME win32
190 #elif wxUSE_THEME_GTK
191 #define wxUNIV_DEFAULT_THEME gtk
192 #elif wxUSE_THEME_MONO
193 #define wxUNIV_DEFAULT_THEME mono
195 // If nothing matches, no themes are compiled and the app must provide
197 // (note that wxUSE_THEME_METAL depends on win32 theme, so we don't have to
200 #endif // !wxUNIV_DEFAULT_THEME
202 #endif // _WX_UNIV_THEME_H_