]>
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();
69 wxRendererPtr() : wxRendererPtrBase(NULL
) { m_initialized
= false; }
73 wxAppTraits
*traits
= wxTheApp
? wxTheApp
->GetTraits() : NULL
;
76 // ask the traits object to create a renderer for us
77 reset(traits
->CreateRenderer());
83 // just to suppress a gcc warning
84 friend class wxRendererPtrDummyFriend
;
86 DECLARE_NO_COPY_CLASS(wxRendererPtr
)
89 // return the global and unique wxRendererPtr
90 /*static*/ wxRendererPtr
& wxRendererPtr::Get()
92 static wxRendererPtr s_renderer
;
97 #if wxUSE_DYNLIB_CLASS
99 // ----------------------------------------------------------------------------
100 // wxRendererFromDynLib: represents a renderer dynamically loaded from a DLL
101 // ----------------------------------------------------------------------------
103 class wxRendererFromDynLib
: public wxDelegateRendererNative
106 // create the object wrapping the given renderer created from this DLL
108 // we take ownership of the pointer and will delete it (and also unload the
109 // DLL) when we're deleted
110 wxRendererFromDynLib(wxDynamicLibrary
& dll
, wxRendererNative
*renderer
)
111 : wxDelegateRendererNative(*renderer
),
112 m_renderer(renderer
),
113 m_dllHandle(dll
.Detach())
117 virtual ~wxRendererFromDynLib()
120 wxDynamicLibrary::Unload(m_dllHandle
);
124 wxRendererNative
*m_renderer
;
125 wxDllType m_dllHandle
;
128 #endif // wxUSE_DYNLIB_CLASS
130 // ============================================================================
131 // wxRendererNative implementation
132 // ============================================================================
134 wxRendererNative::~wxRendererNative()
136 // empty but necessary
139 // ----------------------------------------------------------------------------
140 // Managing the global renderer
141 // ----------------------------------------------------------------------------
144 wxRendererNative
& wxRendererNative::Get()
146 wxRendererPtr
& renderer
= wxRendererPtr::Get();
148 return renderer
.IsOk() ? *renderer
.get() : GetDefault();
152 wxRendererNative
*wxRendererNative::Set(wxRendererNative
*rendererNew
)
154 wxRendererPtr
& renderer
= wxRendererPtr::Get();
156 wxRendererNative
*rendererOld
= renderer
.release();
158 renderer
.reset(rendererNew
);
164 // ----------------------------------------------------------------------------
165 // Dynamic renderers loading
166 // ----------------------------------------------------------------------------
168 #if wxUSE_DYNLIB_CLASS
171 wxRendererNative
*wxRendererNative::Load(const wxString
& name
)
173 wxString fullname
= wxDynamicLibrary::CanonicalizePluginName(name
);
175 wxDynamicLibrary
dll(fullname
);
176 if ( !dll
.IsLoaded() )
179 // each theme DLL must export a wxCreateRenderer() function with this
181 typedef wxRendererNative
*(*wxCreateRenderer_t
)();
183 wxDYNLIB_FUNCTION(wxCreateRenderer_t
, wxCreateRenderer
, dll
);
184 if ( !pfnwxCreateRenderer
)
187 // create a renderer object
188 wxRendererNative
*renderer
= (*pfnwxCreateRenderer
)();
192 // check that its version is compatible with ours
193 wxRendererVersion ver
= renderer
->GetVersion();
194 if ( !wxRendererVersion::IsCompatible(ver
) )
196 wxLogError(_("Renderer \"%s\" has incompatible version %d.%d and couldn't be loaded."),
197 name
.c_str(), ver
.version
, ver
.age
);
203 // finally wrap the renderer in an object which will delete it and unload
204 // the library when it is deleted and return it to the caller
205 return new wxRendererFromDynLib(dll
, renderer
);
208 #endif // wxUSE_DYNLIB_CLASS