\r
#include <string>\r
#include <algorithm> // for std::transform\r
+#include <vector>\r
\r
bool isElementNode(xmlNodePtr theNode)\r
{\r
return false;\r
// it's parent is "feature" or "source" or page ("case" or "box")\r
if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, \r
+ WDG_GROUP, WDG_CHECK_GROUP,\r
WDG_TOOLBOX_BOX, WDG_SWITCH_CASE, NULL))\r
return false;\r
\r
//it should not be a "source" or a "validator" node\r
bool isLogical = isNode(theNode, NODE_SOURCE, NODE_VALIDATOR, NODE_SELFILTER, NULL);\r
bool isPagedContainer = isNode(theNode, WDG_TOOLBOX, WDG_TOOLBOX_BOX,\r
+ WDG_GROUP, WDG_CHECK_GROUP,\r
WDG_SWITCH, WDG_SWITCH_CASE, NULL);\r
return !isLogical && !isPagedContainer;\r
}\r
return false;\r
}\r
\r
+bool hasParentRecursive(xmlNodePtr theNode, const std::vector<const char*>& theNodeNames)\r
+{\r
+ if (!hasParent(theNode)) {\r
+ return false; // have no parents at all\r
+ }\r
+ xmlNodePtr aNode = theNode->parent;\r
+ const xmlChar* aName = aNode->name;\r
+ if (!aName || !isElementNode(aNode)) {\r
+ return false;\r
+ }\r
+ for (size_t anIndex = 0; anIndex < theNodeNames.size(); ++anIndex) {\r
+ if (!xmlStrcmp(aName, (const xmlChar *) theNodeNames[anIndex]))\r
+ return true;\r
+ }\r
+ return hasParentRecursive(aNode, theNodeNames);\r
+}\r
+\r
+bool hasParentRecursive(xmlNodePtr theNode, const char* theNodeName, ...)\r
+{\r
+ std::vector<const char*> aNodeNames;\r
+ va_list args; // define argument list variable\r
+ va_start(args, theNodeName); // init list; point to last defined argument\r
+ aNodeNames.push_back(theNodeName);\r
+ while (true) {\r
+ char *anArg = va_arg (args, char*); // get next argument\r
+ if (anArg == NULL)\r
+ break;\r
+ aNodeNames.push_back(anArg);\r
+ }\r
+ va_end(args); // cleanup the system stack\r
+ return hasParentRecursive(theNode, aNodeNames);\r
+}\r
+\r
bool getParametersInfo(xmlNodePtr theNode, std::string& outPropertyId,\r
std::list<std::string>& outValidatorParameters)\r
{\r
aMessage->setObligatory(getBooleanAttribute(theNode, ATTR_OBLIGATORY, true));
aMessage->setConcealment(getBooleanAttribute(theNode, ATTR_CONCEALMENT, false));
// nested "paged" widgets are not allowed, this issue may be resolved here:
- if (hasParent(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, NULL)) {
- const char* kWdgCase = hasParent(theNode, WDG_SWITCH_CASE, NULL)
+ if (hasParentRecursive(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, NULL)) {
+ const char* kWdgCase = hasParentRecursive(theNode, WDG_SWITCH_CASE, NULL)
? WDG_SWITCH_CASE
: WDG_TOOLBOX_BOX;
- const char* kWdgSwitch = hasParent(theNode, WDG_SWITCH_CASE, NULL)
+ const char* kWdgSwitch = hasParentRecursive(theNode, WDG_SWITCH_CASE, NULL)
? WDG_SWITCH
: WDG_TOOLBOX;
aMessage->setCaseId(restoreAttribute(kWdgCase, _ID));
bool result = isNode(theNode, NODE_WORKBENCH, NODE_GROUP, NULL);
if(!result && myIsProcessWidgets) {
result = isNode(theNode, NODE_FEATURE,
+ WDG_GROUP, WDG_CHECK_GROUP,
WDG_TOOLBOX, WDG_TOOLBOX_BOX,
WDG_SWITCH, WDG_SWITCH_CASE, NULL);
}