X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d1d738f18c7dbcc58604b6f3ba73ceebef656dc2..8347b97ada3561260d499f322902cbc24c566b2c:/src/common/xti.cpp diff --git a/src/common/xti.cpp b/src/common/xti.cpp index d9c0b019c5..b6596338db 100644 --- a/src/common/xti.cpp +++ b/src/common/xti.cpp @@ -10,7 +10,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "xti.h" #endif @@ -22,16 +22,24 @@ #endif #ifndef WX_PRECOMP - #include "wx/hash.h" - #include "wx/object.h" +#include "wx/hash.h" +#include "wx/object.h" #endif +#if wxUSE_EXTENDED_RTTI + +#include "wx/xti.h" #include "wx/xml/xml.h" #include "wx/tokenzr.h" - +#include "wx/list.h" #include -#if wxUSE_EXTENDED_RTTI +#include "wx/beforestd.h" +#include +#include +#include "wx/afterstd.h" + +using namespace std ; // ---------------------------------------------------------------------------- // Enum Support @@ -39,36 +47,36 @@ 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) { 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 (!strcmp(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 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 (!strcmp(name, m_members[i].m_name)) + { + return m_members[i].m_value; + } + } return 0 ; } @@ -76,561 +84,611 @@ const wxChar *wxEnumData::GetEnumMemberName(int value) { 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 wxT("") ; } int wxEnumData::GetEnumMemberValueByIndex( int idx ) { - // 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 ) { - // 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 ; } // ---------------------------------------------------------------------------- // Type Information // ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// value streaming +// ---------------------------------------------------------------------------- -template<> const wxTypeInfo* wxGetTypeInfo( void * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; -} +// streamer specializations +// for all built-in types -template<> const wxTypeInfo* wxGetTypeInfo( bool * ) +// bool + +template<> void wxStringReadValue(const wxString &s , bool &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_BOOL ) ; - return &s_typeInfo ; + int intdata ; + wxSscanf(s, _T("%d"), &intdata ) ; + data = bool(intdata) ; } -template<> const wxTypeInfo* wxGetTypeInfo( char * ) +template<> void wxStringWriteValue(wxString &s , const bool &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR ) ; - return &s_typeInfo ; + s = wxString::Format("%d", data ) ; } -template<> const wxTypeInfo* wxGetTypeInfo( unsigned char * ) +// char + +template<> void wxStringReadValue(const wxString &s , char &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR ) ; - return &s_typeInfo ; + int intdata ; + wxSscanf(s, _T("%d"), &intdata ) ; + data = char(intdata) ; } -template<> const wxTypeInfo* wxGetTypeInfo( int * ) +template<> void wxStringWriteValue(wxString &s , const char &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR ) ; - return &s_typeInfo ; + s = wxString::Format("%d", data ) ; } -template<> const wxTypeInfo* wxGetTypeInfo( unsigned int * ) +// unsigned char + +template<> void wxStringReadValue(const wxString &s , unsigned char &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR ) ; - return &s_typeInfo ; + int intdata ; + wxSscanf(s, _T("%d"), &intdata ) ; + data = (unsigned char)(intdata) ; } -template<> const wxTypeInfo* wxGetTypeInfo( long * ) +template<> void wxStringWriteValue(wxString &s , const unsigned char &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR ) ; - return &s_typeInfo ; + s = wxString::Format("%d", data ) ; } -template<> const wxTypeInfo* wxGetTypeInfo( unsigned long * ) +// int + +template<> void wxStringReadValue(const wxString &s , int &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR ) ; - return &s_typeInfo ; + wxSscanf(s, _T("%d"), &data ) ; } -template<> const wxTypeInfo* wxGetTypeInfo( float * ) +template<> void wxStringWriteValue(wxString &s , const int &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_FLOAT ) ; - return &s_typeInfo ; + s = wxString::Format("%d", data ) ; } -template<> const wxTypeInfo* wxGetTypeInfo( double * ) +// unsigned int + +template<> void wxStringReadValue(const wxString &s , unsigned int &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_DOUBLE ) ; - return &s_typeInfo ; + wxSscanf(s, _T("%d"), &data ) ; } -template<> const wxTypeInfo* wxGetTypeInfo( wxString * ) +template<> void wxStringWriteValue(wxString &s , const unsigned int &data ) { - static wxBuiltInTypeInfo s_typeInfo( wxT_STRING ) ; - return &s_typeInfo ; + s = wxString::Format("%d", data ) ; } -// this are compiler induced specialization which are never used anywhere - -// char const * +// long -template<> const wxTypeInfo* wxGetTypeInfo( char const ** ) +template<> void wxStringReadValue(const wxString &s , long &data ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + wxSscanf(s, _T("%ld"), &data ) ; } -template<> void wxStringReadValue(const wxString & , const char* & ) +template<> void wxStringWriteValue(wxString &s , const long &data ) { - assert(0) ; + s = wxString::Format("%ld", data ) ; } -template<> void wxStringWriteValue(wxString & , char const * const & ) +// unsigned long + +template<> void wxStringReadValue(const wxString &s , unsigned long &data ) { - assert(0) ; + wxSscanf(s, _T("%ld"), &data ) ; } -// char * - -template<> const wxTypeInfo* wxGetTypeInfo( char ** ) +template<> void wxStringWriteValue(wxString &s , const unsigned long &data ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + s = wxString::Format("%ld", data ) ; } -template<> void wxStringReadValue(const wxString & , char* & ) +// float + +template<> void wxStringReadValue(const wxString &s , float &data ) { - assert(0) ; + wxSscanf(s, _T("%f"), &data ) ; } -template<> void wxStringWriteValue(wxString & , char * const & ) +template<> void wxStringWriteValue(wxString &s , const float &data ) { - assert(0) ; + s = wxString::Format("%f", data ) ; } -// unsigned char * +// double -template<> const wxTypeInfo* wxGetTypeInfo( unsigned char ** ) +template<> void wxStringReadValue(const wxString &s , double &data ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + wxSscanf(s, _T("%lf"), &data ) ; } -template<> void wxStringReadValue(const wxString & , unsigned char* & ) +template<> void wxStringWriteValue(wxString &s , const double &data ) { - assert(0) ; + s = wxString::Format("%lf", data ) ; } -template<> void wxStringWriteValue(wxString & , unsigned char * const & ) +// wxString + +template<> void wxStringReadValue(const wxString &s , wxString &data ) { - assert(0) ; + data = s ; } -// int * - -template<> const wxTypeInfo* wxGetTypeInfo( int ** ) +template<> void wxStringWriteValue(wxString &s , const wxString &data ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + s = data ; } -template<> void wxStringReadValue(const wxString & , int* & ) +// built-ins +// + +template<> const wxTypeInfo* wxGetTypeInfo( void * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; + return &s_typeInfo ; } -template<> void wxStringWriteValue(wxString & , int * const & ) +template<> const wxTypeInfo* wxGetTypeInfo( bool * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_BOOL , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -// bool * - -template<> const wxTypeInfo* wxGetTypeInfo( bool ** ) +template<> const wxTypeInfo* wxGetTypeInfo( char * ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -template<> void wxStringReadValue(const wxString & , bool* & ) +template<> const wxTypeInfo* wxGetTypeInfo( unsigned char * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR , &wxToStringConverter< unsigned char > , &wxFromStringConverter) ; + return &s_typeInfo ; } -template<> void wxStringWriteValue(wxString & , bool * const & ) +template<> const wxTypeInfo* wxGetTypeInfo( int * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -// long * - -template<> const wxTypeInfo* wxGetTypeInfo( long ** ) +template<> const wxTypeInfo* wxGetTypeInfo( unsigned int * ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -template<> void wxStringReadValue(const wxString & , long* & ) +template<> const wxTypeInfo* wxGetTypeInfo( long * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_LONG , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -template<> void wxStringWriteValue(wxString & , long * const & ) +template<> const wxTypeInfo* wxGetTypeInfo( unsigned long * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_ULONG , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -// wxString * - -template<> const wxTypeInfo* wxGetTypeInfo( wxString ** ) +template<> const wxTypeInfo* wxGetTypeInfo( float * ) { - assert(0) ; - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; + static wxBuiltInTypeInfo s_typeInfo( wxT_FLOAT , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -template<> void wxStringReadValue(const wxString & , wxString* & ) +template<> const wxTypeInfo* wxGetTypeInfo( double * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_DOUBLE , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } -template<> void wxStringWriteValue(wxString & , wxString * const & ) +template<> const wxTypeInfo* wxGetTypeInfo( wxString * ) { - assert(0) ; + static wxBuiltInTypeInfo s_typeInfo( wxT_STRING , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; } +// this are compiler induced specialization which are never used anywhere -// ---------------------------------------------------------------------------- -// value streaming -// ---------------------------------------------------------------------------- +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 * ) -// convenience function (avoids including xml headers in users code) +WX_COLLECTION_TYPE_INFO( wxString , wxArrayString ) ; -void wxXmlAddContentToNode( wxXmlNode* node , const wxString& data ) +template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) { - node->AddChild(new wxXmlNode(wxXML_TEXT_NODE, "value", data ) ); + wxArrayCollectionToVariantArray( theArray , value ) ; } -wxString wxXmlGetContentFromNode( wxXmlNode *node ) +wxTypeInfoMap *wxTypeInfo::sm_typeTable = NULL ; + +wxTypeInfo *wxTypeInfo::FindType(const wxChar *typeName) { - if ( node->GetChildren() ) - return node->GetChildren()->GetContent() ; - else - return wxEmptyString ; + return (wxTypeInfo *)sm_typeTable->find(typeName)->second; } -// streamer specializations -// for all built-in types +wxClassTypeInfo::wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to , converterFromString_t from ) : +wxTypeInfo( kind , to , from , classInfo->GetClassName() ) +{ wxASSERT_MSG( kind == wxT_OBJECT_PTR || kind == wxT_OBJECT , wxT("Illegal Kind for Enum Type")) ; m_classInfo = classInfo ;} -// bool +wxDelegateTypeInfo::wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to , converterFromString_t from ) : +wxTypeInfo ( wxT_DELEGATE , to , from , wxEmptyString ) +{ m_eventClass = eventClass ; m_eventType = eventType ;} -template<> void wxStringReadValue(const wxString &s , bool &data ) -{ - int intdata ; - wxSscanf(s, _T("%d"), &intdata ) ; - data = bool(intdata) ; +void wxTypeInfo::Register() +{ + if ( sm_typeTable == NULL ) + sm_typeTable = new wxTypeInfoMap() ; + + if( !m_name.IsEmpty() ) + (*sm_typeTable)[m_name] = this ; } -template<> void wxStringWriteValue(wxString &s , const bool &data ) +void wxTypeInfo::Unregister() { - s = wxString::Format("%d", data ) ; + if( !m_name.IsEmpty() ) + sm_typeTable->erase(m_name); } -// char +// removing header dependancy on string tokenizer -template<> void wxStringReadValue(const wxString &s , char &data ) +void wxSetStringToArray( const wxString &s , wxArrayString &array ) { - int intdata ; - wxSscanf(s, _T("%d"), &intdata ) ; - data = char(intdata) ; + wxStringTokenizer tokenizer(s, wxT("| \t\n"), wxTOKEN_STRTOK); + wxString flag; + array.Clear() ; + while (tokenizer.HasMoreTokens()) + { + array.Add(tokenizer.GetNextToken()) ; + } } -template<> void wxStringWriteValue(wxString &s , const char &data ) +// ---------------------------------------------------------------------------- +// wxClassInfo +// ---------------------------------------------------------------------------- + +const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName) const { - s = wxString::Format("%d", data ) ; -} + const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; -// unsigned char + if ( info ) + return info->GetAccessor() ; -template<> void wxStringReadValue(const wxString &s , unsigned char &data ) -{ - int intdata ; - wxSscanf(s, _T("%d"), &intdata ) ; - data = (unsigned char)(intdata) ; + return NULL ; } -template<> void wxStringWriteValue(wxString &s , const unsigned char &data ) +const wxPropertyInfo *wxClassInfo::FindPropertyInfoInThisClass (const char *PropertyName) const { - s = wxString::Format("%d", data ) ; -} + const wxPropertyInfo* info = GetFirstProperty() ; -// int + while( info ) + { + if ( strcmp( info->GetName() , PropertyName ) == 0 ) + return info ; + info = info->GetNext() ; + } -template<> void wxStringReadValue(const wxString &s , int &data ) -{ - wxSscanf(s, _T("%d"), &data ) ; + return 0; } -template<> void wxStringWriteValue(wxString &s , const int &data ) +const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const char *PropertyName) const { - s = wxString::Format("%d", data ) ; -} + const wxPropertyInfo* info = FindPropertyInfoInThisClass( PropertyName ) ; + if ( info ) + return info ; -// unsigned int + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + if ( ( info = parents[i]->FindPropertyInfo( PropertyName ) ) != NULL ) + return info ; + } -template<> void wxStringReadValue(const wxString &s , unsigned int &data ) -{ - wxSscanf(s, _T("%d"), &data ) ; + return 0; } -template<> void wxStringWriteValue(wxString &s , const unsigned int &data ) +const wxHandlerInfo *wxClassInfo::FindHandlerInfoInThisClass (const char *PropertyName) const { - s = wxString::Format("%d", data ) ; -} + const wxHandlerInfo* info = GetFirstHandler() ; -// long + while( info ) + { + if ( strcmp( info->GetName() , PropertyName ) == 0 ) + return info ; + info = info->GetNext() ; + } -template<> void wxStringReadValue(const wxString &s , long &data ) -{ - wxSscanf(s, _T("%ld"), &data ) ; + return 0; } -template<> void wxStringWriteValue(wxString &s , const long &data ) +const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const char *PropertyName) const { - s = wxString::Format("%ld", data ) ; -} + const wxHandlerInfo* info = FindHandlerInfoInThisClass( PropertyName ) ; -// unsigned long + if ( info ) + return info ; -template<> void wxStringReadValue(const wxString &s , unsigned long &data ) -{ - wxSscanf(s, _T("%ld"), &data ) ; + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + if ( ( info = parents[i]->FindHandlerInfo( PropertyName ) ) != NULL ) + return info ; + } + + return 0; } -template<> void wxStringWriteValue(wxString &s , const unsigned long &data ) +wxObjectStreamingCallback wxClassInfo::GetStreamingCallback() const { - s = wxString::Format("%ld", data ) ; -} + if ( m_streamingCallback ) + return m_streamingCallback ; -// float + wxObjectStreamingCallback retval = NULL ; + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] && retval == NULL ; ++ i ) + { + retval = parents[i]->GetStreamingCallback() ; + } + return retval ; +} -template<> void wxStringReadValue(const wxString &s , float &data ) +bool wxClassInfo::BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const { - wxSscanf(s, _T("%f"), &data ) ; + wxObjectStreamingCallback sb = GetStreamingCallback() ; + if ( sb ) + return (*sb)(obj , streamer , persister , metadata ) ; + + return true ; } -template<> void wxStringWriteValue(wxString &s , const float &data ) +void wxClassInfo::SetProperty(wxObject *object, const char *propertyName, const wxxVariant &value) const { - s = wxString::Format("%f", data ) ; -} + const wxPropertyAccessor *accessor; -// double + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasSetter()); + accessor->SetProperty( object , value ) ; +} -template<> void wxStringReadValue(const wxString &s , double &data ) +wxxVariant wxClassInfo::GetProperty(wxObject *object, const char *propertyName) const { - wxSscanf(s, _T("%lf"), &data ) ; + const wxPropertyAccessor *accessor; + + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasGetter()); + wxxVariant result ; + accessor->GetProperty(object,result); + return result ; } -template<> void wxStringWriteValue(wxString &s , const double &data ) +wxxVariantArray wxClassInfo::GetPropertyCollection(wxObject *object, const wxChar *propertyName) const { - s = wxString::Format("%lf", data ) ; -} + const wxPropertyAccessor *accessor; -// wxString + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasGetter()); + wxxVariantArray result ; + accessor->GetPropertyCollection(object,result); + return result ; +} -template<> void wxStringReadValue(const wxString &s , wxString &data ) +void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const { - data = s ; + const wxPropertyAccessor *accessor; + + accessor = FindAccessor(propertyName); + wxASSERT(accessor->HasAdder()); + accessor->AddToPropertyCollection( object , value ) ; } -template<> void wxStringWriteValue(wxString &s , const wxString &data ) +void wxClassInfo::GetProperties( wxPropertyInfoMap &map ) const { - s = data ; + const wxPropertyInfo *pi = GetFirstProperty() ; + while( pi ) + { + if ( map.find( pi->GetName() ) == map.end() ) + map[pi->GetName()] = (wxPropertyInfo*) pi ; + + pi = pi->GetNext() ; + } + + const wxClassInfo** parents = GetParents() ; + for ( int i = 0 ; parents[i] ; ++ i ) + { + parents[i]->GetProperties( map ) ; + } } /* - 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 +VARIANT TO OBJECT */ -// wxPoint +wxObject* wxxVariant::GetAsObject() +{ + const wxClassTypeInfo *ti = dynamic_cast( 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 +{ + map m_properties ; +} ; -template<> void wxStringReadValue(const wxString &s , wxPoint &data ) +// instantiates this object with an instance of its superclass +wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) { - wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ; + m_superClassInstance = superClassInstance ; + m_classInfo = info ; + m_data = new wxDynamicObjectInternal ; } -template<> void wxStringWriteValue(wxString &s , const wxPoint &data ) +wxDynamicObject::~wxDynamicObject() { - s = wxString::Format("%d,%d", data.x , data.y ) ; + delete m_data ; + delete m_superClassInstance ; } -template<> void wxStringReadValue(const wxString & , wxPoint* & ) +void wxDynamicObject::SetProperty (const wxChar *propertyName, const wxxVariant &value) { - assert(0) ; + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; + m_data->m_properties[propertyName] = value ; } -template<> void wxStringWriteValue(wxString & , wxPoint* const & ) +wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const { - assert(0) ; + wxASSERT_MSG(m_classInfo->FindPropertyInfoInThisClass(propertyName),wxT("Accessing Unknown Property in a Dynamic Object") ) ; + return m_data->m_properties[propertyName] ; } -WX_CUSTOM_TYPE_INFO(wxPoint) +// ---------------------------------------------------------------------------- +// wxDynamiClassInfo +// ---------------------------------------------------------------------------- -template<> void wxStringReadValue(const wxString &s , wxSize &data ) +wxDynamicClassInfo::wxDynamicClassInfo( const wxChar *unitName, const wxChar *className , const wxClassInfo* superClass ) : +wxClassInfo( unitName, className , new const wxClassInfo*[2]) { - wxSscanf(s, _T("%d,%d"), &data.x , &data.y ) ; + GetParents()[0] = superClass ; + GetParents()[1] = NULL ; } -template<> void wxStringWriteValue(wxString &s , const wxSize &data ) +wxDynamicClassInfo::~wxDynamicClassInfo() { - s = wxString::Format("%d,%d", data.x , data.y ) ; + delete[] GetParents() ; } -template<> void wxStringReadValue(const wxString & , wxSize* & ) +wxObject *wxDynamicClassInfo::AllocateObject() const { - assert(0) ; + wxObject* parent = GetParents()[0]->AllocateObject() ; + return new wxDynamicObject( parent , this ) ; } -template<> void wxStringWriteValue(wxString & , wxSize * const & ) +void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *params) const { - assert(0) ; + 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 ) ; } -WX_CUSTOM_TYPE_INFO(wxSize) - -/* - -template<> void wxStringReadValue(const wxString &s , wxColour &data ) +// get number of parameters for constructor +int wxDynamicClassInfo::GetCreateParamCount() const { - // copied from VS xrc - unsigned long tmp = 0; - - 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))); - } + return GetParents()[0]->GetCreateParamCount() ; } -template<> void wxStringWriteValue(wxString &s , const wxColour &data ) +// get i-th constructor parameter +const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const { - s = wxString::Format("#%2X%2X%2X", data.Red() , data.Green() , data.Blue() ) ; + return GetParents()[0]->GetCreateParamName( i ) ; } -WX_CUSTOM_TYPE_INFO(wxColour) - -*/ - -// removing header dependancy on string tokenizer - -void wxSetStringToArray( const wxString &s , wxArrayString &array ) +void wxDynamicClassInfo::SetProperty(wxObject *object, const char *propertyName, const wxxVariant &value) const { - wxStringTokenizer tokenizer(s, wxT("| \t\n"), wxTOKEN_STRTOK); - wxString flag; - array.Clear() ; - while (tokenizer.HasMoreTokens()) - { - array.Add(tokenizer.GetNextToken()) ; - } + 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 ) ; } -// ---------------------------------------------------------------------------- -// wxClassInfo -// ---------------------------------------------------------------------------- - -const wxPropertyAccessor *wxClassInfo::FindAccessor(const char *PropertyName) +wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const char *propertyName) const { - const wxPropertyInfo* info = FindPropertyInfo( PropertyName ) ; - - if ( info ) - return info->GetAccessor() ; - - return NULL ; + 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 ) ; } -const wxPropertyInfo *wxClassInfo::FindPropertyInfo (const char *PropertyName) const +void wxDynamicClassInfo::AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo ) { - const wxPropertyInfo* info = GetFirstProperty() ; - - while( info ) - { - if ( strcmp( info->GetName() , PropertyName ) == 0 ) - return info ; - info = info->GetNext() ; - } - - const wxClassInfo** parents = GetParents() ; - for ( int i = 0 ; parents[i] ; ++ i ) - { - if ( ( info = parents[i]->FindPropertyInfo( PropertyName ) ) != NULL ) - return info ; - } - - return 0; + new wxPropertyInfo( m_firstProperty , this , propertyName , typeInfo , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ; } -const wxHandlerInfo *wxClassInfo::FindHandlerInfo (const char *PropertyName) const +void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo ) { - const wxHandlerInfo* info = GetFirstHandler() ; - - while( info ) - { - if ( strcmp( info->GetName() , PropertyName ) == 0 ) - return info ; - info = info->GetNext() ; - } + new wxHandlerInfo( m_firstHandler , handlerName , address , eventClassInfo ) ; +} - const wxClassInfo** parents = GetParents() ; - for ( int i = 0 ; parents[i] ; ++ i ) - { - if ( ( info = parents[i]->FindHandlerInfo( PropertyName ) ) != NULL ) - return info ; - } +// removes an existing runtime-property +void wxDynamicClassInfo::RemoveProperty( const wxChar *propertyName ) +{ +} - return 0; +// removes an existing runtime-handler +void wxDynamicClassInfo::RemoveHandler( const wxChar *handlerName ) +{ } +// ---------------------------------------------------------------------------- +// wxGenericPropertyAccessor +// ---------------------------------------------------------------------------- -void wxClassInfo::SetProperty(wxObject *object, const char *propertyName, const wxxVariant &value) +struct wxGenericPropertyAccessor::wxGenericPropertyAccessorInternal { - const wxPropertyAccessor *accessor; + char filler ; +} ; - accessor = FindAccessor(propertyName); - wxASSERT(accessor->HasSetter()); - accessor->SetProperty( object , value ) ; +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 ; } -wxxVariant wxClassInfo::GetProperty(wxObject *object, const char *propertyName) +wxGenericPropertyAccessor::~wxGenericPropertyAccessor() { - const wxPropertyAccessor *accessor; - - accessor = FindAccessor(propertyName); - wxASSERT(accessor->HasGetter()); - return accessor->GetProperty(object); + delete m_data ; } - -/* -VARIANT TO OBJECT -*/ - -wxObject* wxxVariant::GetAsObject() +void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxxVariant &value) const { - const wxClassTypeInfo *ti = dynamic_cast( m_data->GetTypeInfo() ) ; - if ( ti ) - return ti->GetClassInfo()->VariantToInstance(*this) ; - else - return NULL ; + 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