]> git.saurik.com Git - wxWidgets.git/commitdiff
added Load() and Set() methods
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 6 Aug 2003 18:14:44 +0000 (18:14 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 6 Aug 2003 18:14:44 +0000 (18:14 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/renderer.h
src/common/rendcmn.cpp

index fb831c39b5e4f5ffa079f866391ead6aec20f72b..ba5cb2611a17b2c0dc68cbe79a0048c4d6980d9b 100644 (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);
 };
 
 // ----------------------------------------------------------------------------
index 96a0c68318e4092483cc2c8959fbc3622faa4f80..77bfdde5168306426ef8841c958706716cfcfc7c 100644 (file)
 
 #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
+