- storeAttribute(theNode, WORKBENCH_DOC);
- } else if (myIsProcessWidgets && isWidgetNode(theNode)) {
- boost::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, ATTRIBUTE_OBLIGATORY, true));
- aMessage->setConcealment(getBooleanAttribute(theNode, ATTRIBUTE_CONCEALMENT, false));
- Events_Loop::loop()->send(aMessage);
+ 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));
+ aMessage->setConcealment(getBooleanAttribute(theNode, ATTR_CONCEALMENT, false));
+
+ std::list<std::pair<std::string, std::string> > aCases;
+ xmlNodePtr aCaseNode =
+ hasParentRecursive(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, WDG_OPTIONALBOX, 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);
+ }
+ 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, 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, NULL)) {
+ storeAttribute(theNode, _ID); // save case:caseId (or box:boxId)