// Created: 06.08.00
// RCS-ID: $Id$
// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
-// Licence: wxWidgets licence
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_UNIV_THEME_H_
#define _WX_UNIV_THEME_H_
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma interface "theme.h"
-#endif
+#include "wx/string.h"
// ----------------------------------------------------------------------------
// wxTheme
// ----------------------------------------------------------------------------
-class WXDLLEXPORT wxRenderer;
-class WXDLLEXPORT wxColourScheme;
-class WXDLLEXPORT wxInputHandler;
-class WXDLLEXPORT wxArtProvider;
-struct WXDLLEXPORT wxThemeInfo;
+class WXDLLIMPEXP_FWD_CORE wxArtProvider;
+class WXDLLIMPEXP_FWD_CORE wxColourScheme;
+class WXDLLIMPEXP_FWD_CORE wxInputConsumer;
+class WXDLLIMPEXP_FWD_CORE wxInputHandler;
+class WXDLLIMPEXP_FWD_CORE wxRenderer;
+struct WXDLLIMPEXP_FWD_CORE wxThemeInfo;
-class WXDLLEXPORT wxTheme
+class WXDLLIMPEXP_CORE wxTheme
{
public:
// static methods
// get the renderer implementing all the control-drawing operations in
// this theme
virtual wxRenderer *GetRenderer() = 0;
-
+
// get the art provider to be used together with this theme
virtual wxArtProvider *GetArtProvider() = 0;
- // get the input handler of the given type
- virtual wxInputHandler *GetInputHandler(const wxString& handlerType) = 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;
// the current theme
static wxTheme *ms_theme;
- friend struct WXDLLEXPORT wxThemeInfo;
+ friend struct 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 WXDLLIMPEXP_CORE wxDelegateTheme : public wxTheme
+{
+public:
+ wxDelegateTheme(const wxString& 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;
};
// ----------------------------------------------------------------------------
// dynamic theme creation helpers
// ----------------------------------------------------------------------------
-struct WXDLLEXPORT wxThemeInfo
+struct WXDLLIMPEXP_CORE wxThemeInfo
{
typedef wxTheme *(*Constructor)();
wxThemeInfo *next;
// constructor for the struct itself
- wxThemeInfo(Constructor ctor, const wxChar *name, const wxChar *desc);
+ wxThemeInfo(Constructor ctor, const wxString& name, const wxString& desc);
};
// ----------------------------------------------------------------------------
// without it, an over optimizing linker may discard the object module
// containing the theme implementation entirely
#define WX_USE_THEME(themename) \
- WXDLLEXPORT_DATA(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 WXDLLIMPEXP_DATA_CORE(bool) wxThemeUse##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
// and this one must be inserted in the source file
#define WX_IMPLEMENT_THEME(classname, themename, themedesc) \
- WXDLLEXPORT_DATA(bool) wxThemeUse##themename = TRUE; \
+ WXDLLIMPEXP_DATA_CORE(bool) wxThemeUse##themename = true; \
wxTheme *wxCtorFor##themename() { return new classname; } \
wxThemeInfo classname::ms_info##themename(wxCtorFor##themename, \
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_