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();
    }
}
Exemple #2
0
		void RegisterXMLChild( Hash xHash, NodeCallbackFnPtr const pxHandler)
		{
			m_xChildren.insert(ChildPair(xHash, pxHandler));
		}