]> git.saurik.com Git - wxWidgets.git/blobdiff - src/xrc/xmlres.cpp
Italian translation corrections from Roberto Boriotti.
[wxWidgets.git] / src / xrc / xmlres.cpp
index f48bfe7faeefaadbf71384f2faab6f19d15817f0..0afbbcb58861528a2839163a5fad5d8b5e3d7cb3 100644 (file)
@@ -73,6 +73,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 +156,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,
@@ -1216,13 +1217,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 +1228,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()));
@@ -2495,6 +2491,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);
@@ -2700,30 +2721,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)