xti.cpp

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

CPP
771
字号
            info = info->m_next;
        }
    }
}

const wxPropertyAccessor *wxClassInfo::FindAccessor(const wxChar *PropertyName) const
{
    const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ;

    if ( info )
        return info->GetAccessor() ;

    return NULL ;
}

wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const wxChar *PropertyName) const
{
    wxPropertyInfo* info = m_firstProperty ;

    while( info )
    {
        if ( wxStrcmp( info->GetName() , PropertyName ) == 0 )
            return info ;
        info = info->GetNext() ;
    }

    return 0;
}

const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const wxChar *PropertyName) const
{
    const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ) ;
    if ( info )
        return info ;

    const wxClassInfo** parents = GetParents() ;
    for ( int i = 0 ; parents[i] ; ++ i )
    {
        if ( ( info = parents[i]->FindPropertyInfo( PropertyName ) ) != NULL )
            return info ;
    }

    return 0;
}

wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const wxChar *PropertyName) const
{
    wxHandlerInfo* info = m_firstHandler ;

    while( info )
    {
        if ( wxStrcmp( info->GetName() , PropertyName ) == 0 )
            return info ;
        info = info->GetNext() ;
    }

    return 0;
}

const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const wxChar *PropertyName) const
{
    const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ) ;

    if ( info )
        return info ;

    const wxClassInfo** parents = GetParents() ;
    for ( int i = 0 ; parents[i] ; ++ i )
    {
        if ( ( info = parents[i]->FindHandlerInfo( PropertyName ) ) != NULL )
            return info ;
    }

    return 0;
}

wxObjectStreamingCallback wxClassInfo::GetStreamingCallback() const
{
    if ( m_streamingCallback )
        return m_streamingCallback ;

    wxObjectStreamingCallback retval = NULL ;
    const wxClassInfo** parents = GetParents() ;
    for ( int i = 0 ; parents[i] && retval == NULL ; ++ i )
    {
        retval = parents[i]->GetStreamingCallback() ;
    }
    return retval ;
}

bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const
{
    wxObjectStreamingCallback sb = GetStreamingCallback() ;
    if ( sb )
        return (*sb)(obj , streamer , persister , metadata ) ;

    return true ;
}

void wxClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const
{
    const wxPropertyAccessor *accessor;

    accessor = FindAccessor(propertyName);
    wxASSERT(accessor->HasSetter());
    accessor->SetProperty( object , value ) ;
}

wxxVariant wxClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const
{
    const wxPropertyAccessor *accessor;

    accessor = FindAccessor(propertyName);
    wxASSERT(accessor->HasGetter());
    wxxVariant result ;
    accessor->GetProperty(object,result);
    return result ;
}

wxxVariantArray wxClassInfo::GetPropertyCollection(wxObject *object, const wxChar *propertyName) const
{
    const wxPropertyAccessor *accessor;

    accessor = FindAccessor(propertyName);
    wxASSERT(accessor->HasGetter());
    wxxVariantArray result ;
    accessor->GetPropertyCollection(object,result);
    return result ;
}

void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const
{
    const wxPropertyAccessor *accessor;

    accessor = FindAccessor(propertyName);
    wxASSERT(accessor->HasAdder());
    accessor->AddToPropertyCollection( object , value ) ;
}

// void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const
// The map parameter (the name map that is) seems something special
// to MSVC and so we use a other name.
void wxClassInfo::GetProperties( wxPropertyInfoMap &infomap ) const
{
    const wxPropertyInfo *pi = GetFirstProperty() ;
    while( pi )
    {
        if ( infomap.find( pi->GetName() ) == infomap.end() )
            infomap[pi->GetName()] = (wxPropertyInfo*) pi ;

        pi = pi->GetNext() ;
    }

    const wxClassInfo** parents = GetParents() ;
    for ( int i = 0 ; parents[i] ; ++ i )
    {
        parents[i]->GetProperties( infomap ) ;
    }
}

/*
VARIANT TO OBJECT
*/

wxObject* wxxVariant::GetAsObject()
{
    const wxClassTypeInfo *ti = dynamic_cast<const wxClassTypeInfo*>( m_data->GetTypeInfo() ) ;
    if ( ti )
        return ti->GetClassInfo()->VariantToInstance(*this) ;
    else
        return NULL ;
}

// ----------------------------------------------------------------------------
// wxDynamicObject support
// ----------------------------------------------------------------------------
//
// Dynamic Objects are objects that have a real superclass instance and carry their
// own attributes in a hash map. Like this it is possible to create the objects and
// stream them, as if their class information was already available from compiled data

struct wxDynamicObject::wxDynamicObjectInternal
{
    wxDynamicObjectInternal() {}

#if wxUSE_UNICODE
    map<wstring,wxxVariant> m_properties ;
#else
    map<string,wxxVariant> m_properties ;
#endif
} ;

typedef list< wxDynamicObject* > wxDynamicObjectList ;

struct wxDynamicClassInfo::wxDynamicClassInfoInternal
{
    wxDynamicObjectList m_dynamicObjects ;
} ;

// instantiates this object with an instance of its superclass
wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info)
{
    m_superClassInstance = superClassInstance ;
    m_classInfo = info ;
    m_data = new wxDynamicObjectInternal ;
}

wxDynamicObject::~wxDynamicObject()
{
    dynamic_cast<const wxDynamicClassInfo*>(m_classInfo)->m_data->m_dynamicObjects.remove( this ) ;
    delete m_data ;
    delete m_superClassInstance ;
}

void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxxVariant &value)
{
    wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ;
    m_data->m_properties[propertyName] = value ;
}

wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const
{
    wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ;
    return m_data->m_properties[propertyName] ;
}

void wxDynamicObject::RemoveProperty( const wxChar *propertyName )
{
    wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Removing Unknown Property in a Dynamic Object") ) ;
    m_data->m_properties.erase( propertyName ) ;
}

void wxDynamicObject::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName )
{
    wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(oldPropertyName),wxT("Renaming Unknown Property in a Dynamic Object") ) ;
    wxxVariant value = m_data->m_properties[oldPropertyName] ;
    m_data->m_properties.erase( oldPropertyName ) ;
    m_data->m_properties[newPropertyName] = value ;
}


// ----------------------------------------------------------------------------
// wxDynamiClassInfo
// ----------------------------------------------------------------------------

wxDynamicClassInfo::wxDynamicClassInfo( const wxChar *unitName, const wxChar *className , const wxClassInfo* superClass ) :
wxClassInfo( unitName, className , new const wxClassInfo*[2])
{
    GetParents()[0] = superClass ;
    GetParents()[1] = NULL ;
    m_data = new wxDynamicClassInfoInternal ;
}

wxDynamicClassInfo::~wxDynamicClassInfo()
{
    delete[] GetParents() ;
    delete m_data ;
}

wxObject *wxDynamicClassInfo::AllocateObject() const
{
    wxObject* parent = GetParents()[0]->AllocateObject() ;
    wxDynamicObject *obj = new wxDynamicObject( parent , this ) ;
    m_data->m_dynamicObjects.push_back( obj ) ;
    return obj ;
}

void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *params) const
{
    wxDynamicObject *dynobj = dynamic_cast< wxDynamicObject *>( object ) ;
    wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::Create on an object other than wxDynamicObject") ) ;
    GetParents()[0]->Create( dynobj->GetSuperClassInstance() , paramCount , params ) ;
}

// get number of parameters for constructor
int wxDynamicClassInfo::GetCreateParamCount() const
{
    return GetParents()[0]->GetCreateParamCount() ;
}

// get i-th constructor parameter
const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const
{
    return GetParents()[0]->GetCreateParamName( i ) ;
}

void wxDynamicClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const
{
    wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ;
    wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ;
    if ( FindPropertyInfoInThisClass(propertyName) )
        dynobj->SetProperty( propertyName , value ) ;
    else
        GetParents()[0]->SetProperty( dynobj->GetSuperClassInstance() , propertyName , value ) ;
}

wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const
{
    wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ;
    wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ;
    if ( FindPropertyInfoInThisClass(propertyName) )
        return dynobj->GetProperty( propertyName ) ;
    else
        return GetParents()[0]->GetProperty( dynobj->GetSuperClassInstance() , propertyName ) ;
}

void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo )
{
    new wxPropertyInfo( m_firstProperty , this , propertyName , typeInfo->GetTypeName() , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ;
}

void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo )
{
    new wxHandlerInfo( m_firstHandler , this , handlerName , address , eventClassInfo ) ;
}

// removes an existing runtime-property
void wxDynamicClassInfo::RemoveProperty( const wxChar *propertyName )
{
    for ( wxDynamicObjectList::iterator iter = m_data->m_dynamicObjects.begin() ; iter != m_data->m_dynamicObjects.end() ; ++iter )
        (*iter)->RemoveProperty( propertyName ) ;
    delete FindPropertyInfoInThisClass(propertyName) ;
}

// removes an existing runtime-handler
void wxDynamicClassInfo::RemoveHandler( const wxChar *handlerName )
{
    delete FindHandlerInfoInThisClass(handlerName) ;
}

// renames an existing runtime-property
void wxDynamicClassInfo::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName )
{
    wxPropertyInfo* pi = FindPropertyInfoInThisClass(oldPropertyName) ;
    wxASSERT_MSG( pi ,wxT("not existing property") ) ;
    pi->m_name = newPropertyName ;
    dynamic_cast<wxGenericPropertyAccessor*>(pi->GetAccessor())->RenameProperty( oldPropertyName , newPropertyName ) ;
    for ( wxDynamicObjectList::iterator iter = m_data->m_dynamicObjects.begin() ; iter != m_data->m_dynamicObjects.end() ; ++iter )
        (*iter)->RenameProperty( oldPropertyName , newPropertyName ) ;
}

// renames an existing runtime-handler
void wxDynamicClassInfo::RenameHandler( const wxChar *oldHandlerName , const wxChar *newHandlerName )
{
    wxASSERT_MSG(FindHandlerInfoInThisClass(oldHandlerName),wxT("not existing handler") ) ;
    FindHandlerInfoInThisClass(oldHandlerName)->m_name = newHandlerName ;
}

// ----------------------------------------------------------------------------
// wxGenericPropertyAccessor
// ----------------------------------------------------------------------------

struct wxGenericPropertyAccessor::wxGenericPropertyAccessorInternal
{
    char filler ;
} ;

wxGenericPropertyAccessor::wxGenericPropertyAccessor( const wxString& propertyName )
: wxPropertyAccessor( NULL , NULL , NULL , NULL )
{
    m_data = new wxGenericPropertyAccessorInternal ;
    m_propertyName = propertyName ;
    m_getterName = wxT("Get")+propertyName ;
    m_setterName = wxT("Set")+propertyName ;
}

wxGenericPropertyAccessor::~wxGenericPropertyAccessor()
{
    delete m_data ;
}
void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxxVariant &value) const
{
    wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ;
    wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ;
    dynobj->SetProperty(m_propertyName , value ) ;
}

void wxGenericPropertyAccessor::GetProperty(const wxObject *object, wxxVariant& value) const
{
    const wxDynamicObject* dynobj = dynamic_cast< const wxDynamicObject * >( object ) ;
    wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ;
    value = dynobj->GetProperty( m_propertyName ) ;
}
#endif

⌨️ 快捷键说明

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