]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/utils/wxrcedit/xmlhelpr.cpp
corrected version number extraction
[wxWidgets.git] / contrib / utils / wxrcedit / xmlhelpr.cpp
index c920dad77cda6482ecd8207ff9ed68162433e438..a8fa0886af253da04529c30efcc6ca48a776df9a 100644 (file)
 
 #include "wx/xml/xml.h"
 #include "wx/wx.h"
+#include "wx/tokenzr.h"
 #include "xmlhelpr.h"
 
 
 
-wxXmlNode *XmlFindNode(wxXmlNode *parent, const wxString& param)
+wxXmlNode *XmlFindNodeSimple(wxXmlNode *parent, const wxString& param)
 {
+    if (param.IsEmpty()) return parent;
+
     wxXmlNode *n = parent->GetChildren();
-    
+
     while (n)
     {
         if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == param)
@@ -37,21 +40,57 @@ wxXmlNode *XmlFindNode(wxXmlNode *parent, const wxString& param)
 }
 
 
-void XmlWriteValue(wxXmlNode *parent, const wxString& name, const wxString& value)
+
+wxXmlNode *XmlFindNode(wxXmlNode *parent, const wxString& path)
 {
-    wxXmlNode *n = XmlFindNode(parent, name);
-    if (n == NULL) 
+    wxXmlNode *n = parent;
+    wxStringTokenizer tkn(path, _T("/"));
+    while (tkn.HasMoreTokens())
+    {
+        n = XmlFindNodeSimple(n, tkn.GetNextToken());
+        if (n == NULL) break;
+    }
+    return n;
+}
+
+
+
+wxXmlNode *XmlCreateNode(wxXmlNode *parent, const wxString& name)
+{
+    wxXmlNode *n;
+    wxString nm;
+
+    wxStringTokenizer tkn(name, _T("/"));
+    n = parent;
+    while (tkn.HasMoreTokens())
     {
-        n = new wxXmlNode(wxXML_ELEMENT_NODE, name);
+        parent = n;
+        nm = tkn.GetNextToken();
+        n = XmlFindNodeSimple(parent, nm);
+        if (n) continue;
+
+        // n == NULL:
+        n = new wxXmlNode(wxXML_ELEMENT_NODE, nm);
         parent->AddChild(n);
-        n->AddChild(new wxXmlNode(wxXML_TEXT_NODE, ""));
     }
-    
+    n->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString));
+
+    return n;
+}
+
+
+
+void XmlWriteValue(wxXmlNode *parent, const wxString& name, const wxString& value)
+{
+    wxXmlNode *n = XmlFindNode(parent, name);
+    if (n == NULL)
+        n = XmlCreateNode(parent, name);
+
     n = n->GetChildren();
-    
+
     while (n)
     {
-        if (n->GetType() == wxXML_TEXT_NODE || 
+        if (n->GetType() == wxXML_TEXT_NODE ||
             n->GetType() == wxXML_CDATA_SECTION_NODE)
         {
             n->SetContent(value);
@@ -68,10 +107,10 @@ wxString XmlReadValue(wxXmlNode *parent, const wxString& name)
     wxXmlNode *n = XmlFindNode(parent, name);
     if (n == NULL) return wxEmptyString;
     n = n->GetChildren();
-    
+
     while (n)
     {
-        if (n->GetType() == wxXML_TEXT_NODE || 
+        if (n->GetType() == wxXML_TEXT_NODE ||
             n->GetType() == wxXML_CDATA_SECTION_NODE)
             return n->GetContent();
         n = n->GetNext();