[start of] cleanup uxtheme support code
[wxWidgets.git] / src / msw / uxtheme.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/uxtheme.cpp
3 // Purpose: implements wxUxThemeEngine class: support for XP themes
4 // Author:
5 // Modified by:
6 // Created: 2003
7 // RCS-ID: $Id$
8 // Copyright: (c) 2003 wxWindows Dev-Team
9 // License: wxWindows license
10 ///////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 #ifdef __GNUG__
17 #pragma implementation "uxtheme.h"
18 #endif
19
20 // ----------------------------------------------------------------------------
21 // headers
22 // ----------------------------------------------------------------------------
23
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 #if wxUSE_UXTHEME
32
33 #ifndef WX_PRECOMP
34 #include "wx/app.h"
35 #include "wx/toplevel.h"
36 #include "wx/string.h"
37 #include "wx/log.h"
38 #endif //WX_PRECOMP
39
40 #include "wx/module.h"
41
42 #include "wx/msw/wrapwin.h"
43
44 #include "wx/msw/uxtheme.h"
45 #include "wx/msw/private.h"
46
47 // ============================================================================
48 // wxUxThemeModule
49 // ============================================================================
50
51 // this module is responsable for deleting the theme engine
52 class wxUxThemeModule : public wxModule
53 {
54 public:
55 virtual bool OnInit() { return true; }
56 virtual void OnExit()
57 {
58 if ( wxUxThemeEngine::ms_themeEngine )
59 {
60 // this is probably not necessary right now but try to be careful
61 // and avoid the problems which we might have if someone ever
62 // decides to show a message box using the theme engine from
63 // wxUxThemeEngine dtor (e.g. from wxDynamicLibrary dtor...) or
64 // something like this
65 wxUxThemeEngine *themeEngine = wxUxThemeEngine::ms_themeEngine;
66 wxUxThemeEngine::ms_themeEngine = NULL;
67 wxUxThemeEngine::ms_isThemeEngineAvailable = false;
68
69 delete themeEngine;
70 }
71 }
72
73
74 DECLARE_DYNAMIC_CLASS(wxUxThemeModule)
75 };
76
77 IMPLEMENT_DYNAMIC_CLASS(wxUxThemeModule, wxModule)
78
79 // ============================================================================
80 // wxUxThemeEngine implementation
81 // ============================================================================
82
83 wxUxThemeEngine *wxUxThemeEngine::ms_themeEngine = NULL;
84 int wxUxThemeEngine::ms_isThemeEngineAvailable = -1; // unknown
85
86 wxUxThemeEngine* wxUxThemeEngine::Get()
87 {
88 // we assume that themes are only used in the main thread hence no need for
89 // critical section here
90 if ( ms_isThemeEngineAvailable == -1 )
91 {
92 // we're called or the first time, check if the themes are available
93 ms_themeEngine = new wxUxThemeEngine;
94 if ( !ms_themeEngine->Initialize() )
95 {
96 // can't use themes, probably because the system doesn't support
97 // them, don't do it again
98 delete ms_themeEngine;
99 ms_themeEngine = NULL;
100
101 ms_isThemeEngineAvailable = false;
102 }
103 else // initialized ok
104 {
105 ms_isThemeEngineAvailable = true;
106 }
107 }
108
109 return ms_themeEngine;
110 }
111
112 bool wxUxThemeEngine::Initialize()
113 {
114 if ( !m_dllUxTheme.Load(_T("uxtheme.dll")) )
115 return false;
116
117 #define RESOLVE_UXTHEME_FUNCTION(type, funcname) \
118 funcname = (type)m_dllUxTheme.GetSymbol(_T(#funcname)); \
119 if ( !funcname ) \
120 return false
121
122 RESOLVE_UXTHEME_FUNCTION(PFNWXUOPENTHEMEDATA, OpenThemeData);
123 RESOLVE_UXTHEME_FUNCTION(PFNWXUCLOSETHEMEDATA, CloseThemeData);
124 RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEBACKGROUND, DrawThemeBackground);
125 RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMETEXT, DrawThemeText);
126 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBACKGROUNDCONTENTRECT, GetThemeBackgroundContentRect);
127 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBACKGROUNDEXTENT, GetThemeBackgroundExtent);
128 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEPARTSIZE, GetThemePartSize);
129 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMETEXTEXTENT, GetThemeTextExtent);
130 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMETEXTMETRICS, GetThemeTextMetrics);
131 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBACKGROUNDREGION, GetThemeBackgroundRegion);
132 RESOLVE_UXTHEME_FUNCTION(PFNWXUHITTESTTHEMEBACKGROUND, HitTestThemeBackground);
133 RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEEDGE, DrawThemeEdge);
134 RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEICON, DrawThemeIcon);
135 RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEPARTDEFINED, IsThemePartDefined);
136 RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEBACKGROUNDPARTIALLYTRANSPARENT, IsThemeBackgroundPartiallyTransparent);
137 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMECOLOR, GetThemeColor);
138 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEMETRIC, GetThemeMetric);
139 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESTRING, GetThemeString);
140 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEBOOL, GetThemeBool);
141 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEINT, GetThemeInt);
142 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEENUMVALUE, GetThemeEnumValue);
143 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEPOSITION, GetThemePosition);
144 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEFONT, GetThemeFont);
145 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMERECT, GetThemeRect);
146 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEMARGINS, GetThemeMargins);
147 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEINTLIST, GetThemeIntList);
148 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEPROPERTYORIGIN, GetThemePropertyOrigin);
149 RESOLVE_UXTHEME_FUNCTION(PFNWXUSETWINDOWTHEME, SetWindowTheme);
150 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEFILENAME, GetThemeFilename);
151 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSCOLOR, GetThemeSysColor);
152 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSCOLORBRUSH, GetThemeSysColorBrush);
153 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSBOOL, GetThemeSysBool);
154 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSSIZE, GetThemeSysSize);
155 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSFONT, GetThemeSysFont);
156 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSSTRING, GetThemeSysString);
157 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMESYSINT, GetThemeSysInt);
158 RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEACTIVE, IsThemeActive);
159 RESOLVE_UXTHEME_FUNCTION(PFNWXUISAPPTHEMED, IsAppThemed);
160 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETWINDOWTHEME, GetWindowTheme);
161 RESOLVE_UXTHEME_FUNCTION(PFNWXUENABLETHEMEDIALOGTEXTURE, EnableThemeDialogTexture);
162 RESOLVE_UXTHEME_FUNCTION(PFNWXUISTHEMEDIALOGTEXTUREENABLED, IsThemeDialogTextureEnabled);
163 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEAPPPROPERTIES, GetThemeAppProperties);
164 RESOLVE_UXTHEME_FUNCTION(PFNWXUSETTHEMEAPPPROPERTIES, SetThemeAppProperties);
165 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETCURRENTTHEMENAME, GetCurrentThemeName);
166 RESOLVE_UXTHEME_FUNCTION(PFNWXUGETTHEMEDOCUMENTATIONPROPERTY, GetThemeDocumentationProperty);
167 RESOLVE_UXTHEME_FUNCTION(PFNWXUDRAWTHEMEPARENTBACKGROUND, DrawThemeParentBackground);
168 RESOLVE_UXTHEME_FUNCTION(PFNWXUENABLETHEMING, EnableTheming);
169
170 #undef RESOLVE_UXTHEME_FUNCTION
171
172 return true;
173 }
174
175 #endif // wxUSE_UXTHEME
176