use wxVector<T> instead of wxList in wxXmlResource code
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
#include "wx/string.h"
|
#include "wx/string.h"
|
||||||
#include "wx/dynarray.h"
|
#include "wx/dynarray.h"
|
||||||
#include "wx/arrstr.h"
|
|
||||||
#include "wx/datetime.h"
|
#include "wx/datetime.h"
|
||||||
#include "wx/list.h"
|
#include "wx/list.h"
|
||||||
#include "wx/gdicmn.h"
|
#include "wx/gdicmn.h"
|
||||||
@@ -27,6 +26,7 @@
|
|||||||
#include "wx/artprov.h"
|
#include "wx/artprov.h"
|
||||||
#include "wx/colour.h"
|
#include "wx/colour.h"
|
||||||
#include "wx/animate.h"
|
#include "wx/animate.h"
|
||||||
|
#include "wx/vector.h"
|
||||||
|
|
||||||
#include "wx/xml/xml.h"
|
#include "wx/xml/xml.h"
|
||||||
|
|
||||||
@@ -40,8 +40,9 @@ class WXDLLIMPEXP_FWD_CORE wxToolBar;
|
|||||||
|
|
||||||
class WXDLLIMPEXP_FWD_XRC wxXmlResourceHandler;
|
class WXDLLIMPEXP_FWD_XRC wxXmlResourceHandler;
|
||||||
class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactory;
|
class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactory;
|
||||||
class WXDLLIMPEXP_FWD_XRC wxXmlSubclassFactoriesList;
|
class wxXmlSubclassFactories;
|
||||||
class wxXmlResourceModule;
|
class wxXmlResourceModule;
|
||||||
|
class wxXmlResourceDataRecords;
|
||||||
|
|
||||||
|
|
||||||
// These macros indicate current version of XML resources (this information is
|
// These macros indicate current version of XML resources (this information is
|
||||||
@@ -68,28 +69,6 @@ class wxXmlResourceModule;
|
|||||||
WX_XMLRES_CURRENT_VERSION_RELEASE * 256 + \
|
WX_XMLRES_CURRENT_VERSION_RELEASE * 256 + \
|
||||||
WX_XMLRES_CURRENT_VERSION_REVISION)
|
WX_XMLRES_CURRENT_VERSION_REVISION)
|
||||||
|
|
||||||
class WXDLLIMPEXP_XRC wxXmlResourceDataRecord
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
wxXmlResourceDataRecord() : Doc(NULL) {
|
|
||||||
#if wxUSE_DATETIME
|
|
||||||
Time = wxDateTime::Now();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
~wxXmlResourceDataRecord() {delete Doc;}
|
|
||||||
|
|
||||||
wxString File;
|
|
||||||
wxXmlDocument *Doc;
|
|
||||||
#if wxUSE_DATETIME
|
|
||||||
wxDateTime Time;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxXmlResourceDataRecord,
|
|
||||||
wxXmlResourceDataRecords,
|
|
||||||
WXDLLIMPEXP_XRC);
|
|
||||||
|
|
||||||
enum wxXmlResourceFlags
|
enum wxXmlResourceFlags
|
||||||
{
|
{
|
||||||
wxXRC_USE_LOCALE = 1,
|
wxXRC_USE_LOCALE = 1,
|
||||||
@@ -287,12 +266,16 @@ protected:
|
|||||||
static bool IsArchive(const wxString& filename);
|
static bool IsArchive(const wxString& filename);
|
||||||
#endif // wxUSE_FILESYSTEM
|
#endif // wxUSE_FILESYSTEM
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxXmlResourceDataRecords& Data() { return *m_data; }
|
||||||
|
const wxXmlResourceDataRecords& Data() const { return *m_data; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
long m_version;
|
long m_version;
|
||||||
|
|
||||||
int m_flags;
|
int m_flags;
|
||||||
wxList m_handlers;
|
wxVector<wxXmlResourceHandler*> m_handlers;
|
||||||
wxXmlResourceDataRecords m_data;
|
wxXmlResourceDataRecords *m_data;
|
||||||
#if wxUSE_FILESYSTEM
|
#if wxUSE_FILESYSTEM
|
||||||
wxFileSystem m_curFileSystem;
|
wxFileSystem m_curFileSystem;
|
||||||
wxFileSystem& GetCurFileSystem() { return m_curFileSystem; }
|
wxFileSystem& GetCurFileSystem() { return m_curFileSystem; }
|
||||||
@@ -304,7 +287,7 @@ private:
|
|||||||
friend class wxXmlResourceHandler;
|
friend class wxXmlResourceHandler;
|
||||||
friend class wxXmlResourceModule;
|
friend class wxXmlResourceModule;
|
||||||
|
|
||||||
static wxXmlSubclassFactoriesList *ms_subclassFactories;
|
static wxXmlSubclassFactories *ms_subclassFactories;
|
||||||
|
|
||||||
// singleton instance:
|
// singleton instance:
|
||||||
static wxXmlResource *ms_instance;
|
static wxXmlResource *ms_instance;
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "wx/vector.h"
|
||||||
#include "wx/wfstream.h"
|
#include "wx/wfstream.h"
|
||||||
#include "wx/filesys.h"
|
#include "wx/filesys.h"
|
||||||
#include "wx/filename.h"
|
#include "wx/filename.h"
|
||||||
@@ -46,8 +47,27 @@
|
|||||||
|
|
||||||
#include "wx/xml/xml.h"
|
#include "wx/xml/xml.h"
|
||||||
|
|
||||||
#include "wx/arrimpl.cpp"
|
class wxXmlResourceDataRecord
|
||||||
WX_DEFINE_OBJARRAY(wxXmlResourceDataRecords)
|
{
|
||||||
|
public:
|
||||||
|
wxXmlResourceDataRecord() : Doc(NULL) {
|
||||||
|
#if wxUSE_DATETIME
|
||||||
|
Time = wxDateTime::Now();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
~wxXmlResourceDataRecord() {delete Doc;}
|
||||||
|
|
||||||
|
wxString File;
|
||||||
|
wxXmlDocument *Doc;
|
||||||
|
#if wxUSE_DATETIME
|
||||||
|
wxDateTime Time;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
class wxXmlResourceDataRecords : public wxVector<wxXmlResourceDataRecord>
|
||||||
|
{
|
||||||
|
// this is a class so that it can be forward-declared
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
wxXmlResource *wxXmlResource::ms_instance = NULL;
|
wxXmlResource *wxXmlResource::ms_instance = NULL;
|
||||||
@@ -70,6 +90,7 @@ wxXmlResource::wxXmlResource(int flags, const wxString& domain)
|
|||||||
{
|
{
|
||||||
m_flags = flags;
|
m_flags = flags;
|
||||||
m_version = -1;
|
m_version = -1;
|
||||||
|
m_data = new wxXmlResourceDataRecords;
|
||||||
SetDomain(domain);
|
SetDomain(domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,6 +98,7 @@ wxXmlResource::wxXmlResource(const wxString& filemask, int flags, const wxString
|
|||||||
{
|
{
|
||||||
m_flags = flags;
|
m_flags = flags;
|
||||||
m_version = -1;
|
m_version = -1;
|
||||||
|
m_data = new wxXmlResourceDataRecords;
|
||||||
SetDomain(domain);
|
SetDomain(domain);
|
||||||
Load(filemask);
|
Load(filemask);
|
||||||
}
|
}
|
||||||
@@ -84,6 +106,8 @@ wxXmlResource::wxXmlResource(const wxString& filemask, int flags, const wxString
|
|||||||
wxXmlResource::~wxXmlResource()
|
wxXmlResource::~wxXmlResource()
|
||||||
{
|
{
|
||||||
ClearHandlers();
|
ClearHandlers();
|
||||||
|
|
||||||
|
delete m_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxXmlResource::SetDomain(const wxString& domain)
|
void wxXmlResource::SetDomain(const wxString& domain)
|
||||||
@@ -135,7 +159,6 @@ bool wxXmlResource::IsArchive(const wxString& filename)
|
|||||||
bool wxXmlResource::Load(const wxString& filemask)
|
bool wxXmlResource::Load(const wxString& filemask)
|
||||||
{
|
{
|
||||||
wxString fnd;
|
wxString fnd;
|
||||||
wxXmlResourceDataRecord *drec;
|
|
||||||
bool iswild = wxIsWild(filemask);
|
bool iswild = wxIsWild(filemask);
|
||||||
bool rt = true;
|
bool rt = true;
|
||||||
|
|
||||||
@@ -163,9 +186,9 @@ bool wxXmlResource::Load(const wxString& filemask)
|
|||||||
else // a single resource URL
|
else // a single resource URL
|
||||||
#endif // wxUSE_FILESYSTEM
|
#endif // wxUSE_FILESYSTEM
|
||||||
{
|
{
|
||||||
drec = new wxXmlResourceDataRecord;
|
wxXmlResourceDataRecord drec;
|
||||||
drec->File = fnd;
|
drec.File = fnd;
|
||||||
m_data.Add(drec);
|
Data().push_back(drec);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iswild)
|
if (iswild)
|
||||||
@@ -191,22 +214,22 @@ bool wxXmlResource::Unload(const wxString& filename)
|
|||||||
#endif // wxUSE_FILESYSTEM
|
#endif // wxUSE_FILESYSTEM
|
||||||
|
|
||||||
bool unloaded = false;
|
bool unloaded = false;
|
||||||
const size_t count = m_data.GetCount();
|
for ( wxXmlResourceDataRecords::iterator i = Data().begin();
|
||||||
for ( size_t i = 0; i < count; i++ )
|
i != Data().end(); ++i )
|
||||||
{
|
{
|
||||||
#if wxUSE_FILESYSTEM
|
#if wxUSE_FILESYSTEM
|
||||||
if ( isArchive )
|
if ( isArchive )
|
||||||
{
|
{
|
||||||
if ( m_data[i].File.StartsWith(fnd) )
|
if ( i->File.StartsWith(fnd) )
|
||||||
unloaded = true;
|
unloaded = true;
|
||||||
// don't break from the loop, we can have other matching files
|
// don't break from the loop, we can have other matching files
|
||||||
}
|
}
|
||||||
else // a single resource URL
|
else // a single resource URL
|
||||||
#endif // wxUSE_FILESYSTEM
|
#endif // wxUSE_FILESYSTEM
|
||||||
{
|
{
|
||||||
if ( m_data[i].File == fnd )
|
if ( i->File == fnd )
|
||||||
{
|
{
|
||||||
m_data.RemoveAt(i);
|
Data().erase(i);
|
||||||
unloaded = true;
|
unloaded = true;
|
||||||
|
|
||||||
// no sense in continuing, there is only one file with this URL
|
// no sense in continuing, there is only one file with this URL
|
||||||
@@ -223,13 +246,13 @@ IMPLEMENT_ABSTRACT_CLASS(wxXmlResourceHandler, wxObject)
|
|||||||
|
|
||||||
void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
|
void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
|
||||||
{
|
{
|
||||||
m_handlers.Append(handler);
|
m_handlers.push_back(handler);
|
||||||
handler->SetParentResource(this);
|
handler->SetParentResource(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
|
void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
|
||||||
{
|
{
|
||||||
m_handlers.Insert(handler);
|
m_handlers.insert(m_handlers.begin(), handler);
|
||||||
handler->SetParentResource(this);
|
handler->SetParentResource(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +260,10 @@ void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
|
|||||||
|
|
||||||
void wxXmlResource::ClearHandlers()
|
void wxXmlResource::ClearHandlers()
|
||||||
{
|
{
|
||||||
WX_CLEAR_LIST(wxList, m_handlers);
|
for ( wxVector<wxXmlResourceHandler*>::iterator i = m_handlers.begin();
|
||||||
|
i != m_handlers.end(); ++i )
|
||||||
|
delete *i;
|
||||||
|
m_handlers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -415,29 +441,30 @@ bool wxXmlResource::UpdateResources()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (size_t i = 0; i < m_data.GetCount(); i++)
|
for ( wxXmlResourceDataRecords::iterator i = Data().begin();
|
||||||
|
i != Data().end(); ++i )
|
||||||
{
|
{
|
||||||
modif = (m_data[i].Doc == NULL);
|
modif = (i->Doc == NULL);
|
||||||
|
|
||||||
if (!modif && !(m_flags & wxXRC_NO_RELOADING))
|
if (!modif && !(m_flags & wxXRC_NO_RELOADING))
|
||||||
{
|
{
|
||||||
# if wxUSE_FILESYSTEM
|
# if wxUSE_FILESYSTEM
|
||||||
file = fsys.OpenFile(m_data[i].File);
|
file = fsys.OpenFile(i->File);
|
||||||
# if wxUSE_DATETIME
|
# if wxUSE_DATETIME
|
||||||
modif = file && file->GetModificationTime() > m_data[i].Time;
|
modif = file && file->GetModificationTime() > i->Time;
|
||||||
# else // wxUSE_DATETIME
|
# else // wxUSE_DATETIME
|
||||||
modif = true;
|
modif = true;
|
||||||
# endif // wxUSE_DATETIME
|
# endif // wxUSE_DATETIME
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
wxLogError(_("Cannot open file '%s'."), m_data[i].File.c_str());
|
wxLogError(_("Cannot open file '%s'."), i->File.c_str());
|
||||||
rt = false;
|
rt = false;
|
||||||
}
|
}
|
||||||
wxDELETE(file);
|
wxDELETE(file);
|
||||||
wxUnusedVar(file);
|
wxUnusedVar(file);
|
||||||
# else // wxUSE_FILESYSTEM
|
# else // wxUSE_FILESYSTEM
|
||||||
# if wxUSE_DATETIME
|
# if wxUSE_DATETIME
|
||||||
modif = wxDateTime(wxFileModificationTime(m_data[i].File)) > m_data[i].Time;
|
modif = wxDateTime(wxFileModificationTime(i->File)) > i->Time;
|
||||||
# else // wxUSE_DATETIME
|
# else // wxUSE_DATETIME
|
||||||
modif = true;
|
modif = true;
|
||||||
# endif // wxUSE_DATETIME
|
# endif // wxUSE_DATETIME
|
||||||
@@ -447,41 +474,41 @@ bool wxXmlResource::UpdateResources()
|
|||||||
if (modif)
|
if (modif)
|
||||||
{
|
{
|
||||||
wxLogTrace(_T("xrc"),
|
wxLogTrace(_T("xrc"),
|
||||||
_T("opening file '%s'"), m_data[i].File.c_str());
|
_T("opening file '%s'"), i->File.c_str());
|
||||||
|
|
||||||
wxInputStream *stream = NULL;
|
wxInputStream *stream = NULL;
|
||||||
|
|
||||||
# if wxUSE_FILESYSTEM
|
# if wxUSE_FILESYSTEM
|
||||||
file = fsys.OpenFile(m_data[i].File);
|
file = fsys.OpenFile(i->File);
|
||||||
if (file)
|
if (file)
|
||||||
stream = file->GetStream();
|
stream = file->GetStream();
|
||||||
# else
|
# else
|
||||||
stream = new wxFileInputStream(m_data[i].File);
|
stream = new wxFileInputStream(i->File);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
if (stream)
|
if (stream)
|
||||||
{
|
{
|
||||||
delete m_data[i].Doc;
|
delete i->Doc;
|
||||||
m_data[i].Doc = new wxXmlDocument;
|
i->Doc = new wxXmlDocument;
|
||||||
}
|
}
|
||||||
if (!stream || !m_data[i].Doc->Load(*stream, encoding))
|
if (!stream || !i->Doc->Load(*stream, encoding))
|
||||||
{
|
{
|
||||||
wxLogError(_("Cannot load resources from file '%s'."),
|
wxLogError(_("Cannot load resources from file '%s'."),
|
||||||
m_data[i].File.c_str());
|
i->File.c_str());
|
||||||
wxDELETE(m_data[i].Doc);
|
wxDELETE(i->Doc);
|
||||||
rt = false;
|
rt = false;
|
||||||
}
|
}
|
||||||
else if (m_data[i].Doc->GetRoot()->GetName() != wxT("resource"))
|
else if (i->Doc->GetRoot()->GetName() != wxT("resource"))
|
||||||
{
|
{
|
||||||
wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), m_data[i].File.c_str());
|
wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), i->File.c_str());
|
||||||
wxDELETE(m_data[i].Doc);
|
wxDELETE(i->Doc);
|
||||||
rt = false;
|
rt = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
long version;
|
long version;
|
||||||
int v1, v2, v3, v4;
|
int v1, v2, v3, v4;
|
||||||
wxString verstr = m_data[i].Doc->GetRoot()->GetAttribute(
|
wxString verstr = i->Doc->GetRoot()->GetAttribute(
|
||||||
wxT("version"), wxT("0.0.0.0"));
|
wxT("version"), wxT("0.0.0.0"));
|
||||||
if (wxSscanf(verstr.c_str(), wxT("%i.%i.%i.%i"),
|
if (wxSscanf(verstr.c_str(), wxT("%i.%i.%i.%i"),
|
||||||
&v1, &v2, &v3, &v4) == 4)
|
&v1, &v2, &v3, &v4) == 4)
|
||||||
@@ -496,12 +523,12 @@ bool wxXmlResource::UpdateResources()
|
|||||||
rt = false;
|
rt = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessPlatformProperty(m_data[i].Doc->GetRoot());
|
ProcessPlatformProperty(i->Doc->GetRoot());
|
||||||
#if wxUSE_DATETIME
|
#if wxUSE_DATETIME
|
||||||
#if wxUSE_FILESYSTEM
|
#if wxUSE_FILESYSTEM
|
||||||
m_data[i].Time = file->GetModificationTime();
|
i->Time = file->GetModificationTime();
|
||||||
#else // wxUSE_FILESYSTEM
|
#else // wxUSE_FILESYSTEM
|
||||||
m_data[i].Time = wxDateTime(wxFileModificationTime(m_data[i].File));
|
i->Time = wxDateTime(wxFileModificationTime(i->File));
|
||||||
#endif // wxUSE_FILESYSTEM
|
#endif // wxUSE_FILESYSTEM
|
||||||
#endif // wxUSE_DATETIME
|
#endif // wxUSE_DATETIME
|
||||||
}
|
}
|
||||||
@@ -578,17 +605,18 @@ wxXmlNode *wxXmlResource::FindResource(const wxString& name,
|
|||||||
UpdateResources(); //ensure everything is up-to-date
|
UpdateResources(); //ensure everything is up-to-date
|
||||||
|
|
||||||
wxString dummy;
|
wxString dummy;
|
||||||
for (size_t f = 0; f < m_data.GetCount(); f++)
|
for ( wxXmlResourceDataRecords::const_iterator f = Data().begin();
|
||||||
|
f != Data().end(); ++f )
|
||||||
{
|
{
|
||||||
if ( m_data[f].Doc == NULL || m_data[f].Doc->GetRoot() == NULL )
|
if ( f->Doc == NULL || f->Doc->GetRoot() == NULL )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
wxXmlNode* found = DoFindResource(m_data[f].Doc->GetRoot(),
|
wxXmlNode* found = DoFindResource(f->Doc->GetRoot(),
|
||||||
name, classname, recursive);
|
name, classname, recursive);
|
||||||
if ( found )
|
if ( found )
|
||||||
{
|
{
|
||||||
#if wxUSE_FILESYSTEM
|
#if wxUSE_FILESYSTEM
|
||||||
m_curFileSystem.ChangePathTo(m_data[f].File);
|
m_curFileSystem.ChangePathTo(f->File);
|
||||||
#endif
|
#endif
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
@@ -681,8 +709,6 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent,
|
|||||||
return CreateResFromNode(©, parent, instance);
|
return CreateResFromNode(©, parent, instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxXmlResourceHandler *handler;
|
|
||||||
|
|
||||||
if (handlerToUse)
|
if (handlerToUse)
|
||||||
{
|
{
|
||||||
if (handlerToUse->CanHandle(node))
|
if (handlerToUse->CanHandle(node))
|
||||||
@@ -692,16 +718,13 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent,
|
|||||||
}
|
}
|
||||||
else if (node->GetName() == wxT("object"))
|
else if (node->GetName() == wxT("object"))
|
||||||
{
|
{
|
||||||
wxList::compatibility_iterator ND = m_handlers.GetFirst();
|
for ( wxVector<wxXmlResourceHandler*>::iterator h = m_handlers.begin();
|
||||||
while (ND)
|
h != m_handlers.end(); ++h )
|
||||||
{
|
{
|
||||||
handler = (wxXmlResourceHandler*)ND->GetData();
|
wxXmlResourceHandler *handler = *h;
|
||||||
if (handler->CanHandle(node))
|
if (handler->CanHandle(node))
|
||||||
{
|
|
||||||
return handler->CreateResource(node, parent, instance);
|
return handler->CreateResource(node, parent, instance);
|
||||||
}
|
}
|
||||||
ND = ND->GetNext();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxLogError(_("No handler found for XML node '%s', class '%s'!"),
|
wxLogError(_("No handler found for XML node '%s', class '%s'!"),
|
||||||
@@ -711,19 +734,20 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "wx/listimpl.cpp"
|
class wxXmlSubclassFactories : public wxVector<wxXmlSubclassFactory*>
|
||||||
WX_DECLARE_LIST(wxXmlSubclassFactory, wxXmlSubclassFactoriesList);
|
{
|
||||||
WX_DEFINE_LIST(wxXmlSubclassFactoriesList)
|
// this is a class so that it can be forward-declared
|
||||||
|
};
|
||||||
|
|
||||||
wxXmlSubclassFactoriesList *wxXmlResource::ms_subclassFactories = NULL;
|
wxXmlSubclassFactories *wxXmlResource::ms_subclassFactories = NULL;
|
||||||
|
|
||||||
/*static*/ void wxXmlResource::AddSubclassFactory(wxXmlSubclassFactory *factory)
|
/*static*/ void wxXmlResource::AddSubclassFactory(wxXmlSubclassFactory *factory)
|
||||||
{
|
{
|
||||||
if (!ms_subclassFactories)
|
if (!ms_subclassFactories)
|
||||||
{
|
{
|
||||||
ms_subclassFactories = new wxXmlSubclassFactoriesList;
|
ms_subclassFactories = new wxXmlSubclassFactories;
|
||||||
}
|
}
|
||||||
ms_subclassFactories->Append(factory);
|
ms_subclassFactories->push_back(factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
class wxXmlSubclassFactoryCXX : public wxXmlSubclassFactory
|
class wxXmlSubclassFactoryCXX : public wxXmlSubclassFactory
|
||||||
@@ -766,10 +790,10 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent
|
|||||||
wxString subclass = node->GetAttribute(wxT("subclass"), wxEmptyString);
|
wxString subclass = node->GetAttribute(wxT("subclass"), wxEmptyString);
|
||||||
if (!subclass.empty())
|
if (!subclass.empty())
|
||||||
{
|
{
|
||||||
for (wxXmlSubclassFactoriesList::compatibility_iterator i = wxXmlResource::ms_subclassFactories->GetFirst();
|
for (wxXmlSubclassFactories::iterator i = wxXmlResource::ms_subclassFactories->begin();
|
||||||
i; i = i->GetNext())
|
i != wxXmlResource::ms_subclassFactories->end(); ++i)
|
||||||
{
|
{
|
||||||
m_instance = i->GetData()->Create(subclass);
|
m_instance = (*i)->Create(subclass);
|
||||||
if (m_instance)
|
if (m_instance)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1758,8 +1782,14 @@ public:
|
|||||||
{
|
{
|
||||||
delete wxXmlResource::Set(NULL);
|
delete wxXmlResource::Set(NULL);
|
||||||
if(wxXmlResource::ms_subclassFactories)
|
if(wxXmlResource::ms_subclassFactories)
|
||||||
WX_CLEAR_LIST(wxXmlSubclassFactoriesList, *wxXmlResource::ms_subclassFactories);
|
{
|
||||||
|
for ( wxXmlSubclassFactories::iterator i = wxXmlResource::ms_subclassFactories->begin();
|
||||||
|
i != wxXmlResource::ms_subclassFactories->end(); ++i )
|
||||||
|
{
|
||||||
|
delete *i;
|
||||||
|
}
|
||||||
wxDELETE(wxXmlResource::ms_subclassFactories);
|
wxDELETE(wxXmlResource::ms_subclassFactories);
|
||||||
|
}
|
||||||
CleanXRCID_Records();
|
CleanXRCID_Records();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user