X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a26fe2430195643dcc5b52126217f5305d9f4b4b..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/xti2.h diff --git a/include/wx/xti2.h b/include/wx/xti2.h index 885fe7d682..eeb31067ea 100644 --- a/include/wx/xti2.h +++ b/include/wx/xti2.h @@ -1,244 +1,294 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: wx/wxt2.h -// Purpose: runtime metadata information (extended class info) -// Author: Stefan Csomor -// Modified by: Francesco Montorsi -// Created: 27/07/03 -// RCS-ID: $Id: xti.h 66555 2011-01-04 08:31:53Z SC $ -// Copyright: (c) 1997 Julian Smart -// (c) 2003 Stefan Csomor -///////////////////////////////////////////////////////////////////////////// - -#ifndef _WX_XTI2H__ -#define _WX_XTI2H__ - -// ---------------------------------------------------------------------------- -// second part of xti headers, is included from object.h -// ---------------------------------------------------------------------------- - -#if wxUSE_EXTENDED_RTTI - -class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject -{ - friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ; -public: - // instantiates this object with an instance of its superclass - wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ; - virtual ~wxDynamicObject(); - - void SetProperty (const wxChar *propertyName, const wxAny &value); - wxAny GetProperty (const wxChar *propertyName) const ; - - // get the runtime identity of this object - wxClassInfo *GetClassInfo() const - { -#ifdef _MSC_VER - return (wxClassInfo*) m_classInfo; -#else - wxDynamicClassInfo *nonconst = const_cast(m_classInfo); - return static_cast(nonconst); -#endif - } - - wxObject* GetSuperClassInstance() const - { - return m_superClassInstance ; - } -private : - // removes an existing runtime-property - void RemoveProperty( const wxChar *propertyName ) ; - - // renames an existing runtime-property - void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ; - - wxObject *m_superClassInstance ; - const wxDynamicClassInfo *m_classInfo; - struct wxDynamicObjectInternal; - wxDynamicObjectInternal *m_data; -}; - -#include "wx/xtiprop.h" - -// ---------------------------------------------------------------------------- -// wxIMPLEMENT class macros for concrete classes -// ---------------------------------------------------------------------------- - -// Single inheritance with one base class - -#define _DEFAULT_CONSTRUCTOR(name) \ -wxObject* wxConstructorFor##name() \ -{ return new name; } - -#define _DEFAULT_CONVERTERS(name) \ -wxObject* wxVariantOfPtrToObjectConverter##name ( const wxAny &data ) \ -{ return data.As( (name**)NULL ); } \ - wxAny wxObjectToVariantConverter##name ( wxObject *data ) \ -{ return wxAny( wx_dynamic_cast(name*, data) ); } - -#define _TYPEINFO_CLASSES(n, toString, fromString ) \ - wxClassTypeInfo s_typeInfo##n(wxT_OBJECT, &n::ms_classInfo, \ - toString, fromString, typeid(n).name()); \ - wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR, &n::ms_classInfo, \ - toString, fromString, typeid(n*).name()); - -#define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit, callback) \ - _DEFAULT_CONSTRUCTOR(name) \ - _DEFAULT_CONVERTERS(name) \ - \ - const wxClassInfo* name::ms_classParents[] = \ -{ &basename::ms_classInfo, NULL }; \ - wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ - wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ - name::GetPropertiesStatic, name::GetHandlersStatic, name::ms_constructor, \ - name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ - wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \ - callback); - -#define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback ) \ - _DEFAULT_CONSTRUCTOR(name) \ - _DEFAULT_CONVERTERS(name) \ - void wxVariantToObjectConverter##name ( const wxAny &data, wxObjectFunctor* fn ) \ -{ (*fn)( &wxANY_AS(data, name) ); } \ - \ - const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo,NULL }; \ - wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ - wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ - name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \ - name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ - wxVariantOfPtrToObjectConverter##name, wxVariantToObjectConverter##name, \ - wxObjectToVariantConverter##name, callback); - -#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename ) \ - _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, "", NULL ) \ - _TYPEINFO_CLASSES(name, NULL, NULL) \ - const wxPropertyInfo *name::GetPropertiesStatic() \ -{ return (wxPropertyInfo*) NULL; } \ - const wxHandlerInfo *name::GetHandlersStatic() \ -{ return (wxHandlerInfo*) NULL; } \ - wxCONSTRUCTOR_DUMMY( name ) - -#define wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) \ - _IMPLEMENT_DYNAMIC_CLASS( name, basename, "", NULL ) \ - _TYPEINFO_CLASSES(name, NULL, NULL) \ - wxPropertyInfo *name::GetPropertiesStatic() \ -{ return (wxPropertyInfo*) NULL; } \ - wxHandlerInfo *name::GetHandlersStatic() \ -{ return (wxHandlerInfo*) NULL; } \ - wxCONSTRUCTOR_DUMMY( name ) - -#define wxIMPLEMENT_DYNAMIC_CLASS_XTI( name, basename, unit ) \ - _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, NULL ) \ - _TYPEINFO_CLASSES(name, NULL, NULL) - -#define wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name, basename, unit, callback )\ - _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, &callback ) \ - _TYPEINFO_CLASSES(name, NULL, NULL) - -#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name, basename, unit ) \ - _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \ - _TYPEINFO_CLASSES(name, NULL, NULL) - -#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name, basename, \ - unit, toString, \ - fromString ) \ - _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \ - _TYPEINFO_CLASSES(name, toString, fromString) - -// this is for classes that do not derive from wxObject, there are no creators for these - -#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name, unit ) \ - const wxClassInfo* name::ms_classParents[] = { NULL }; \ - wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ - wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ - name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ - 0, 0, 0 ); \ - _TYPEINFO_CLASSES(name, NULL, NULL) - -// this is for subclasses that still do not derive from wxObject - -#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name, basename, unit ) \ - const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo, NULL }; \ - wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ - wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ - name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ - 0, 0, 0 ); \ - _TYPEINFO_CLASSES(name, NULL, NULL) - - -// Multiple inheritance with two base classes - -#define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit, callback) \ - _DEFAULT_CONSTRUCTOR(name) \ - _DEFAULT_CONVERTERS(name) \ - \ - const wxClassInfo* name::ms_classParents[] = \ -{ &basename::ms_classInfo,&basename2::ms_classInfo, NULL }; \ - wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ - wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ - name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \ - name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ - wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \ - callback); - -#define wxIMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2) \ - _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, "", NULL) \ - _TYPEINFO_CLASSES(name, NULL, NULL) \ - wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } \ - wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \ - wxCONSTRUCTOR_DUMMY( name ) - -#define wxIMPLEMENT_DYNAMIC_CLASS2_XTI( name, basename, basename2, unit) \ - _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, unit, NULL) \ - _TYPEINFO_CLASSES(name, NULL, NULL) - - - -// ---------------------------------------------------------------------------- -// wxIMPLEMENT class macros for abstract classes -// ---------------------------------------------------------------------------- - -// Single inheritance with one base class - -#define _IMPLEMENT_ABSTRACT_CLASS(name, basename) \ - _DEFAULT_CONVERTERS(name) \ - \ - const wxClassInfo* name::ms_classParents[] = \ -{ &basename::ms_classInfo,NULL }; \ - wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ - wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ - name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ - 0, wxVariantOfPtrToObjectConverter##name,0, \ - wxObjectToVariantConverter##name); \ - _TYPEINFO_CLASSES(name, NULL, NULL) - -#define wxIMPLEMENT_ABSTRACT_CLASS( name, basename ) \ - _IMPLEMENT_ABSTRACT_CLASS( name, basename ) \ - wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \ - wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } - -// Multiple inheritance with two base classes - -#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ - wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1), \ - wxT(#basename2), (int) sizeof(name), \ - (wxObjectConstructorFn) 0); - -// templated streaming, every type must have their specialization for these methods - -template -void wxStringReadValue( const wxString &s, T &data ); - -template -void wxStringWriteValue( wxString &s, const T &data); - -template -void wxToStringConverter( const wxAny &v, wxString &s ) -{ wxStringWriteValue(s, wxANY_AS(v, T)); } - -template -void wxFromStringConverter( const wxString &s, wxAny &v) -{ T d; wxStringReadValue(s, d); v = wxAny(d); } - -#endif - -#endif // _WX_XTIH2__ +///////////////////////////////////////////////////////////////////////////// +// Name: wx/wxt2.h +// Purpose: runtime metadata information (extended class info) +// Author: Stefan Csomor +// Modified by: Francesco Montorsi +// Created: 27/07/03 +// RCS-ID: $Id$ +// Copyright: (c) 1997 Julian Smart +// (c) 2003 Stefan Csomor +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_XTI2H__ +#define _WX_XTI2H__ + +// ---------------------------------------------------------------------------- +// second part of xti headers, is included from object.h +// ---------------------------------------------------------------------------- + +#if wxUSE_EXTENDED_RTTI + +// ---------------------------------------------------------------------------- +// wxDynamicObject class, its instances connect to a 'super class instance' +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject +{ + friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ; +public: + // instantiates this object with an instance of its superclass + wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ; + virtual ~wxDynamicObject(); + + void SetProperty (const wxChar *propertyName, const wxAny &value); + wxAny GetProperty (const wxChar *propertyName) const ; + + // get the runtime identity of this object + wxClassInfo *GetClassInfo() const + { +#ifdef _MSC_VER + return (wxClassInfo*) m_classInfo; +#else + wxDynamicClassInfo *nonconst = const_cast(m_classInfo); + return static_cast(nonconst); +#endif + } + + wxObject* GetSuperClassInstance() const + { + return m_superClassInstance ; + } +private : + // removes an existing runtime-property + void RemoveProperty( const wxChar *propertyName ) ; + + // renames an existing runtime-property + void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ; + + wxObject *m_superClassInstance ; + const wxDynamicClassInfo *m_classInfo; + struct wxDynamicObjectInternal; + wxDynamicObjectInternal *m_data; +}; + +// ---------------------------------------------------------------------------- +// String conversion templates supporting older compilers +// ---------------------------------------------------------------------------- + +#if wxUSE_FUNC_TEMPLATE_POINTER +# define wxTO_STRING(type) wxToStringConverter +# define wxTO_STRING_IMP(type) +# define wxFROM_STRING(type) wxFromStringConverter +# define wxFROM_STRING_IMP(type) +#else +# define wxTO_STRING(type) ToString##type +# define wxTO_STRING_IMP(type) \ + inline void ToString##type( const wxAny& data, wxString &result ) \ +{ wxToStringConverter(data, result); } + +# define wxFROM_STRING(type) FromString##type +# define wxFROM_STRING_IMP(type) \ + inline void FromString##type( const wxString& data, wxAny &result ) \ +{ wxFromStringConverter(data, result); } +#endif + +#include "wx/xtiprop.h" +#include "wx/xtictor.h" + +// ---------------------------------------------------------------------------- +// wxIMPLEMENT class macros for concrete classes +// ---------------------------------------------------------------------------- + +// Single inheritance with one base class + +#define _DEFAULT_CONSTRUCTOR(name) \ +wxObject* wxConstructorFor##name() \ +{ return new name; } + +#define _DEFAULT_CONVERTERS(name) \ +wxObject* wxVariantOfPtrToObjectConverter##name ( const wxAny &data ) \ +{ return data.As( (name**)NULL ); } \ + wxAny wxObjectToVariantConverter##name ( wxObject *data ) \ +{ return wxAny( wx_dynamic_cast(name*, data) ); } + +#define _TYPEINFO_CLASSES(n, toString, fromString ) \ + wxClassTypeInfo s_typeInfo##n(wxT_OBJECT, &n::ms_classInfo, \ + toString, fromString, typeid(n).name()); \ + wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR, &n::ms_classInfo, \ + toString, fromString, typeid(n*).name()); + +#define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit, callback) \ + _DEFAULT_CONSTRUCTOR(name) \ + _DEFAULT_CONVERTERS(name) \ + \ + const wxClassInfo* name::ms_classParents[] = \ +{ &basename::ms_classInfo, NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ + name::GetPropertiesStatic, name::GetHandlersStatic, name::ms_constructor, \ + name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ + wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \ + callback); + +#define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback ) \ + _DEFAULT_CONSTRUCTOR(name) \ + _DEFAULT_CONVERTERS(name) \ + void wxVariantToObjectConverter##name ( const wxAny &data, wxObjectFunctor* fn ) \ + { name o = wxANY_AS(data, name); (*fn)( &o ); } \ + \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo,NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ + name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \ + name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ + wxVariantOfPtrToObjectConverter##name, wxVariantToObjectConverter##name, \ + wxObjectToVariantConverter##name, callback); + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, "", NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) \ + const wxPropertyInfo *name::GetPropertiesStatic() \ +{ return (wxPropertyInfo*) NULL; } \ + const wxHandlerInfo *name::GetHandlersStatic() \ +{ return (wxHandlerInfo*) NULL; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) \ + _IMPLEMENT_DYNAMIC_CLASS( name, basename, "", NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) \ + wxPropertyInfo *name::GetPropertiesStatic() \ +{ return (wxPropertyInfo*) NULL; } \ + wxHandlerInfo *name::GetHandlersStatic() \ +{ return (wxHandlerInfo*) NULL; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define wxIMPLEMENT_DYNAMIC_CLASS_XTI( name, basename, unit ) \ + _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name, basename, unit, callback )\ + _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, &callback ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name, basename, unit ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name, basename, \ + unit, toString, \ + fromString ) \ + _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \ + _TYPEINFO_CLASSES(name, toString, fromString) + +// this is for classes that do not derive from wxObject, there are no creators for these + +#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name, unit ) \ + const wxClassInfo* name::ms_classParents[] = { NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ + name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ + 0, 0, 0 ); \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +// this is for subclasses that still do not derive from wxObject + +#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name, basename, unit ) \ + const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo, NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ + name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ + 0, 0, 0 ); \ + _TYPEINFO_CLASSES(name, NULL, NULL) + + +// Multiple inheritance with two base classes + +#define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit, callback) \ + _DEFAULT_CONSTRUCTOR(name) \ + _DEFAULT_CONVERTERS(name) \ + \ + const wxClassInfo* name::ms_classParents[] = \ +{ &basename::ms_classInfo,&basename2::ms_classInfo, NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \ + name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \ + name::ms_constructorProperties, name::ms_constructorPropertiesCount, \ + wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \ + callback); + +#define wxIMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2) \ + _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, "", NULL) \ + _TYPEINFO_CLASSES(name, NULL, NULL) \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \ + wxCONSTRUCTOR_DUMMY( name ) + +#define wxIMPLEMENT_DYNAMIC_CLASS2_XTI( name, basename, basename2, unit) \ + _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, unit, NULL) \ + _TYPEINFO_CLASSES(name, NULL, NULL) + + + +// ---------------------------------------------------------------------------- +// wxIMPLEMENT class macros for abstract classes +// ---------------------------------------------------------------------------- + +// Single inheritance with one base class + +#define _IMPLEMENT_ABSTRACT_CLASS(name, basename) \ + _DEFAULT_CONVERTERS(name) \ + \ + const wxClassInfo* name::ms_classParents[] = \ +{ &basename::ms_classInfo,NULL }; \ + wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \ + wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \ + name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \ + 0, wxVariantOfPtrToObjectConverter##name,0, \ + wxObjectToVariantConverter##name); \ + _TYPEINFO_CLASSES(name, NULL, NULL) + +#define wxIMPLEMENT_ABSTRACT_CLASS( name, basename ) \ + _IMPLEMENT_ABSTRACT_CLASS( name, basename ) \ + wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \ + wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } + +// Multiple inheritance with two base classes + +#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \ + wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1), \ + wxT(#basename2), (int) sizeof(name), \ + (wxObjectConstructorFn) 0); + +// templated streaming, every type that can be converted to wxString +// must have their specialization for these methods + +template +void wxStringReadValue( const wxString &s, T &data ); + +template +void wxStringWriteValue( wxString &s, const T &data); + +template +void wxToStringConverter( const wxAny &v, wxString &s ) +{ wxStringWriteValue(s, wxANY_AS(v, T)); } + +template +void wxFromStringConverter( const wxString &s, wxAny &v) +{ T d; wxStringReadValue(s, d); v = wxAny(d); } + +// -------------------------------------------------------------------------- +// Collection Support +// -------------------------------------------------------------------------- + +template void wxListCollectionToAnyList( + const collection_t& coll, wxAnyList &value ) +{ + for ( iter current = coll.GetFirst(); current; + current = current->GetNext() ) + { + value.Append( new wxAny(current->GetData()) ); + } +} + +template void wxArrayCollectionToVariantArray( + const collection_t& coll, wxAnyList &value ) +{ + for( size_t i = 0; i < coll.GetCount(); i++ ) + { + value.Append( new wxAny(coll[i]) ); + } +} + +#endif + +#endif // _WX_XTIH2__