added Load() and Set() methods

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-08-06 18:14:44 +00:00
parent 010fb35d89
commit 9f2be12593
2 changed files with 114 additions and 4 deletions

View File

@@ -144,6 +144,22 @@ public:
// return the default (native) implementation for this platform
static wxRendererNative& GetDefault();
// changing the global renderer
// ----------------------------
#if wxUSE_DYNLIB_CLASS
// load the renderer from the specified DLL, the returned pointer must be
// deleted by caller if not NULL when it is not used any more
static wxRendererNative *Load(const wxString& name);
#endif // wxUSE_DYNLIB_CLASS
// set the renderer to use, passing NULL reverts to using the default
// renderer
//
// return the previous renderer used with Set() or NULL if none
static wxRendererNative *Set(wxRendererNative *renderer);
};
// ----------------------------------------------------------------------------

View File

@@ -32,6 +32,10 @@
#include "wx/ptr_scpd.h"
#if wxUSE_DYNLIB_CLASS
#include "wx/dynlib.h"
#endif // wxUSE_DYNLIB_CLASS
// ----------------------------------------------------------------------------
// wxRendererPtr: auto pointer holding the global renderer
// ----------------------------------------------------------------------------
@@ -42,8 +46,6 @@ wxDEFINE_SCOPED_PTR(wxRendererNative, wxRendererPtrBase);
class wxRendererPtr : public wxRendererPtrBase
{
public:
wxRendererPtr() : wxRendererPtrBase(NULL) { m_initialized = false; }
// return true if we have a renderer, false otherwise
bool IsOk()
{
@@ -58,7 +60,17 @@ public:
return get() != NULL;
}
// return the global and unique wxRendererPtr
static wxRendererPtr& Get()
{
static wxRendererPtr s_renderer;
return s_renderer;
}
private:
wxRendererPtr() : wxRendererPtrBase(NULL) { m_initialized = false; }
void DoInit()
{
wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
@@ -74,15 +86,97 @@ private:
DECLARE_NO_COPY_CLASS(wxRendererPtr)
};
#if wxUSE_DYNLIB_CLASS
// ----------------------------------------------------------------------------
// wxRendererFromDynLib: represents a renderer dynamically loaded from a DLL
// ----------------------------------------------------------------------------
class wxRendererFromDynLib : public wxDelegateRendererNative
{
public:
// create the object wrapping the given renderer created from this DLL
//
// we take ownership of the pointer and will delete it (and also unload the
// DLL) when we're deleted
wxRendererFromDynLib(wxDynamicLibrary& dll, wxRendererNative *renderer)
: wxDelegateRendererNative(*renderer),
m_renderer(renderer),
m_dllHandle(dll.Detach())
{
}
virtual ~wxRendererFromDynLib()
{
delete m_renderer;
wxDynamicLibrary::Unload(m_dllHandle);
}
private:
wxRendererNative *m_renderer;
wxDllType m_dllHandle;
};
#endif // wxUSE_DYNLIB_CLASS
// ============================================================================
// wxRendererNative implementation
// ============================================================================
// ----------------------------------------------------------------------------
// Managing the global renderer
// ----------------------------------------------------------------------------
/* static */
wxRendererNative& wxRendererNative::Get()
{
static wxRendererPtr s_renderer;
wxRendererPtr& renderer = wxRendererPtr::Get();
return s_renderer.IsOk() ? *s_renderer.get() : GetDefault();
return renderer.IsOk() ? *renderer.get() : GetDefault();
}
/* static */
wxRendererNative *wxRendererNative::Set(wxRendererNative *rendererNew)
{
wxRendererPtr& renderer = wxRendererPtr::Get();
wxRendererNative *rendererOld = renderer.release();
renderer.reset(rendererNew);
return rendererOld;
}
// ----------------------------------------------------------------------------
// Dynamic renderers loading
// ----------------------------------------------------------------------------
#if wxUSE_DYNLIB_CLASS
/* static */
wxRendererNative *wxRendererNative::Load(const wxString& name)
{
wxString fullname = wxDynamicLibrary::CanonicalizePluginName(name);
wxDynamicLibrary dll(fullname);
if ( !dll.IsLoaded() )
return NULL;
// each theme DLL must export a wxCreateRenderer() function with this
// signature
typedef wxRendererNative *(*wxCreateRenderer_t)();
wxDYNLIB_FUNCTION(wxCreateRenderer_t, wxCreateRenderer, dll);
if ( !pfnwxCreateRenderer )
return NULL;
wxRendererNative *renderer = (*pfnwxCreateRenderer)();
if ( !renderer )
return NULL;
return new wxRendererFromDynLib(dll, renderer);
}
#endif // wxUSE_DYNLIB_CLASS