-/*
- * Config_WidgetAPI.cpp
- *
- * Created on: Apr 1, 2014
- * Author: sbh
- */
+// Copyright (C) 2014-2023 CEA, EDF
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
#include <Config_WidgetAPI.h>
+#include <Config_Keywords.h>
+#include <Config_Common.h>
-#include <libxml\parser.h>
-#include <libxml\tree.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <string>
-Config_WidgetAPI::Config_WidgetAPI(std::string theRawXml)
+Config_WidgetAPI::Config_WidgetAPI(std::string theRawXml, const std::string theAttributePrefix)
{
myDoc = xmlParseDoc(BAD_CAST theRawXml.c_str());
- myCurrentNode = NULL;
+ myCurrentNode = xmlDocGetRootElement(myDoc);
+ myFeatureId = getProperty(_ID);
+ myAttributePrefix = theAttributePrefix;
}
-
Config_WidgetAPI::~Config_WidgetAPI()
{
xmlFreeDoc(myDoc);
}
-void Config_WidgetAPI::reset()
+bool Config_WidgetAPI::toNextWidget()
{
- xmlNodePtr aRoot = xmlDocGetRootElement(myDoc);
- if(aRoot) {
- myCurrentNode = aRoot->children;
+ //Skip all non-element node, stop if next node is null
+ xmlNodePtr aNextNode = myCurrentNode;
+ do {
+ aNextNode = aNextNode->next;
+ } while (aNextNode && !isElementNode(aNextNode));
+
+ if (!aNextNode) {
+ toParentWidget();
+ return false;
+ }
+ myCurrentNode = aNextNode;
+ return true;
+}
+
+bool Config_WidgetAPI::toChildWidget()
+{
+ if (myCurrentNode && hasChild(myCurrentNode)) {
+ xmlNodePtr aChildNode = myCurrentNode->children;
+ // it is possible that among child nodes, there is no an element node, so
+ // we should not change the current node until not-zero node is found
+ // otherwise, it may happens that the current node is null and the node tree information
+ // is lost
+ while (aChildNode && !isElementNode(aChildNode)) {
+ aChildNode = aChildNode->next;
+ }
+ if (aChildNode != NULL) {
+ myCurrentNode = aChildNode;
+ return true;
+ }
}
+ return false;
}
-bool Config_WidgetAPI::nextWidget()
+bool Config_WidgetAPI::toParentWidget()
{
- if(myCurrentNode) {
- myCurrentNode = myCurrentNode->next;
+ if (myCurrentNode) {
+ myCurrentNode = myCurrentNode->parent;
}
return myCurrentNode != NULL;
}
-std::string Config_WidgetAPI::widgetType()
+std::string Config_WidgetAPI::widgetType() const
{
std::string result = "";
- if(myCurrentNode) {
+ if (myCurrentNode) {
result = std::string((char *) myCurrentNode->name);
}
return result;
}
-std::string Config_WidgetAPI::getProperty(const char* thePropName)
+bool Config_WidgetAPI::isGroupBoxWidget() const
{
- std::string result = "";
- char* aPropChars = (char*) xmlGetProp(myCurrentNode, BAD_CAST thePropName);
- if (!aPropChars || aPropChars[0] == 0)
- return result;
- result = std::string(aPropChars);
- return result;
+ return isNode(myCurrentNode, WDG_GROUP, WDG_OPTIONALBOX,
+ NULL);
}
-std::string Config_WidgetAPI::widgetTooltip()
+bool Config_WidgetAPI::isPagedWidget() const
{
- return getProperty("tooltip");
+ return isNode(myCurrentNode, WDG_TOOLBOX, WDG_SWITCH, WDG_RADIOBOX,
+ NULL);
}
-std::string Config_WidgetAPI::widgetIcon()
+std::string Config_WidgetAPI::getProperty(const char* thePropName) const
{
- return getProperty("icon");
+ return ::getProperty(myCurrentNode, thePropName);
}
-std::string Config_WidgetAPI::widgetLabel()
+bool Config_WidgetAPI::getBooleanAttribute(const char* theAttributeName, bool theDefault) const
{
- return getProperty("label");
+ return ::getBooleanAttribute(myCurrentNode, theAttributeName, theDefault);
}
-bool Config_WidgetAPI::isNode(xmlNodePtr theNode, const char* theNodeName, ...)
+std::string Config_WidgetAPI::featureId() const
{
- bool result = false;
- const xmlChar* aName = theNode->name;
- if (!aName || theNode->type != XML_ELEMENT_NODE)
- return false;
+ return myFeatureId;
+}
- if (!xmlStrcmp(aName, (const xmlChar *) theNodeName))
- return true;
-
- va_list args; // define argument list variable
- va_start(args, theNodeName); // init list; point to last defined argument
- while(true) {
- char *anArg = va_arg (args, char*); // get next argument
- if (anArg == NULL)
- break;
- if (!xmlStrcmp(aName, (const xmlChar *) anArg)) {
- va_end(args); // cleanup the system stack
- return true;
- }
- }
- va_end(args); // cleanup the system stack
- return false;
+std::string Config_WidgetAPI::widgetId() const
+{
+ return myAttributePrefix + getProperty(_ID);
+}
+
+std::string Config_WidgetAPI::widgetIcon() const
+{
+ return getProperty(ATTR_ICON);
+}
+
+std::string Config_WidgetAPI::widgetLabel() const
+{
+ return getProperty(ATTR_LABEL);
+}
+
+std::string Config_WidgetAPI::widgetTooltip() const
+{
+ return getProperty(ATTR_TOOLTIP);
}