]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xmlres.cpp
compilation fix for PCH-less compilation after the last change
[wxWidgets.git] / src / xrc / xmlres.cpp
index 52de6a660b4138fcae666d7cef98d2be14da3853..c93f2ef02303552a30d4d7a1673026bfbfa1b532 100644 (file)
@@ -65,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
 };
@@ -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
         }
     }
@@ -987,6 +995,7 @@ float wxXmlResourceHandler::GetFloat(const wxString& param, float defaultv)
 {
     wxString str = GetParamValue(param);
 
+#if wxUSE_INTL
     // strings in XRC always use C locale but wxString::ToDouble() uses the
     // current one, so transform the string to it supposing that the only
     // difference between them is the decimal separator
@@ -994,6 +1003,7 @@ float wxXmlResourceHandler::GetFloat(const wxString& param, float defaultv)
     // TODO: use wxString::ToCDouble() when we have it
     str.Replace(wxT("."), wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT,
                                             wxLOCALE_CAT_NUMBER));
+#endif // wxUSE_INTL
 
     double value;
     if (!str.ToDouble(&value))
@@ -1430,8 +1440,9 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
     if (hasFacename)
     {
         wxString faces = GetParamValue(wxT("face"));
-        wxArrayString facenames(wxFontEnumerator::GetFacenames());
         wxStringTokenizer tk(faces, wxT(","));
+#if wxUSE_FONTENUM
+        wxArrayString facenames(wxFontEnumerator::GetFacenames());
         while (tk.HasMoreTokens())
         {
             int index = facenames.Index(tk.GetNextToken(), false);
@@ -1441,6 +1452,11 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
                 break;
             }
         }
+#else // !wxUSE_FONTENUM
+        // just use the first face name if we can't check its availability:
+        if (tk.HasMoreTokens())
+            facename = tk.GetNextToken();
+#endif // wxUSE_FONTENUM/!wxUSE_FONTENUM
     }
 
     // encoding
@@ -1568,7 +1584,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 +1660,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 +1703,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);
@@ -1775,6 +1790,17 @@ static void AddStdXRCID_Records()
 
 // --------------- module and globals -----------------------------
 
+// normally we would do the cleanup from wxXmlResourceModule::OnExit() but it
+// can happen that some XRC records have been created because of the use of
+// XRCID() in event tables, which happens during static objects initialization,
+// but then the application initialization failed and so the wx modules were
+// neither initialized nor cleaned up -- this static object does the cleanup in
+// this case
+static struct wxXRCStaticCleanup
+{
+    ~wxXRCStaticCleanup() { CleanXRCID_Records(); }
+} s_staticCleanup;
+
 class wxXmlResourceModule: public wxModule
 {
 DECLARE_DYNAMIC_CLASS(wxXmlResourceModule)