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:
Václav Slavík
2007-09-10 22:26:39 +00:00
parent bc1d617aac
commit eb2d0d232c
2 changed files with 98 additions and 85 deletions

View File

@@ -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;

View File

@@ -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(&copy, parent, instance); return CreateResFromNode(&copy, parent, instance);
} }
wxXmlResourceHandler *handler;
if (handlerToUse) if (handlerToUse)
{ {
if (handlerToUse->CanHandle(node)) if (handlerToUse->CanHandle(node))
@@ -692,15 +718,12 @@ 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();
} }
} }
@@ -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); {
wxDELETE(wxXmlResource::ms_subclassFactories); for ( wxXmlSubclassFactories::iterator i = wxXmlResource::ms_subclassFactories->begin();
i != wxXmlResource::ms_subclassFactories->end(); ++i )
{
delete *i;
}
wxDELETE(wxXmlResource::ms_subclassFactories);
}
CleanXRCID_Records(); CleanXRCID_Records();
} }
}; };