-int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks)
-{
- wxString className;
- wxClassInfo *classInfo;
-
- wxxVariant *createParams ;
- int *createParamOids ;
- const wxClassInfo** createClassInfos ;
- wxXmlNode *children;
- int objectID;
-
- children = node->GetChildren();
- if (!node->GetPropVal("class", &className))
- {
- // No class name. Eek. FIXME: error handling
- return wxInvalidObjectID;
- }
- classInfo = wxClassInfo::FindClass(className);
- if (children && children->GetType() == wxXML_TEXT_NODE)
- {
- assert( wxXmlGetContentFromNode(node) == "null" ) ;
- // this must be a NULL component reference. We just bail out
- return wxNullObjectID;
- }
-
- wxString ObjectIdString ;
- if (!node->GetPropVal("id", &ObjectIdString))
- {
- // No object id. Eek. FIXME: error handling
- return wxInvalidObjectID;
- }
-
- objectID = atoi( ObjectIdString.c_str() ) ;
- // is this object already has been streamed in, return it here
- if ( HasObjectClassInfo( objectID ) )
- return objectID ;
-
- // new object, start with allocation
- // first make the object know to our internal registry
- SetObjectClassInfo( objectID , classInfo ) ;
-
- callbacks->AllocateObject(objectID, classInfo);
-
- //
- // stream back the Create parameters first
- createParams = new wxxVariant[ classInfo->GetCreateParamCount() ] ;
- createParamOids = new int[classInfo->GetCreateParamCount() ] ;
- createClassInfos = new const wxClassInfo*[classInfo->GetCreateParamCount() ] ;
-
- typedef map<string, wxXmlNode *> PropertyNodes ;
- typedef vector<string> PropertyNames ;
-
- PropertyNodes propertyNodes ;
- PropertyNames propertyNames ;
-
- while( children )
- {
- propertyNames.push_back( children->GetName().c_str() ) ;
- propertyNodes[children->GetName().c_str()] = children ;
- children = children->GetNext() ;
- }
-
- for ( int i = 0 ; i <classInfo->GetCreateParamCount() ; ++i )
- {
- const wxChar* paramName = classInfo->GetCreateParamName(i) ;
- PropertyNodes::iterator propiter = propertyNodes.find( paramName ) ;
- const wxPropertyInfo* pi = classInfo->FindPropertyInfo( paramName ) ;
- // if we don't have the value of a create param set in the xml
- // we use the default value
- if ( propiter != propertyNodes.end() )
- {
- wxXmlNode* prop = propiter->second ;
- if ( pi->GetTypeInfo()->IsObjectType() )
- {
- createParamOids[i] = ReadComponent( prop , callbacks ) ;
- createClassInfos[i] = dynamic_cast<const wxClassTypeInfo*>(pi->GetTypeInfo())->GetClassInfo() ;
- }
- else
- {
- createParamOids[i] = wxInvalidObjectID ;
- createParams[i] = ReadValue( prop , pi->GetAccessor() ) ;
- createClassInfos[i] = NULL ;
- }
-
- for ( size_t j = 0 ; j < propertyNames.size() ; ++j )
- {
- if ( propertyNames[j] == paramName )
- {
- propertyNames[j] = "" ;
- break ;
- }
- }
- }
- else
- {
- createParams[i] = pi->GetDefaultValue() ;
- }
- }
-
- // got the parameters. Call the Create method
- callbacks->CreateObject(objectID, classInfo,
- classInfo->GetCreateParamCount(),
- createParams, createParamOids, createClassInfos);
-
- // now stream in the rest of the properties, in the sequence their properties were written in the xml
- for ( size_t j = 0 ; j < propertyNames.size() ; ++j )
- {
- if ( propertyNames[j].length() )
- {
- PropertyNodes::iterator propiter = propertyNodes.find( propertyNames[j] ) ;
- if ( propiter != propertyNodes.end() )
- {
- wxXmlNode* prop = propiter->second ;
- const wxPropertyInfo* pi = classInfo->FindPropertyInfo( propertyNames[j].c_str() ) ;
- if ( pi->GetTypeInfo()->IsObjectType() )
- {
- int valueId = ReadComponent( prop , callbacks ) ;
- if ( callbacks )
- {
- if ( valueId != wxInvalidObjectID )
- {
- callbacks->SetPropertyAsObject( objectID , classInfo , pi , valueId ) ;
- if ( pi->GetTypeInfo()->GetKind() == wxT_OBJECT && valueId != wxNullObjectID )
- callbacks->DestroyObject( valueId , GetObjectClassInfo( valueId ) ) ;
- }
- }
- }
- else if ( pi->GetTypeInfo()->IsDelegateType() )
- {
- wxString resstring = wxXmlGetContentFromNode(prop) ;
- wxInt32 pos = resstring.Find('.') ;
- assert( pos != wxNOT_FOUND ) ;
- int sinkOid = atol(resstring.Left(pos)) ;
- wxString handlerName = resstring.Mid(pos+1) ;
- wxClassInfo* sinkClassInfo = GetObjectClassInfo( sinkOid ) ;
-
- if (callbacks)
- callbacks->SetConnect( objectID , classInfo , dynamic_cast<const wxDelegateTypeInfo*>(pi->GetTypeInfo()) , sinkClassInfo ,
- sinkClassInfo->FindHandlerInfo(handlerName) , sinkOid ) ;
-
- }
- else
- {
- if ( callbacks )
- callbacks->SetProperty( objectID, classInfo ,pi , ReadValue( prop , pi->GetAccessor() ) ) ;
- }
- }
- }
- }
-
- delete[] createParams ;
- delete[] createParamOids ;
- delete[] createClassInfos ;
-
- return objectID;
-}
-
-wxxVariant wxXmlReader::ReadValue(wxXmlNode *node,
- wxPropertyAccessor *accessor )
-{
- return accessor->ReadValue(wxXmlGetContentFromNode( node ) ) ;
-}
-
-int wxXmlReader::ReadObject(wxDepersister *callbacks)
-{
- return ReadComponent( m_parent , callbacks ) ;
-}