xtistrm.cpp

来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 852 行 · 第 1/3 页

CPP
852
字号
    {
        const wxDelegateTypeInfo *delegateTypeInfo = dynamic_cast<const wxDelegateTypeInfo*>(delegateInfo->GetTypeInfo());
        if( delegateTypeInfo && delegateTypeInfo->GetLastEventType() == -1 )
        {
            ehsource->Connect( -1 , delegateTypeInfo->GetEventType() ,
                handlerInfo->GetEventFunction() , NULL /*user data*/ ,
                ehsink ) ;
        }
        else
        {
            for ( wxEventType iter = delegateTypeInfo->GetEventType() ; iter <= delegateTypeInfo->GetLastEventType() ; ++iter )
            {
                ehsource->Connect( -1 , iter ,
                    handlerInfo->GetEventFunction() , NULL /*user data*/ ,
                    ehsink ) ;
            }
        }
    }
}

wxObject *wxRuntimeDepersister::GetObject(int objectID)
{
    return m_data->GetObject( objectID ) ;
}

// adds an element to a property collection
void wxRuntimeDepersister::AddToPropertyCollection( int objectID ,
                                                   const wxClassInfo *classInfo,
                                                   const wxPropertyInfo* propertyInfo ,
                                                   const wxxVariant &value)
{
    wxObject *o;
    o = m_data->GetObject(objectID);
    classInfo->AddToPropertyCollection( o , propertyInfo->GetName() , value ) ;
}

// sets the corresponding property (value is an object)
void wxRuntimeDepersister::AddToPropertyCollectionAsObject(int objectID,
                                                           const wxClassInfo *classInfo,
                                                           const wxPropertyInfo* propertyInfo ,
                                                           int valueObjectId)
{
    wxObject *o, *valo;
    o = m_data->GetObject(objectID);
    valo = m_data->GetObject(valueObjectId);
    const wxCollectionTypeInfo * collectionTypeInfo = dynamic_cast< const wxCollectionTypeInfo * >(propertyInfo->GetTypeInfo() ) ;
    const wxClassInfo* valClassInfo = (dynamic_cast<const wxClassTypeInfo*>(collectionTypeInfo->GetElementType()))->GetClassInfo() ;
    // if this is a dynamic object and we are asked for another class
    // than wxDynamicObject we cast it down manually.
    wxDynamicObject *dynvalo = dynamic_cast< wxDynamicObject * > (valo) ;
    if ( dynvalo!=NULL  && (valClassInfo != dynvalo->GetClassInfo()) )
    {
        valo = dynvalo->GetSuperClassInstance() ;
    }

    classInfo->AddToPropertyCollection( o , propertyInfo->GetName() , valClassInfo->InstanceToVariant(valo) ) ;
}

// ----------------------------------------------------------------------------
// depersisting to code
// ----------------------------------------------------------------------------

struct wxCodeDepersister::wxCodeDepersisterInternal
{
#if wxUSE_UNICODE
    map<int,wstring> m_objectNames ;
#else
    map<int,string> m_objectNames ;
#endif

    void SetObjectName(int objectID, const wxString &name )
    {
        if ( m_objectNames.find(objectID) != m_objectNames.end() )
        {
            wxLogError( _("Passing a already registered object to SetObjectName") ) ;
            return  ;
        }
        m_objectNames[objectID] = (const wxChar *)name;
    }

    wxString GetObjectName( int objectID )
    {
        if ( objectID == wxNullObjectID )
            return wxT("NULL") ;

        if ( m_objectNames.find(objectID) == m_objectNames.end() )
        {
            wxLogError( _("Passing an unkown object to GetObject") ) ;
            return wxEmptyString ;
        }
        return wxString( m_objectNames[objectID].c_str() ) ;
    }
} ;

wxCodeDepersister::wxCodeDepersister(wxTextOutputStream *out)
: m_fp(out)
{
    m_data = new wxCodeDepersisterInternal ;
}

wxCodeDepersister::~wxCodeDepersister()
{
    delete m_data ;
}

void wxCodeDepersister::AllocateObject(int objectID, wxClassInfo *classInfo ,
                                       wxxVariantArray &WXUNUSED(metadata))
{
    wxString objectName = wxString::Format( wxT("LocalObject_%d") , objectID ) ;
    m_fp->WriteString( wxString::Format( wxT("\t%s *%s = new %s;\n"),
        classInfo->GetClassName(),
        objectName.c_str(),
        classInfo->GetClassName()) );
    m_data->SetObjectName( objectID , objectName ) ;
}

void wxCodeDepersister::DestroyObject(int objectID, wxClassInfo *WXUNUSED(classInfo))
{
    m_fp->WriteString( wxString::Format( wxT("\tdelete %s;\n"),
        m_data->GetObjectName( objectID).c_str() ) );
}

wxString wxCodeDepersister::ValueAsCode( const wxxVariant &param )
{
    wxString value ;
    const wxTypeInfo* type = param.GetTypeInfo() ;
    if ( type->GetKind() == wxT_CUSTOM )
    {
        const wxCustomTypeInfo* cti = dynamic_cast<const wxCustomTypeInfo*>(type) ;
        if ( cti )
        {
            value.Printf( wxT("%s(%s)"), cti->GetTypeName().c_str(),param.GetAsString().c_str() );
        }
        else
        {
            wxLogError ( _("Internal error, illegal wxCustomTypeInfo") ) ;
        }
    }
    else if ( type->GetKind() == wxT_STRING )
    {
        value.Printf( wxT("\"%s\""),param.GetAsString().c_str() );
    }
    else
    {
        value.Printf( wxT("%s"), param.GetAsString().c_str() );
    }
    return value ;
}

void wxCodeDepersister::CreateObject(int objectID,
                                     const wxClassInfo *WXUNUSED(classInfo),
                                     int paramCount,
                                     wxxVariant *params,
                                     int *objectIDValues,
                                     const wxClassInfo **WXUNUSED(objectClassInfos) ,
                                     wxxVariantArray &WXUNUSED(metadata)
                                     )
{
    int i;
    m_fp->WriteString( wxString::Format( wxT("\t%s->Create("), m_data->GetObjectName(objectID).c_str() ) );
    for (i = 0; i < paramCount; i++)
    {
        if ( objectIDValues[i] != wxInvalidObjectID )
            m_fp->WriteString( wxString::Format( wxT("%s"), m_data->GetObjectName( objectIDValues[i] ).c_str() ) );
        else
        {
            m_fp->WriteString( wxString::Format( wxT("%s"), ValueAsCode(params[i]).c_str() ) );
        }
        if (i < paramCount - 1)
            m_fp->WriteString( wxT(", "));
    }
    m_fp->WriteString( wxT(");\n") );
}

void wxCodeDepersister::ConstructObject(int objectID,
                                     const wxClassInfo *classInfo,
                                     int paramCount,
                                     wxxVariant *params,
                                     int *objectIDValues,
                                     const wxClassInfo **WXUNUSED(objectClassInfos) ,
                                     wxxVariantArray &WXUNUSED(metadata)
                                     )
{
    wxString objectName = wxString::Format( wxT("LocalObject_%d") , objectID ) ;
    m_fp->WriteString( wxString::Format( wxT("\t%s *%s = new %s("),
        classInfo->GetClassName(),
        objectName.c_str(),
        classInfo->GetClassName()) );
    m_data->SetObjectName( objectID , objectName ) ;

    int i;
    for (i = 0; i < paramCount; i++)
    {
        if ( objectIDValues[i] != wxInvalidObjectID )
            m_fp->WriteString( wxString::Format( wxT("%s"), m_data->GetObjectName( objectIDValues[i] ).c_str() ) );
        else
        {
            m_fp->WriteString( wxString::Format( wxT("%s"), ValueAsCode(params[i]).c_str() ) );
        }
        if (i < paramCount - 1)
            m_fp->WriteString( wxT(", ") );
    }
    m_fp->WriteString( wxT(");\n") );
}

void wxCodeDepersister::SetProperty(int objectID,
                                    const wxClassInfo *WXUNUSED(classInfo),
                                    const wxPropertyInfo* propertyInfo,
                                    const wxxVariant &value)
{
    m_fp->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"),
        m_data->GetObjectName(objectID).c_str(),
        propertyInfo->GetAccessor()->GetSetterName().c_str(),
        ValueAsCode(value).c_str()) );
}

void wxCodeDepersister::SetPropertyAsObject(int objectID,
                                            const wxClassInfo *WXUNUSED(classInfo),
                                            const wxPropertyInfo* propertyInfo,
                                            int valueObjectId)
{
    if ( propertyInfo->GetTypeInfo()->GetKind() == wxT_OBJECT )
        m_fp->WriteString( wxString::Format( wxT("\t%s->%s(*%s);\n"),
        m_data->GetObjectName(objectID).c_str(),
        propertyInfo->GetAccessor()->GetSetterName().c_str(),
        m_data->GetObjectName( valueObjectId).c_str() ) );
    else
        m_fp->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"),
        m_data->GetObjectName(objectID).c_str(),
        propertyInfo->GetAccessor()->GetSetterName().c_str(),
        m_data->GetObjectName( valueObjectId).c_str() ) );
}

void wxCodeDepersister::AddToPropertyCollection( int objectID ,
                                                const wxClassInfo *WXUNUSED(classInfo),
                                                const wxPropertyInfo* propertyInfo ,
                                                const wxxVariant &value)
{
    m_fp->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"),
        m_data->GetObjectName(objectID).c_str(),
        propertyInfo->GetAccessor()->GetAdderName().c_str(),
        ValueAsCode(value).c_str()) );
}

// sets the corresponding property (value is an object)
void wxCodeDepersister::AddToPropertyCollectionAsObject(int WXUNUSED(objectID),
                                                        const wxClassInfo *WXUNUSED(classInfo),
                                                        const wxPropertyInfo* WXUNUSED(propertyInfo) ,
                                                        int WXUNUSED(valueObjectId))
{
    // TODO
}

void wxCodeDepersister::SetConnect(int eventSourceObjectID,
                                   const wxClassInfo *WXUNUSED(eventSourceClassInfo),
                                   const wxPropertyInfo *delegateInfo ,
                                   const wxClassInfo *eventSinkClassInfo ,
                                   const wxHandlerInfo* handlerInfo ,
                                   int eventSinkObjectID )
{
    wxString ehsource = m_data->GetObjectName( eventSourceObjectID ) ;
    wxString ehsink = m_data->GetObjectName(eventSinkObjectID) ;
    wxString ehsinkClass = eventSinkClassInfo->GetClassName() ;
    const wxDelegateTypeInfo *delegateTypeInfo = dynamic_cast<const wxDelegateTypeInfo*>(delegateInfo->GetTypeInfo());
    if ( delegateTypeInfo )
    {
        int eventType = delegateTypeInfo->GetEventType() ;
        wxString handlerName = handlerInfo->GetName() ;

        m_fp->WriteString( wxString::Format(  wxT("\t%s->Connect( %s->GetId() , %d , (wxObjectEventFunction)(wxEventFunction) & %s::%s , NULL , %s ) ;") ,
            ehsource.c_str() , ehsource.c_str() , eventType , ehsinkClass.c_str() , handlerName.c_str() , ehsink.c_str() ) );
    }
    else
    {
        wxLogError(_("delegate has no type info"));
    }
}

#include <wx/arrimpl.cpp>

WX_DEFINE_OBJARRAY(wxxVariantArray);

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?