implemented subclass factories for XRC

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17375 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2002-09-25 11:10:39 +00:00
parent 5e3012152c
commit 3ce501311b
4 changed files with 152 additions and 20 deletions

View File

@@ -547,6 +547,40 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, wx
}
#include "wx/listimpl.cpp"
WX_DECLARE_LIST(wxXmlSubclassFactory, wxXmlSubclassFactoriesList);
WX_DEFINE_LIST(wxXmlSubclassFactoriesList);
wxXmlSubclassFactoriesList *wxXmlResource::ms_subclassFactories = NULL;
/*static*/ void wxXmlResource::AddSubclassFactory(wxXmlSubclassFactory *factory)
{
if (!ms_subclassFactories)
{
ms_subclassFactories = new wxXmlSubclassFactoriesList;
ms_subclassFactories->DeleteContents(TRUE);
}
ms_subclassFactories->Append(factory);
}
class wxXmlSubclassFactoryCXX : public wxXmlSubclassFactory
{
public:
~wxXmlSubclassFactoryCXX() {}
wxObject *Create(const wxString& className)
{
wxClassInfo* classInfo = wxClassInfo::FindClass(className);
if (classInfo)
return classInfo->CreateObject();
else
return NULL;
}
};
wxXmlResourceHandler::wxXmlResourceHandler()
@@ -568,18 +602,23 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent
!(m_resource->GetFlags() & wxXRC_NO_SUBCLASSING))
{
wxString subclass = node->GetPropVal(wxT("subclass"), wxEmptyString);
wxClassInfo* classInfo = wxClassInfo::FindClass(subclass);
if (classInfo)
m_instance = classInfo->CreateObject();
if (!m_instance)
if (!subclass.empty())
{
wxLogError(_("Subclass '%s' not found for resource '%s', not subclassing!"),
subclass.c_str(), node->GetPropVal(wxT("name"), wxEmptyString).c_str());
}
for (wxXmlSubclassFactoriesList::Node *i = wxXmlResource::ms_subclassFactories->GetFirst();
i; i = i->GetNext())
{
m_instance = i->GetData()->Create(subclass);
if (m_instance)
break;
}
m_instance = classInfo->CreateObject();
if (!m_instance)
{
wxString name = node->GetPropVal(wxT("name"), wxEmptyString);
wxLogError(_("Subclass '%s' not found for resource '%s', not subclassing!"),
subclass.c_str(), name.c_str());
}
}
}
m_node = node;
@@ -1167,11 +1206,13 @@ public:
wxXmlResourceModule() {}
bool OnInit()
{
wxXmlResource::AddSubclassFactory(new wxXmlSubclassFactoryCXX);
return TRUE;
}
void OnExit()
{
delete wxXmlResource::Set(NULL);
wxDELETE(wxXmlResource::ms_subclassFactories);
CleanXRCID_Records();
}
};