Salome HOME
Issue #1315 Middle point constraint problem
[modules/shaper.git] / src / Config / Config_Common.cpp
index 9c4df7f57c539174f1496979685e7d8b48c113e9..bb5ddeed9b001da3700fd3298a3e8eb7e1e79d4f 100644 (file)
@@ -17,6 +17,7 @@
 \r
 #include <string>\r
 #include <algorithm> // for std::transform\r
+#include <vector>\r
 \r
 bool isElementNode(xmlNodePtr theNode)\r
 {\r
@@ -27,7 +28,6 @@ bool isElementNode(xmlNodePtr theNode)
 \r
 bool isNode(xmlNodePtr theNode, const char* theNodeName, ...)\r
 {\r
-  bool result = false;\r
   const xmlChar* aName = theNode->name;\r
   if (!aName || !isElementNode(theNode)) {\r
     return false;\r
@@ -50,19 +50,46 @@ bool isNode(xmlNodePtr theNode, const char* theNodeName, ...)
   return false;\r
 }\r
 \r
+bool isAttributeNode(xmlNodePtr theNode)\r
+{\r
+  if(!isElementNode(theNode))\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
+\r
 bool isWidgetNode(xmlNodePtr theNode)\r
 {\r
   if(!isElementNode(theNode))\r
     return false;\r
-  // it's parent is "feature" or "source"\r
-  xmlNodePtr aParentNode = theNode->parent;\r
-  if(!isNode(aParentNode, NODE_FEATURE, NODE_SOURCE, NULL))\r
+  // it's parent is "feature" or "source" or a page ("box", "case")\r
+  if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, WDG_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
   return !isNode(theNode, NODE_SOURCE, NODE_VALIDATOR, NODE_SELFILTER, NULL);\r
 }\r
 \r
+// widget api?\r
+bool isCaseNode(xmlNodePtr theNode)\r
+{\r
+  if(!isElementNode(theNode))\r
+    return false;\r
+\r
+  return isNode(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, NULL);\r
+}\r
+\r
 bool hasChild(xmlNodePtr theNode)\r
 {\r
   xmlNodePtr aNode = theNode->children;\r
@@ -74,6 +101,81 @@ bool hasChild(xmlNodePtr theNode)
   return false;\r
 }\r
 \r
+bool hasParent(xmlNodePtr theNode)\r
+{\r
+  xmlNodePtr aNode = theNode->parent;\r
+  if (!aNode) {\r
+    return false;\r
+  }\r
+  for (; aNode; aNode = aNode->next) {\r
+    if (isElementNode(theNode)) {\r
+      return true;\r
+    }\r
+  }\r
+  return false;\r
+}\r
+\r
+bool hasParent(xmlNodePtr theNode, const char* theNodeName, ...)\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
+  if (!xmlStrcmp(aName, (const xmlChar *) theNodeName)) {\r
+    return true;\r
+  }\r
+  va_list args;  // define argument list variable\r
+  va_start(args, theNodeName);  // init list; point to last defined argument\r
+  while (true) {\r
+    char *anArg = va_arg (args, char*);  // get next argument\r
+    if (anArg == NULL)\r
+      break;\r
+    if (!xmlStrcmp(aName, (const xmlChar *) anArg)) {\r
+      va_end(args);  // cleanup the system stack\r
+      return true;\r
+    }\r
+  }\r
+  va_end(args);  // cleanup the system stack\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