--- /dev/null
+/////////////////////////////////////////////////////////////////////////////\r
+// Name: wx/wxt2.h\r
+// Purpose: runtime metadata information (extended class info)\r
+// Author: Stefan Csomor\r
+// Modified by: Francesco Montorsi\r
+// Created: 27/07/03\r
+// RCS-ID: $Id: xti.h 66555 2011-01-04 08:31:53Z SC $\r
+// Copyright: (c) 1997 Julian Smart\r
+// (c) 2003 Stefan Csomor\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _WX_XTI2H__\r
+#define _WX_XTI2H__\r
+\r
+// ----------------------------------------------------------------------------\r
+// second part of xti headers, is included from object.h\r
+// ----------------------------------------------------------------------------\r
+\r
+#if wxUSE_EXTENDED_RTTI\r
+\r
+class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject\r
+{\r
+ friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ;\r
+public:\r
+ // instantiates this object with an instance of its superclass\r
+ wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ;\r
+ virtual ~wxDynamicObject();\r
+\r
+ void SetProperty (const wxChar *propertyName, const wxAny &value);\r
+ wxAny GetProperty (const wxChar *propertyName) const ;\r
+\r
+ // get the runtime identity of this object\r
+ wxClassInfo *GetClassInfo() const\r
+ {\r
+#ifdef _MSC_VER\r
+ return (wxClassInfo*) m_classInfo;\r
+#else\r
+ wxDynamicClassInfo *nonconst = const_cast<wxDynamicClassInfo *>(m_classInfo);\r
+ return static_cast<wxClassInfo *>(nonconst);\r
+#endif\r
+ }\r
+\r
+ wxObject* GetSuperClassInstance() const\r
+ {\r
+ return m_superClassInstance ;\r
+ }\r
+private :\r
+ // removes an existing runtime-property\r
+ void RemoveProperty( const wxChar *propertyName ) ;\r
+\r
+ // renames an existing runtime-property\r
+ void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ;\r
+\r
+ wxObject *m_superClassInstance ;\r
+ const wxDynamicClassInfo *m_classInfo;\r
+ struct wxDynamicObjectInternal;\r
+ wxDynamicObjectInternal *m_data;\r
+};\r
+\r
+#include "wx/xtiprop.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+// wxIMPLEMENT class macros for concrete classes\r
+// ----------------------------------------------------------------------------\r
+\r
+// Single inheritance with one base class\r
+\r
+#define _DEFAULT_CONSTRUCTOR(name) \\r
+wxObject* wxConstructorFor##name() \\r
+{ return new name; } \r
+\r
+#define _DEFAULT_CONVERTERS(name) \\r
+wxObject* wxVariantOfPtrToObjectConverter##name ( const wxAny &data ) \\r
+{ return data.As( (name**)NULL ); } \\r
+ wxAny wxObjectToVariantConverter##name ( wxObject *data ) \\r
+{ return wxAny( wx_dynamic_cast(name*, data) ); }\r
+\r
+#define _TYPEINFO_CLASSES(n, toString, fromString ) \\r
+ wxClassTypeInfo s_typeInfo##n(wxT_OBJECT, &n::ms_classInfo, \\r
+ toString, fromString, typeid(n).name()); \\r
+ wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR, &n::ms_classInfo, \\r
+ toString, fromString, typeid(n*).name());\r
+\r
+#define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit, callback) \\r
+ _DEFAULT_CONSTRUCTOR(name) \\r
+ _DEFAULT_CONVERTERS(name) \\r
+ \\r
+ const wxClassInfo* name::ms_classParents[] = \\r
+{ &basename::ms_classInfo, NULL }; \\r
+ wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \\r
+ wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \\r
+ name::GetPropertiesStatic, name::GetHandlersStatic, name::ms_constructor, \\r
+ name::ms_constructorProperties, name::ms_constructorPropertiesCount, \\r
+ wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \\r
+ callback);\r
+\r
+#define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback ) \\r
+ _DEFAULT_CONSTRUCTOR(name) \\r
+ _DEFAULT_CONVERTERS(name) \\r
+ void wxVariantToObjectConverter##name ( const wxAny &data, wxObjectFunctor* fn ) \\r
+{ (*fn)( &wxANY_AS(data, name) ); } \\r
+ \\r
+ const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo,NULL }; \\r
+ wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \\r
+ wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \\r
+ name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \\r
+ name::ms_constructorProperties, name::ms_constructorPropertiesCount, \\r
+ wxVariantOfPtrToObjectConverter##name, wxVariantToObjectConverter##name, \\r
+ wxObjectToVariantConverter##name, callback);\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename ) \\r
+ _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, "", NULL ) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL) \\r
+ const wxPropertyInfo *name::GetPropertiesStatic() \\r
+{ return (wxPropertyInfo*) NULL; } \\r
+ const wxHandlerInfo *name::GetHandlersStatic() \\r
+{ return (wxHandlerInfo*) NULL; } \\r
+ wxCONSTRUCTOR_DUMMY( name )\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) \\r
+ _IMPLEMENT_DYNAMIC_CLASS( name, basename, "", NULL ) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL) \\r
+ wxPropertyInfo *name::GetPropertiesStatic() \\r
+{ return (wxPropertyInfo*) NULL; } \\r
+ wxHandlerInfo *name::GetHandlersStatic() \\r
+{ return (wxHandlerInfo*) NULL; } \\r
+ wxCONSTRUCTOR_DUMMY( name )\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_XTI( name, basename, unit ) \\r
+ _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, NULL ) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name, basename, unit, callback )\\r
+ _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, &callback ) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name, basename, unit ) \\r
+ _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name, basename, \\r
+ unit, toString, \\r
+ fromString ) \\r
+ _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \\r
+ _TYPEINFO_CLASSES(name, toString, fromString)\r
+\r
+// this is for classes that do not derive from wxObject, there are no creators for these\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name, unit ) \\r
+ const wxClassInfo* name::ms_classParents[] = { NULL }; \\r
+ wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \\r
+ wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \\r
+ name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \\r
+ 0, 0, 0 ); \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+// this is for subclasses that still do not derive from wxObject\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name, basename, unit ) \\r
+ const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo, NULL }; \\r
+ wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \\r
+ wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \\r
+ name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \\r
+ 0, 0, 0 ); \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+\r
+// Multiple inheritance with two base classes\r
+\r
+#define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit, callback) \\r
+ _DEFAULT_CONSTRUCTOR(name) \\r
+ _DEFAULT_CONVERTERS(name) \\r
+ \\r
+ const wxClassInfo* name::ms_classParents[] = \\r
+{ &basename::ms_classInfo,&basename2::ms_classInfo, NULL }; \\r
+ wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \\r
+ wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \\r
+ name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \\r
+ name::ms_constructorProperties, name::ms_constructorPropertiesCount, \\r
+ wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \\r
+ callback);\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2) \\r
+ _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, "", NULL) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL) \\r
+ wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } \\r
+ wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \\r
+ wxCONSTRUCTOR_DUMMY( name )\r
+\r
+#define wxIMPLEMENT_DYNAMIC_CLASS2_XTI( name, basename, basename2, unit) \\r
+ _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, unit, NULL) \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+\r
+\r
+// ----------------------------------------------------------------------------\r
+// wxIMPLEMENT class macros for abstract classes\r
+// ----------------------------------------------------------------------------\r
+\r
+// Single inheritance with one base class\r
+\r
+#define _IMPLEMENT_ABSTRACT_CLASS(name, basename) \\r
+ _DEFAULT_CONVERTERS(name) \\r
+ \\r
+ const wxClassInfo* name::ms_classParents[] = \\r
+{ &basename::ms_classInfo,NULL }; \\r
+ wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \\r
+ wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \\r
+ name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \\r
+ 0, wxVariantOfPtrToObjectConverter##name,0, \\r
+ wxObjectToVariantConverter##name); \\r
+ _TYPEINFO_CLASSES(name, NULL, NULL)\r
+\r
+#define wxIMPLEMENT_ABSTRACT_CLASS( name, basename ) \\r
+ _IMPLEMENT_ABSTRACT_CLASS( name, basename ) \\r
+ wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \\r
+ wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; }\r
+\r
+// Multiple inheritance with two base classes\r
+\r
+#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \\r
+ wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1), \\r
+ wxT(#basename2), (int) sizeof(name), \\r
+ (wxObjectConstructorFn) 0);\r
+\r
+// templated streaming, every type must have their specialization for these methods\r
+\r
+template<typename T>\r
+void wxStringReadValue( const wxString &s, T &data );\r
+\r
+template<typename T>\r
+void wxStringWriteValue( wxString &s, const T &data);\r
+\r
+template<typename T>\r
+void wxToStringConverter( const wxAny &v, wxString &s ) \r
+{ wxStringWriteValue(s, wxANY_AS(v, T)); }\r
+\r
+template<typename T>\r
+void wxFromStringConverter( const wxString &s, wxAny &v) \r
+{ T d; wxStringReadValue(s, d); v = wxAny(d); }\r
+\r
+#endif\r
+\r
+#endif // _WX_XTIH2__\r