void GNEDemandElement::setGenericParametersStr(const std::string& value) { // clear parameters clearParameter(); // separate value in a vector of string using | as separator std::vector<std::string> parsedValues; StringTokenizer stValues(value, "|", true); while (stValues.hasNext()) { parsedValues.push_back(stValues.next()); } // check that parsed values (A=B)can be parsed in generic parameters for (auto i : parsedValues) { std::vector<std::string> parsedParameters; StringTokenizer stParam(i, "=", true); while (stParam.hasNext()) { parsedParameters.push_back(stParam.next()); } // Check that parsed parameters are exactly two and contains valid chracters if (parsedParameters.size() == 2 && SUMOXMLDefinitions::isValidGenericParameterKey(parsedParameters.front()) && SUMOXMLDefinitions::isValidGenericParameterValue(parsedParameters.back())) { setParameter(parsedParameters.front(), parsedParameters.back()); } } }
long GNEFrame::GenericParametersEditor::onCmdSetGenericParameter(FXObject*, FXSelector, void*) { // separate value in a vector of string using | as separator std::vector<std::string> parsedValues; StringTokenizer st(myTextFieldGenericParameter->getText().text(), "|", true); while (st.hasNext()) { parsedValues.push_back(st.next()); } // first check if parsed generic parameters are valid for(auto i : parsedValues) { if(!GNEAttributeCarrier::isGenericParametersValid(i)) { WRITE_WARNING("Invalid format of Generic Parameter (" + i + ")"); myTextFieldGenericParameter->setTextColor(FXRGB(255, 0, 0)); return 1; } } // now check if there is duplicated parameters std::sort(parsedValues.begin(), parsedValues.end()); for (auto i = parsedValues.begin(); i != parsedValues.end(); i++) { if(((i+1) != parsedValues.end())) { std::vector<std::string> firstKey, secondKey; StringTokenizer stKey1(*i, "=", true); StringTokenizer stKey2(*(i+1), "=", true); //parse both keys while (stKey1.hasNext()) { firstKey.push_back(stKey1.next()); } while (stKey2.hasNext()) { secondKey.push_back(stKey2.next()); } // compare both keys and stop if are equal if((firstKey.size() != 2) || (secondKey.size() != 2) || (firstKey.front() == secondKey.front())) { WRITE_WARNING("Generic Parameters wit the same key aren't allowed (" + (*i) + "," + *(i+1) + ")"); myTextFieldGenericParameter->setTextColor(FXRGB(255, 0, 0)); return 1; } } } // parsed generic parameters ok, then set text field black and continue myTextFieldGenericParameter->setTextColor(FXRGB(0, 0, 0)); myTextFieldGenericParameter->killFocus(); // clear current existent generic parameters and set parsed generic parameters myGenericParameters->clear(); for(auto i : parsedValues) { std::vector<std::string> parsedParameters; StringTokenizer stParam(i, "=", true); while (stParam.hasNext()) { parsedParameters.push_back(stParam.next()); } // Check that parsed parameters are exactly two and contains valid chracters if(parsedParameters.size() == 2 && SUMOXMLDefinitions::isValidNetID(parsedParameters.front()) && SUMOXMLDefinitions::isValidAttribute(parsedParameters.back())) { myGenericParameters->push_back(std::make_pair(parsedParameters.front(), parsedParameters.back())); } } // if we're editing generic attributes of an AttributeCarrier, set it if(myAC) { myAC->setAttribute(GNE_ATTR_GENERIC, getGenericParametersStr(), myFrameParent->getViewNet()->getUndoList()); } else if (myACs.size() > 0) { myFrameParent->getViewNet()->getUndoList()->p_begin("Change multiple generic attributes"); for (auto i : myACs) { i->setAttribute(GNE_ATTR_GENERIC, getGenericParametersStr(), myFrameParent->getViewNet()->getUndoList()); } myFrameParent->getViewNet()->getUndoList()->p_end(); } return 1; }