X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b8d5be011d6d7e9aaf493eb8f5e21960d22b2a8f..8bd37efca7eb0de7cdf72167e138f9cabd9b6750:/src/common/xti.cpp diff --git a/src/common/xti.cpp b/src/common/xti.cpp index c3b5bef7d2..04e166170d 100644 --- a/src/common/xti.cpp +++ b/src/common/xti.cpp @@ -10,33 +10,30 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "xti.h" -#endif - // For compilers that support precompilation, includes "wx.h". #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/list.h" + #include "wx/hash.h" #endif +#include "wx/xti.h" #include "wx/xml/xml.h" #include "wx/tokenzr.h" -#include "wx/notebook.h" -#include "wx/list.h" #include -#if wxUSE_EXTENDED_RTTI - #include "wx/beforestd.h" #include #include +#include #include "wx/afterstd.h" using namespace std ; @@ -47,59 +44,59 @@ using namespace std ; wxEnumData::wxEnumData( wxEnumMemberData* data ) { - m_members = data ; + m_members = data ; for ( m_count = 0; m_members[m_count].m_name ; m_count++) - {} ; + {} ; } -bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) +bool wxEnumData::HasEnumMemberValue(const wxChar *name, int *value) const { int i; for (i = 0; m_members[i].m_name ; i++ ) - { - if (!strcmp(name, m_members[i].m_name)) - { - if ( value ) - *value = m_members[i].m_value; - return true ; - } - } - return false ; + { + if (!wxStrcmp(name, m_members[i].m_name)) + { + if ( value ) + *value = m_members[i].m_value; + return true ; + } + } + return false ; } -int wxEnumData::GetEnumMemberValue(const wxChar *name) +int wxEnumData::GetEnumMemberValue(const wxChar *name) const { int i; for (i = 0; m_members[i].m_name ; i++ ) - { - if (!strcmp(name, m_members[i].m_name)) - { - return m_members[i].m_value; - } - } + { + if (!wxStrcmp(name, m_members[i].m_name)) + { + return m_members[i].m_value; + } + } return 0 ; } -const wxChar *wxEnumData::GetEnumMemberName(int value) +const wxChar *wxEnumData::GetEnumMemberName(int value) const { int i; for (i = 0; m_members[i].m_name ; i++) - if (value == m_members[i].m_value) - return m_members[i].m_name; + if (value == m_members[i].m_value) + return m_members[i].m_name; - return wxT("") ; + return wxEmptyString ; } -int wxEnumData::GetEnumMemberValueByIndex( int idx ) +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 ; + // we should cache the count in order to avoid out-of-bounds errors + return m_members[idx].m_value ; } -const char * wxEnumData::GetEnumMemberNameByIndex( int idx ) +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 ; + // we should cache the count in order to avoid out-of-bounds errors + return m_members[idx].m_name ; } // ---------------------------------------------------------------------------- @@ -116,404 +113,382 @@ const char * wxEnumData::GetEnumMemberNameByIndex( int idx ) 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 ; } template<> void wxStringWriteValue(wxString &s , const bool &data ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // char 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 ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // unsigned char 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 ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // int 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 ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // unsigned int 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 ) { - s = wxString::Format("%d", data ) ; + s = wxString::Format(_T("%d"), data ) ; } // long 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 ) { - s = wxString::Format("%ld", data ) ; + s = wxString::Format(_T("%ld"), data ) ; } // unsigned long template<> void wxStringReadValue(const wxString &s , unsigned long &data ) { - wxSscanf(s, _T("%ld"), &data ) ; + wxSscanf(s, _T("%ld"), &data ) ; } template<> void wxStringWriteValue(wxString &s , const unsigned long &data ) { - s = wxString::Format("%ld", data ) ; + s = wxString::Format(_T("%ld"), data ) ; } // float 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 ) { - s = wxString::Format("%f", data ) ; + s = wxString::Format(_T("%f"), data ) ; } // double 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 ) { - s = wxString::Format("%lf", data ) ; + s = wxString::Format(_T("%lf"), data ) ; } // wxString template<> void wxStringReadValue(const wxString &s , wxString &data ) { - data = s ; + data = s ; } template<> void wxStringWriteValue(wxString &s , const wxString &data ) { - s = data ; -} - -/* - Custom Data Streaming / Type Infos - we will have to add this for all wx non object types, but it is also an example - for custom data structures -*/ - -// wxPoint - -template<> void wxStringReadValue(const wxString &s , wxPoint &data ) -{ - wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ; -} - -template<> void wxStringWriteValue(wxString &s , const wxPoint &data ) -{ - s = wxString::Format("%d,%d", data.x , data.y ) ; -} - -template<> void wxStringReadValue(const wxString & , wxPoint* & ) -{ - assert(0) ; -} - -template<> void wxStringWriteValue(wxString & , wxPoint* const & ) -{ - assert(0) ; -} - -WX_CUSTOM_TYPE_INFO(wxPoint) - -template<> void wxStringReadValue(const wxString &s , wxSize &data ) -{ - wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ; -} - -template<> void wxStringWriteValue(wxString &s , const wxSize &data ) -{ - s = wxString::Format("%d,%d", data.x , data.y ) ; -} - -template<> void wxStringReadValue(const wxString & , wxSize* & ) -{ - assert(0) ; -} - -template<> void wxStringWriteValue(wxString & , wxSize * const & ) -{ - assert(0) ; -} - -WX_CUSTOM_TYPE_INFO(wxSize) - - -template<> const wxTypeInfo* wxGetTypeInfo( void * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + s = data ; } -template<> const wxTypeInfo* wxGetTypeInfo( bool * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_BOOL , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( char * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} +// built-ins +// -template<> const wxTypeInfo* wxGetTypeInfo( unsigned char * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR , &wxToStringConverter< unsigned char > , &wxFromStringConverter) ; - return &s_typeInfo ; -} +#if wxUSE_FUNC_TEMPLATE_POINTER +#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()) ; +#endif -template<> const wxTypeInfo* wxGetTypeInfo( int * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} +typedef unsigned char unsigned_char; +typedef unsigned int unsigned_int; +typedef unsigned long unsigned_long; -template<> const wxTypeInfo* wxGetTypeInfo( unsigned int * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} +wxBuiltInTypeInfo s_typeInfovoid( wxT_VOID , NULL , NULL , typeid(void).name()); +wxBUILTIN_TYPE_INFO( wxT_BOOL , bool); +wxBUILTIN_TYPE_INFO( wxT_CHAR , char); +wxBUILTIN_TYPE_INFO( wxT_UCHAR , unsigned_char); +wxBUILTIN_TYPE_INFO( wxT_INT , int); +wxBUILTIN_TYPE_INFO( wxT_UINT , unsigned_int); +wxBUILTIN_TYPE_INFO( wxT_LONG , long); +wxBUILTIN_TYPE_INFO( wxT_ULONG , unsigned_long); +wxBUILTIN_TYPE_INFO( wxT_FLOAT , float); +wxBUILTIN_TYPE_INFO( wxT_DOUBLE , double); +wxBUILTIN_TYPE_INFO( wxT_STRING , wxString); -template<> const wxTypeInfo* wxGetTypeInfo( long * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_LONG , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} -template<> const wxTypeInfo* wxGetTypeInfo( unsigned long * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_ULONG , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} +// this are compiler induced specialization which are never used anywhere -template<> const wxTypeInfo* wxGetTypeInfo( float * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_FLOAT , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} +wxILLEGAL_TYPE_SPECIALIZATION( char const * ) +wxILLEGAL_TYPE_SPECIALIZATION( char * ) +wxILLEGAL_TYPE_SPECIALIZATION( unsigned char * ) +wxILLEGAL_TYPE_SPECIALIZATION( int * ) +wxILLEGAL_TYPE_SPECIALIZATION( bool * ) +wxILLEGAL_TYPE_SPECIALIZATION( long * ) +wxILLEGAL_TYPE_SPECIALIZATION( wxString * ) -template<> const wxTypeInfo* wxGetTypeInfo( double * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_DOUBLE , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; -} +wxCOLLECTION_TYPE_INFO( wxString , wxArrayString ) ; -template<> const wxTypeInfo* wxGetTypeInfo( wxString * ) +template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) { - static wxBuiltInTypeInfo s_typeInfo( wxT_STRING , &wxToStringConverter , &wxFromStringConverter) ; - return &s_typeInfo ; + wxArrayCollectionToVariantArray( theArray , value ) ; } -// this are compiler induced specialization which are never used anywhere - -WX_ILLEGAL_TYPE_SPECIALIZATION( char const * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( char * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( unsigned char * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( int * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( bool * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( long * ) -WX_ILLEGAL_TYPE_SPECIALIZATION( wxString * ) - -// - -// make wxWindowList known +wxTypeInfoMap *wxTypeInfo::ms_typeTable = NULL ; -template<> const wxTypeInfo* wxGetTypeInfo( wxArrayString * ) +wxTypeInfo *wxTypeInfo::FindType(const wxChar *typeName) { - static wxCollectionTypeInfo s_typeInfo( (wxTypeInfo*) wxGetTypeInfo( (wxString *) NULL) ) ; - return &s_typeInfo ; + 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; } -template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) -{ - 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 +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 ;} +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 ;} -/* +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; } -template<> void wxStringReadValue(const wxString &s , wxColour &data ) +void wxTypeInfo::Register() { - // copied from VS xrc - unsigned long tmp = 0; + if ( ms_typeTable == NULL ) + ms_typeTable = new wxTypeInfoMap() ; - if (s.Length() != 7 || s[0u] != wxT('#') || - wxSscanf(s.c_str(), wxT("#%lX"), &tmp) != 1) - { - wxLogError(_("String To Colour : Incorrect colour specification : %s"), - s.c_str() ); - data = wxNullColour; - } - else - { - data = wxColour((unsigned char) ((tmp & 0xFF0000) >> 16) , - (unsigned char) ((tmp & 0x00FF00) >> 8), - (unsigned char) ((tmp & 0x0000FF))); - } + if( !m_name.empty() ) + (*ms_typeTable)[m_name] = this ; } -template<> void wxStringWriteValue(wxString &s , const wxColour &data ) +void wxTypeInfo::Unregister() { - s = wxString::Format("#%2X%2X%2X", data.Red() , data.Green() , data.Blue() ) ; + if( !m_name.empty() ) + ms_typeTable->erase(m_name); } -WX_CUSTOM_TYPE_INFO(wxColour) - -*/ - // removing header dependancy on string tokenizer 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 // ---------------------------------------------------------------------------- -const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName) const +wxPropertyInfo::~wxPropertyInfo() +{ + if ( this == m_itsClass->m_firstProperty ) + { + m_itsClass->m_firstProperty = m_next; + } + else + { + wxPropertyInfo *info = m_itsClass->m_firstProperty; + while (info) + { + if ( info->m_next == this ) + { + info->m_next = m_next; + break; + } + + info = info->m_next; + } + } +} + +wxHandlerInfo::~wxHandlerInfo() +{ + if ( this == m_itsClass->m_firstHandler ) + { + m_itsClass->m_firstHandler = m_next; + } + else + { + wxHandlerInfo *info = m_itsClass->m_firstHandler; + while (info) + { + if ( info->m_next == this ) + { + info->m_next = m_next; + break; + } + + info = info->m_next; + } + } +} + +const wxPropertyAccessor *wxClassInfo::FindAccessor(const wxChar *PropertyName) const { const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; - if ( info ) - return info->GetAccessor() ; + if ( info ) + return info->GetAccessor() ; - return NULL ; + return NULL ; } -const wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const char *PropertyName) const +wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const wxChar *PropertyName) const { - const wxPropertyInfo* info = GetFirstProperty() ; + wxPropertyInfo* info = m_firstProperty ; - while( info ) - { - if ( strcmp( info->GetName() , PropertyName ) == 0 ) - return info ; - info = info->GetNext() ; - } + while( info ) + { + if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) + return info ; + info = info->GetNext() ; + } return 0; } -const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const char *PropertyName) const +const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const wxChar *PropertyName) const { - const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ) ; + 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 ; - } + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + if ( ( info = parents[i]->FindPropertyInfo( PropertyName ) ) != NULL ) + return info ; + } return 0; } -const wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const char *PropertyName) const +wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const wxChar *PropertyName) const { - const wxHandlerInfo* info = GetFirstHandler() ; + wxHandlerInfo* info = m_firstHandler ; - while( info ) - { - if ( strcmp( info->GetName() , PropertyName ) == 0 ) - return info ; - info = info->GetNext() ; - } + while( info ) + { + if ( wxStrcmp( info->GetName() , PropertyName ) == 0 ) + return info ; + info = info->GetNext() ; + } return 0; } -const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const char *PropertyName) const +const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const wxChar *PropertyName) const { - const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ) ; + 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 ; - } + 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 char *propertyName, const wxxVariant &value) const +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 ) ; + accessor->SetProperty( object , value ) ; } -wxxVariant wxClassInfo::GetProperty(wxObject *object, const char *propertyName) const +wxxVariant wxClassInfo::GetProperty(wxObject *object, const wxChar *propertyName) const { const wxPropertyAccessor *accessor; @@ -544,17 +519,38 @@ void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *proper 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( m_data->GetTypeInfo() ) ; - if ( ti ) - return ti->GetClassInfo()->VariantToInstance(*this) ; - else - return NULL ; + const wxClassTypeInfo *ti = dynamic_cast( m_data->GetTypeInfo() ) ; + if ( ti ) + return ti->GetClassInfo()->VariantToInstance(*this) ; + else + return NULL ; } // ---------------------------------------------------------------------------- @@ -567,7 +563,20 @@ wxObject* wxxVariant::GetAsObject() struct wxDynamicObject::wxDynamicObjectInternal { + wxDynamicObjectInternal() {} + +#if wxUSE_UNICODE + map m_properties ; +#else map m_properties ; +#endif +} ; + +typedef list< wxDynamicObject* > wxDynamicObjectList ; + +struct wxDynamicClassInfo::wxDynamicClassInfoInternal +{ + wxDynamicObjectList m_dynamicObjects ; } ; // instantiates this object with an instance of its superclass @@ -580,6 +589,7 @@ wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicCl wxDynamicObject::~wxDynamicObject() { + dynamic_cast(m_classInfo)->m_data->m_dynamicObjects.remove( this ) ; delete m_data ; delete m_superClassInstance ; } @@ -592,30 +602,49 @@ void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxxVariant 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] ; + 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]) +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() ; - return new wxDynamicObject( parent , this ) ; + 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 @@ -637,7 +666,7 @@ const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const return GetParents()[0]->GetCreateParamName( i ) ; } -void wxDynamicClassInfo::SetProperty(wxObject *object, const char *propertyName, const wxxVariant &value) const +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") ) ; @@ -647,7 +676,7 @@ void wxDynamicClassInfo::SetProperty(wxObject *object, const char *propertyName, GetParents()[0]->SetProperty( dynobj->GetSuperClassInstance() , propertyName , value ) ; } -wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const char *propertyName) const +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") ) ; @@ -659,12 +688,44 @@ wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const char *propert void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo ) { - new wxPropertyInfo( m_firstProperty , propertyName , typeInfo , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ; + 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 , handlerName , address , 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(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 ; } // ---------------------------------------------------------------------------- @@ -702,4 +763,5 @@ void wxGenericPropertyAccessor::GetProperty(const wxObject *object, wxxVariant& wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; value = dynobj->GetProperty( m_propertyName ) ; } -#endif + +#endif // wxUSE_EXTENDED_RTTI