From: Stefan Csomor Date: Fri, 7 Jan 2011 17:28:18 +0000 (+0000) Subject: additional file, test auto-props X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a26fe2430195643dcc5b52126217f5305d9f4b4b additional file, test auto-props git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66622 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/xti2.h b/include/wx/xti2.h new file mode 100644 index 0000000000..885fe7d682 --- /dev/null +++ b/include/wx/xti2.h @@ -0,0 +1,244 @@ +///////////////////////////////////////////////////////////////////////////// +// 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__