]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xmlres.cpp
More test cases and handle __doc__ == None
[wxWidgets.git] / src / xrc / xmlres.cpp
index 661453e0e1c11f625a06dcc16d40ae74a732f861..d9b2c4afff46ab1412cdde7e4a1db1088fc39fbe 100644 (file)
@@ -35,7 +35,7 @@
 #include "wx/fontmap.h"
 #include "wx/artprov.h"
 
-#include "wx/xrc/xml.h"
+#include "wx/xml/xml.h"
 #include "wx/xrc/xmlres.h"
 
 #include "wx/arrimpl.cpp"
@@ -60,7 +60,6 @@ wxXmlResource *wxXmlResource::ms_instance = NULL;
 
 wxXmlResource::wxXmlResource(int flags)
 {
-    m_handlers.DeleteContents(TRUE);
     m_flags = flags;
     m_version = -1;
 }
@@ -69,7 +68,6 @@ wxXmlResource::wxXmlResource(const wxString& filemask, int flags)
 {
     m_flags = flags;
     m_version = -1;
-    m_handlers.DeleteContents(TRUE);
     Load(filemask);
 }
 
@@ -107,7 +105,7 @@ bool wxXmlResource::Load(const wxString& filemask)
         //     filename and not URL:
         if (wxFileName::FileExists(fnd))
         {
-            // Make the name absolute filename, because the app may 
+            // Make the name absolute filename, because the app may
             // change working directory later:
             wxFileName fn(fnd);
             if (fn.IsRelative())
@@ -119,13 +117,12 @@ bool wxXmlResource::Load(const wxString& filemask)
             fnd = wxFileSystem::FileNameToURL(fnd);
 #endif
         }
-        
+
 #if wxUSE_FILESYSTEM
         if (fnd.Lower().Matches(wxT("*.zip")) ||
             fnd.Lower().Matches(wxT("*.xrs")))
         {
-            wxString url(wxFileSystem::FileNameToURL(fnd));
-            rt = rt && Load(url + wxT("#zip:*.xrc"));
+            rt = rt && Load(fnd + wxT("#zip:*.xrc"));
         }
         else
 #endif
@@ -142,7 +139,7 @@ bool wxXmlResource::Load(const wxString& filemask)
     }
 #   undef wxXmlFindFirst
 #   undef wxXmlFindNext
-    return rt;
+    return rt && UpdateResources();
 }
 
 
@@ -164,7 +161,7 @@ void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
 
 void wxXmlResource::ClearHandlers()
 {
-    m_handlers.Clear();
+    WX_CLEAR_LIST(wxList, m_handlers);
 }
 
 
@@ -287,14 +284,13 @@ static void ProcessPlatformProperty(wxXmlNode *node)
             while (tkn.HasMoreTokens())
             {
                 s = tkn.GetNextToken();
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
                 if (s == wxT("win")) isok = true;
 #endif
-#ifdef __UNIX__
-                if (s == wxT("unix")) isok = true;
-#endif
-#ifdef __MAC__
+#if defined(__MAC__) || defined(__APPLE__)
                 if (s == wxT("mac")) isok = true;
+#elif defined(__UNIX__)
+                if (s == wxT("unix")) isok = true;
 #endif
 #ifdef __OS2__
                 if (s == wxT("os2")) isok = true;
@@ -322,11 +318,13 @@ static void ProcessPlatformProperty(wxXmlNode *node)
 
 
 
-void wxXmlResource::UpdateResources()
+bool wxXmlResource::UpdateResources()
 {
+    bool rt = true;
     bool modif;
 #   if wxUSE_FILESYSTEM
     wxFSFile *file = NULL;
+    wxUnusedVar(file);
     wxFileSystem fsys;
 #   endif
 
@@ -351,8 +349,12 @@ void wxXmlResource::UpdateResources()
             file = fsys.OpenFile(m_data[i].File);
             modif = file && file->GetModificationTime() > m_data[i].Time;
             if (!file)
+            {
                 wxLogError(_("Cannot open file '%s'."), m_data[i].File.c_str());
+                rt = false;
+            }
             wxDELETE(file);
+            wxUnusedVar(file);
 #           else
             modif = wxDateTime(wxFileModificationTime(m_data[i].File)) > m_data[i].Time;
 #           endif
@@ -380,11 +382,13 @@ void wxXmlResource::UpdateResources()
                 wxLogError(_("Cannot load resources from file '%s'."),
                            m_data[i].File.c_str());
                 wxDELETE(m_data[i].Doc);
+                rt = false;
             }
             else if (m_data[i].Doc->GetRoot()->GetName() != wxT("resource"))
             {
                 wxLogError(_("Invalid XRC resource '%s': doesn't have root node 'resource'."), m_data[i].File.c_str());
                 wxDELETE(m_data[i].Doc);
+                rt = false;
             }
             else
                        {
@@ -400,19 +404,29 @@ void wxXmlResource::UpdateResources()
                 if (m_version == -1)
                     m_version = version;
                 if (m_version != version)
+                {
                     wxLogError(_("Resource files must have same version number!"));
+                    rt = false;
+                }
 
                 ProcessPlatformProperty(m_data[i].Doc->GetRoot());
+#if wxUSE_FILESYSTEM
                                m_data[i].Time = file->GetModificationTime();
+#else
+                m_data[i].Time = wxDateTime(wxFileModificationTime(m_data[i].File));
+#endif
                        }
 
 #           if wxUSE_FILESYSTEM
                                wxDELETE(file);
+                               wxUnusedVar(file);
 #           else
                                wxDELETE(stream);
 #           endif
         }
     }
+
+    return rt;
 }
 
 
@@ -569,15 +583,15 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent,
     wxXmlResourceHandler *handler;
 
     if (handlerToUse)
-    {        
+    {
         if (handlerToUse->CanHandle(node))
         {
             return handlerToUse->CreateResource(node, parent, instance);
         }
     }
     else if (node->GetName() == wxT("object"))
-    {    
-        wxNode *ND = m_handlers.GetFirst();
+    {
+        wxList::compatibility_iterator ND = m_handlers.GetFirst();
         while (ND)
         {
             handler = (wxXmlResourceHandler*)ND->GetData();
@@ -607,7 +621,6 @@ wxXmlSubclassFactoriesList *wxXmlResource::ms_subclassFactories = NULL;
     if (!ms_subclassFactories)
     {
         ms_subclassFactories = new wxXmlSubclassFactoriesList;
-        ms_subclassFactories->DeleteContents(TRUE);
     }
     ms_subclassFactories->Append(factory);
 }
@@ -653,7 +666,7 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent
         wxString subclass = node->GetPropVal(wxT("subclass"), wxEmptyString);
         if (!subclass.empty())
         {
-            for (wxXmlSubclassFactoriesList::Node *i = wxXmlResource::ms_subclassFactories->GetFirst();
+            for (wxXmlSubclassFactoriesList::compatibility_iterator i = wxXmlResource::ms_subclassFactories->GetFirst();
                  i; i = i->GetNext())
             {
                 m_instance = i->GetData()->Create(subclass);
@@ -706,6 +719,7 @@ void wxXmlResourceHandler::AddWindowStyles()
     XRC_ADD_STYLE(wxTRANSPARENT_WINDOW);
     XRC_ADD_STYLE(wxWANTS_CHARS);
     XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
+    XRC_ADD_STYLE(wxWS_EX_BLOCK_EVENTS);
 }
 
 
@@ -742,7 +756,8 @@ int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults)
 
 wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
 {
-    wxString str1(GetParamValue(param));
+    wxXmlNode *parNode = GetParamNode(param);
+    wxString str1(GetNodeContent(parNode));
     wxString str2;
     const wxChar *dt;
     wxChar amp_char;
@@ -778,11 +793,31 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
         else str2 << *dt;
     }
 
-    if (translate && m_resource->GetFlags() & wxXRC_USE_LOCALE)
-        return wxGetTranslation(str2);
+    if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
+    {
+        if (translate && parNode &&
+            parNode->GetPropVal(wxT("translate"), wxEmptyString) != wxT("0"))
+        {
+            return wxGetTranslation(str2);
+        }
+        else
+        {
+#if wxUSE_UNICODE
+            return str2;
+#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);
+#endif
+        }
+    }
     else
+    {
+        // If wxXRC_USE_LOCALE is not set, then the string is already in
+        // system's default encoding in ANSI build, so we don't have to
+        // do anything special here.
         return str2;
-
+    }
 }
 
 
@@ -954,7 +989,7 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param)
     wxString s = GetParamValue(param);
     if (s.IsEmpty()) s = wxT("-1,-1");
     bool is_dlg;
-    long sx, sy;
+    long sx, sy = 0;
 
     is_dlg = s[s.Length()-1] == wxT('d');
     if (is_dlg) s.RemoveLast();
@@ -1174,14 +1209,12 @@ static int XRCID_Lookup(const wxChar *str_id, int value_if_not_found = -2)
     index %= XRCID_TABLE_SIZE;
 
     XRCID_record *oldrec = NULL;
-    int matchcnt = 0;
     for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next)
     {
         if (wxStrcmp(rec->key, str_id) == 0)
         {
             return rec->id;
         }
-        matchcnt++;
         oldrec = rec;
     }
 
@@ -1277,6 +1310,8 @@ public:
     void OnExit()
     {
         delete wxXmlResource::Set(NULL);
+        if(wxXmlResource::ms_subclassFactories)
+            WX_CLEAR_LIST(wxXmlSubclassFactoriesList, *wxXmlResource::ms_subclassFactories);
         wxDELETE(wxXmlResource::ms_subclassFactories);
         CleanXRCID_Records();
     }