+wxXmlNode *wxXmlResource::DoFindResource(wxXmlNode *parent,
+ const wxString& name,
+ const wxString& classname,
+ bool recursive)
+{
+ wxString dummy;
+ wxXmlNode *node;
+
+ // first search for match at the top-level nodes (as this is
+ // where the resource is most commonly looked for):
+ for (node = parent->GetChildren(); node; node = node->GetNext())
+ {
+ if ( node->GetType() == wxXML_ELEMENT_NODE &&
+ (node->GetName() == wxT("object") ||
+ node->GetName() == wxT("object_ref")) &&
+ node->GetPropVal(wxT("name"), &dummy) && dummy == name )
+ {
+ wxString cls(node->GetPropVal(wxT("class"), wxEmptyString));
+ if (!classname || cls == classname)
+ return node;
+ // object_ref may not have 'class' property:
+ if (cls.empty() && node->GetName() == wxT("object_ref"))
+ {
+ wxString refName = node->GetPropVal(wxT("ref"), wxEmptyString);
+ if (refName.empty())
+ continue;
+ wxXmlNode* refNode = FindResource(refName, wxEmptyString, TRUE);
+ if (refNode &&
+ refNode->GetPropVal(wxT("class"), wxEmptyString) == classname)
+ {
+ return node;
+ }
+ }
+ }
+ }
+
+ if ( recursive )
+ for (node = parent->GetChildren(); node; node = node->GetNext())
+ {
+ if ( node->GetType() == wxXML_ELEMENT_NODE &&
+ (node->GetName() == wxT("object") ||
+ node->GetName() == wxT("object_ref")) )
+ {
+ wxXmlNode* found = DoFindResource(node, name, classname, TRUE);
+ if ( found )
+ return found;
+ }
+ }
+
+ return NULL;
+}