Salome HOME
Support of additional attributes if ModelWidget and features
[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(const 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     myCurrentNode = myCurrentNode->children;
50     while (myCurrentNode && !isElementNode(myCurrentNode)) {
51       myCurrentNode = myCurrentNode->next;
52     }
53     return myCurrentNode != NULL;
54   }
55   return false;
56 }
57
58 bool Config_WidgetAPI::toParentWidget()
59 {
60   if (myCurrentNode) {
61     myCurrentNode = myCurrentNode->parent;
62   }
63   return myCurrentNode != NULL;
64 }
65
66 std::list<xmlNodePtr> Config_WidgetAPI::attributes() const
67 {
68   std::list<xmlNodePtr> aResult;
69   if (myCurrentNode && hasChild(myCurrentNode)) {
70     xmlNodePtr anAttributesNode = myCurrentNode->children;
71     while (anAttributesNode &&
72            (!isElementNode(anAttributesNode) ||
73             std::string((char *) anAttributesNode->name) != NODE_NAME_ATTRIBUTES)) {
74       anAttributesNode = anAttributesNode->next;
75     }
76     if (anAttributesNode && hasChild(anAttributesNode)) {
77       xmlNodePtr anAttributeNode = anAttributesNode->children;
78       while (anAttributeNode) {
79         if (isElementNode(anAttributeNode) &&
80             std::string((char *) anAttributeNode->name) == NODE_NAME_ATTRIBUTE)
81           aResult.push_back(anAttributeNode);
82         anAttributeNode = anAttributeNode->next;
83       }
84     }
85   }
86   return aResult;
87 }
88
89 std::string Config_WidgetAPI::widgetType() const
90 {
91   std::string result = "";
92   if (myCurrentNode) {
93     result = std::string((char *) myCurrentNode->name);
94   }
95   return result;
96 }
97
98 bool Config_WidgetAPI::isGroupBoxWidget() const
99 {
100   return isNode(myCurrentNode, WDG_GROUP, WDG_CHECK_GROUP,
101                 NULL);
102 }
103
104 bool Config_WidgetAPI::isPagedWidget() const
105 {
106   return isNode(myCurrentNode, WDG_TOOLBOX, WDG_SWITCH,
107                 NULL);
108 }
109
110 std::string Config_WidgetAPI::getProperty(const char* thePropName) const
111 {
112   return ::getProperty(myCurrentNode, thePropName);
113 }
114
115 bool Config_WidgetAPI::getBooleanAttribute(const char* theAttributeName, bool theDefault) const
116 {
117   return ::getBooleanAttribute(myCurrentNode, theAttributeName, theDefault);
118 }
119
120 std::string Config_WidgetAPI::widgetId() const
121 {
122   return getProperty(_ID);
123 }
124
125 std::string Config_WidgetAPI::widgetIcon() const
126 {
127   return getProperty(ATTR_ICON);
128 }
129
130 std::string Config_WidgetAPI::widgetLabel() const
131 {
132   return getProperty(ATTR_LABEL);
133 }
134
135 std::string Config_WidgetAPI::widgetTooltip() const
136 {
137   return getProperty(ATTR_TOOLTIP);
138 }
139
140 std::list<std::string> Config_WidgetAPI::getAttributes(const std::string& theRole/* = std::string()*/) const
141 {
142   std::list<std::string> aResult;
143
144   if (theRole.empty() || theRole == ATTR_MAIN_ROLE)
145     aResult.push_back(widgetId());
146
147   if (theRole == ATTR_MAIN_ROLE)
148     return aResult;
149
150   std::list<xmlNodePtr> anAttributes = attributes();
151   for (auto it = anAttributes.begin(); it != anAttributes.end(); ++it) {
152     if (theRole.empty() || theRole == ::getProperty(*it, ATTR_ROLE))
153       aResult.push_back(::getProperty(*it, ATTR_ID));
154   }
155   return aResult;
156 }
157
158 std::string Config_WidgetAPI::getAttributeProperty(const std::string& theAttribute,
159                                                    const std::string& thePropName) const
160 {
161   if (theAttribute == widgetId()) {
162     if (thePropName == ATTR_ROLE)
163       return ATTR_MAIN_ROLE;
164     return ::getProperty(myCurrentNode, thePropName.c_str());
165   }
166
167   std::list<xmlNodePtr> anAttributes = attributes();
168   for (auto it = anAttributes.begin(); it != anAttributes.end(); ++it) {
169     if (theAttribute == ::getProperty(*it, ATTR_ID))
170       return ::getProperty(*it, thePropName.c_str());
171   }
172   return std::string();
173 }
174