X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0edeeb6d96d31d342a6a283d2a9b625a1d0a7b96..04d24675d3d26e9ae8af8b4bd390532d03adcbe1:/src/xrc/xmlres.cpp diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index ccacf01905..466faa9870 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -47,6 +47,7 @@ #include "wx/xml/xml.h" + class wxXmlResourceDataRecord { public: @@ -64,7 +65,7 @@ public: #endif }; -class wxXmlResourceDataRecords : public wxVector +class wxXmlResourceDataRecords : public wxVector { // this is a class so that it can be forward-declared }; @@ -107,6 +108,11 @@ wxXmlResource::~wxXmlResource() { ClearHandlers(); + for ( wxXmlResourceDataRecords::iterator i = m_data->begin(); + i != m_data->end(); ++i ) + { + delete *i; + } delete m_data; } @@ -186,8 +192,8 @@ bool wxXmlResource::Load(const wxString& filemask) else // a single resource URL #endif // wxUSE_FILESYSTEM { - wxXmlResourceDataRecord drec; - drec.File = fnd; + wxXmlResourceDataRecord *drec = new wxXmlResourceDataRecord; + drec->File = fnd; Data().push_back(drec); } @@ -220,15 +226,16 @@ bool wxXmlResource::Unload(const wxString& filename) #if wxUSE_FILESYSTEM if ( isArchive ) { - if ( i->File.StartsWith(fnd) ) + if ( (*i)->File.StartsWith(fnd) ) unloaded = true; // don't break from the loop, we can have other matching files } else // a single resource URL #endif // wxUSE_FILESYSTEM { - if ( i->File == fnd ) + if ( (*i)->File == fnd ) { + delete *i; Data().erase(i); unloaded = true; @@ -444,27 +451,29 @@ bool wxXmlResource::UpdateResources() for ( wxXmlResourceDataRecords::iterator i = Data().begin(); i != Data().end(); ++i ) { - modif = (i->Doc == NULL); + wxXmlResourceDataRecord* const rec = *i; + + modif = (rec->Doc == NULL); if (!modif && !(m_flags & wxXRC_NO_RELOADING)) { # if wxUSE_FILESYSTEM - file = fsys.OpenFile(i->File); + file = fsys.OpenFile(rec->File); # if wxUSE_DATETIME - modif = file && file->GetModificationTime() > i->Time; + modif = file && file->GetModificationTime() > rec->Time; # else // wxUSE_DATETIME modif = true; # endif // wxUSE_DATETIME if (!file) { - wxLogError(_("Cannot open file '%s'."), i->File.c_str()); + wxLogError(_("Cannot open file '%s'."), rec->File); rt = false; } wxDELETE(file); wxUnusedVar(file); # else // wxUSE_FILESYSTEM # if wxUSE_DATETIME - modif = wxDateTime(wxFileModificationTime(i->File)) > i->Time; + modif = wxDateTime(wxFileModificationTime(rec->File)) > rec->Time; # else // wxUSE_DATETIME modif = true; # endif // wxUSE_DATETIME @@ -473,42 +482,41 @@ bool wxXmlResource::UpdateResources() if (modif) { - wxLogTrace(_T("xrc"), - _T("opening file '%s'"), i->File.c_str()); + wxLogTrace(_T("xrc"), _T("opening file '%s'"), rec->File); wxInputStream *stream = NULL; # if wxUSE_FILESYSTEM - file = fsys.OpenFile(i->File); + file = fsys.OpenFile(rec->File); if (file) stream = file->GetStream(); # else - stream = new wxFileInputStream(i->File); + stream = new wxFileInputStream(rec->File); # endif if (stream) { - delete i->Doc; - i->Doc = new wxXmlDocument; + delete rec->Doc; + rec->Doc = new wxXmlDocument; } - if (!stream || !i->Doc->Load(*stream, encoding)) + if (!stream || !rec->Doc->Load(*stream, encoding)) { wxLogError(_("Cannot load resources from file '%s'."), - i->File.c_str()); - wxDELETE(i->Doc); + rec->File); + wxDELETE(rec->Doc); rt = false; } - else if (i->Doc->GetRoot()->GetName() != wxT("resource")) + else if (rec->Doc->GetRoot()->GetName() != wxT("resource")) { - wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), i->File.c_str()); - wxDELETE(i->Doc); + wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), rec->File); + wxDELETE(rec->Doc); rt = false; } else { long version; int v1, v2, v3, v4; - wxString verstr = i->Doc->GetRoot()->GetAttribute( + wxString verstr = rec->Doc->GetRoot()->GetAttribute( wxT("version"), wxT("0.0.0.0")); if (wxSscanf(verstr.c_str(), wxT("%i.%i.%i.%i"), &v1, &v2, &v3, &v4) == 4) @@ -523,12 +531,12 @@ bool wxXmlResource::UpdateResources() rt = false; } - ProcessPlatformProperty(i->Doc->GetRoot()); + ProcessPlatformProperty(rec->Doc->GetRoot()); #if wxUSE_DATETIME #if wxUSE_FILESYSTEM - i->Time = file->GetModificationTime(); + rec->Time = file->GetModificationTime(); #else // wxUSE_FILESYSTEM - i->Time = wxDateTime(wxFileModificationTime(i->File)); + rec->Time = wxDateTime(wxFileModificationTime(rec->File)); #endif // wxUSE_FILESYSTEM #endif // wxUSE_DATETIME } @@ -608,15 +616,16 @@ wxXmlNode *wxXmlResource::FindResource(const wxString& name, for ( wxXmlResourceDataRecords::const_iterator f = Data().begin(); f != Data().end(); ++f ) { - if ( f->Doc == NULL || f->Doc->GetRoot() == NULL ) + wxXmlResourceDataRecord* const rec = *f; + if ( rec->Doc == NULL || rec->Doc->GetRoot() == NULL ) continue; - wxXmlNode* found = DoFindResource(f->Doc->GetRoot(), + wxXmlNode* found = DoFindResource(rec->Doc->GetRoot(), name, classname, recursive); if ( found ) { #if wxUSE_FILESYSTEM - m_curFileSystem.ChangePathTo(f->File); + m_curFileSystem.ChangePathTo(rec->File); #endif return found; } @@ -958,7 +967,7 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate) #else // The string is internally stored as UTF-8, we have to convert // it into system's default encoding so that it can be displayed: - return wxString(str2.mb_str(wxConvUTF8), wxConvLocal); + return wxString(str2.wc_str(wxConvUTF8), wxConvLocal); #endif } } @@ -1567,7 +1576,10 @@ void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode * struct XRCID_record { - int id; + /* Hold the id so that once an id is allocated for a name, it + does not get created again by NewControlId at least + until we are done with it */ + wxWindowIDRef id; char *key; XRCID_record *next; }; @@ -1610,7 +1622,7 @@ static int XRCID_Lookup(const char *str_id, int value_if_not_found = wxID_NONE) } else { - (*rec_var)->id = wxWindow::NewControlId(); + (*rec_var)->id = wxWindowBase::NewControlId(); } } @@ -1639,6 +1651,7 @@ static void CleanXRCID_Record(XRCID_record *rec) if (rec) { CleanXRCID_Record(rec->next); + free(rec->key); delete rec; } @@ -1682,6 +1695,7 @@ static void AddStdXRCID_Records() stdID(wxID_HELP_CONTEXT); stdID(wxID_CLOSE_ALL); stdID(wxID_PREFERENCES); + stdID(wxID_EDIT); stdID(wxID_CUT); stdID(wxID_COPY); stdID(wxID_PASTE);