X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/common/xti.cpp diff --git a/src/common/xti.cpp b/src/common/xti.cpp index 93906a9e4f..f207253ad7 100644 --- a/src/common/xti.cpp +++ b/src/common/xti.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/common/xti.cpp -// Purpose: runtime metadata information (extended class info +// Purpose: runtime metadata information (extended class info) // Author: Stefan Csomor // Modified by: // Created: 27/07/03 @@ -14,20 +14,22 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_EXTENDED_RTTI + #ifndef WX_PRECOMP -#include "wx/hash.h" -#include "wx/object.h" + #include "wx/object.h" + #include "wx/list.h" + #include "wx/hash.h" #endif -#if wxUSE_EXTENDED_RTTI - #include "wx/xti.h" #include "wx/xml/xml.h" #include "wx/tokenzr.h" -#include "wx/list.h" +#include "wx/range.h" + #include #include "wx/beforestd.h" @@ -36,72 +38,73 @@ #include #include "wx/afterstd.h" -using namespace std ; +using namespace std; // ---------------------------------------------------------------------------- -// Enum Support +// wxEnumData // ---------------------------------------------------------------------------- wxEnumData::wxEnumData( wxEnumMemberData* data ) { - m_members = data ; - for ( m_count = 0; m_members[m_count].m_name ; m_count++) - {} ; + m_members = data; + for ( m_count = 0; m_members[m_count].m_name; m_count++) + {}; } bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) const { int i; - for (i = 0; m_members[i].m_name ; i++ ) + for (i = 0; m_members[i].m_name; i++ ) { if (!wxStrcmp(name, m_members[i].m_name)) { if ( value ) *value = m_members[i].m_value; - return true ; + return true; } } - return false ; + return false; } int wxEnumData::GetEnumMemberValue(const wxChar *name) const { int i; - for (i = 0; m_members[i].m_name ; i++ ) + for (i = 0; m_members[i].m_name; i++ ) { if (!wxStrcmp(name, m_members[i].m_name)) { return m_members[i].m_value; } } - return 0 ; + return 0; } const wxChar *wxEnumData::GetEnumMemberName(int value) const { int i; - for (i = 0; m_members[i].m_name ; i++) + for (i = 0; m_members[i].m_name; i++) if (value == m_members[i].m_value) return m_members[i].m_name; - return wxEmptyString ; + return wxEmptyString; } int wxEnumData::GetEnumMemberValueByIndex( int idx ) const { // we should cache the count in order to avoid out-of-bounds errors - return m_members[idx].m_value ; + return m_members[idx].m_value; } const wxChar * wxEnumData::GetEnumMemberNameByIndex( int idx ) const { // we should cache the count in order to avoid out-of-bounds errors - return m_members[idx].m_name ; + return m_members[idx].m_name; } // ---------------------------------------------------------------------------- // Type Information // ---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- // value streaming // ---------------------------------------------------------------------------- @@ -111,159 +114,190 @@ const wxChar * wxEnumData::GetEnumMemberNameByIndex( int idx ) const // bool -template<> void wxStringReadValue(const wxString &s , bool &data ) +template<> void wxStringReadValue(const wxString &s, bool &data ) { - int intdata ; - wxSscanf(s, _T("%d"), &intdata ) ; - data = (bool)intdata ; + int intdata; + wxSscanf(s, _T("%d"), &intdata ); + data = (bool)(intdata != 0); } -template<> void wxStringWriteValue(wxString &s , const bool &data ) +template<> void wxStringWriteValue(wxString &s, const bool &data ) { - s = wxString::Format(_T("%d"), data ) ; + s = wxString::Format(_T("%d"), data ); } // char -template<> void wxStringReadValue(const wxString &s , char &data ) +template<> void wxStringReadValue(const wxString &s, char &data ) { - int intdata ; - wxSscanf(s, _T("%d"), &intdata ) ; - data = char(intdata) ; + int intdata; + wxSscanf(s, _T("%d"), &intdata ); + data = char(intdata); } -template<> void wxStringWriteValue(wxString &s , const char &data ) +template<> void wxStringWriteValue(wxString &s, const char &data ) { - s = wxString::Format(_T("%d"), data ) ; + s = wxString::Format(_T("%d"), data ); } // unsigned char -template<> void wxStringReadValue(const wxString &s , unsigned char &data ) +template<> void wxStringReadValue(const wxString &s, unsigned char &data ) { - int intdata ; - wxSscanf(s, _T("%d"), &intdata ) ; - data = (unsigned char)(intdata) ; + int intdata; + wxSscanf(s, _T("%d"), &intdata ); + data = (unsigned char)(intdata); } -template<> void wxStringWriteValue(wxString &s , const unsigned char &data ) +template<> void wxStringWriteValue(wxString &s, const unsigned char &data ) { - s = wxString::Format(_T("%d"), data ) ; + s = wxString::Format(_T("%d"), data ); } // int -template<> void wxStringReadValue(const wxString &s , int &data ) +template<> void wxStringReadValue(const wxString &s, int &data ) { - wxSscanf(s, _T("%d"), &data ) ; + wxSscanf(s, _T("%d"), &data ); } -template<> void wxStringWriteValue(wxString &s , const int &data ) +template<> void wxStringWriteValue(wxString &s, const int &data ) { - s = wxString::Format(_T("%d"), data ) ; + s = wxString::Format(_T("%d"), data ); } // unsigned int -template<> void wxStringReadValue(const wxString &s , unsigned int &data ) +template<> void wxStringReadValue(const wxString &s, unsigned int &data ) { - wxSscanf(s, _T("%d"), &data ) ; + wxSscanf(s, _T("%d"), &data ); } -template<> void wxStringWriteValue(wxString &s , const unsigned int &data ) +template<> void wxStringWriteValue(wxString &s, const unsigned int &data ) { - s = wxString::Format(_T("%d"), data ) ; + s = wxString::Format(_T("%d"), data ); } // long -template<> void wxStringReadValue(const wxString &s , long &data ) +template<> void wxStringReadValue(const wxString &s, long &data ) { - wxSscanf(s, _T("%ld"), &data ) ; + wxSscanf(s, _T("%ld"), &data ); } -template<> void wxStringWriteValue(wxString &s , const long &data ) +template<> void wxStringWriteValue(wxString &s, const long &data ) { - s = wxString::Format(_T("%ld"), data ) ; + s = wxString::Format(_T("%ld"), data ); } // unsigned long -template<> void wxStringReadValue(const wxString &s , unsigned long &data ) +template<> void wxStringReadValue(const wxString &s, unsigned long &data ) +{ + wxSscanf(s, _T("%ld"), &data ); +} + +template<> void wxStringWriteValue(wxString &s, const unsigned long &data ) +{ + s = wxString::Format(_T("%ld"), data ); +} + +#ifdef wxLongLong_t +template<> void wxStringReadValue(const wxString &s, wxLongLong_t &data ) +{ + wxSscanf(s, _T("%lld"), &data ); +} + +template<> void wxStringWriteValue(wxString &s, const wxLongLong_t &data ) { - wxSscanf(s, _T("%ld"), &data ) ; + s = wxString::Format(_T("%lld"), data ); } -template<> void wxStringWriteValue(wxString &s , const unsigned long &data ) +template<> void wxStringReadValue(const wxString &s, wxULongLong_t &data ) { - s = wxString::Format(_T("%ld"), data ) ; + wxSscanf(s, _T("%lld"), &data ); } +template<> void wxStringWriteValue(wxString &s, const wxULongLong_t &data ) +{ + s = wxString::Format(_T("%lld"), data ); +} +#endif // float -template<> void wxStringReadValue(const wxString &s , float &data ) +template<> void wxStringReadValue(const wxString &s, float &data ) { - wxSscanf(s, _T("%f"), &data ) ; + wxSscanf(s, _T("%f"), &data ); } -template<> void wxStringWriteValue(wxString &s , const float &data ) +template<> void wxStringWriteValue(wxString &s, const float &data ) { - s = wxString::Format(_T("%f"), data ) ; + s = wxString::Format(_T("%f"), data ); } // double -template<> void wxStringReadValue(const wxString &s , double &data ) +template<> void wxStringReadValue(const wxString &s, double &data ) { - wxSscanf(s, _T("%lf"), &data ) ; + wxSscanf(s, _T("%lf"), &data ); } -template<> void wxStringWriteValue(wxString &s , const double &data ) +template<> void wxStringWriteValue(wxString &s, const double &data ) { - s = wxString::Format(_T("%lf"), data ) ; + s = wxString::Format(_T("%lf"), data ); } // wxString -template<> void wxStringReadValue(const wxString &s , wxString &data ) +template<> void wxStringReadValue(const wxString &s, wxString &data ) { - data = s ; + data = s; } -template<> void wxStringWriteValue(wxString &s , const wxString &data ) +template<> void wxStringWriteValue(wxString &s, const wxString &data ) { - s = data ; + s = data; } + // built-ins // #if wxUSE_FUNC_TEMPLATE_POINTER -#define wxBUILTIN_TYPE_INFO( element , type ) \ - wxBuiltInTypeInfo s_typeInfo##type(element , &wxToStringConverter , &wxFromStringConverter , typeid(type).name()) ; + #define wxBUILTIN_TYPE_INFO( element, type ) \ + wxBuiltInTypeInfo \ + s_typeInfo##type(element, &wxToStringConverter, \ + &wxFromStringConverter, typeid(type).name()); #else -#define wxBUILTIN_TYPE_INFO( element , type ) \ - void _toString##element( const wxxVariant& data , wxString &result ) { wxToStringConverter(data, result); } \ - void _fromString##element( const wxString& data , wxxVariant &result ) { wxFromStringConverter(data, result); } \ - wxBuiltInTypeInfo s_typeInfo##type(element , &_toString##element , &_fromString##element , typeid(type).name()) ; + #define wxBUILTIN_TYPE_INFO( element, type ) \ + void _toString##element( const wxAny& data, wxString &result ) \ + { wxToStringConverter void wxStringReadValue(const wxString &s , wxRange &data) +{ + int minValue, maxValue; + wxSscanf(s, wxT("%d,%d"), &minValue , &maxValue); + data = wxRange(minValue, maxValue); +} -template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) +template<> void wxStringWriteValue(wxString &s , const wxRange &data) { - wxArrayCollectionToVariantArray( theArray , value ) ; + s = wxString::Format(wxT("%d,%d"), data.GetMin() , data.GetMax()); } -wxTypeInfoMap *wxTypeInfo::ms_typeTable = NULL ; +wxCUSTOM_TYPE_INFO(wxRange, wxToStringConverter , wxFromStringConverter) -wxTypeInfo *wxTypeInfo::FindType(const wxChar *typeName) +// other types + +wxCOLLECTION_TYPE_INFO( wxString, wxArrayString ); + +template<> void wxCollectionToVariantArray( wxArrayString const &theArray, + wxAnyList &value) { - wxTypeInfoMap::iterator iter = ms_typeTable->find(typeName) ; - wxASSERT_MSG( iter != ms_typeTable->end() , wxT("lookup for a non-existent type-info") ) ; - return (wxTypeInfo *)iter->second; + wxArrayCollectionToVariantArray( theArray, value ); } -#if wxUSE_UNICODE -wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const char *name) : -wxTypeInfo( kind , to , from , name) -{ wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} -#endif +wxTypeInfoMap *wxTypeInfo::ms_typeTable = NULL; + +wxTypeInfo *wxTypeInfo::FindType(const wxString& typeName) +{ + wxTypeInfoMap::iterator iter = ms_typeTable->find(typeName); + + if (iter == ms_typeTable->end()) + return NULL; + + return (wxTypeInfo *)iter->second; +} -wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from , const wxString &name) : -wxTypeInfo( kind , to , from , name) -{ wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} +wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind, wxClassInfo* classInfo, + wxVariant2StringFnc to, + wxString2VariantFnc from, + const wxString &name) : + wxTypeInfo( kind, to, from, name) +{ + wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT, + wxT("Illegal Kind for Enum Type")); m_classInfo = classInfo; +} -wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : -wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) -{ m_eventClass = eventClass ; m_eventType = eventType ; m_lastEventType = -1 ;} +wxEventSourceTypeInfo::wxEventSourceTypeInfo( int eventType, wxClassInfo* eventClass, + wxVariant2StringFnc to, + wxString2VariantFnc from ) : + wxTypeInfo ( wxT_DELEGATE, to, from, wxEmptyString ) +{ + m_eventClass = eventClass; + m_eventType = eventType; + m_lastEventType = -1; +} -wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , int lastEventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : -wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) -{ m_eventClass = eventClass ; m_eventType = eventType ; m_lastEventType = lastEventType; } +wxEventSourceTypeInfo::wxEventSourceTypeInfo( int eventType, int lastEventType, + wxClassInfo* eventClass, + wxVariant2StringFnc to, + wxString2VariantFnc from ) : + wxTypeInfo ( wxT_DELEGATE, to, from, wxEmptyString ) +{ + m_eventClass = eventClass; + m_eventType = eventType; + m_lastEventType = lastEventType; +} void wxTypeInfo::Register() { if ( ms_typeTable == NULL ) - ms_typeTable = new wxTypeInfoMap() ; + ms_typeTable = new wxTypeInfoMap(); if( !m_name.empty() ) - (*ms_typeTable)[m_name] = this ; + (*ms_typeTable)[m_name] = this; } void wxTypeInfo::Unregister() @@ -326,22 +395,37 @@ void wxTypeInfo::Unregister() // removing header dependancy on string tokenizer -void wxSetStringToArray( const wxString &s , wxArrayString &array ) +void wxSetStringToArray( const wxString &s, wxArrayString &array ) { wxStringTokenizer tokenizer(s, wxT("| \t\n"), wxTOKEN_STRTOK); wxString flag; - array.Clear() ; + array.Clear(); while (tokenizer.HasMoreTokens()) { - array.Add(tokenizer.GetNextToken()) ; + array.Add(tokenizer.GetNextToken()); } } // ---------------------------------------------------------------------------- -// wxClassInfo +// wxPropertyInfo // ---------------------------------------------------------------------------- -wxPropertyInfo::~wxPropertyInfo() +void wxPropertyInfo::Insert(wxPropertyInfo* &iter) +{ + m_next = NULL; + if ( iter == NULL ) + iter = this; + else + { + wxPropertyInfo* i = iter; + while( i->m_next ) + i = i->m_next; + + i->m_next = this; + } +} + +void wxPropertyInfo::Remove() { if ( this == m_itsClass->m_firstProperty ) { @@ -361,9 +445,29 @@ wxPropertyInfo::~wxPropertyInfo() info = info->m_next; } } + +} + +// ---------------------------------------------------------------------------- +// wxHandlerInfo +// ---------------------------------------------------------------------------- + +void wxHandlerInfo::Insert(wxHandlerInfo* &iter) +{ + m_next = NULL; + if ( iter == NULL ) + iter = this; + else + { + wxHandlerInfo* i = iter; + while( i->m_next ) + i = i->m_next; + + i->m_next = this; + } } -wxHandlerInfo::~wxHandlerInfo() +void wxHandlerInfo::Remove() { if ( this == m_itsClass->m_firstHandler ) { @@ -385,25 +489,73 @@ wxHandlerInfo::~wxHandlerInfo() } } + +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +bool wxClassInfo::Create(wxObject *object, int ParamCount, wxAny *Params) const +{ + if ( ParamCount != m_constructorPropertiesCount ) + { + // FIXME: shouldn't we just return false and let the caller handle it? + wxLogError( _("Illegal Parameter Count for Create Method") ); + return false; + } + + return m_constructor->Create( object, Params ); +} + +wxObject *wxClassInfo::ConstructObject(int ParamCount, wxAny *Params) const +{ + if ( ParamCount != m_constructorPropertiesCount ) + { + // FIXME: shouldn't we just return NULL and let the caller handle this case? + wxLogError( _("Illegal Parameter Count for ConstructObject Method") ); + return NULL; + } + + wxObject *object = NULL; + if (!m_constructor->Create( object, Params )) + return NULL; + return object; +} + +bool wxClassInfo::IsKindOf(const wxClassInfo *info) const +{ + if ( info != 0 ) + { + if ( info == this ) + return true; + + for ( int i = 0; m_parents[i]; ++ i ) + { + if ( m_parents[i]->IsKindOf( info ) ) + return true; + } + } + return false; +} + const wxPropertyAccessor *wxClassInfo::FindAccessor(const wxChar *PropertyName) const { - const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; + const wxPropertyInfo* info = FindPropertyInfo( PropertyName ); if ( info ) - return info->GetAccessor() ; + return info->GetAccessor(); - return NULL ; + return NULL; } wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const wxChar *PropertyName) const { - wxPropertyInfo* info = m_firstProperty ; + wxPropertyInfo* info = GetFirstProperty(); while( info ) { - if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) - return info ; - info = info->GetNext() ; + if ( wxStrcmp( info->GetName(), PropertyName ) == 0 ) + return info; + info = info->GetNext(); } return 0; @@ -411,15 +563,15 @@ wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const wxChar *Property const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const wxChar *PropertyName) const { - const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ) ; + const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ); if ( info ) - return info ; + return info; - const wxClassInfo** parents = GetParents() ; - for ( int i = 0 ; parents[i] ; ++ i ) + const wxClassInfo** parents = GetParents(); + for ( int i = 0; parents[i]; ++ i ) { if ( ( info = parents[i]->FindPropertyInfo( PropertyName ) ) != NULL ) - return info ; + return info; } return 0; @@ -427,13 +579,13 @@ const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const wxChar *PropertyName) wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const wxChar *PropertyName) const { - wxHandlerInfo* info = m_firstHandler ; + wxHandlerInfo* info = GetFirstHandler(); while( info ) { - if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) - return info ; - info = info->GetNext() ; + if ( wxStrcmp( info->GetName(), PropertyName ) == 0 ) + return info; + info = info->GetNext(); } return 0; @@ -441,16 +593,16 @@ wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const wxChar *PropertyNa const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const wxChar *PropertyName) const { - const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ) ; + const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ); if ( info ) - return info ; + return info; - const wxClassInfo** parents = GetParents() ; - for ( int i = 0 ; parents[i] ; ++ i ) + const wxClassInfo** parents = GetParents(); + for ( int i = 0; parents[i]; ++ i ) { if ( ( info = parents[i]->FindHandlerInfo( PropertyName ) ) != NULL ) - return info ; + return info; } return 0; @@ -459,64 +611,68 @@ const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const wxChar *PropertyName) c wxObjectStreamingCallback wxClassInfo::GetStreamingCallback() const { if ( m_streamingCallback ) - return m_streamingCallback ; + return m_streamingCallback; - wxObjectStreamingCallback retval = NULL ; - const wxClassInfo** parents = GetParents() ; - for ( int i = 0 ; parents[i] && retval == NULL ; ++ i ) + wxObjectStreamingCallback retval = NULL; + const wxClassInfo** parents = GetParents(); + for ( int i = 0; parents[i] && retval == NULL; ++ i ) { - retval = parents[i]->GetStreamingCallback() ; + retval = parents[i]->GetStreamingCallback(); } - return retval ; + return retval; } -bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const +bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxObjectWriter *streamer, + wxObjectWriterCallback *writercallback, const wxStringToAnyHashMap &metadata) const { - wxObjectStreamingCallback sb = GetStreamingCallback() ; + wxObjectStreamingCallback sb = GetStreamingCallback(); if ( sb ) - return (*sb)(obj , streamer , persister , metadata ) ; + return (*sb)(obj, streamer, writercallback, metadata ); - return true ; + return true; } -void wxClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const +void wxClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, + const wxAny &value) const { const wxPropertyAccessor *accessor; accessor = FindAccessor(propertyName); wxASSERT(accessor->HasSetter()); - accessor->SetProperty( object , value ) ; + accessor->SetProperty( object, value ); } -wxxVariant wxClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const +wxAny wxClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const { const wxPropertyAccessor *accessor; accessor = FindAccessor(propertyName); wxASSERT(accessor->HasGetter()); - wxxVariant result ; + wxAny result; accessor->GetProperty(object,result); - return result ; + return result; } -wxxVariantArray wxClassInfo::GetPropertyCollection(wxObject *object, const wxChar *propertyName) const +wxAnyList wxClassInfo::GetPropertyCollection(wxObject *object, + const wxChar *propertyName) const { const wxPropertyAccessor *accessor; accessor = FindAccessor(propertyName); wxASSERT(accessor->HasGetter()); - wxxVariantArray result ; + wxAnyList result; accessor->GetPropertyCollection(object,result); - return result ; + return result; } -void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const +void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName, + const wxAny& value) const { const wxPropertyAccessor *accessor; accessor = FindAccessor(propertyName); wxASSERT(accessor->HasAdder()); - accessor->AddToPropertyCollection( object , value ) ; + accessor->AddToPropertyCollection( object, value ); } // void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const @@ -524,39 +680,49 @@ void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *proper // to MSVC and so we use a other name. void wxClassInfo::GetProperties( wxPropertyInfoMap &infomap ) const { - const wxPropertyInfo *pi = GetFirstProperty() ; + const wxPropertyInfo *pi = GetFirstProperty(); while( pi ) { if ( infomap.find( pi->GetName() ) == infomap.end() ) - infomap[pi->GetName()] = (wxPropertyInfo*) pi ; + infomap[pi->GetName()] = (wxPropertyInfo*) pi; - pi = pi->GetNext() ; + pi = pi->GetNext(); } - const wxClassInfo** parents = GetParents() ; - for ( int i = 0 ; parents[i] ; ++ i ) + const wxClassInfo** parents = GetParents(); + for ( int i = 0; parents[i]; ++ i ) { - parents[i]->GetProperties( infomap ) ; + parents[i]->GetProperties( infomap ); } } -/* -VARIANT TO OBJECT -*/ +wxObject* wxClassInfo::AnyToObjectPtr( const wxAny &data) const +{ + return m_variantOfPtrToObjectConverter(data); +} -wxObject* wxxVariant::GetAsObject() +void wxClassInfo::CallOnAny( const wxAny &data, wxObjectFunctor* functor ) const { - const wxClassTypeInfo *ti = dynamic_cast( m_data->GetTypeInfo() ) ; - if ( ti ) - return ti->GetClassInfo()->VariantToInstance(*this) ; + if ( data.GetTypeInfo()->GetKind() == wxT_OBJECT ) + return m_variantToObjectConverter(data, functor); else - return NULL ; + return (*functor)(m_variantOfPtrToObjectConverter(data)); +} + +wxAny wxClassInfo::ObjectPtrToAny( wxObject* obj) const +{ + return m_objectToVariantConverter(obj); +} + +bool wxClassInfo::NeedsDirectConstruction() const +{ + return wx_dynamic_cast(wxObjectAllocator*, m_constructor) != 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 @@ -565,167 +731,177 @@ struct wxDynamicObject::wxDynamicObjectInternal { wxDynamicObjectInternal() {} -#if wxUSE_UNICODE - map m_properties ; -#else - map m_properties ; -#endif -} ; + wxStringToAnyHashMap m_properties; +}; -typedef list< wxDynamicObject* > wxDynamicObjectList ; +typedef list< wxDynamicObject* > wxDynamicObjectList; struct wxDynamicClassInfo::wxDynamicClassInfoInternal { - wxDynamicObjectList m_dynamicObjects ; -} ; + 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 ; + m_superClassInstance = superClassInstance; + m_classInfo = info; + m_data = new wxDynamicObjectInternal; } wxDynamicObject::~wxDynamicObject() { - dynamic_cast(m_classInfo)->m_data->m_dynamicObjects.remove( this ) ; - delete m_data ; - delete m_superClassInstance ; + wx_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) +void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxAny &value) { - wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; - m_data->m_properties[propertyName] = 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 +wxAny 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] ; + 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 ) ; + 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 ) +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 ; + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(oldPropertyName), + wxT("Renaming Unknown Property in a Dynamic Object") ); + + wxAny value = m_data->m_properties[oldPropertyName]; + m_data->m_properties.erase( oldPropertyName ); + m_data->m_properties[newPropertyName] = value; } // ---------------------------------------------------------------------------- -// wxDynamiClassInfo +// wxDynamicClassInfo // ---------------------------------------------------------------------------- -wxDynamicClassInfo::wxDynamicClassInfo( const wxChar *unitName, const wxChar *className , const wxClassInfo* superClass ) : -wxClassInfo( unitName, className , new const wxClassInfo*[2]) +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 ; + GetParents()[0] = superClass; + GetParents()[1] = NULL; + m_data = new wxDynamicClassInfoInternal; } wxDynamicClassInfo::~wxDynamicClassInfo() { - delete[] GetParents() ; - delete m_data ; + 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 ; + 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 +bool wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxAny *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 ) ; + wxDynamicObject *dynobj = wx_dynamic_cast( wxDynamicObject *, object ); + wxASSERT_MSG( dynobj, + wxT("cannot call wxDynamicClassInfo::Create on ") + wxT("an object other than wxDynamicObject") ); + + return GetParents()[0]->Create( dynobj->GetSuperClassInstance(), paramCount, params ); } // get number of parameters for constructor int wxDynamicClassInfo::GetCreateParamCount() const { - return GetParents()[0]->GetCreateParamCount() ; + return GetParents()[0]->GetCreateParamCount(); } // get i-th constructor parameter const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const { - return GetParents()[0]->GetCreateParamName( i ) ; + return GetParents()[0]->GetCreateParamName( i ); } -void wxDynamicClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxxVariant &value) const +void wxDynamicClassInfo::SetProperty(wxObject *object, const wxChar *propertyName, const wxAny &value) const { - wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; - wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; + wxDynamicObject* dynobj = wx_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 ) ; + dynobj->SetProperty( propertyName, value ); else - GetParents()[0]->SetProperty( dynobj->GetSuperClassInstance() , propertyName , value ) ; + GetParents()[0]->SetProperty( dynobj->GetSuperClassInstance(), propertyName, value ); } -wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const +wxAny 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") ) ; + wxDynamicObject* dynobj = wx_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 ) ; + return dynobj->GetProperty( propertyName ); else - return GetParents()[0]->GetProperty( dynobj->GetSuperClassInstance() , propertyName ) ; + return GetParents()[0]->GetProperty( dynobj->GetSuperClassInstance(), propertyName ); } -void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo ) +void wxDynamicClassInfo::AddProperty( const wxChar *propertyName, const wxTypeInfo* typeInfo ) { - new wxPropertyInfo( m_firstProperty , this , propertyName , typeInfo->GetTypeName() , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ; + EnsureInfosInited(); + new wxPropertyInfo( m_firstProperty, this, propertyName, typeInfo->GetTypeName(), new wxGenericPropertyAccessor( propertyName ), wxAny() ); } -void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo ) +void wxDynamicClassInfo::AddHandler( const wxChar *handlerName, wxObjectEventFunction address, const wxClassInfo* eventClassInfo ) { - new wxHandlerInfo( m_firstHandler , this , handlerName , address , eventClassInfo ) ; + EnsureInfosInited(); + 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) ; + 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) ; + delete FindHandlerInfoInThisClass(handlerName); } // renames an existing runtime-property -void wxDynamicClassInfo::RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) +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(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 ) ; + wxPropertyInfo* pi = FindPropertyInfoInThisClass(oldPropertyName); + wxASSERT_MSG( pi,wxT("not existing property") ); + pi->m_name = newPropertyName; + wx_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 ) +void wxDynamicClassInfo::RenameHandler( const wxChar *oldHandlerName, const wxChar *newHandlerName ) { - wxASSERT_MSG(FindHandlerInfoInThisClass(oldHandlerName),wxT("not existing handler") ) ; - FindHandlerInfoInThisClass(oldHandlerName)->m_name = newHandlerName ; + wxASSERT_MSG(FindHandlerInfoInThisClass(oldHandlerName),wxT("not existing handler") ); + FindHandlerInfoInThisClass(oldHandlerName)->m_name = newHandlerName; } // ---------------------------------------------------------------------------- @@ -734,33 +910,63 @@ void wxDynamicClassInfo::RenameHandler( const wxChar *oldHandlerName , const wxC struct wxGenericPropertyAccessor::wxGenericPropertyAccessorInternal { - char filler ; -} ; + char filler; +}; wxGenericPropertyAccessor::wxGenericPropertyAccessor( const wxString& propertyName ) -: wxPropertyAccessor( NULL , NULL , NULL , NULL ) +: wxPropertyAccessor( NULL, NULL, NULL, NULL ) { - m_data = new wxGenericPropertyAccessorInternal ; - m_propertyName = propertyName ; - m_getterName = wxT("Get")+propertyName ; - m_setterName = wxT("Set")+propertyName ; + m_data = new wxGenericPropertyAccessorInternal; + m_propertyName = propertyName; + m_getterName = wxT("Get")+propertyName; + m_setterName = wxT("Set")+propertyName; } wxGenericPropertyAccessor::~wxGenericPropertyAccessor() { - delete m_data ; + delete m_data; } -void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxxVariant &value) const + +void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxAny &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 ) ; + wxDynamicObject* dynobj = wx_dynamic_cast(wxDynamicObject*, object); + wxASSERT_MSG( dynobj, wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ); + dynobj->SetProperty(m_propertyName.c_str(), value ); } -void wxGenericPropertyAccessor::GetProperty(const wxObject *object, wxxVariant& value) const +void wxGenericPropertyAccessor::GetProperty(const wxObject *object, wxAny& 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 ) ; + const wxDynamicObject* dynobj = wx_dynamic_cast( const wxDynamicObject * , object ); + wxASSERT_MSG( dynobj, wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ); + value = dynobj->GetProperty( m_propertyName.c_str() ); } -#endif + +// ---------------------------------------------------------------------------- +// wxGenericPropertyAccessor +// ---------------------------------------------------------------------------- + +wxString wxAnyGetAsString( const wxAny& data) +{ + if ( data.IsNull() || data.GetTypeInfo()==NULL ) + return wxEmptyString; + + wxString s; + data.GetTypeInfo()->ConvertToString(data,s); + return s; +} + +const wxObject* wxAnyGetAsObjectPtr( const wxAny& data) +{ + if ( !data.IsNull() ) + { + const wxClassTypeInfo* ti = wx_dynamic_cast(const wxClassTypeInfo*, data.GetTypeInfo()); + if( ti ) + return ti->GetClassInfo()->AnyToObjectPtr(data); + } + return NULL; +} + +wxObjectFunctor::~wxObjectFunctor() +{}; + +#endif // wxUSE_EXTENDED_RTTI