]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xmlres.cpp
make wxSelectDispatcher ctor public, it can be useful to create it in places other...
[wxWidgets.git] / src / xrc / xmlres.cpp
index ccacf0190560b355ff7ae36b5707adc603458fb4..466faa9870f12e8290595f976ec1111bad030441 100644 (file)
@@ -47,6 +47,7 @@
 
 #include "wx/xml/xml.h"
 
+
 class wxXmlResourceDataRecord
 {
 public:
@@ -64,7 +65,7 @@ public:
 #endif
 };
 
-class wxXmlResourceDataRecords : public wxVector<wxXmlResourceDataRecord>
+class wxXmlResourceDataRecords : public wxVector<wxXmlResourceDataRecord*>
 {
     // 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);