void DivNode::insertChild(NodePtr pChild, unsigned i) { if (!pChild) { throw Exception(AVG_ERR_NO_NODE, getID()+"::insertChild called without a node."); } if (pChild->getState() == NS_CONNECTED || pChild->getState() == NS_CANRENDER) { throw(Exception(AVG_ERR_ALREADY_CONNECTED, "Can't connect node with id "+pChild->getID()+ ": already connected.")); } if (getState() == NS_CONNECTED || getState() == NS_CANRENDER) { getCanvas()->registerNode(pChild); } DivNodePtr ptr = dynamic_pointer_cast<DivNode>(shared_from_this()); pChild->checkSetParentError(ptr); if (!isChildTypeAllowed(pChild->getTypeStr())) { throw(Exception(AVG_ERR_ALREADY_CONNECTED, "Can't insert a node of type "+pChild->getTypeStr()+ " into a node of type "+getTypeStr()+".")); } if (i > m_Children.size()) { throw(Exception(AVG_ERR_OUT_OF_RANGE, pChild->getID()+"::insertChild: index out of bounds.")); } std::vector<NodePtr>::iterator pos = m_Children.begin()+i; m_Children.insert(pos, pChild); try { pChild->setParent(ptr, getState(), getCanvas()); } catch (Exception&) { m_Children.erase(m_Children.begin()+i); throw; } if (getState() == NS_CANRENDER) { pChild->connectDisplay(); } }