]> git.saurik.com Git - wxWidgets.git/commitdiff
Added generic LoadObject methods that can load any classtype from a
authorRobin Dunn <robin@alldunn.com>
Sat, 24 Aug 2002 02:26:13 +0000 (02:26 +0000)
committerRobin Dunn <robin@alldunn.com>
Sat, 24 Aug 2002 02:26:13 +0000 (02:26 +0000)
resources and return it as a wxObject (Assuming there is a handler for
it.)

Enabled wxFrames and wxDialogs to be loaded using a new instance
rather than only with existing instances.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16720 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

contrib/include/wx/xrc/xmlres.h
contrib/src/xrc/xh_dlg.cpp
contrib/src/xrc/xh_frame.cpp
contrib/src/xrc/xmlres.cpp
include/wx/xrc/xmlres.h
src/xrc/xh_dlg.cpp
src/xrc/xh_frame.cpp
src/xrc/xmlres.cpp

index 00547bca5e9747b29f53cc026a9a2e358c6d0b63..4e539a17c50b10a4f622582c0d9dcdf2030d7e4e 100644 (file)
@@ -111,7 +111,7 @@ public:
 
     // Destructor.
     ~wxXmlResource();
-    
+
     // Loads resources from XML files that match given filemask.
     // This method understands VFS (see filesys.h).
     bool Load(const wxString& filemask);
@@ -128,6 +128,9 @@ public:
     // all controls used within the resource.
     void AddHandler(wxXmlResourceHandler *handler);
 
+    // Add a new handler at the begining of the handler list
+    void InsertHandler(wxXmlResourceHandler *handler);
+
     // Removes all handlers
     void ClearHandlers();
 
@@ -165,8 +168,20 @@ public:
     bool LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name);
 
     // Loads a frame.
+    wxFrame *LoadFrame(wxWindow* parent, const wxString& name);
     bool LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name);
 
+    // Load an object from the resource specifying both the resource name and
+    // the classname.  This lets you load nonstandard container windows.
+    wxObject *LoadObject(wxWindow *parent, const wxString& name,
+                         const wxString& classname);
+
+    // Load an object from the resource specifying both the resource name and
+    // the classname.  This form lets you finish the creation of an existing
+    // instance.
+    bool LoadObject(wxObject *instance, wxWindow *parent, const wxString& name,
+                    const wxString& classname);
+
     // Loads a bitmap resource from a file.
     wxBitmap LoadBitmap(const wxString& name);
 
@@ -191,9 +206,9 @@ public:
     int CompareVersion(int major, int minor, int release, int revision) const
         { return GetVersion() -
                  (major*256*256*256 + minor*256*256 + release*256 + revision); }
-                 
+
 //// Singleton accessors.
-    
+
     // Gets the global resources object or creates one if none exists.
     static wxXmlResource *Get();
 
@@ -229,7 +244,7 @@ private:
 #endif
 
     friend class wxXmlResourceHandler;
-    
+
     // singleton instance:
     static wxXmlResource *ms_instance;
 };
@@ -423,7 +438,7 @@ protected:
 void wxXmlInitResourceModule();
 
 
-/* ------------------------------------------------------------------------- 
+/* -------------------------------------------------------------------------
    Backward compatibility macros. Do *NOT* use, they may disappear in future
    versions of the XRC library!
    ------------------------------------------------------------------------- */
index ebeba3a8310b58f810e7f73511528e9efbfe7a4d..d44ad16a91343d98db7ba7900714889dad585faf 100644 (file)
@@ -7,7 +7,7 @@
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
+
 #ifdef __GNUG__
 #pragma implementation "xh_dlg.h"
 #endif
@@ -46,11 +46,9 @@ wxDialogXmlHandler::wxDialogXmlHandler() : wxXmlResourceHandler()
 }
 
 wxObject *wxDialogXmlHandler::DoCreateResource()
-{ 
-    wxDialog *dlg = wxDynamicCast(m_instance, wxDialog);
-    
-    wxASSERT_MSG(dlg, _("XRC resource: Cannot create dialog without instance."));
-    
+{
+    XRC_MAKE_INSTANCE(dlg, wxDialog);
+
     dlg->Create(m_parentAsWindow,
                 GetID(),
                 GetText(wxT("title")),
@@ -66,10 +64,10 @@ wxObject *wxDialogXmlHandler::DoCreateResource()
     SetupWindow(dlg);
 
     CreateChildren(dlg);
-    
+
     if (GetBool(wxT("centered"), FALSE))
         dlg->Centre();
-    
+
     return dlg;
 }
 
index d4e47c1fff995ef8c5fd76ba608260a15bef3080..34327e067ed47e53c2eb43123c69ad13318ab9d6 100644 (file)
@@ -7,7 +7,7 @@
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
+
 #ifdef __GNUG__
 #pragma implementation "xh_frame.h"
 #endif
@@ -51,11 +51,9 @@ wxFrameXmlHandler::wxFrameXmlHandler() : wxXmlResourceHandler()
 }
 
 wxObject *wxFrameXmlHandler::DoCreateResource()
-{ 
-    wxFrame *frame = wxDynamicCast(m_instance, wxFrame);
-    
-    wxASSERT_MSG(frame, _("XRC resource: Cannot create dialog without instance."));
-    
+{
+    XRC_MAKE_INSTANCE(frame, wxFrame);
+
     frame->Create(m_parentAsWindow,
                   GetID(),
                   GetText(wxT("title")),
@@ -71,10 +69,10 @@ wxObject *wxFrameXmlHandler::DoCreateResource()
     SetupWindow(frame);
 
     CreateChildren(frame);
-    
+
     if (GetBool(wxT("centered"), FALSE))
         frame->Centre();
-    
+
     return frame;
 }
 
index b0376ee8516233bb371cf7037653673071254ee7..21375aff6034109fda333ad1cba2d13278f849af 100644 (file)
@@ -132,6 +132,12 @@ void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
     handler->SetParentResource(this);
 }
 
+void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
+{
+    m_handlers.Insert(handler);
+    handler->SetParentResource(this);
+}
+
 
 
 void wxXmlResource::ClearHandlers()
@@ -188,6 +194,11 @@ bool wxXmlResource::LoadPanel(wxPanel *panel, wxWindow *parent, const wxString&
     return CreateResFromNode(FindResource(name, wxT("wxPanel")), parent, panel) != NULL;
 }
 
+wxFrame *wxXmlResource::LoadFrame(wxWindow* parent, const wxString& name)
+{
+    return (wxFrame*)CreateResFromNode(FindResource(name, wxT("wxFrame")), parent, NULL);
+}
+
 bool wxXmlResource::LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name)
 {
     return CreateResFromNode(FindResource(name, wxT("wxFrame")), parent, frame) != NULL;
@@ -213,6 +224,18 @@ wxIcon wxXmlResource::LoadIcon(const wxString& name)
     return rt;
 }
 
+
+wxObject *wxXmlResource::LoadObject(wxWindow *parent, const wxString& name, const wxString& classname)
+{
+    return CreateResFromNode(FindResource(name, classname), parent, NULL);
+}
+
+bool wxXmlResource::LoadObject(wxObject *instance, wxWindow *parent, const wxString& name, const wxString& classname)
+{
+    return CreateResFromNode(FindResource(name, classname), parent, instance) != NULL;
+}
+
+
 bool wxXmlResource::AttachUnknownControl(const wxString& name,
                                          wxWindow *control, wxWindow *parent)
 {
@@ -756,7 +779,7 @@ wxColour wxXmlResourceHandler::GetColour(const wxString& param)
 
 
 
-wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, 
+wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
                                          const wxArtClient& defaultArtClient,
                                          wxSize size)
 {
@@ -768,7 +791,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
         if ( !sid.empty() )
         {
             wxString scl = bmpNode->GetPropVal(wxT("stock_client"), defaultArtClient);
-            wxBitmap stockArt = 
+            wxBitmap stockArt =
                 wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(sid),
                                          wxART_MAKE_CLIENT_ID_FROM_STR(scl),
                                          size);
@@ -777,9 +800,9 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
         }
     }
 
-    /* ...or load the bitmap from file: */  
+    /* ...or load the bitmap from file: */
     wxString name = GetParamValue(param);
-    if (name.IsEmpty()) return wxNullBitmap;        
+    if (name.IsEmpty()) return wxNullBitmap;
 #if wxUSE_FILESYSTEM
     wxFSFile *fsfile = GetCurFileSystem().OpenFile(name);
     if (fsfile == NULL)
@@ -805,7 +828,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
 
 
 
-wxIcon wxXmlResourceHandler::GetIcon(const wxString& param, 
+wxIcon wxXmlResourceHandler::GetIcon(const wxString& param,
                                      const wxArtClient& defaultArtClient,
                                      wxSize size)
 {
index 00547bca5e9747b29f53cc026a9a2e358c6d0b63..4e539a17c50b10a4f622582c0d9dcdf2030d7e4e 100644 (file)
@@ -111,7 +111,7 @@ public:
 
     // Destructor.
     ~wxXmlResource();
-    
+
     // Loads resources from XML files that match given filemask.
     // This method understands VFS (see filesys.h).
     bool Load(const wxString& filemask);
@@ -128,6 +128,9 @@ public:
     // all controls used within the resource.
     void AddHandler(wxXmlResourceHandler *handler);
 
+    // Add a new handler at the begining of the handler list
+    void InsertHandler(wxXmlResourceHandler *handler);
+
     // Removes all handlers
     void ClearHandlers();
 
@@ -165,8 +168,20 @@ public:
     bool LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name);
 
     // Loads a frame.
+    wxFrame *LoadFrame(wxWindow* parent, const wxString& name);
     bool LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name);
 
+    // Load an object from the resource specifying both the resource name and
+    // the classname.  This lets you load nonstandard container windows.
+    wxObject *LoadObject(wxWindow *parent, const wxString& name,
+                         const wxString& classname);
+
+    // Load an object from the resource specifying both the resource name and
+    // the classname.  This form lets you finish the creation of an existing
+    // instance.
+    bool LoadObject(wxObject *instance, wxWindow *parent, const wxString& name,
+                    const wxString& classname);
+
     // Loads a bitmap resource from a file.
     wxBitmap LoadBitmap(const wxString& name);
 
@@ -191,9 +206,9 @@ public:
     int CompareVersion(int major, int minor, int release, int revision) const
         { return GetVersion() -
                  (major*256*256*256 + minor*256*256 + release*256 + revision); }
-                 
+
 //// Singleton accessors.
-    
+
     // Gets the global resources object or creates one if none exists.
     static wxXmlResource *Get();
 
@@ -229,7 +244,7 @@ private:
 #endif
 
     friend class wxXmlResourceHandler;
-    
+
     // singleton instance:
     static wxXmlResource *ms_instance;
 };
@@ -423,7 +438,7 @@ protected:
 void wxXmlInitResourceModule();
 
 
-/* ------------------------------------------------------------------------- 
+/* -------------------------------------------------------------------------
    Backward compatibility macros. Do *NOT* use, they may disappear in future
    versions of the XRC library!
    ------------------------------------------------------------------------- */
index ebeba3a8310b58f810e7f73511528e9efbfe7a4d..d44ad16a91343d98db7ba7900714889dad585faf 100644 (file)
@@ -7,7 +7,7 @@
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
+
 #ifdef __GNUG__
 #pragma implementation "xh_dlg.h"
 #endif
@@ -46,11 +46,9 @@ wxDialogXmlHandler::wxDialogXmlHandler() : wxXmlResourceHandler()
 }
 
 wxObject *wxDialogXmlHandler::DoCreateResource()
-{ 
-    wxDialog *dlg = wxDynamicCast(m_instance, wxDialog);
-    
-    wxASSERT_MSG(dlg, _("XRC resource: Cannot create dialog without instance."));
-    
+{
+    XRC_MAKE_INSTANCE(dlg, wxDialog);
+
     dlg->Create(m_parentAsWindow,
                 GetID(),
                 GetText(wxT("title")),
@@ -66,10 +64,10 @@ wxObject *wxDialogXmlHandler::DoCreateResource()
     SetupWindow(dlg);
 
     CreateChildren(dlg);
-    
+
     if (GetBool(wxT("centered"), FALSE))
         dlg->Centre();
-    
+
     return dlg;
 }
 
index d4e47c1fff995ef8c5fd76ba608260a15bef3080..34327e067ed47e53c2eb43123c69ad13318ab9d6 100644 (file)
@@ -7,7 +7,7 @@
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
+
 #ifdef __GNUG__
 #pragma implementation "xh_frame.h"
 #endif
@@ -51,11 +51,9 @@ wxFrameXmlHandler::wxFrameXmlHandler() : wxXmlResourceHandler()
 }
 
 wxObject *wxFrameXmlHandler::DoCreateResource()
-{ 
-    wxFrame *frame = wxDynamicCast(m_instance, wxFrame);
-    
-    wxASSERT_MSG(frame, _("XRC resource: Cannot create dialog without instance."));
-    
+{
+    XRC_MAKE_INSTANCE(frame, wxFrame);
+
     frame->Create(m_parentAsWindow,
                   GetID(),
                   GetText(wxT("title")),
@@ -71,10 +69,10 @@ wxObject *wxFrameXmlHandler::DoCreateResource()
     SetupWindow(frame);
 
     CreateChildren(frame);
-    
+
     if (GetBool(wxT("centered"), FALSE))
         frame->Centre();
-    
+
     return frame;
 }
 
index b0376ee8516233bb371cf7037653673071254ee7..21375aff6034109fda333ad1cba2d13278f849af 100644 (file)
@@ -132,6 +132,12 @@ void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
     handler->SetParentResource(this);
 }
 
+void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
+{
+    m_handlers.Insert(handler);
+    handler->SetParentResource(this);
+}
+
 
 
 void wxXmlResource::ClearHandlers()
@@ -188,6 +194,11 @@ bool wxXmlResource::LoadPanel(wxPanel *panel, wxWindow *parent, const wxString&
     return CreateResFromNode(FindResource(name, wxT("wxPanel")), parent, panel) != NULL;
 }
 
+wxFrame *wxXmlResource::LoadFrame(wxWindow* parent, const wxString& name)
+{
+    return (wxFrame*)CreateResFromNode(FindResource(name, wxT("wxFrame")), parent, NULL);
+}
+
 bool wxXmlResource::LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name)
 {
     return CreateResFromNode(FindResource(name, wxT("wxFrame")), parent, frame) != NULL;
@@ -213,6 +224,18 @@ wxIcon wxXmlResource::LoadIcon(const wxString& name)
     return rt;
 }
 
+
+wxObject *wxXmlResource::LoadObject(wxWindow *parent, const wxString& name, const wxString& classname)
+{
+    return CreateResFromNode(FindResource(name, classname), parent, NULL);
+}
+
+bool wxXmlResource::LoadObject(wxObject *instance, wxWindow *parent, const wxString& name, const wxString& classname)
+{
+    return CreateResFromNode(FindResource(name, classname), parent, instance) != NULL;
+}
+
+
 bool wxXmlResource::AttachUnknownControl(const wxString& name,
                                          wxWindow *control, wxWindow *parent)
 {
@@ -756,7 +779,7 @@ wxColour wxXmlResourceHandler::GetColour(const wxString& param)
 
 
 
-wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param, 
+wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
                                          const wxArtClient& defaultArtClient,
                                          wxSize size)
 {
@@ -768,7 +791,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
         if ( !sid.empty() )
         {
             wxString scl = bmpNode->GetPropVal(wxT("stock_client"), defaultArtClient);
-            wxBitmap stockArt = 
+            wxBitmap stockArt =
                 wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(sid),
                                          wxART_MAKE_CLIENT_ID_FROM_STR(scl),
                                          size);
@@ -777,9 +800,9 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
         }
     }
 
-    /* ...or load the bitmap from file: */  
+    /* ...or load the bitmap from file: */
     wxString name = GetParamValue(param);
-    if (name.IsEmpty()) return wxNullBitmap;        
+    if (name.IsEmpty()) return wxNullBitmap;
 #if wxUSE_FILESYSTEM
     wxFSFile *fsfile = GetCurFileSystem().OpenFile(name);
     if (fsfile == NULL)
@@ -805,7 +828,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
 
 
 
-wxIcon wxXmlResourceHandler::GetIcon(const wxString& param, 
+wxIcon wxXmlResourceHandler::GetIcon(const wxString& param,
                                      const wxArtClient& defaultArtClient,
                                      wxSize size)
 {