+ aMessage->setUseInput(hasChild(theNode));
+ Events_Loop::loop()->send(aMessage);
+ //The m_last* variables always defined before fillFeature() call. XML is a tree.
+ } else if (isNode(theNode, NODE_WORKBENCH, NODE_GROUP, NULL)) {
+ storeAttribute(theNode, _ID);
+ storeAttribute(theNode, GROUP_TOOLBAR);
+ storeAttribute(theNode, WORKBENCH_DOC, true);
+ } else if (myIsProcessWidgets) {
+ // widgets, like shape_selector or containers, like toolbox
+ if (isAttributeNode(theNode)) {
+ std::shared_ptr<Config_AttributeMessage>
+ aMessage(new Config_AttributeMessage(aMenuItemEvent, this));
+ aMessage->setFeatureId(restoreAttribute(NODE_FEATURE, _ID));
+ std::string anAttributeID = getProperty(theNode, _ID);
+ if (!anAttributeID.empty()) {
+ aMessage->setAttributeId(anAttributeID);
+ aMessage->setObligatory(getBooleanAttribute(theNode, ATTR_OBLIGATORY, true));
+ bool isConcealment = getBooleanAttribute(theNode, ATTR_CONCEALMENT, false);
+ aMessage->setConcealment(isConcealment);
+ bool isMainArg = isConcealment && getBooleanAttribute(theNode, ATTR_MAIN_ARG, false);
+ aMessage->setMainArgument(isMainArg);
+
+ std::list<std::pair<std::string, std::string> > aCases;
+ xmlNodePtr aCaseNode = hasParentRecursive(theNode,
+ WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, WDG_OPTIONALBOX, WDG_RADIOBOX_ITEM, NULL);
+ while(aCaseNode) {
+ std::string aCaseNodeID = getProperty(aCaseNode, _ID);
+ std::string aSwitchNodeID = "";
+ const xmlChar* aName = aCaseNode->name;
+ xmlNodePtr aSwitchNode;
+ if (!xmlStrcmp(aName, (const xmlChar *) WDG_SWITCH_CASE)) {
+ aSwitchNode = hasParentRecursive(aCaseNode, WDG_SWITCH, NULL);
+ }
+ else if (!xmlStrcmp(aName, (const xmlChar *) WDG_TOOLBOX_BOX)) {
+ aSwitchNode = hasParentRecursive(aCaseNode, WDG_TOOLBOX, NULL);
+ }
+ else if (!xmlStrcmp(aName, (const xmlChar *)WDG_RADIOBOX_ITEM)) {
+ aSwitchNode = hasParentRecursive(aCaseNode, WDG_RADIOBOX, NULL);
+ }
+ if (!xmlStrcmp(aName, (const xmlChar *) WDG_OPTIONALBOX)) {
+ /// the box is optional, attribute is in case
+ /// if the optional attribute value is not empty
+ aSwitchNode = aCaseNode;
+ }
+ if (aSwitchNode)
+ aSwitchNodeID = getProperty(aSwitchNode, _ID);
+
+ aCases.push_back(std::make_pair(aSwitchNodeID, aCaseNodeID));
+ aCaseNode = hasParentRecursive(aSwitchNode, WDG_SWITCH_CASE,
+ WDG_TOOLBOX_BOX, WDG_OPTIONALBOX, WDG_RADIOBOX_ITEM, NULL);
+ }
+ aMessage->setCases(aCases);
+ Events_Loop::loop()->send(aMessage);
+ }
+ // container pages, like "case" or "box"
+ } else if (isNode(theNode, WDG_OPTIONALBOX, WDG_SWITCH, WDG_SWITCH_CASE,
+ WDG_TOOLBOX, WDG_TOOLBOX_BOX,
+ WDG_RADIOBOX, WDG_RADIOBOX_ITEM, NULL)) {
+ storeAttribute(theNode, _ID); // save case:caseId (or box:boxId)
+ }