} // 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:
// this is a class so that it can be forward-declared
};
-WX_DECLARE_HASH_SET(int, wxIntegerHash, wxIntegerEqual, wxHashSetInt);
+WX_DECLARE_HASH_SET_PTR(int, ::wxIntegerHash, ::wxIntegerEqual, wxHashSetInt);
class wxIdRange // Holds data for a particular rangename
{
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,
// 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,
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()));
// 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;
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);
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)