]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/xti2.h
synchronize GTK2 minimum version in docs
[wxWidgets.git] / include / wx / xti2.h
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/wxt2.h
3// Purpose: runtime metadata information (extended class info)
4// Author: Stefan Csomor
5// Modified by: Francesco Montorsi
6// Created: 27/07/03
7// RCS-ID: $Id$
8// Copyright: (c) 1997 Julian Smart
9// (c) 2003 Stefan Csomor
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_XTI2H__
13#define _WX_XTI2H__
14
15// ----------------------------------------------------------------------------
16// second part of xti headers, is included from object.h
17// ----------------------------------------------------------------------------
18
19#if wxUSE_EXTENDED_RTTI
20
21// ----------------------------------------------------------------------------
22// wxDynamicObject class, its instances connect to a 'super class instance'
23// ----------------------------------------------------------------------------
24
25class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject
26{
27 friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ;
28public:
29 // instantiates this object with an instance of its superclass
30 wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ;
31 virtual ~wxDynamicObject();
32
33 void SetProperty (const wxChar *propertyName, const wxAny &value);
34 wxAny GetProperty (const wxChar *propertyName) const ;
35
36 // get the runtime identity of this object
37 wxClassInfo *GetClassInfo() const
38 {
39#ifdef _MSC_VER
40 return (wxClassInfo*) m_classInfo;
41#else
42 wxDynamicClassInfo *nonconst = const_cast<wxDynamicClassInfo *>(m_classInfo);
43 return static_cast<wxClassInfo *>(nonconst);
44#endif
45 }
46
47 wxObject* GetSuperClassInstance() const
48 {
49 return m_superClassInstance ;
50 }
51private :
52 // removes an existing runtime-property
53 void RemoveProperty( const wxChar *propertyName ) ;
54
55 // renames an existing runtime-property
56 void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ;
57
58 wxObject *m_superClassInstance ;
59 const wxDynamicClassInfo *m_classInfo;
60 struct wxDynamicObjectInternal;
61 wxDynamicObjectInternal *m_data;
62};
63
64// ----------------------------------------------------------------------------
65// String conversion templates supporting older compilers
66// ----------------------------------------------------------------------------
67
68#if wxUSE_FUNC_TEMPLATE_POINTER
69# define wxTO_STRING(type) wxToStringConverter<type>
70# define wxTO_STRING_IMP(type)
71# define wxFROM_STRING(type) wxFromStringConverter<type>
72# define wxFROM_STRING_IMP(type)
73#else
74# define wxTO_STRING(type) ToString##type
75# define wxTO_STRING_IMP(type) \
76 inline void ToString##type( const wxAny& data, wxString &result ) \
77{ wxToStringConverter<type>(data, result); }
78
79# define wxFROM_STRING(type) FromString##type
80# define wxFROM_STRING_IMP(type) \
81 inline void FromString##type( const wxString& data, wxAny &result ) \
82{ wxFromStringConverter<type>(data, result); }
83#endif
84
85#include "wx/xtiprop.h"
86#include "wx/xtictor.h"
87
88// ----------------------------------------------------------------------------
89// wxIMPLEMENT class macros for concrete classes
90// ----------------------------------------------------------------------------
91
92// Single inheritance with one base class
93
94#define _DEFAULT_CONSTRUCTOR(name) \
95wxObject* wxConstructorFor##name() \
96{ return new name; }
97
98#define _DEFAULT_CONVERTERS(name) \
99wxObject* wxVariantOfPtrToObjectConverter##name ( const wxAny &data ) \
100{ return data.As( (name**)NULL ); } \
101 wxAny wxObjectToVariantConverter##name ( wxObject *data ) \
102{ return wxAny( wx_dynamic_cast(name*, data) ); }
103
104#define _TYPEINFO_CLASSES(n, toString, fromString ) \
105 wxClassTypeInfo s_typeInfo##n(wxT_OBJECT, &n::ms_classInfo, \
106 toString, fromString, typeid(n).name()); \
107 wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR, &n::ms_classInfo, \
108 toString, fromString, typeid(n*).name());
109
110#define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit, callback) \
111 _DEFAULT_CONSTRUCTOR(name) \
112 _DEFAULT_CONVERTERS(name) \
113 \
114 const wxClassInfo* name::ms_classParents[] = \
115{ &basename::ms_classInfo, NULL }; \
116 wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \
117 wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \
118 name::GetPropertiesStatic, name::GetHandlersStatic, name::ms_constructor, \
119 name::ms_constructorProperties, name::ms_constructorPropertiesCount, \
120 wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \
121 callback);
122
123#define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback ) \
124 _DEFAULT_CONSTRUCTOR(name) \
125 _DEFAULT_CONVERTERS(name) \
126 void wxVariantToObjectConverter##name ( const wxAny &data, wxObjectFunctor* fn ) \
127 { name o = wxANY_AS(data, name); (*fn)( &o ); } \
128 \
129 const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo,NULL }; \
130 wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \
131 wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \
132 name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \
133 name::ms_constructorProperties, name::ms_constructorPropertiesCount, \
134 wxVariantOfPtrToObjectConverter##name, wxVariantToObjectConverter##name, \
135 wxObjectToVariantConverter##name, callback);
136
137#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename ) \
138 _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, "", NULL ) \
139 _TYPEINFO_CLASSES(name, NULL, NULL) \
140 const wxPropertyInfo *name::GetPropertiesStatic() \
141{ return (wxPropertyInfo*) NULL; } \
142 const wxHandlerInfo *name::GetHandlersStatic() \
143{ return (wxHandlerInfo*) NULL; } \
144 wxCONSTRUCTOR_DUMMY( name )
145
146#define wxIMPLEMENT_DYNAMIC_CLASS( name, basename ) \
147 _IMPLEMENT_DYNAMIC_CLASS( name, basename, "", NULL ) \
148 _TYPEINFO_CLASSES(name, NULL, NULL) \
149 wxPropertyInfo *name::GetPropertiesStatic() \
150{ return (wxPropertyInfo*) NULL; } \
151 wxHandlerInfo *name::GetHandlersStatic() \
152{ return (wxHandlerInfo*) NULL; } \
153 wxCONSTRUCTOR_DUMMY( name )
154
155#define wxIMPLEMENT_DYNAMIC_CLASS_XTI( name, basename, unit ) \
156 _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, NULL ) \
157 _TYPEINFO_CLASSES(name, NULL, NULL)
158
159#define wxIMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name, basename, unit, callback )\
160 _IMPLEMENT_DYNAMIC_CLASS( name, basename, unit, &callback ) \
161 _TYPEINFO_CLASSES(name, NULL, NULL)
162
163#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name, basename, unit ) \
164 _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \
165 _TYPEINFO_CLASSES(name, NULL, NULL)
166
167#define wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name, basename, \
168 unit, toString, \
169 fromString ) \
170 _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name, basename, unit, NULL ) \
171 _TYPEINFO_CLASSES(name, toString, fromString)
172
173// this is for classes that do not derive from wxObject, there are no creators for these
174
175#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name, unit ) \
176 const wxClassInfo* name::ms_classParents[] = { NULL }; \
177 wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \
178 wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \
179 name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \
180 0, 0, 0 ); \
181 _TYPEINFO_CLASSES(name, NULL, NULL)
182
183// this is for subclasses that still do not derive from wxObject
184
185#define wxIMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name, basename, unit ) \
186 const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo, NULL }; \
187 wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \
188 wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \
189 name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \
190 0, 0, 0 ); \
191 _TYPEINFO_CLASSES(name, NULL, NULL)
192
193
194// Multiple inheritance with two base classes
195
196#define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit, callback) \
197 _DEFAULT_CONSTRUCTOR(name) \
198 _DEFAULT_CONVERTERS(name) \
199 \
200 const wxClassInfo* name::ms_classParents[] = \
201{ &basename::ms_classInfo,&basename2::ms_classInfo, NULL }; \
202 wxClassInfo name::ms_classInfo(name::ms_classParents, wxT(unit), \
203 wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) wxConstructorFor##name, \
204 name::GetPropertiesStatic,name::GetHandlersStatic,name::ms_constructor, \
205 name::ms_constructorProperties, name::ms_constructorPropertiesCount, \
206 wxVariantOfPtrToObjectConverter##name, NULL, wxObjectToVariantConverter##name, \
207 callback);
208
209#define wxIMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2) \
210 _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, "", NULL) \
211 _TYPEINFO_CLASSES(name, NULL, NULL) \
212 wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; } \
213 wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \
214 wxCONSTRUCTOR_DUMMY( name )
215
216#define wxIMPLEMENT_DYNAMIC_CLASS2_XTI( name, basename, basename2, unit) \
217 _IMPLEMENT_DYNAMIC_CLASS2( name, basename, basename2, unit, NULL) \
218 _TYPEINFO_CLASSES(name, NULL, NULL)
219
220
221
222// ----------------------------------------------------------------------------
223// wxIMPLEMENT class macros for abstract classes
224// ----------------------------------------------------------------------------
225
226// Single inheritance with one base class
227
228#define _IMPLEMENT_ABSTRACT_CLASS(name, basename) \
229 _DEFAULT_CONVERTERS(name) \
230 \
231 const wxClassInfo* name::ms_classParents[] = \
232{ &basename::ms_classInfo,NULL }; \
233 wxClassInfo name::ms_classInfo(name::ms_classParents, wxEmptyString, \
234 wxT(#name), (int) sizeof(name), (wxObjectConstructorFn) 0, \
235 name::GetPropertiesStatic,name::GetHandlersStatic, 0, 0, \
236 0, wxVariantOfPtrToObjectConverter##name,0, \
237 wxObjectToVariantConverter##name); \
238 _TYPEINFO_CLASSES(name, NULL, NULL)
239
240#define wxIMPLEMENT_ABSTRACT_CLASS( name, basename ) \
241 _IMPLEMENT_ABSTRACT_CLASS( name, basename ) \
242 wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL; } \
243 wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL; }
244
245// Multiple inheritance with two base classes
246
247#define wxIMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2) \
248 wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1), \
249 wxT(#basename2), (int) sizeof(name), \
250 (wxObjectConstructorFn) 0);
251
252// templated streaming, every type that can be converted to wxString
253// must have their specialization for these methods
254
255template<typename T>
256void wxStringReadValue( const wxString &s, T &data );
257
258template<typename T>
259void wxStringWriteValue( wxString &s, const T &data);
260
261template<typename T>
262void wxToStringConverter( const wxAny &v, wxString &s )
263{ wxStringWriteValue(s, wxANY_AS(v, T)); }
264
265template<typename T>
266void wxFromStringConverter( const wxString &s, wxAny &v)
267{ T d; wxStringReadValue(s, d); v = wxAny(d); }
268
269// --------------------------------------------------------------------------
270// Collection Support
271// --------------------------------------------------------------------------
272
273template<typename iter, typename collection_t > void wxListCollectionToAnyList(
274 const collection_t& coll, wxAnyList &value )
275{
276 for ( iter current = coll.GetFirst(); current;
277 current = current->GetNext() )
278 {
279 value.Append( new wxAny(current->GetData()) );
280 }
281}
282
283template<typename collection_t> void wxArrayCollectionToVariantArray(
284 const collection_t& coll, wxAnyList &value )
285{
286 for( size_t i = 0; i < coll.GetCount(); i++ )
287 {
288 value.Append( new wxAny(coll[i]) );
289 }
290}
291
292#endif
293
294#endif // _WX_XTIH2__