]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xmlres.cpp
Fix another crash when conversion fails in Unix PostScript code.
[wxWidgets.git] / src / xrc / xmlres.cpp
index f48bfe7faeefaadbf71384f2faab6f19d15817f0..c514809b0101f0dbc64e3573a77459f904c94862 100644 (file)
@@ -3,7 +3,6 @@
 // Purpose:     XRC resources
 // Author:      Vaclav Slavik
 // Created:     2000/03/05
 // Purpose:     XRC resources
 // Author:      Vaclav Slavik
 // Created:     2000/03/05
-// RCS-ID:      $Id$
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) 2000 Vaclav Slavik
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -73,6 +72,10 @@ wxDateTime GetXRCFileModTime(const wxString& filename)
 
 } // anonymous namespace
 
 
 } // anonymous namespace
 
+// Assign the given value to the specified entry or add a new value with this
+// name.
+static void XRCID_Assign(const wxString& str_id, int value);
+
 class wxXmlResourceDataRecord
 {
 public:
 class wxXmlResourceDataRecord
 {
 public:
@@ -152,9 +155,6 @@ public:
     void FinaliseRanges(const wxXmlNode* node) const;
     // Searches for a known IdRange matching 'name', returning its index or -1
     int Find(const wxString& rangename) const;
     void FinaliseRanges(const wxXmlNode* node) const;
     // Searches for a known IdRange matching 'name', returning its index or -1
     int Find(const wxString& rangename) const;
-    // Removes, if it exists, an entry from the XRCID table. Used in id-ranges
-    // to replace defunct or statically-initialised entries with current values
-    static void RemoveXRCIDEntry(const wxString& idstr);
 
 protected:
     wxIdRange* FindRangeForItem(const wxXmlNode* node,
 
 protected:
     wxIdRange* FindRangeForItem(const wxXmlNode* node,
@@ -430,16 +430,18 @@ bool wxXmlResource::Unload(const wxString& filename)
 }
 
 
 }
 
 
-IMPLEMENT_ABSTRACT_CLASS(wxXmlResourceHandler, wxObject)
-
 void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
 {
 void wxXmlResource::AddHandler(wxXmlResourceHandler *handler)
 {
+    wxXmlResourceHandlerImpl *impl = new wxXmlResourceHandlerImpl(handler);
+    handler->SetImpl(impl);
     m_handlers.push_back(handler);
     handler->SetParentResource(this);
 }
 
 void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
 {
     m_handlers.push_back(handler);
     handler->SetParentResource(this);
 }
 
 void wxXmlResource::InsertHandler(wxXmlResourceHandler *handler)
 {
+    wxXmlResourceHandlerImpl *impl = new wxXmlResourceHandlerImpl(handler);
+    handler->SetImpl(impl);
     m_handlers.insert(m_handlers.begin(), handler);
     handler->SetParentResource(this);
 }
     m_handlers.insert(m_handlers.begin(), handler);
     handler->SetParentResource(this);
 }
@@ -1216,13 +1218,10 @@ void wxIdRange::Finalise(const wxXmlNode* node)
     // Create the XRCIDs
     for (int i=m_start; i <= m_end; ++i)
     {
     // Create the XRCIDs
     for (int i=m_start; i <= m_end; ++i)
     {
-        // First clear any pre-existing XRCID
-        // Necessary for wxXmlResource::Unload() followed by Load()
-        wxIdRangeManager::RemoveXRCIDEntry(
-                m_name + wxString::Format("[%i]", i-m_start));
+        // Ensure that we overwrite any existing value as otherwise
+        // wxXmlResource::Unload() followed by Load() wouldn't work correctly.
+        XRCID_Assign(m_name + wxString::Format("[%i]", i-m_start), i);
 
 
-        // Use the second parameter of GetXRCID to force it to take the value i
-        wxXmlResource::GetXRCID(m_name + wxString::Format("[%i]", i-m_start), i);
         wxLogTrace("xrcrange",
                    "integer = %i %s now returns %i",
                    i,
         wxLogTrace("xrcrange",
                    "integer = %i %s now returns %i",
                    i,
@@ -1230,10 +1229,8 @@ void wxIdRange::Finalise(const wxXmlNode* node)
                    XRCID((m_name + wxString::Format("[%i]", i-m_start)).mb_str()));
     }
     // and these special ones
                    XRCID((m_name + wxString::Format("[%i]", i-m_start)).mb_str()));
     }
     // and these special ones
-    wxIdRangeManager::RemoveXRCIDEntry(m_name + "[start]");
-    wxXmlResource::GetXRCID(m_name + "[start]", m_start);
-    wxIdRangeManager::RemoveXRCIDEntry(m_name + "[end]");
-    wxXmlResource::GetXRCID(m_name + "[end]", m_end);
+    XRCID_Assign(m_name + "[start]", m_start);
+    XRCID_Assign(m_name + "[end]", m_end);
     wxLogTrace("xrcrange","%s[start] = %i  %s[end] = %i",
             m_name.mb_str(),XRCID(wxString(m_name+"[start]").mb_str()),
                 m_name.mb_str(),XRCID(wxString(m_name+"[end]").mb_str()));
     wxLogTrace("xrcrange","%s[start] = %i  %s[end] = %i",
             m_name.mb_str(),XRCID(wxString(m_name+"[start]").mb_str()),
                 m_name.mb_str(),XRCID(wxString(m_name+"[end]").mb_str()));
@@ -1405,23 +1402,35 @@ public:
 
 
 
 
 
 
-wxXmlResourceHandler::wxXmlResourceHandler()
-        : m_node(NULL), m_parent(NULL), m_instance(NULL),
-          m_parentAsWindow(NULL)
-{}
+wxXmlResourceHandlerImpl::wxXmlResourceHandlerImpl(wxXmlResourceHandler *handler)
+                         :wxXmlResourceHandlerImplBase(handler)
+{
+}
 
 
+wxObject *wxXmlResourceHandlerImpl::CreateResFromNode(wxXmlNode *node,
+                            wxObject *parent, wxObject *instance)
+{
+    return m_handler->m_resource->CreateResFromNode(node, parent, instance);
+}
 
 
+#if wxUSE_FILESYSTEM
+wxFileSystem& wxXmlResourceHandlerImpl::GetCurFileSystem()
+{
+    return m_handler->m_resource->GetCurFileSystem();
+}
+#endif
 
 
-wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent, wxObject *instance)
+
+wxObject *wxXmlResourceHandlerImpl::CreateResource(wxXmlNode *node, wxObject *parent, wxObject *instance)
 {
 {
-    wxXmlNode *myNode = m_node;
-    wxString myClass = m_class;
-    wxObject *myParent = m_parent, *myInstance = m_instance;
-    wxWindow *myParentAW = m_parentAsWindow;
+    wxXmlNode *myNode = m_handler->m_node;
+    wxString myClass = m_handler->m_class;
+    wxObject *myParent = m_handler->m_parent, *myInstance = m_handler->m_instance;
+    wxWindow *myParentAW = m_handler->m_parentAsWindow;
 
 
-    m_instance = instance;
-    if (!m_instance && node->HasAttribute(wxT("subclass")) &&
-        !(m_resource->GetFlags() & wxXRC_NO_SUBCLASSING))
+    m_handler->m_instance = instance;
+    if (!m_handler->m_instance && node->HasAttribute(wxT("subclass")) &&
+        !(m_handler->m_resource->GetFlags() & wxXRC_NO_SUBCLASSING))
     {
         wxString subclass = node->GetAttribute(wxT("subclass"), wxEmptyString);
         if (!subclass.empty())
     {
         wxString subclass = node->GetAttribute(wxT("subclass"), wxEmptyString);
         if (!subclass.empty())
@@ -1429,12 +1438,12 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent
             for (wxXmlSubclassFactories::iterator i = wxXmlResource::ms_subclassFactories->begin();
                  i != wxXmlResource::ms_subclassFactories->end(); ++i)
             {
             for (wxXmlSubclassFactories::iterator i = wxXmlResource::ms_subclassFactories->begin();
                  i != wxXmlResource::ms_subclassFactories->end(); ++i)
             {
-                m_instance = (*i)->Create(subclass);
-                if (m_instance)
+                m_handler->m_instance = (*i)->Create(subclass);
+                if (m_handler->m_instance)
                     break;
             }
 
                     break;
             }
 
-            if (!m_instance)
+            if (!m_handler->m_instance)
             {
                 wxString name = node->GetAttribute(wxT("name"), wxEmptyString);
                 ReportError
             {
                 wxString name = node->GetAttribute(wxT("name"), wxEmptyString);
                 ReportError
@@ -1450,62 +1459,28 @@ wxObject *wxXmlResourceHandler::CreateResource(wxXmlNode *node, wxObject *parent
         }
     }
 
         }
     }
 
-    m_node = node;
-    m_class = node->GetAttribute(wxT("class"), wxEmptyString);
-    m_parent = parent;
-    m_parentAsWindow = wxDynamicCast(m_parent, wxWindow);
+    m_handler->m_node = node;
+    m_handler->m_class = node->GetAttribute(wxT("class"), wxEmptyString);
+    m_handler->m_parent = parent;
+    m_handler->m_parentAsWindow = wxDynamicCast(m_handler->m_parent, wxWindow);
 
 
-    wxObject *returned = DoCreateResource();
+    wxObject *returned = GetHandler()->DoCreateResource();
 
 
-    m_node = myNode;
-    m_class = myClass;
-    m_parent = myParent; m_parentAsWindow = myParentAW;
-    m_instance = myInstance;
+    m_handler->m_node = myNode;
+    m_handler->m_class = myClass;
+    m_handler->m_parent = myParent; m_handler->m_parentAsWindow = myParentAW;
+    m_handler->m_instance = myInstance;
 
     return returned;
 }
 
 
     return returned;
 }
 
-
-void wxXmlResourceHandler::AddStyle(const wxString& name, int value)
-{
-    m_styleNames.Add(name);
-    m_styleValues.Add(value);
-}
-
-
-
-void wxXmlResourceHandler::AddWindowStyles()
-{
-    XRC_ADD_STYLE(wxCLIP_CHILDREN);
-
-    // the border styles all have the old and new names, recognize both for now
-    XRC_ADD_STYLE(wxSIMPLE_BORDER); XRC_ADD_STYLE(wxBORDER_SIMPLE);
-    XRC_ADD_STYLE(wxSUNKEN_BORDER); XRC_ADD_STYLE(wxBORDER_SUNKEN);
-    XRC_ADD_STYLE(wxDOUBLE_BORDER); XRC_ADD_STYLE(wxBORDER_DOUBLE); // deprecated
-    XRC_ADD_STYLE(wxBORDER_THEME);
-    XRC_ADD_STYLE(wxRAISED_BORDER); XRC_ADD_STYLE(wxBORDER_RAISED);
-    XRC_ADD_STYLE(wxSTATIC_BORDER); XRC_ADD_STYLE(wxBORDER_STATIC);
-    XRC_ADD_STYLE(wxNO_BORDER);     XRC_ADD_STYLE(wxBORDER_NONE);
-
-    XRC_ADD_STYLE(wxTRANSPARENT_WINDOW);
-    XRC_ADD_STYLE(wxWANTS_CHARS);
-    XRC_ADD_STYLE(wxTAB_TRAVERSAL);
-    XRC_ADD_STYLE(wxNO_FULL_REPAINT_ON_RESIZE);
-    XRC_ADD_STYLE(wxFULL_REPAINT_ON_RESIZE);
-    XRC_ADD_STYLE(wxALWAYS_SHOW_SB);
-    XRC_ADD_STYLE(wxWS_EX_BLOCK_EVENTS);
-    XRC_ADD_STYLE(wxWS_EX_VALIDATE_RECURSIVELY);
-}
-
-
-
-bool wxXmlResourceHandler::HasParam(const wxString& param)
+bool wxXmlResourceHandlerImpl::HasParam(const wxString& param)
 {
     return (GetParamNode(param) != NULL);
 }
 
 
 {
     return (GetParamNode(param) != NULL);
 }
 
 
-int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults)
+int wxXmlResourceHandlerImpl::GetStyle(const wxString& param, int defaults)
 {
     wxString s = GetParamValue(param);
 
 {
     wxString s = GetParamValue(param);
 
@@ -1518,10 +1493,10 @@ int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults)
     while (tkn.HasMoreTokens())
     {
         fl = tkn.GetNextToken();
     while (tkn.HasMoreTokens())
     {
         fl = tkn.GetNextToken();
-        index = m_styleNames.Index(fl);
+        index = m_handler->m_styleNames.Index(fl);
         if (index != wxNOT_FOUND)
         {
         if (index != wxNOT_FOUND)
         {
-            style |= m_styleValues[index];
+            style |= m_handler->m_styleValues[index];
         }
         else
         {
         }
         else
         {
@@ -1537,19 +1512,19 @@ int wxXmlResourceHandler::GetStyle(const wxString& param, int defaults)
 
 
 
 
 
 
-wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
+wxString wxXmlResourceHandlerImpl::GetText(const wxString& param, bool translate)
 {
     wxXmlNode *parNode = GetParamNode(param);
     wxString str1(GetNodeContent(parNode));
     wxString str2;
 
     // "\\" wasn't translated to "\" prior to 2.5.3.0:
 {
     wxXmlNode *parNode = GetParamNode(param);
     wxString str1(GetNodeContent(parNode));
     wxString str2;
 
     // "\\" wasn't translated to "\" prior to 2.5.3.0:
-    const bool escapeBackslash = (m_resource->CompareVersion(2,5,3,0) >= 0);
+    const bool escapeBackslash = (m_handler->m_resource->CompareVersion(2,5,3,0) >= 0);
 
     // VS: First version of XRC resources used $ instead of & (which is
     //     illegal in XML), but later I realized that '_' fits this purpose
     //     much better (because &File means "File with F underlined").
 
     // VS: First version of XRC resources used $ instead of & (which is
     //     illegal in XML), but later I realized that '_' fits this purpose
     //     much better (because &File means "File with F underlined").
-    const wxChar amp_char = (m_resource->CompareVersion(2,3,0,1) < 0)
+    const wxChar amp_char = (m_handler->m_resource->CompareVersion(2,3,0,1) < 0)
                             ? '$' : '_';
 
     for ( wxString::const_iterator dt = str1.begin(); dt != str1.end(); ++dt )
                             ? '$' : '_';
 
     for ( wxString::const_iterator dt = str1.begin(); dt != str1.end(); ++dt )
@@ -1558,7 +1533,7 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
         // like "&File..." -- this is illegal in XML, so we use "_File..."):
         if ( *dt == amp_char )
         {
         // like "&File..." -- this is illegal in XML, so we use "_File..."):
         if ( *dt == amp_char )
         {
-            if ( *(++dt) == amp_char )
+            if ( dt+1 == str1.end() || *(++dt) == amp_char )
                 str2 << amp_char;
             else
                 str2 << wxT('&') << *dt;
                 str2 << amp_char;
             else
                 str2 << wxT('&') << *dt;
@@ -1600,12 +1575,12 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
         }
     }
 
         }
     }
 
-    if (m_resource->GetFlags() & wxXRC_USE_LOCALE)
+    if (m_handler->m_resource->GetFlags() & wxXRC_USE_LOCALE)
     {
         if (translate && parNode &&
             parNode->GetAttribute(wxT("translate"), wxEmptyString) != wxT("0"))
         {
     {
         if (translate && parNode &&
             parNode->GetAttribute(wxT("translate"), wxEmptyString) != wxT("0"))
         {
-            return wxGetTranslation(str2, m_resource->GetDomain());
+            return wxGetTranslation(str2, m_handler->m_resource->GetDomain());
         }
         else
         {
         }
         else
         {
@@ -1627,53 +1602,71 @@ wxString wxXmlResourceHandler::GetText(const wxString& param, bool translate)
 
 
 
 
 
 
-long wxXmlResourceHandler::GetLong(const wxString& param, long defaultv)
+long wxXmlResourceHandlerImpl::GetLong(const wxString& param, long defaultv)
 {
 {
-    long value;
+    long value = defaultv;
     wxString str1 = GetParamValue(param);
 
     wxString str1 = GetParamValue(param);
 
-    if (!str1.ToLong(&value))
-        value = defaultv;
+    if (!str1.empty())
+    {
+        if (!str1.ToLong(&value))
+        {
+            ReportParamError
+            (
+                param,
+                wxString::Format("invalid long specification \"%s\"", str1)
+            );
+        }
+    }
 
     return value;
 }
 
 
     return value;
 }
 
-float wxXmlResourceHandler::GetFloat(const wxString& param, float defaultv)
+float wxXmlResourceHandlerImpl::GetFloat(const wxString& param, float defaultv)
 {
     wxString str = GetParamValue(param);
 
     // strings in XRC always use C locale so make sure to use the
     // locale-independent wxString::ToCDouble() and not ToDouble() which uses
     // the current locale with a potentially different decimal point character
 {
     wxString str = GetParamValue(param);
 
     // strings in XRC always use C locale so make sure to use the
     // locale-independent wxString::ToCDouble() and not ToDouble() which uses
     // the current locale with a potentially different decimal point character
-    double value;
-    if (!str.ToCDouble(&value))
-        value = defaultv;
+    double value = defaultv;
+    if (!str.empty())
+    {
+        if (!str.ToCDouble(&value))
+        {
+            ReportParamError
+            (
+                param,
+                wxString::Format("invalid float specification \"%s\"", str)
+            );
+        }
+    }
 
     return wx_truncate_cast(float, value);
 }
 
 
 
     return wx_truncate_cast(float, value);
 }
 
 
-int wxXmlResourceHandler::GetID()
+int wxXmlResourceHandlerImpl::GetID()
 {
     return wxXmlResource::GetXRCID(GetName());
 }
 
 
 
 {
     return wxXmlResource::GetXRCID(GetName());
 }
 
 
 
-wxString wxXmlResourceHandler::GetName()
+wxString wxXmlResourceHandlerImpl::GetName()
 {
 {
-    return m_node->GetAttribute(wxT("name"), wxT("-1"));
+    return m_handler->m_node->GetAttribute(wxT("name"), wxT("-1"));
 }
 
 
 
 }
 
 
 
-bool wxXmlResourceHandler::GetBoolAttr(const wxString& attr, bool defaultv)
+bool wxXmlResourceHandlerImpl::GetBoolAttr(const wxString& attr, bool defaultv)
 {
     wxString v;
 {
     wxString v;
-    return m_node->GetAttribute(attr, &v) ? v == '1' : defaultv;
+    return m_handler->m_node->GetAttribute(attr, &v) ? v == '1' : defaultv;
 }
 
 }
 
-bool wxXmlResourceHandler::GetBool(const wxString& param, bool defaultv)
+bool wxXmlResourceHandlerImpl::GetBool(const wxString& param, bool defaultv)
 {
     const wxString v = GetParamValue(param);
 
 {
     const wxString v = GetParamValue(param);
 
@@ -1730,7 +1723,7 @@ static wxColour GetSystemColour(const wxString& name)
     return wxNullColour;
 }
 
     return wxNullColour;
 }
 
-wxColour wxXmlResourceHandler::GetColour(const wxString& param, const wxColour& defaultv)
+wxColour wxXmlResourceHandlerImpl::GetColour(const wxString& param, const wxColour& defaultv)
 {
     wxString v = GetParamValue(param);
 
 {
     wxString v = GetParamValue(param);
 
@@ -1790,7 +1783,7 @@ bool GetStockArtAttrs(const wxXmlNode *paramNode,
 
 } // anonymous namespace
 
 
 } // anonymous namespace
 
-wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
+wxBitmap wxXmlResourceHandlerImpl::GetBitmap(const wxString& param,
                                          const wxArtClient& defaultArtClient,
                                          wxSize size)
 {
                                          const wxArtClient& defaultArtClient,
                                          wxSize size)
 {
@@ -1811,7 +1804,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxString& param,
     return GetBitmap(node, defaultArtClient, size);
 }
 
     return GetBitmap(node, defaultArtClient, size);
 }
 
-wxBitmap wxXmlResourceHandler::GetBitmap(const wxXmlNode* node,
+wxBitmap wxXmlResourceHandlerImpl::GetBitmap(const wxXmlNode* node,
                                          const wxArtClient& defaultArtClient,
                                          wxSize size)
 {
                                          const wxArtClient& defaultArtClient,
                                          wxSize size)
 {
@@ -1861,7 +1854,7 @@ wxBitmap wxXmlResourceHandler::GetBitmap(const wxXmlNode* node,
 }
 
 
 }
 
 
-wxIcon wxXmlResourceHandler::GetIcon(const wxString& param,
+wxIcon wxXmlResourceHandlerImpl::GetIcon(const wxString& param,
                                      const wxArtClient& defaultArtClient,
                                      wxSize size)
 {
                                      const wxArtClient& defaultArtClient,
                                      wxSize size)
 {
@@ -1879,7 +1872,7 @@ wxIcon wxXmlResourceHandler::GetIcon(const wxString& param,
     return GetIcon(node, defaultArtClient, size);
 }
 
     return GetIcon(node, defaultArtClient, size);
 }
 
-wxIcon wxXmlResourceHandler::GetIcon(const wxXmlNode* node,
+wxIcon wxXmlResourceHandlerImpl::GetIcon(const wxXmlNode* node,
                                      const wxArtClient& defaultArtClient,
                                      wxSize size)
 {
                                      const wxArtClient& defaultArtClient,
                                      wxSize size)
 {
@@ -1889,7 +1882,7 @@ wxIcon wxXmlResourceHandler::GetIcon(const wxXmlNode* node,
 }
 
 
 }
 
 
-wxIconBundle wxXmlResourceHandler::GetIconBundle(const wxString& param,
+wxIconBundle wxXmlResourceHandlerImpl::GetIconBundle(const wxString& param,
                                                  const wxArtClient& defaultArtClient)
 {
     wxString art_id, art_client;
                                                  const wxArtClient& defaultArtClient)
 {
     wxString art_id, art_client;
@@ -1937,14 +1930,14 @@ wxIconBundle wxXmlResourceHandler::GetIconBundle(const wxString& param,
 }
 
 
 }
 
 
-wxImageList *wxXmlResourceHandler::GetImageList(const wxString& param)
+wxImageList *wxXmlResourceHandlerImpl::GetImageList(const wxString& param)
 {
     wxXmlNode * const imagelist_node = GetParamNode(param);
     if ( !imagelist_node )
         return NULL;
 
 {
     wxXmlNode * const imagelist_node = GetParamNode(param);
     if ( !imagelist_node )
         return NULL;
 
-    wxXmlNode * const oldnode = m_node;
-    m_node = imagelist_node;
+    wxXmlNode * const oldnode = m_handler->m_node;
+    m_handler->m_node = imagelist_node;
 
     // Get the size if we have it, otherwise we will use the size of the first
     // list element.
 
     // Get the size if we have it, otherwise we will use the size of the first
     // list element.
@@ -1956,7 +1949,7 @@ wxImageList *wxXmlResourceHandler::GetImageList(const wxString& param)
     wxString parambitmap = wxT("bitmap");
     if ( HasParam(parambitmap) )
     {
     wxString parambitmap = wxT("bitmap");
     if ( HasParam(parambitmap) )
     {
-        wxXmlNode *n = m_node->GetChildren();
+        wxXmlNode *n = m_handler->m_node->GetChildren();
         while (n)
         {
             if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == parambitmap)
         while (n)
         {
             if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == parambitmap)
@@ -1981,15 +1974,15 @@ wxImageList *wxXmlResourceHandler::GetImageList(const wxString& param)
         }
     }
 
         }
     }
 
-    m_node = oldnode;
+    m_handler->m_node = oldnode;
     return imagelist;
 }
 
     return imagelist;
 }
 
-wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param)
+wxXmlNode *wxXmlResourceHandlerImpl::GetParamNode(const wxString& param)
 {
 {
-    wxCHECK_MSG(m_node, NULL, wxT("You can't access handler data before it was initialized!"));
+    wxCHECK_MSG(m_handler->m_node, NULL, wxT("You can't access handler data before it was initialized!"));
 
 
-    wxXmlNode *n = m_node->GetChildren();
+    wxXmlNode *n = m_handler->m_node->GetChildren();
 
     while (n)
     {
 
     while (n)
     {
@@ -2008,15 +2001,14 @@ wxXmlNode *wxXmlResourceHandler::GetParamNode(const wxString& param)
     return NULL;
 }
 
     return NULL;
 }
 
-/* static */
-bool wxXmlResourceHandler::IsOfClass(wxXmlNode *node, const wxString& classname)
+bool wxXmlResourceHandlerImpl::IsOfClass(wxXmlNode *node, const wxString& classname) const
 {
     return node->GetAttribute(wxT("class")) == classname;
 }
 
 
 
 {
     return node->GetAttribute(wxT("class")) == classname;
 }
 
 
 
-wxString wxXmlResourceHandler::GetNodeContent(const wxXmlNode *node)
+wxString wxXmlResourceHandlerImpl::GetNodeContent(const wxXmlNode *node)
 {
     const wxXmlNode *n = node;
     if (n == NULL) return wxEmptyString;
 {
     const wxXmlNode *n = node;
     if (n == NULL) return wxEmptyString;
@@ -2034,21 +2026,21 @@ wxString wxXmlResourceHandler::GetNodeContent(const wxXmlNode *node)
 
 
 
 
 
 
-wxString wxXmlResourceHandler::GetParamValue(const wxString& param)
+wxString wxXmlResourceHandlerImpl::GetParamValue(const wxString& param)
 {
     if (param.empty())
 {
     if (param.empty())
-        return GetNodeContent(m_node);
+        return GetNodeContent(m_handler->m_node);
     else
         return GetNodeContent(GetParamNode(param));
 }
 
     else
         return GetNodeContent(GetParamNode(param));
 }
 
-wxString wxXmlResourceHandler::GetParamValue(const wxXmlNode* node)
+wxString wxXmlResourceHandlerImpl::GetParamValue(const wxXmlNode* node)
 {
     return GetNodeContent(node);
 }
 
 
 {
     return GetNodeContent(node);
 }
 
 
-wxSize wxXmlResourceHandler::GetSize(const wxString& param,
+wxSize wxXmlResourceHandlerImpl::GetSize(const wxString& param,
                                      wxWindow *windowToUse)
 {
     wxString s = GetParamValue(param);
                                      wxWindow *windowToUse)
 {
     wxString s = GetParamValue(param);
@@ -2076,9 +2068,9 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param,
         {
             return wxDLG_UNIT(windowToUse, wxSize(sx, sy));
         }
         {
             return wxDLG_UNIT(windowToUse, wxSize(sx, sy));
         }
-        else if (m_parentAsWindow)
+        else if (m_handler->m_parentAsWindow)
         {
         {
-            return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, sy));
+            return wxDLG_UNIT(m_handler->m_parentAsWindow, wxSize(sx, sy));
         }
         else
         {
         }
         else
         {
@@ -2096,7 +2088,7 @@ wxSize wxXmlResourceHandler::GetSize(const wxString& param,
 
 
 
 
 
 
-wxPoint wxXmlResourceHandler::GetPosition(const wxString& param)
+wxPoint wxXmlResourceHandlerImpl::GetPosition(const wxString& param)
 {
     wxSize sz = GetSize(param);
     return wxPoint(sz.x, sz.y);
 {
     wxSize sz = GetSize(param);
     return wxPoint(sz.x, sz.y);
@@ -2104,7 +2096,7 @@ wxPoint wxXmlResourceHandler::GetPosition(const wxString& param)
 
 
 
 
 
 
-wxCoord wxXmlResourceHandler::GetDimension(const wxString& param,
+wxCoord wxXmlResourceHandlerImpl::GetDimension(const wxString& param,
                                            wxCoord defaultv,
                                            wxWindow *windowToUse)
 {
                                            wxCoord defaultv,
                                            wxWindow *windowToUse)
 {
@@ -2132,9 +2124,9 @@ wxCoord wxXmlResourceHandler::GetDimension(const wxString& param,
         {
             return wxDLG_UNIT(windowToUse, wxSize(sx, 0)).x;
         }
         {
             return wxDLG_UNIT(windowToUse, wxSize(sx, 0)).x;
         }
-        else if (m_parentAsWindow)
+        else if (m_handler->m_parentAsWindow)
         {
         {
-            return wxDLG_UNIT(m_parentAsWindow, wxSize(sx, 0)).x;
+            return wxDLG_UNIT(m_handler->m_parentAsWindow, wxSize(sx, 0)).x;
         }
         else
         {
         }
         else
         {
@@ -2151,7 +2143,7 @@ wxCoord wxXmlResourceHandler::GetDimension(const wxString& param,
 }
 
 wxDirection
 }
 
 wxDirection
-wxXmlResourceHandler::GetDirection(const wxString& param, wxDirection dirDefault)
+wxXmlResourceHandlerImpl::GetDirection(const wxString& param, wxDirection dirDefault)
 {
     wxDirection dir;
 
 {
     wxDirection dir;
 
@@ -2205,7 +2197,7 @@ static wxFont GetSystemFont(const wxString& name)
     return wxNullFont;
 }
 
     return wxNullFont;
 }
 
-wxFont wxXmlResourceHandler::GetFont(const wxString& param)
+wxFont wxXmlResourceHandlerImpl::GetFont(const wxString& param, wxWindow* parent)
 {
     wxXmlNode *font_node = GetParamNode(param);
     if (font_node == NULL)
 {
     wxXmlNode *font_node = GetParamNode(param);
     if (font_node == NULL)
@@ -2215,8 +2207,8 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
         return wxNullFont;
     }
 
         return wxNullFont;
     }
 
-    wxXmlNode *oldnode = m_node;
-    m_node = font_node;
+    wxXmlNode *oldnode = m_handler->m_node;
+    m_handler->m_node = font_node;
 
     // font attributes:
 
 
     // font attributes:
 
@@ -2236,6 +2228,14 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
             istyle = wxITALIC;
         else if (style == wxT("slant"))
             istyle = wxSLANT;
             istyle = wxITALIC;
         else if (style == wxT("slant"))
             istyle = wxSLANT;
+        else if (style != wxT("normal"))
+        {
+            ReportParamError
+            (
+                param,
+                wxString::Format("unknown font style \"%s\"", style)
+            );
+        }
     }
 
     // weight
     }
 
     // weight
@@ -2248,6 +2248,14 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
             iweight = wxBOLD;
         else if (weight == wxT("light"))
             iweight = wxLIGHT;
             iweight = wxBOLD;
         else if (weight == wxT("light"))
             iweight = wxLIGHT;
+        else if (weight != wxT("normal"))
+        {
+            ReportParamError
+            (
+                param,
+                wxString::Format("unknown font weight \"%s\"", weight)
+            );
+        }
     }
 
     // underline
     }
 
     // underline
@@ -2266,6 +2274,14 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
         else if (family == wxT("swiss")) ifamily = wxSWISS;
         else if (family == wxT("modern")) ifamily = wxMODERN;
         else if (family == wxT("teletype")) ifamily = wxTELETYPE;
         else if (family == wxT("swiss")) ifamily = wxSWISS;
         else if (family == wxT("modern")) ifamily = wxMODERN;
         else if (family == wxT("teletype")) ifamily = wxTELETYPE;
+        else
+        {
+            ReportParamError
+            (
+                param,
+                wxString::Format("unknown font family \"%s\"", family)
+            );
+        }
     }
 
 
     }
 
 
@@ -2308,13 +2324,50 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
     }
 #endif // wxUSE_FONTMAP
 
     }
 #endif // wxUSE_FONTMAP
 
+    wxFont font;
+
     // is this font based on a system font?
     // is this font based on a system font?
-    wxFont font = GetSystemFont(GetParamValue(wxT("sysfont")));
+    if (HasParam(wxT("sysfont")))
+    {
+        font = GetSystemFont(GetParamValue(wxT("sysfont")));
+        if (HasParam(wxT("inherit")))
+        {
+            ReportParamError
+            (
+                param,
+                "double specification of \"sysfont\" and \"inherit\""
+            );
+        }
+    }
+    // or should the font of the widget be used?
+    else if (GetBool(wxT("inherit"), false))
+    {
+        if (parent)
+            font = parent->GetFont();
+        else
+        {
+            ReportParamError
+            (
+                param,
+                "no parent window specified to derive the font from"
+            );
+        }
+    }
 
     if (font.IsOk())
     {
         if (hasSize && isize != -1)
 
     if (font.IsOk())
     {
         if (hasSize && isize != -1)
+        {
             font.SetPointSize(isize);
             font.SetPointSize(isize);
+            if (HasParam(wxT("relativesize")))
+            {
+                ReportParamError
+                (
+                    param,
+                    "double specification of \"size\" and \"relativesize\""
+                );
+            }
+        }
         else if (HasParam(wxT("relativesize")))
             font.SetPointSize(int(font.GetPointSize() *
                                      GetFloat(wxT("relativesize"))));
         else if (HasParam(wxT("relativesize")))
             font.SetPointSize(int(font.GetPointSize() *
                                      GetFloat(wxT("relativesize"))));
@@ -2339,12 +2392,12 @@ wxFont wxXmlResourceHandler::GetFont(const wxString& param)
                       underlined, facename, enc);
     }
 
                       underlined, facename, enc);
     }
 
-    m_node = oldnode;
+    m_handler->m_node = oldnode;
     return font;
 }
 
 
     return font;
 }
 
 
-void wxXmlResourceHandler::SetupWindow(wxWindow *wnd)
+void wxXmlResourceHandlerImpl::SetupWindow(wxWindow *wnd)
 {
     //FIXME : add cursor
 
 {
     //FIXME : add cursor
 
@@ -2372,36 +2425,36 @@ void wxXmlResourceHandler::SetupWindow(wxWindow *wnd)
         wnd->SetToolTip(GetText(wxT("tooltip")));
 #endif
     if (HasParam(wxT("font")))
         wnd->SetToolTip(GetText(wxT("tooltip")));
 #endif
     if (HasParam(wxT("font")))
-        wnd->SetFont(GetFont(wxT("font")));
+        wnd->SetFont(GetFont(wxT("font"), wnd));
     if (HasParam(wxT("ownfont")))
     if (HasParam(wxT("ownfont")))
-        wnd->SetOwnFont(GetFont(wxT("ownfont")));
+        wnd->SetOwnFont(GetFont(wxT("ownfont"), wnd));
     if (HasParam(wxT("help")))
         wnd->SetHelpText(GetText(wxT("help")));
 }
 
 
     if (HasParam(wxT("help")))
         wnd->SetHelpText(GetText(wxT("help")));
 }
 
 
-void wxXmlResourceHandler::CreateChildren(wxObject *parent, bool this_hnd_only)
+void wxXmlResourceHandlerImpl::CreateChildren(wxObject *parent, bool this_hnd_only)
 {
 {
-    for ( wxXmlNode *n = m_node->GetChildren(); n; n = n->GetNext() )
+    for ( wxXmlNode *n = m_handler->m_node->GetChildren(); n; n = n->GetNext() )
     {
         if ( IsObjectNode(n) )
         {
     {
         if ( IsObjectNode(n) )
         {
-            m_resource->DoCreateResFromNode(*n, parent, NULL,
-                                            this_hnd_only ? this : NULL);
-        }
+            m_handler->m_resource->DoCreateResFromNode(*n, parent, NULL,
+                                            this_hnd_only ? this->GetHandler() : NULL);
+       }
     }
 }
 
 
     }
 }
 
 
-void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode)
+void wxXmlResourceHandlerImpl::CreateChildrenPrivately(wxObject *parent, wxXmlNode *rootnode)
 {
     wxXmlNode *root;
 {
     wxXmlNode *root;
-    if (rootnode == NULL) root = m_node; else root = rootnode;
+    if (rootnode == NULL) root = m_handler->m_node; else root = rootnode;
     wxXmlNode *n = root->GetChildren();
 
     while (n)
     {
     wxXmlNode *n = root->GetChildren();
 
     while (n)
     {
-        if (n->GetType() == wxXML_ELEMENT_NODE && CanHandle(n))
+        if (n->GetType() == wxXML_ELEMENT_NODE && GetHandler()->CanHandle(n))
         {
             CreateResource(n, parent, NULL);
         }
         {
             CreateResource(n, parent, NULL);
         }
@@ -2414,21 +2467,21 @@ void wxXmlResourceHandler::CreateChildrenPrivately(wxObject *parent, wxXmlNode *
 // errors reporting
 //-----------------------------------------------------------------------------
 
 // errors reporting
 //-----------------------------------------------------------------------------
 
-void wxXmlResourceHandler::ReportError(const wxString& message)
+void wxXmlResourceHandlerImpl::ReportError(const wxString& message)
 {
 {
-    m_resource->ReportError(m_node, message);
+    m_handler->m_resource->ReportError(m_handler->m_node, message);
 }
 
 }
 
-void wxXmlResourceHandler::ReportError(wxXmlNode *context,
+void wxXmlResourceHandlerImpl::ReportError(wxXmlNode *context,
                                        const wxString& message)
 {
                                        const wxString& message)
 {
-    m_resource->ReportError(context ? context : m_node, message);
+    m_handler->m_resource->ReportError(context ? context : m_handler->m_node, message);
 }
 
 }
 
-void wxXmlResourceHandler::ReportParamError(const wxString& param,
+void wxXmlResourceHandlerImpl::ReportParamError(const wxString& param,
                                             const wxString& message)
 {
                                             const wxString& message)
 {
-    m_resource->ReportError(GetParamNode(param), message);
+    m_handler->m_resource->ReportError(GetParamNode(param), message);
 }
 
 void wxXmlResource::ReportError(const wxXmlNode *context, const wxString& message)
 }
 
 void wxXmlResource::ReportError(const wxXmlNode *context, const wxString& message)
@@ -2495,6 +2548,31 @@ static inline unsigned XRCIdHash(const char *str_id)
     return index;
 }
 
     return index;
 }
 
+static void XRCID_Assign(const wxString& str_id, int value)
+{
+    const wxCharBuffer buf_id(str_id.mb_str());
+    const unsigned index = XRCIdHash(buf_id);
+
+
+    XRCID_record *oldrec = NULL;
+    for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next)
+    {
+        if (wxStrcmp(rec->key, buf_id) == 0)
+        {
+            rec->id = value;
+            return;
+        }
+        oldrec = rec;
+    }
+
+    XRCID_record **rec_var = (oldrec == NULL) ?
+                              &XRCID_Records[index] : &oldrec->next;
+    *rec_var = new XRCID_record;
+    (*rec_var)->key = wxStrdup(str_id);
+    (*rec_var)->id = value;
+    (*rec_var)->next = NULL;
+}
+
 static int XRCID_Lookup(const char *str_id, int value_if_not_found = wxID_NONE)
 {
     const unsigned index = XRCIdHash(str_id);
 static int XRCID_Lookup(const char *str_id, int value_if_not_found = wxID_NONE)
 {
     const unsigned index = XRCIdHash(str_id);
@@ -2566,11 +2644,14 @@ void AddStdXRCID_Records()
     stdID(wxID_PREVIEW);
     stdID(wxID_ABOUT);
     stdID(wxID_HELP_CONTENTS);
     stdID(wxID_PREVIEW);
     stdID(wxID_ABOUT);
     stdID(wxID_HELP_CONTENTS);
+    stdID(wxID_HELP_INDEX),
+    stdID(wxID_HELP_SEARCH),
     stdID(wxID_HELP_COMMANDS);
     stdID(wxID_HELP_PROCEDURES);
     stdID(wxID_HELP_CONTEXT);
     stdID(wxID_CLOSE_ALL);
     stdID(wxID_PREFERENCES);
     stdID(wxID_HELP_COMMANDS);
     stdID(wxID_HELP_PROCEDURES);
     stdID(wxID_HELP_CONTEXT);
     stdID(wxID_CLOSE_ALL);
     stdID(wxID_PREFERENCES);
+
     stdID(wxID_EDIT);
     stdID(wxID_CUT);
     stdID(wxID_COPY);
     stdID(wxID_EDIT);
     stdID(wxID_CUT);
     stdID(wxID_COPY);
@@ -2583,6 +2664,7 @@ void AddStdXRCID_Records()
     stdID(wxID_REPLACE);
     stdID(wxID_REPLACE_ALL);
     stdID(wxID_PROPERTIES);
     stdID(wxID_REPLACE);
     stdID(wxID_REPLACE_ALL);
     stdID(wxID_PROPERTIES);
+
     stdID(wxID_VIEW_DETAILS);
     stdID(wxID_VIEW_LARGEICONS);
     stdID(wxID_VIEW_SMALLICONS);
     stdID(wxID_VIEW_DETAILS);
     stdID(wxID_VIEW_LARGEICONS);
     stdID(wxID_VIEW_SMALLICONS);
@@ -2591,6 +2673,8 @@ void AddStdXRCID_Records()
     stdID(wxID_VIEW_SORTNAME);
     stdID(wxID_VIEW_SORTSIZE);
     stdID(wxID_VIEW_SORTTYPE);
     stdID(wxID_VIEW_SORTNAME);
     stdID(wxID_VIEW_SORTSIZE);
     stdID(wxID_VIEW_SORTTYPE);
+
+
     stdID(wxID_FILE1);
     stdID(wxID_FILE2);
     stdID(wxID_FILE3);
     stdID(wxID_FILE1);
     stdID(wxID_FILE2);
     stdID(wxID_FILE3);
@@ -2600,6 +2684,8 @@ void AddStdXRCID_Records()
     stdID(wxID_FILE7);
     stdID(wxID_FILE8);
     stdID(wxID_FILE9);
     stdID(wxID_FILE7);
     stdID(wxID_FILE8);
     stdID(wxID_FILE9);
+
+
     stdID(wxID_OK);
     stdID(wxID_CANCEL);
     stdID(wxID_APPLY);
     stdID(wxID_OK);
     stdID(wxID_CANCEL);
     stdID(wxID_APPLY);
@@ -2620,12 +2706,14 @@ void AddStdXRCID_Records()
     stdID(wxID_IGNORE);
     stdID(wxID_ADD);
     stdID(wxID_REMOVE);
     stdID(wxID_IGNORE);
     stdID(wxID_ADD);
     stdID(wxID_REMOVE);
+
     stdID(wxID_UP);
     stdID(wxID_DOWN);
     stdID(wxID_HOME);
     stdID(wxID_REFRESH);
     stdID(wxID_STOP);
     stdID(wxID_INDEX);
     stdID(wxID_UP);
     stdID(wxID_DOWN);
     stdID(wxID_HOME);
     stdID(wxID_REFRESH);
     stdID(wxID_STOP);
     stdID(wxID_INDEX);
+
     stdID(wxID_BOLD);
     stdID(wxID_ITALIC);
     stdID(wxID_JUSTIFY_CENTER);
     stdID(wxID_BOLD);
     stdID(wxID_ITALIC);
     stdID(wxID_JUSTIFY_CENTER);
@@ -2641,13 +2729,6 @@ void AddStdXRCID_Records()
     stdID(wxID_ZOOM_OUT);
     stdID(wxID_UNDELETE);
     stdID(wxID_REVERT_TO_SAVED);
     stdID(wxID_ZOOM_OUT);
     stdID(wxID_UNDELETE);
     stdID(wxID_REVERT_TO_SAVED);
-    stdID(wxID_SYSTEM_MENU);
-    stdID(wxID_CLOSE_FRAME);
-    stdID(wxID_MOVE_FRAME);
-    stdID(wxID_RESIZE_FRAME);
-    stdID(wxID_MAXIMIZE_FRAME);
-    stdID(wxID_ICONIZE_FRAME);
-    stdID(wxID_RESTORE_FRAME);
     stdID(wxID_CDROM);
     stdID(wxID_CONVERT);
     stdID(wxID_EXECUTE);
     stdID(wxID_CDROM);
     stdID(wxID_CONVERT);
     stdID(wxID_EXECUTE);
@@ -2667,6 +2748,23 @@ void AddStdXRCID_Records()
     stdID(wxID_SPELL_CHECK);
     stdID(wxID_STRIKETHROUGH);
 
     stdID(wxID_SPELL_CHECK);
     stdID(wxID_STRIKETHROUGH);
 
+
+    stdID(wxID_SYSTEM_MENU);
+    stdID(wxID_CLOSE_FRAME);
+    stdID(wxID_MOVE_FRAME);
+    stdID(wxID_RESIZE_FRAME);
+    stdID(wxID_MAXIMIZE_FRAME);
+    stdID(wxID_ICONIZE_FRAME);
+    stdID(wxID_RESTORE_FRAME);
+
+
+
+    stdID(wxID_MDI_WINDOW_CASCADE);
+    stdID(wxID_MDI_WINDOW_TILE_HORZ);
+    stdID(wxID_MDI_WINDOW_TILE_VERT);
+    stdID(wxID_MDI_WINDOW_ARRANGE_ICONS);
+    stdID(wxID_MDI_WINDOW_PREV);
+    stdID(wxID_MDI_WINDOW_NEXT);
 #undef stdID
 }
 
 #undef stdID
 }
 
@@ -2700,30 +2798,6 @@ wxString wxXmlResource::FindXRCIDById(int numId)
     return wxString();
 }
 
     return wxString();
 }
 
-/* static */
-void wxIdRangeManager::RemoveXRCIDEntry(const wxString& idstr)
-{
-    const char *str_id = idstr.mb_str();
-
-    const unsigned index = XRCIdHash(str_id);
-
-    XRCID_record **p_previousrec = &XRCID_Records[index];
-    for (XRCID_record *rec = XRCID_Records[index]; rec; rec = rec->next)
-    {
-        if (wxStrcmp(rec->key, str_id) == 0)
-        {
-            // Found the item to be removed so delete its record; but first
-            // remove it from the linked list.
-            *p_previousrec = rec->next;
-            free(rec->key);
-            delete rec;
-            return;
-        }
-
-        p_previousrec = &rec->next;
-    }
-}
-
 static void CleanXRCID_Record(XRCID_record *rec)
 {
     if (rec)
 static void CleanXRCID_Record(XRCID_record *rec)
 {
     if (rec)
@@ -2797,8 +2871,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxXmlResourceModule, wxModule)
 void wxXmlInitResourceModule()
 {
     wxModule* module = new wxXmlResourceModule;
 void wxXmlInitResourceModule()
 {
     wxModule* module = new wxXmlResourceModule;
-    module->Init();
     wxModule::RegisterModule(module);
     wxModule::RegisterModule(module);
+    wxModule::InitializeModules();
 }
 
 #endif // wxUSE_XRC
 }
 
 #endif // wxUSE_XRC