]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Advanced processing of the "SOURCE" and "VALIDATOR" nodes:
authorsbh <sergey.belash@opencascade.com>
Mon, 14 Jul 2014 08:24:59 +0000 (12:24 +0400)
committersbh <sergey.belash@opencascade.com>
Mon, 14 Jul 2014 08:24:59 +0000 (12:24 +0400)
* Support of mixing the "SOURCE" with any other nodes
* Support of the "VALIDATOR" nodes in sourced files

src/Config/Config_WidgetReader.cpp
src/Config/Config_WidgetReader.h
src/Config/Config_XMLReader.cpp
src/Config/Config_XMLReader.h
src/ConstructionPlugin/plugin-Construction.xml
src/ConstructionPlugin/point_widget.xml

index 7ce67a2e7ddc98141d8fb185db846342c0d036ab..f0214657bb339201c81a8ee1d5fda147189b4838 100644 (file)
@@ -14,6 +14,8 @@
 #include <libxml/xpath.h>
 #include <libxml/xmlstring.h>
 
+#include <list>
+
 #ifdef _DEBUG
 #include <iostream>
 #endif
@@ -43,9 +45,9 @@ std::string Config_WidgetReader::featureDescription(const std::string& theFeatur
 void Config_WidgetReader::processNode(xmlNodePtr theNode)
 {
   if (isNode(theNode, NODE_FEATURE, NULL)) {
-    std::string aNodeName = getProperty(theNode, _ID);
-    myWidgetCache[aNodeName] = dumpNode(theNode);
-    myDescriptionCache[aNodeName] = getProperty(theNode, FEATURE_TEXT);
+    myCurrentFeature = getProperty(theNode, _ID);
+    myWidgetCache[myCurrentFeature] = dumpNode(theNode);
+    myDescriptionCache[myCurrentFeature] = getProperty(theNode, FEATURE_TEXT);
   }
   //Process SOURCE nodes.
   Config_XMLReader::processNode(theNode);
@@ -53,7 +55,38 @@ void Config_WidgetReader::processNode(xmlNodePtr theNode)
 
 bool Config_WidgetReader::processChildren(xmlNodePtr theNode)
 {
-  return isNode(theNode, NODE_WORKBENCH, NODE_GROUP, NULL);
+  //Read all nodes recursively, source and validator nodes have no children
+  return !isNode(theNode, NODE_VALIDATOR, NODE_SOURCE, NULL);
+}
+
+void Config_WidgetReader::resolveSourceNodes(xmlNodePtr theNode)
+{
+  xmlNodePtr aNode = xmlFirstElementChild(theNode);
+  std::list<xmlNodePtr> aSourceNodes;
+  while(aNode != NULL) {
+    if (isNode(aNode, NODE_SOURCE, NULL)) {
+      Config_XMLReader aSourceReader = Config_XMLReader(getProperty(aNode, SOURCE_FILE));
+      xmlNodePtr aSourceRoot = aSourceReader.findRoot();
+      if (!aSourceRoot) {
+        continue;
+      }
+      xmlNodePtr aSourceNode = xmlFirstElementChild(aSourceRoot);
+      xmlNodePtr aTargetNode = xmlDocCopyNodeList(aNode->doc, aSourceNode);
+      while(aTargetNode != NULL) {
+        xmlNodePtr aNextNode = xmlNextElementSibling(aTargetNode);
+        xmlAddPrevSibling(aNode, aTargetNode);
+        aTargetNode = aNextNode;
+      }
+      aSourceNodes.push_back(aNode);
+    }
+    aNode = xmlNextElementSibling(aNode);
+  }
+  //Remove "SOURCE" node.
+  std::list<xmlNodePtr>::iterator it = aSourceNodes.begin();
+  for(; it != aSourceNodes.end(); it++) {
+    xmlUnlinkNode(*it);
+    xmlFreeNode(*it);
+  }
 }
 
 std::string Config_WidgetReader::dumpNode(xmlNodePtr theNode)
@@ -62,19 +95,11 @@ std::string Config_WidgetReader::dumpNode(xmlNodePtr theNode)
   if (!hasChild(theNode)) {
     return result;
   }
-  xmlNodePtr aChildrenNode = xmlFirstElementChild(theNode);
+  //Replace all "source" nodes with content;
+  resolveSourceNodes(theNode);
   xmlBufferPtr buffer = xmlBufferCreate();
-  if (isNode(aChildrenNode, NODE_SOURCE, NULL)) {
-    Config_XMLReader aSourceReader = 
-      Config_XMLReader(getProperty(aChildrenNode, SOURCE_FILE));
-    //Register all validators in the sourced xml
-    aSourceReader.readAll();
-    //Dump!
-    xmlNodePtr aSourceRoot = aSourceReader.findRoot();
-    int size = xmlNodeDump(buffer, aSourceRoot->doc, aSourceRoot, 0, 1);
-  } else {
-    int size = xmlNodeDump(buffer, theNode->doc, theNode, 0, 1);
-  }
+  int size = xmlNodeDump(buffer, theNode->doc, theNode, 0, 0);
   result = std::string((char*) (buffer->content));
+  xmlBufferFree(buffer);
   return result;
 }
index 96f35ac19a062a46a70075bab2150b115c9a2b1f..c9c2f060267d353e9356dcdfaf6794190abde845 100644 (file)
@@ -28,6 +28,7 @@ protected:
   void processNode(xmlNodePtr theNode);
   bool processChildren(xmlNodePtr theNode);
   std::string dumpNode(xmlNodePtr theNode);
+  void resolveSourceNodes(xmlNodePtr theNode);
 
 private:
   std::map<std::string, std::string> myWidgetCache;
index a9bf87dc617c560383505840f9a2a9f5402cbaf1..8d618b102f0731f9e5d424808d8e67f0aab52719 100644 (file)
@@ -123,9 +123,10 @@ void Config_XMLReader::readRecursively(xmlNodePtr theParent)
   xmlNodePtr aNode = theParent->xmlChildrenNode;
   for(; aNode; aNode = aNode->next) {
     //Still no text processing in features...
-    if(isElementNode(aNode)) {
-      processNode(aNode);
+    if(!isElementNode(aNode)) {
+      continue;
     }
+    processNode(aNode);
     if (processChildren(aNode)) {
       readRecursively(aNode);
     }
@@ -163,12 +164,12 @@ void Config_XMLReader::processValidator(xmlNodePtr theNode)
   getValidatorInfo(theNode, aValidatorId, aValidatorParameters);
   aMessage.setValidatorId(aValidatorId);
   aMessage.setValidatorParameters(aValidatorParameters);
-  if(isNode(theNode->parent, NODE_FEATURE, NULL)) {
-    aMessage.setFeatureId(getProperty(theNode->parent, _ID));
+  xmlNodePtr aFeatureOrWdgNode = theNode->parent;
+  if(isNode(aFeatureOrWdgNode, NODE_FEATURE, NULL)) {
+    aMessage.setFeatureId(getProperty(aFeatureOrWdgNode, _ID));
   } else {
-    xmlNodePtr aWdgNode = theNode->parent;
-    aMessage.setAttributeId(getProperty(aWdgNode, _ID));
-    aMessage.setFeatureId(getProperty(aWdgNode->parent, _ID));
+    aMessage.setAttributeId(getProperty(aFeatureOrWdgNode, _ID));
+    aMessage.setFeatureId(myCurrentFeature);
   }
   aEvLoop->send(aMessage);
 }
index 47fc97b7b0d997d17b7ea4c8ce04959d9d37729d..3a8219cdae749d348877a38e552c232edd38b828 100644 (file)
@@ -51,6 +51,9 @@ protected:
   std::string getProperty(xmlNodePtr theNode, const char* property);
   void processValidator(xmlNodePtr theNode);
 
+protected:
+  std::string myCurrentFeature;
+
 protected:
   std::string myDocumentPath;
   xmlDocPtr   myXmlDoc;
index b3fdc4608c6ae1054cff9a91c7201cdf2412605b..0918dc9cda6e82bd48fb23a400b314ce95c1c888 100644 (file)
@@ -2,9 +2,12 @@
   <workbench id="Construction">
     <group id="Basic">
       <feature id="Point" title="Point" tooltip="Create a new point" icon=":icons/point.png">
+        <validator id="test" parameters="x,y,z"/>
         <source path="point_widget.xml"/>
       </feature>
-      <feature id="Axis" title="Axis" tooltip="Create a new axis" icon=":icons/axis.png" keysequence="" internal="true"/>
+      <feature id="Axis" title="Axis" tooltip="Create a new axis" icon=":icons/axis.png" keysequence="" internal="true">
+        <validator id="inside" parameters="a,b"/> 
+      </feature>
       <feature id="Plane" title="Plane" tooltip="Create a new plane" icon=":icons/plane.png" keysequence="" internal="true"/>
     </group>
 </workbench>  
index 920d8e0a57cf816450bc972e2e61a0b37445b30c..35397224fd39560d15d452003f5c72c4e8d6cae4 100644 (file)
@@ -1,5 +1,7 @@
 <source>
-  <doublevalue id="x" label="X:" max="50" step="1.0" default="0" icon=":pictures/x_point.png" tooltip="Set X"/>
+  <doublevalue id="x" label="X:" max="50" step="1.0" default="0" icon=":pictures/x_point.png" tooltip="Set X">
+    <validator id="between" parameters="a,b"/> 
+  </doublevalue>
   <doublevalue id="y" label="Y:" min="x" default="1" icon=":pictures/y_point.png" tooltip="Set Y"/>
   <doublevalue id="z" label="Z:" min="-20" step="0.1" default="2" icon=":pictures/z_point.png" tooltip="Set Z"/>
 </source>