From b8d5be011d6d7e9aaf493eb8f5e21960d22b2a8f Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Tue, 19 Aug 2003 16:40:20 +0000 Subject: [PATCH] XTI extensions git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23023 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/ctrlsub.cpp | 9 ++ src/common/xti.cpp | 239 +++++++++++++++++++++-------------------- src/common/xtistrm.cpp | 19 ++-- 3 files changed, 143 insertions(+), 124 deletions(-) diff --git a/src/common/ctrlsub.cpp b/src/common/ctrlsub.cpp index 9a7ec228e3..03be03f3dc 100644 --- a/src/common/ctrlsub.cpp +++ b/src/common/ctrlsub.cpp @@ -58,6 +58,15 @@ wxString wxItemContainer::GetStringSelection() const return s; } +wxArrayString wxItemContainer::GetStrings() const +{ + wxArrayString result ; + size_t count = GetCount() ; + for ( size_t n = 0 ; n < count ; n++ ) + result.Add(GetString(n)); + return result ; +} + // ---------------------------------------------------------------------------- // appending items // ---------------------------------------------------------------------------- diff --git a/src/common/xti.cpp b/src/common/xti.cpp index 38ed197501..c3b5bef7d2 100644 --- a/src/common/xti.cpp +++ b/src/common/xti.cpp @@ -28,7 +28,8 @@ #include "wx/xml/xml.h" #include "wx/tokenzr.h" - +#include "wx/notebook.h" +#include "wx/list.h" #include #if wxUSE_EXTENDED_RTTI @@ -104,89 +105,6 @@ const char * wxEnumData::GetEnumMemberNameByIndex( int idx ) // ---------------------------------------------------------------------------- // Type Information // ---------------------------------------------------------------------------- - -template<> const wxTypeInfo* wxGetTypeInfo( void * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( bool * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_BOOL ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( char * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( unsigned char * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( int * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( unsigned int * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( long * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( unsigned long * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( float * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_FLOAT ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( double * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_DOUBLE ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( wxString * ) -{ - static wxBuiltInTypeInfo s_typeInfo( wxT_STRING ) ; - return &s_typeInfo ; -} - -template<> const wxTypeInfo* wxGetTypeInfo( wxWindowList * ) -{ - static wxCollectionTypeInfo s_typeInfo( (wxTypeInfo*) wxGetTypeInfo( (wxWindow **) NULL) ) ; - return &s_typeInfo ; -} - -// 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 * ) - // ---------------------------------------------------------------------------- // value streaming // ---------------------------------------------------------------------------- @@ -372,6 +290,100 @@ template<> void wxStringWriteValue(wxString & , wxSize * const & ) WX_CUSTOM_TYPE_INFO(wxSize) + +template<> const wxTypeInfo* wxGetTypeInfo( void * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_VOID ) ; + return &s_typeInfo ; +} + +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 ; +} + +template<> const wxTypeInfo* wxGetTypeInfo( unsigned char * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR , &wxToStringConverter< unsigned char > , &wxFromStringConverter) ; + return &s_typeInfo ; +} + +template<> const wxTypeInfo* wxGetTypeInfo( int * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_CHAR , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; +} + +template<> const wxTypeInfo* wxGetTypeInfo( unsigned int * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_UCHAR , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; +} + +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 ; +} + +template<> const wxTypeInfo* wxGetTypeInfo( float * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_FLOAT , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; +} + +template<> const wxTypeInfo* wxGetTypeInfo( double * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_DOUBLE , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; +} + +template<> const wxTypeInfo* wxGetTypeInfo( wxString * ) +{ + static wxBuiltInTypeInfo s_typeInfo( wxT_STRING , &wxToStringConverter , &wxFromStringConverter) ; + return &s_typeInfo ; +} + +// 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 + +template<> const wxTypeInfo* wxGetTypeInfo( wxArrayString * ) +{ + static wxCollectionTypeInfo s_typeInfo( (wxTypeInfo*) wxGetTypeInfo( (wxString *) NULL) ) ; + return &s_typeInfo ; +} + +template<> void wxCollectionToVariantArray( wxArrayString const &theArray, wxxVariantArray &value) +{ + wxArrayCollectionToVariantArray( theArray , value ) ; +} + + + /* template<> void wxStringReadValue(const wxString &s , wxColour &data ) @@ -507,19 +519,23 @@ wxxVariant wxClassInfo::GetProperty(wxObject *object, const char *propertyName) accessor = FindAccessor(propertyName); wxASSERT(accessor->HasGetter()); - return accessor->GetProperty(object); + wxxVariant result ; + accessor->GetProperty(object,result); + return result ; } -wxxVariantArray wxClassInfo::GetPropertyCollection(wxObject *object, const wxChar *propertyName) const +wxxVariantArray wxClassInfo::GetPropertyCollection(wxObject *object, const wxChar *propertyName) const { const wxPropertyAccessor *accessor; accessor = FindAccessor(propertyName); wxASSERT(accessor->HasGetter()); - return accessor->GetPropertyCollection(object); + wxxVariantArray result ; + accessor->GetPropertyCollection(object,result); + return result ; } -void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const +void wxClassInfo::AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const { const wxPropertyAccessor *accessor; @@ -555,7 +571,7 @@ struct wxDynamicObject::wxDynamicObjectInternal } ; // instantiates this object with an instance of its superclass -wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) +wxDynamicObject::wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) { m_superClassInstance = superClassInstance ; m_classInfo = info ; @@ -585,7 +601,7 @@ wxxVariant wxDynamicObject::GetProperty (const wxChar *propertyName) const // ---------------------------------------------------------------------------- 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 ; @@ -596,13 +612,13 @@ wxDynamicClassInfo::~wxDynamicClassInfo() delete[] GetParents() ; } -wxObject *wxDynamicClassInfo::AllocateObject() const +wxObject *wxDynamicClassInfo::AllocateObject() const { wxObject* parent = GetParents()[0]->AllocateObject() ; return new wxDynamicObject( parent , this ) ; } -void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *params) const +void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *params) const { wxDynamicObject *dynobj = dynamic_cast< wxDynamicObject *>( object ) ; wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::Create on an object other than wxDynamicObject") ) ; @@ -610,13 +626,13 @@ void wxDynamicClassInfo::Create (wxObject *object, int paramCount, wxxVariant *p } // get number of parameters for constructor -int wxDynamicClassInfo::GetCreateParamCount() const +int wxDynamicClassInfo::GetCreateParamCount() const { return GetParents()[0]->GetCreateParamCount() ; } // get i-th constructor parameter -const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const +const wxChar* wxDynamicClassInfo::GetCreateParamName(int i) const { return GetParents()[0]->GetCreateParamName( i ) ; } @@ -641,12 +657,12 @@ wxxVariant wxDynamicClassInfo::GetProperty(wxObject *object, const char *propert 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 , propertyName , typeInfo , new wxGenericPropertyAccessor( propertyName ) , wxxVariant() ) ; } -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 , handlerName , address , eventClassInfo ) ; } @@ -657,44 +673,33 @@ void wxDynamicClassInfo::AddHandler( const wxChar *handlerName , wxObjectEventFu struct wxGenericPropertyAccessor::wxGenericPropertyAccessorInternal { - wxString m_propertyName ; + char filler ; } ; -wxGenericPropertyAccessor::wxGenericPropertyAccessor( const wxChar* propertyName ) +wxGenericPropertyAccessor::wxGenericPropertyAccessor( const wxString& propertyName ) +: wxPropertyAccessor( NULL , NULL , NULL , NULL ) { m_data = new wxGenericPropertyAccessorInternal ; - m_data->m_propertyName = propertyName ; + m_propertyName = propertyName ; + m_getterName = wxT("Get")+propertyName ; + m_setterName = wxT("Set")+propertyName ; } wxGenericPropertyAccessor::~wxGenericPropertyAccessor() { delete m_data ; } -void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxxVariant &value) const +void wxGenericPropertyAccessor::SetProperty(wxObject *object, const wxxVariant &value) const { wxDynamicObject* dynobj = dynamic_cast< wxDynamicObject * >( object ) ; wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; - dynobj->SetProperty(m_data->m_propertyName , value ) ; -} - -wxxVariant wxGenericPropertyAccessor::GetProperty(const wxObject *object) const -{ - const wxDynamicObject* dynobj = dynamic_cast< const wxDynamicObject * >( object ) ; - wxASSERT_MSG( dynobj , wxT("cannot call wxDynamicClassInfo::SetProperty on an object other than wxDynamicObject") ) ; - return dynobj->GetProperty( m_data->m_propertyName ) ; + dynobj->SetProperty(m_propertyName , value ) ; } -wxxVariant wxGenericPropertyAccessor::ReadValue( const wxString &value ) const -{ - return wxxVariant(value) ; -} - -void wxGenericPropertyAccessor::WriteValue( wxString& value , const wxObject *object ) const +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") ) ; - wxxVariant val = dynobj->GetProperty( m_data->m_propertyName ) ; - value = val.GetAsString() ; + value = dynobj->GetProperty( m_propertyName ) ; } - #endif diff --git a/src/common/xtistrm.cpp b/src/common/xtistrm.cpp index daf4a12647..10dacef13f 100644 --- a/src/common/xtistrm.cpp +++ b/src/common/xtistrm.cpp @@ -170,7 +170,8 @@ void wxWriter::WriteAllProperties( const wxObject * obj , const wxClassInfo* ci DoBeginWriteProperty( pi ) ; if ( pi->GetTypeInfo()->GetKind() == wxT_COLLECTION ) { - wxxVariantArray data = pi->GetAccessor()->GetPropertyCollection(obj) ; + wxxVariantArray data ; + pi->GetAccessor()->GetPropertyCollection(obj, data) ; const wxTypeInfo * elementType = dynamic_cast< const wxCollectionTypeInfo* >( pi->GetTypeInfo() )->GetElementType() ; for ( size_t i = 0 ; i < data.GetCount() ; ++i ) { @@ -216,7 +217,8 @@ void wxWriter::WriteAllProperties( const wxObject * obj , const wxClassInfo* ci } else { - wxxVariant value = pi->GetAccessor()->GetProperty(obj) ; + wxxVariant value ; + pi->GetAccessor()->GetProperty(obj, value) ; if ( persister->BeforeWriteProperty( this , pi , value ) ) { const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( pi->GetTypeInfo() ) ; @@ -534,7 +536,7 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) else { createParamOids[i] = wxInvalidObjectID ; - createParams[i] = ReadValue( prop , pi->GetAccessor() ) ; + createParams[i] = ReadValue( prop , pi->GetTypeInfo() ) ; createClassInfos[i] = NULL ; } @@ -591,7 +593,7 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) } else { - wxxVariant elementValue = ReadValue( prop , pi->GetAccessor() ) ; + wxxVariant elementValue = ReadValue( elementContent , elementType ) ; if ( pi->GetAccessor()->HasAdder() ) callbacks->AddToPropertyCollection( objectID , classInfo ,pi , elementValue ) ; } @@ -626,7 +628,8 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) } else { - callbacks->SetProperty( objectID, classInfo ,pi , ReadValue( prop , pi->GetAccessor() ) ) ; + wxxVariant nodeval ; + callbacks->SetProperty( objectID, classInfo ,pi , ReadValue( prop , pi->GetTypeInfo() ) ) ; } } } @@ -640,12 +643,14 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) } wxxVariant wxXmlReader::ReadValue(wxXmlNode *node, - wxPropertyAccessor *accessor ) + const wxTypeInfo *type ) { wxString content ; if ( node ) content = node->GetContent() ; - return accessor->ReadValue(content) ; + wxxVariant result ; + type->ConvertFromString( content , result ) ; + return result ; } int wxXmlReader::ReadObject( const wxString &name , wxDepersister *callbacks) -- 2.45.2