]>
git.saurik.com Git - wxWidgets.git/blob - src/common/rendcmn.cpp
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"
32 #include "wx/apptrait.h"
33 #include "wx/renderer.h"
35 #include "wx/ptr_scpd.h"
37 #if wxUSE_DYNLIB_CLASS
38 #include "wx/dynlib.h"
39 #endif // wxUSE_DYNLIB_CLASS
41 // ----------------------------------------------------------------------------
42 // wxRendererPtr: auto pointer holding the global renderer
43 // ----------------------------------------------------------------------------
45 wxDECLARE_SCOPED_PTR(wxRendererNative
, wxRendererPtrBase
);
46 wxDEFINE_SCOPED_PTR(wxRendererNative
, wxRendererPtrBase
);
48 class wxRendererPtr
: public wxRendererPtrBase
51 // return true if we have a renderer, false otherwise
56 // only try to create the renderer once
65 // return the global and unique wxRendererPtr
66 static wxRendererPtr
& Get()
68 static wxRendererPtr s_renderer
;
74 wxRendererPtr() : wxRendererPtrBase(NULL
) { m_initialized
= false; }
78 wxAppTraits
*traits
= wxTheApp
? wxTheApp
->GetTraits() : NULL
;
81 // ask the traits object to create a renderer for us
82 reset(traits
->CreateRenderer());
88 // just to suppress a gcc warning
89 friend class wxRendererPtrDummyFriend
;
91 DECLARE_NO_COPY_CLASS(wxRendererPtr
)
94 #if wxUSE_DYNLIB_CLASS
96 // ----------------------------------------------------------------------------
97 // wxRendererFromDynLib: represents a renderer dynamically loaded from a DLL
98 // ----------------------------------------------------------------------------
100 class wxRendererFromDynLib
: public wxDelegateRendererNative
103 // create the object wrapping the given renderer created from this DLL
105 // we take ownership of the pointer and will delete it (and also unload the
106 // DLL) when we're deleted
107 wxRendererFromDynLib(wxDynamicLibrary
& dll
, wxRendererNative
*renderer
)
108 : wxDelegateRendererNative(*renderer
),
109 m_renderer(renderer
),
110 m_dllHandle(dll
.Detach())
114 virtual ~wxRendererFromDynLib()
117 wxDynamicLibrary::Unload(m_dllHandle
);
121 wxRendererNative
*m_renderer
;
122 wxDllType m_dllHandle
;
125 #endif // wxUSE_DYNLIB_CLASS
127 // ============================================================================
128 // wxRendererNative implementation
129 // ============================================================================
131 wxRendererNative::~wxRendererNative()
133 // empty but necessary
136 // ----------------------------------------------------------------------------
137 // Managing the global renderer
138 // ----------------------------------------------------------------------------
141 wxRendererNative
& wxRendererNative::Get()
143 wxRendererPtr
& renderer
= wxRendererPtr::Get();
145 return renderer
.IsOk() ? *renderer
.get() : GetDefault();
149 wxRendererNative
*wxRendererNative::Set(wxRendererNative
*rendererNew
)
151 wxRendererPtr
& renderer
= wxRendererPtr::Get();
153 wxRendererNative
*rendererOld
= renderer
.release();
155 renderer
.reset(rendererNew
);
161 // ----------------------------------------------------------------------------
162 // Dynamic renderers loading
163 // ----------------------------------------------------------------------------
165 #if wxUSE_DYNLIB_CLASS
168 wxRendererNative
*wxRendererNative::Load(const wxString
& name
)
170 wxString fullname
= wxDynamicLibrary::CanonicalizePluginName(name
);
172 wxDynamicLibrary
dll(fullname
);
173 if ( !dll
.IsLoaded() )
176 // each theme DLL must export a wxCreateRenderer() function with this
178 typedef wxRendererNative
*(*wxCreateRenderer_t
)();
180 wxDYNLIB_FUNCTION(wxCreateRenderer_t
, wxCreateRenderer
, dll
);
181 if ( !pfnwxCreateRenderer
)
184 // create a renderer object
185 wxRendererNative
*renderer
= (*pfnwxCreateRenderer
)();
189 // check that its version is compatible with ours
190 wxRendererVersion ver
= renderer
->GetVersion();
191 if ( !wxRendererVersion::IsCompatible(ver
) )
193 wxLogError(_("Renderer \"%s\" has incompatible version %d.%d and couldn't be loaded."),
194 name
.c_str(), ver
.version
, ver
.age
);
200 // finally wrap the renderer in an object which will delete it and unload
201 // the library when it is deleted and return it to the caller
202 return new wxRendererFromDynLib(dll
, renderer
);
205 #endif // wxUSE_DYNLIB_CLASS