]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/univ/theme.h
Compilation fix for old GCC versions.
[wxWidgets.git] / include / wx / univ / theme.h
index a22293cfa1039569500f3f4499e4a1765c627f89..a386a2cca837697a80aa8e019ebf4f58dfd9db8f 100644 (file)
@@ -8,23 +8,23 @@
 // Created:     06.08.00
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
 // Created:     06.08.00
 // RCS-ID:      $Id$
 // Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_UNIV_THEME_H_
 #define _WX_UNIV_THEME_H_
 
 ///////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_UNIV_THEME_H_
 #define _WX_UNIV_THEME_H_
 
-#ifdef __GNUG__
-    #pragma interface "theme.h"
-#endif
+#include "wx/string.h"
 
 // ----------------------------------------------------------------------------
 // wxTheme
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
 // wxTheme
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxRenderer;
+class WXDLLEXPORT wxArtProvider;
 class WXDLLEXPORT wxColourScheme;
 class WXDLLEXPORT wxColourScheme;
+class WXDLLEXPORT wxInputConsumer;
 class WXDLLEXPORT wxInputHandler;
 class WXDLLEXPORT wxInputHandler;
+class WXDLLEXPORT wxRenderer;
 struct WXDLLEXPORT wxThemeInfo;
 
 class WXDLLEXPORT wxTheme
 struct WXDLLEXPORT wxThemeInfo;
 
 class WXDLLEXPORT wxTheme
@@ -52,8 +52,12 @@ public:
     // this theme
     virtual wxRenderer *GetRenderer() = 0;
 
     // this theme
     virtual wxRenderer *GetRenderer() = 0;
 
-    // get the input handler of the given type
-    virtual wxInputHandler *GetInputHandler(const wxString& handlerType) = 0;
+    // get the art provider to be used together with this theme
+    virtual wxArtProvider *GetArtProvider() = 0;
+
+    // get the input handler of the given type, forward to the standard one
+    virtual wxInputHandler *GetInputHandler(const wxString& handlerType,
+                                            wxInputConsumer *consumer) = 0;
 
     // get the colour scheme for the control with this name
     virtual wxColourScheme *GetColourScheme() = 0;
 
     // get the colour scheme for the control with this name
     virtual wxColourScheme *GetColourScheme() = 0;
@@ -69,11 +73,35 @@ private:
 
     // the current theme
     static wxTheme *ms_theme;
 
     // the current theme
     static wxTheme *ms_theme;
-#ifdef __MWERKS__
-    friend class wxThemeInfo;
-#else
-    friend wxThemeInfo;
-#endif
+    friend struct WXDLLEXPORT wxThemeInfo;
+};
+
+// ----------------------------------------------------------------------------
+// wxDelegateTheme: it is impossible to inherit from any of standard
+// themes as their declarations are in private code, but you can use this
+// class to override only some of their functions - all the other ones
+// will be left to the original theme
+// ----------------------------------------------------------------------------
+
+class wxDelegateTheme : public wxTheme
+{
+public:
+    wxDelegateTheme(const wxChar *theme);
+    virtual ~wxDelegateTheme();
+
+    virtual wxRenderer *GetRenderer();
+    virtual wxArtProvider *GetArtProvider();
+    virtual wxInputHandler *GetInputHandler(const wxString& control,
+                                            wxInputConsumer *consumer);
+    virtual wxColourScheme *GetColourScheme();
+
+protected:
+    // gets or creates theme and sets m_theme to point to it,
+    // returns true on success
+    bool GetOrCreateTheme();
+
+    wxString    m_themeName;
+    wxTheme    *m_theme;
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -105,10 +133,14 @@ struct WXDLLEXPORT wxThemeInfo
 // without it, an over optimizing linker may discard the object module
 // containing the theme implementation entirely
 #define WX_USE_THEME(themename)                                             \
 // without it, an over optimizing linker may discard the object module
 // containing the theme implementation entirely
 #define WX_USE_THEME(themename)                                             \
-    extern bool wxThemeUse##themename;                                      \
+    /* this indirection makes it possible to pass macro as the argument */  \
+    WX_USE_THEME_IMPL(themename)
+
+#define WX_USE_THEME_IMPL(themename)                                        \
+    extern WXDLLEXPORT_DATA(bool) wxThemeUse##themename;                    \
     static struct wxThemeUserFor##themename                                 \
     {                                                                       \
     static struct wxThemeUserFor##themename                                 \
     {                                                                       \
-        wxThemeUserFor##themename() { wxThemeUse##themename = TRUE; }       \
+        wxThemeUserFor##themename() { wxThemeUse##themename = true; }       \
     } wxThemeDoUse##themename
 
 // to declare a new theme, this macro must be used in the class declaration
     } wxThemeDoUse##themename
 
 // to declare a new theme, this macro must be used in the class declaration
@@ -121,10 +153,50 @@ struct WXDLLEXPORT wxThemeInfo
 
 // and this one must be inserted in the source file
 #define WX_IMPLEMENT_THEME(classname, themename, themedesc)                 \
 
 // and this one must be inserted in the source file
 #define WX_IMPLEMENT_THEME(classname, themename, themedesc)                 \
-    bool wxThemeUse##themename = TRUE;                                      \
+    WXDLLEXPORT_DATA(bool) wxThemeUse##themename = true;                    \
     wxTheme *wxCtorFor##themename() { return new classname; }               \
     wxThemeInfo classname::ms_info##themename(wxCtorFor##themename,         \
     wxTheme *wxCtorFor##themename() { return new classname; }               \
     wxThemeInfo classname::ms_info##themename(wxCtorFor##themename,         \
-                                              #themename, themedesc)
+                                              wxT( #themename ), themedesc)
 
 
-#endif // _WX_UNIV_THEME_H_
+// ----------------------------------------------------------------------------
+// determine default theme
+// ----------------------------------------------------------------------------
+
+#if wxUSE_ALL_THEMES
+    #undef  wxUSE_THEME_WIN32
+    #define wxUSE_THEME_WIN32  1
+    #undef  wxUSE_THEME_GTK
+    #define wxUSE_THEME_GTK    1
+    #undef  wxUSE_THEME_MONO
+    #define wxUSE_THEME_MONO   1
+    #undef  wxUSE_THEME_METAL
+    #define wxUSE_THEME_METAL  1
+#endif // wxUSE_ALL_THEMES
+
+// determine the default theme to use:
+#if defined(__WXGTK__) && wxUSE_THEME_GTK
+    #define wxUNIV_DEFAULT_THEME gtk
+#elif defined(__WXDFB__) && wxUSE_THEME_MONO
+    // use mono theme for DirectFB port because it cannot correctly
+    // render neither win32 nor gtk themes yet:
+    #define wxUNIV_DEFAULT_THEME mono
+#endif
 
 
+// if no theme was picked, get any theme compiled in (sorted by
+// quality/completeness of the theme):
+#ifndef wxUNIV_DEFAULT_THEME
+    #if wxUSE_THEME_WIN32
+        #define wxUNIV_DEFAULT_THEME win32
+    #elif wxUSE_THEME_GTK
+        #define wxUNIV_DEFAULT_THEME gtk
+    #elif wxUSE_THEME_MONO
+        #define wxUNIV_DEFAULT_THEME mono
+    #endif
+    // If nothing matches, no themes are compiled and the app must provide
+    // some theme itself
+    // (note that wxUSE_THEME_METAL depends on win32 theme, so we don't have to
+    // try it)
+    //
+#endif // !wxUNIV_DEFAULT_THEME
+
+#endif // _WX_UNIV_THEME_H_