| 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 WXDLLEXPORT wxArtProvider; |
| 24 | class WXDLLEXPORT wxColourScheme; |
| 25 | class WXDLLEXPORT wxInputConsumer; |
| 26 | class WXDLLEXPORT wxInputHandler; |
| 27 | class WXDLLEXPORT wxRenderer; |
| 28 | struct WXDLLEXPORT wxThemeInfo; |
| 29 | |
| 30 | class WXDLLEXPORT 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 WXDLLEXPORT 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 wxChar *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 WXDLLEXPORT 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 wxChar *name, const wxChar *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 WXDLLEXPORT_DATA(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 | 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) |
| 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_ |