1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        src/univ/theme.cpp
3 // Purpose:     implementation of wxTheme
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     06.08.00
7 // Copyright:   (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
8 // Licence:     wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10 
11 // ===========================================================================
12 // declarations
13 // ===========================================================================
14 
15 // ---------------------------------------------------------------------------
16 // headers
17 // ---------------------------------------------------------------------------
18 
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21 
22 #ifdef __BORLANDC__
23     #pragma hdrstop
24 #endif
25 
26 #ifndef WX_PRECOMP
27     #include "wx/intl.h"
28     #include "wx/log.h"
29 #endif // WX_PRECOMP
30 
31 #include "wx/artprov.h"
32 
33 #include "wx/univ/renderer.h"
34 #include "wx/univ/inphand.h"
35 #include "wx/univ/theme.h"
36 
37 // ============================================================================
38 // implementation
39 // ============================================================================
40 
41 wxThemeInfo *wxTheme::ms_allThemes = NULL;
42 wxTheme *wxTheme::ms_theme = NULL;
43 
44 // ----------------------------------------------------------------------------
45 // "dynamic" theme creation
46 // ----------------------------------------------------------------------------
47 
wxThemeInfo(Constructor c,const wxString & n,const wxString & d)48 wxThemeInfo::wxThemeInfo(Constructor c,
49                          const wxString& n,
50                          const wxString& d)
51            : name(n), desc(d), ctor(c)
52 {
53     // insert us (in the head of) the linked list
54     next = wxTheme::ms_allThemes;
55     wxTheme::ms_allThemes = this;
56 }
57 
Create(const wxString & name)58 /* static */ wxTheme *wxTheme::Create(const wxString& name)
59 {
60     // find the theme in the list by name
61     wxThemeInfo *info = ms_allThemes;
62     while ( info )
63     {
64         if ( name.CmpNoCase(info->name) == 0 )
65         {
66             return info->ctor();
67         }
68 
69         info = info->next;
70     }
71 
72     return NULL;
73 }
74 
75 // ----------------------------------------------------------------------------
76 // the default theme (called by wxApp::OnInitGui)
77 // ----------------------------------------------------------------------------
78 
CreateDefault()79 /* static */ bool wxTheme::CreateDefault()
80 {
81     if ( ms_theme )
82     {
83         // we already have a theme
84         return true;
85     }
86 
87     wxString nameDefTheme;
88 
89     // use the environment variable first
90     const wxChar *p = wxGetenv(wxT("WXTHEME"));
91     if ( p )
92     {
93         nameDefTheme = p;
94     }
95 #ifdef wxUNIV_DEFAULT_THEME
96     else // use native theme by default
97     {
98         nameDefTheme = wxSTRINGIZE_T(wxUNIV_DEFAULT_THEME);
99     }
100 #endif // wxUNIV_DEFAULT_THEME
101 
102     wxTheme *theme = Create(nameDefTheme);
103 
104     // fallback to the first one in the list
105     if ( !theme && ms_allThemes )
106     {
107         theme = ms_allThemes->ctor();
108     }
109 
110     // abort if still nothing
111     if ( !theme )
112     {
113         wxLogError(_("Failed to initialize GUI: no built-in themes found."));
114 
115         return false;
116     }
117 
118     // Set the theme as current.
119     wxTheme::Set(theme);
120 
121     return true;
122 }
123 
Set(wxTheme * theme)124 /* static */ wxTheme *wxTheme::Set(wxTheme *theme)
125 {
126     wxTheme *themeOld = ms_theme;
127     ms_theme = theme;
128 
129     if ( ms_theme )
130     {
131         // automatically start using the art provider of the new theme if it
132         // has one
133         wxArtProvider *art = ms_theme->GetArtProvider();
134         if ( art )
135             wxArtProvider::Push(art);
136     }
137 
138     return themeOld;
139 }
140 
141 // ----------------------------------------------------------------------------
142 // assorted trivial dtors
143 // ----------------------------------------------------------------------------
144 
~wxTheme()145 wxTheme::~wxTheme()
146 {
147 }
148 
149 
150 // ----------------------------------------------------------------------------
151 // wxDelegateTheme
152 // ----------------------------------------------------------------------------
153 
wxDelegateTheme(const wxString & theme)154 wxDelegateTheme::wxDelegateTheme(const wxString& theme)
155 {
156     m_themeName = theme;
157     m_theme = NULL;
158 }
159 
~wxDelegateTheme()160 wxDelegateTheme::~wxDelegateTheme()
161 {
162     delete m_theme;
163 }
164 
GetOrCreateTheme()165 bool wxDelegateTheme::GetOrCreateTheme()
166 {
167     if ( !m_theme )
168         m_theme = wxTheme::Create(m_themeName);
169     return m_theme != NULL;
170 }
171 
GetRenderer()172 wxRenderer *wxDelegateTheme::GetRenderer()
173 {
174     if ( !GetOrCreateTheme() )
175         return NULL;
176 
177     return m_theme->GetRenderer();
178 }
179 
GetArtProvider()180 wxArtProvider *wxDelegateTheme::GetArtProvider()
181 {
182     if ( !GetOrCreateTheme() )
183         return NULL;
184 
185     return m_theme->GetArtProvider();
186 }
187 
GetInputHandler(const wxString & control,wxInputConsumer * consumer)188 wxInputHandler *wxDelegateTheme::GetInputHandler(const wxString& control,
189                                                  wxInputConsumer *consumer)
190 {
191     if ( !GetOrCreateTheme() )
192         return NULL;
193 
194     return m_theme->GetInputHandler(control, consumer);
195 }
196 
GetColourScheme()197 wxColourScheme *wxDelegateTheme::GetColourScheme()
198 {
199     if ( !GetOrCreateTheme() )
200         return NULL;
201 
202     return m_theme->GetColourScheme();
203 }
204