]>
Commit | Line | Data |
---|---|---|
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 | ||
23 | class WXDLLIMPEXP_FWD_CORE wxArtProvider; | |
24 | class WXDLLIMPEXP_FWD_CORE wxColourScheme; | |
25 | class WXDLLIMPEXP_FWD_CORE wxInputConsumer; | |
26 | class WXDLLIMPEXP_FWD_CORE wxInputHandler; | |
27 | class WXDLLIMPEXP_FWD_CORE wxRenderer; | |
28 | struct WXDLLIMPEXP_FWD_CORE wxThemeInfo; | |
29 | ||
30 | class WXDLLIMPEXP_CORE wxTheme | |
31 | { | |
32 | public: | |
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 | ||
70 | private: | |
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 wxThemeInfo; | |
77 | }; | |
78 | ||
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 | // ---------------------------------------------------------------------------- | |
85 | ||
86 | class wxDelegateTheme : public wxTheme | |
87 | { | |
88 | public: | |
89 | wxDelegateTheme(const wxString& theme); | |
90 | virtual ~wxDelegateTheme(); | |
91 | ||
92 | virtual wxRenderer *GetRenderer(); | |
93 | virtual wxArtProvider *GetArtProvider(); | |
94 | virtual wxInputHandler *GetInputHandler(const wxString& control, | |
95 | wxInputConsumer *consumer); | |
96 | virtual wxColourScheme *GetColourScheme(); | |
97 | ||
98 | protected: | |
99 | // gets or creates theme and sets m_theme to point to it, | |
100 | // returns true on success | |
101 | bool GetOrCreateTheme(); | |
102 | ||
103 | wxString m_themeName; | |
104 | wxTheme *m_theme; | |
105 | }; | |
106 | ||
107 | // ---------------------------------------------------------------------------- | |
108 | // dynamic theme creation helpers | |
109 | // ---------------------------------------------------------------------------- | |
110 | ||
111 | struct WXDLLIMPEXP_CORE wxThemeInfo | |
112 | { | |
113 | typedef wxTheme *(*Constructor)(); | |
114 | ||
115 | // theme name and (user readable) description | |
116 | wxString name, desc; | |
117 | ||
118 | // the function to create a theme object | |
119 | Constructor ctor; | |
120 | ||
121 | // next node in the linked list or NULL | |
122 | wxThemeInfo *next; | |
123 | ||
124 | // constructor for the struct itself | |
125 | wxThemeInfo(Constructor ctor, const wxString& name, const wxString& desc); | |
126 | }; | |
127 | ||
128 | // ---------------------------------------------------------------------------- | |
129 | // macros | |
130 | // ---------------------------------------------------------------------------- | |
131 | ||
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) | |
138 | ||
139 | #define WX_USE_THEME_IMPL(themename) \ | |
140 | extern WXDLLIMPEXP_DATA_CORE(bool) wxThemeUse##themename; \ | |
141 | static struct wxThemeUserFor##themename \ | |
142 | { \ | |
143 | wxThemeUserFor##themename() { wxThemeUse##themename = true; } \ | |
144 | } wxThemeDoUse##themename | |
145 | ||
146 | // to declare a new theme, this macro must be used in the class declaration | |
147 | #define WX_DECLARE_THEME(themename) \ | |
148 | private: \ | |
149 | static wxThemeInfo ms_info##themename; \ | |
150 | public: \ | |
151 | const wxThemeInfo *GetThemeInfo() const \ | |
152 | { return &ms_info##themename; } | |
153 | ||
154 | // and this one must be inserted in the source file | |
155 | #define WX_IMPLEMENT_THEME(classname, themename, themedesc) \ | |
156 | WXDLLIMPEXP_DATA_CORE(bool) wxThemeUse##themename = true; \ | |
157 | wxTheme *wxCtorFor##themename() { return new classname; } \ | |
158 | wxThemeInfo classname::ms_info##themename(wxCtorFor##themename, \ | |
159 | wxT( #themename ), themedesc) | |
160 | ||
161 | // ---------------------------------------------------------------------------- | |
162 | // determine default theme | |
163 | // ---------------------------------------------------------------------------- | |
164 | ||
165 | #if wxUSE_ALL_THEMES | |
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 | |
175 | ||
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 | |
183 | #endif | |
184 | ||
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 | |
194 | #endif | |
195 | // If nothing matches, no themes are compiled and the app must provide | |
196 | // some theme itself | |
197 | // (note that wxUSE_THEME_METAL depends on win32 theme, so we don't have to | |
198 | // try it) | |
199 | // | |
200 | #endif // !wxUNIV_DEFAULT_THEME | |
201 | ||
202 | #endif // _WX_UNIV_THEME_H_ |