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 + -
显示快捷键?