diff --git a/src/xrc/xmlres.cpp b/src/xrc/xmlres.cpp index 090d7da5f2..e9942ba285 100644 --- a/src/xrc/xmlres.cpp +++ b/src/xrc/xmlres.cpp @@ -844,14 +844,31 @@ wxObject *wxXmlResource::CreateResFromNode(wxXmlNode *node, wxObject *parent, return NULL; } - wxXmlNode copy(*refNode); - MergeNodesOver(copy, *node, GetFileNameFromNode(node, Data())); + if ( !node->GetChildren() ) + { + // In the typical, simple case, is used to link + // to another node and doesn't have any content of its own that + // would overwrite linked object's properties. In this case, + // we can simply create the resource from linked node. - // remember referenced object's file, see GetFileNameFromNode() - copy.AddAttribute(ATTR_INPUT_FILENAME, - GetFileNameFromNode(refNode, Data())); + return CreateResFromNode(refNode, parent, instance); + } + else + { + // In the more complicated (but rare) case, has + // subnodes that partially overwrite content of the referenced + // object. In this case, we need to merge both XML trees and + // load the resource from result of the merge. - return CreateResFromNode(©, parent, instance); + wxXmlNode copy(*refNode); + MergeNodesOver(copy, *node, GetFileNameFromNode(node, Data())); + + // remember referenced object's file, see GetFileNameFromNode() + copy.AddAttribute(ATTR_INPUT_FILENAME, + GetFileNameFromNode(refNode, Data())); + + return CreateResFromNode(©, parent, instance); + } } if (handlerToUse)