X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f35fdf7e4a86ad98256debf60939f1f3a34c8a0f..fdf7ff738cb755be0e9e7e1378d8c3073f08f0e1:/src/xrc/xmlres.cpp diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 52de6a660b..466faa9870 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -65,7 +65,7 @@ public: #endif }; -class wxXmlResourceDataRecords : public wxVector +class wxXmlResourceDataRecords : public wxVector { // this is a class so that it can be forward-declared }; @@ -108,6 +108,11 @@ wxXmlResource::~wxXmlResource() { ClearHandlers(); + for ( wxXmlResourceDataRecords::iterator i = m_data->begin(); + i != m_data->end(); ++i ) + { + delete *i; + } delete m_data; } @@ -187,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); } @@ -221,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; @@ -445,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 @@ -474,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) @@ -524,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 } @@ -609,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; } @@ -959,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 } } @@ -1568,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; }; @@ -1641,11 +1652,6 @@ static void CleanXRCID_Record(XRCID_record *rec) { CleanXRCID_Record(rec->next); - // if we had generated the value of this id automatically, release it - // now that we don't need it any longer - if ( wxWindow::IsAutoGeneratedId(rec->id) ) - wxWindow::ReleaseControlId(rec->id); - free(rec->key); delete rec; } @@ -1689,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);