1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: common/rendcmn.cpp
3 // Purpose: wxRendererNative common functions
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
9 // License: wxWindows license
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 #include "wx/wxprec.h"
30 #include "wx/apptrait.h"
31 #include "wx/renderer.h"
33 #include "wx/ptr_scpd.h"
35 #if wxUSE_DYNLIB_CLASS
36 #include "wx/dynlib.h"
37 #endif // wxUSE_DYNLIB_CLASS
39 // ----------------------------------------------------------------------------
40 // wxRendererPtr: auto pointer holding the global renderer
41 // ----------------------------------------------------------------------------
43 wxDECLARE_SCOPED_PTR(wxRendererNative
, wxRendererPtrBase
);
44 wxDEFINE_SCOPED_PTR(wxRendererNative
, wxRendererPtrBase
);
46 class wxRendererPtr
: public wxRendererPtrBase
49 // return true if we have a renderer, false otherwise
54 // only try to create the renderer once
63 // return the global and unique wxRendererPtr
64 static wxRendererPtr
& Get()
66 static wxRendererPtr s_renderer
;
72 wxRendererPtr() : wxRendererPtrBase(NULL
) { m_initialized
= false; }
76 wxAppTraits
*traits
= wxTheApp ? wxTheApp
->GetTraits() : NULL
;
79 // ask the traits object to create a renderer for us
80 reset(traits
->CreateRenderer());
86 // just to suppress a gcc warning
87 friend class wxRendererPtrDummyFriend
;
89 DECLARE_NO_COPY_CLASS(wxRendererPtr
)
92 #if wxUSE_DYNLIB_CLASS
94 // ----------------------------------------------------------------------------
95 // wxRendererFromDynLib: represents a renderer dynamically loaded from a DLL
96 // ----------------------------------------------------------------------------
98 class wxRendererFromDynLib
: public wxDelegateRendererNative
101 // create the object wrapping the given renderer created from this DLL
103 // we take ownership of the pointer and will delete it (and also unload the
104 // DLL) when we're deleted
105 wxRendererFromDynLib(wxDynamicLibrary
& dll
, wxRendererNative
*renderer
)
106 : wxDelegateRendererNative(*renderer
),
107 m_renderer(renderer
),
108 m_dllHandle(dll
.Detach())
112 virtual ~wxRendererFromDynLib()
115 wxDynamicLibrary
::Unload(m_dllHandle
);
119 wxRendererNative
*m_renderer
;
120 wxDllType m_dllHandle
;
123 #endif // wxUSE_DYNLIB_CLASS
125 // ============================================================================
126 // wxRendererNative implementation
127 // ============================================================================
129 wxRendererNative
::~wxRendererNative()
131 // empty but necessary
134 // ----------------------------------------------------------------------------
135 // Managing the global renderer
136 // ----------------------------------------------------------------------------
139 wxRendererNative
& wxRendererNative
::Get()
141 wxRendererPtr
& renderer
= wxRendererPtr
::Get();
143 return renderer
.IsOk() ?
*renderer
.get() : GetDefault();
147 wxRendererNative
*wxRendererNative
::Set(wxRendererNative
*rendererNew
)
149 wxRendererPtr
& renderer
= wxRendererPtr
::Get();
151 wxRendererNative
*rendererOld
= renderer
.release();
153 renderer
.reset(rendererNew
);
159 // ----------------------------------------------------------------------------
160 // Dynamic renderers loading
161 // ----------------------------------------------------------------------------
163 #if wxUSE_DYNLIB_CLASS
166 wxRendererNative
*wxRendererNative
::Load(const wxString
& name
)
168 wxString fullname
= wxDynamicLibrary
::CanonicalizePluginName(name
);
170 wxDynamicLibrary
dll(fullname
);
171 if ( !dll
.IsLoaded() )
174 // each theme DLL must export a wxCreateRenderer() function with this
176 typedef wxRendererNative
*(*wxCreateRenderer_t
)();
178 wxDYNLIB_FUNCTION(wxCreateRenderer_t
, wxCreateRenderer
, dll
);
179 if ( !pfnwxCreateRenderer
)
182 // create a renderer object
183 wxRendererNative
*renderer
= (*pfnwxCreateRenderer
)();
187 // check that its version is compatible with ours
188 wxRendererVersion ver
= renderer
->GetVersion();
189 if ( !wxRendererVersion
::IsCompatible(ver
) )
191 wxLogError(_("Renderer \"%s\" has incompatible version %d.%d and couldn't be loaded."),
192 name
.c_str(), ver
.version
, ver
.age
);
198 // finally wrap the renderer in an object which will delete it and unload
199 // the library when it is deleted and return it to the caller
200 return new wxRendererFromDynLib(dll
, renderer
);
203 #endif // wxUSE_DYNLIB_CLASS