boost::any FieldContainerTreeModel::getChild(const boost::any& parent, const UInt32& index) const { try { ContainerFieldIdPair ThePair = boost::any_cast<ContainerFieldIdPair>(parent); //FieldContainer if(ThePair._FieldID == 0) { UInt32 FieldId(1); UInt32 NumFields(0); for( ; FieldId<=ThePair._Container->getNumFields() ; ++FieldId) { if(isFieldAllowed(ThePair._Container->getFieldDescription(FieldId))) { ++NumFields; if(NumFields == index+1) { break; } } } ContainerFieldIdPair ChildPair(ThePair._Container,FieldId); return boost::any(ChildPair); } //Field else { const FieldType& fcType(ThePair._Container->getFieldDescription(ThePair._FieldID)->getFieldType()); if((fcType.getClass() == FieldType::PtrField ) || (fcType.getClass() == FieldType::ParentPtrField) || (fcType.getClass() == FieldType::ChildPtrField )) { if(fcType.getCardinality() == FieldType::MultiField ) { if(index < ThePair._Container->getField(ThePair._FieldID)->size()) { GetFieldHandlePtr TempHandle(ThePair._Container->getField(ThePair._FieldID)); FieldContainerWeakPtr TheContainer = dynamic_cast<GetMFieldHandle<FieldContainerPtrMFieldBase>*>(TempHandle.get())->get(index); return boost::any(ContainerFieldIdPair(TheContainer,0)); } else { SWARNING << "Index out of bounds." << std::endl; return boost::any(); } } else { if(index == 0) { GetFieldHandlePtr TempHandle(ThePair._Container->getField(ThePair._FieldID)); FieldContainerWeakPtr TheContainer = dynamic_cast<GetSFieldHandle<FieldContainerPtrSFieldBase>*>(TempHandle.get())->get(); return boost::any(ContainerFieldIdPair(TheContainer,0)); } else { SWARNING << "Index out of bounds." << std::endl; return boost::any(); } } } else { SWARNING << "Not Ptr field." << std::endl; return boost::any(); } } } catch(const boost::bad_any_cast &ex) { SWARNING << "Bad any cast" << ex.what() << "." << std::endl; return boost::any(); } }
void RegisterXMLChild( Hash xHash, NodeCallbackFnPtr const pxHandler) { m_xChildren.insert(ChildPair(xHash, pxHandler)); }