Salome HOME
Issue #1343 Improvement of Extrusion and Revolution operations: correction for the...
[modules/shaper.git] / src / Config / Config_WidgetAPI.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 /*
4  * Config_WidgetAPI.cpp
5  *
6  *  Created on: Apr 1, 2014
7  *      Author: sbh
8  */
9
10 #include <Config_WidgetAPI.h>
11 #include <Config_Keywords.h>
12 #include <Config_Common.h>
13
14 #include <libxml/parser.h>
15 #include <libxml/tree.h>
16
17 #include <string>
18
19 Config_WidgetAPI::Config_WidgetAPI(std::string theRawXml)
20 {
21   myDoc = xmlParseDoc(BAD_CAST theRawXml.c_str());
22   myCurrentNode = xmlDocGetRootElement(myDoc);
23 }
24
25 Config_WidgetAPI::~Config_WidgetAPI()
26 {
27   xmlFreeDoc(myDoc);
28 }
29
30 bool Config_WidgetAPI::toNextWidget()
31 {
32   //Skip all non-element node, stop if next node is null
33   xmlNodePtr aNextNode = myCurrentNode;
34   do {
35     aNextNode = aNextNode->next;
36   } while (aNextNode && !isElementNode(aNextNode));
37
38   if (!aNextNode) {
39     toParentWidget();
40     return false;
41   }
42   myCurrentNode = aNextNode;
43   return true;
44 }
45
46 bool Config_WidgetAPI::toChildWidget()
47 {
48   if (myCurrentNode && hasChild(myCurrentNode)) {
49     xmlNodePtr aChildNode = myCurrentNode->children;
50     // it is possible that among child nodes, there is no an element node, so
51     // we should not change the current node until not-zero node is found
52     // otherwise, it may happens that the current node is null and the node tree information
53     // is lost
54     while (aChildNode && !isElementNode(aChildNode)) {
55       aChildNode = aChildNode->next;
56     }
57     if (aChildNode != NULL) {
58       myCurrentNode = aChildNode;
59       return true;
60     }
61   }
62   return false;
63 }
64
65 bool Config_WidgetAPI::toParentWidget()
66 {
67   if (myCurrentNode) {
68     myCurrentNode = myCurrentNode->parent;
69   }
70   return myCurrentNode != NULL;
71 }
72
73 std::string Config_WidgetAPI::widgetType() const
74 {
75   std::string result = "";
76   if (myCurrentNode) {
77     result = std::string((char *) myCurrentNode->name);
78   }
79   return result;
80 }
81
82 bool Config_WidgetAPI::isGroupBoxWidget() const
83 {
84   return isNode(myCurrentNode, WDG_GROUP, WDG_CHECK_GROUP,
85                 NULL);
86 }
87
88 bool Config_WidgetAPI::isPagedWidget() const
89 {
90   return isNode(myCurrentNode, WDG_TOOLBOX, WDG_SWITCH,
91                 NULL);
92 }
93
94 std::string Config_WidgetAPI::getProperty(const char* thePropName) const
95 {
96   return ::getProperty(myCurrentNode, thePropName);
97 }
98
99 bool Config_WidgetAPI::getBooleanAttribute(const char* theAttributeName, bool theDefault) const
100 {
101   return ::getBooleanAttribute(myCurrentNode, theAttributeName, theDefault);
102 }
103
104 std::string Config_WidgetAPI::widgetId() const
105 {
106   return getProperty(_ID);
107 }
108
109 std::string Config_WidgetAPI::widgetIcon() const
110 {
111   return getProperty(ATTR_ICON);
112 }
113
114 std::string Config_WidgetAPI::widgetLabel() const
115 {
116   return getProperty(ATTR_LABEL);
117 }
118
119 std::string Config_WidgetAPI::widgetTooltip() const
120 {
121   return getProperty(ATTR_TOOLTIP);
122 }