1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/xti.h
3 // Purpose:     runtime metadata information (extended class info)
4 // Author:      Stefan Csomor
5 // Modified by:
6 // Created:     27/07/03
7 // RCS-ID:      $Id: xti.h 52488 2008-03-14 14:13:05Z JS $
8 // Copyright:   (c) 1997 Julian Smart
9 //              (c) 2003 Stefan Csomor
10 // Licence:     wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
12 
13 #ifndef _WX_XTIH__
14 #define _WX_XTIH__
15 
16 // We want to support properties, event sources and events sinks through
17 // explicit declarations, using templates and specialization to make the
18 // effort as painless as possible.
19 //
20 // This means we have the following domains :
21 //
22 // - Type Information for categorizing built in types as well as custom types
23 // this includes information about enums, their values and names
24 // - Type safe value storage : a kind of wxVariant, called right now wxxVariant
25 // which will be merged with wxVariant
26 // - Property Information and Property Accessors providing access to a class'
27 // values and exposed event delegates
28 // - Information about event handlers
29 // - extended Class Information for accessing all these
30 
31 // ----------------------------------------------------------------------------
32 // headers
33 // ----------------------------------------------------------------------------
34 
35 #include "wx/defs.h"
36 #include "wx/memory.h"
37 #include "wx/flags.h"
38 #include "wx/string.h"
39 #include "wx/arrstr.h"
40 #include "wx/hashmap.h"
41 #include "wx/log.h"
42 #include  "wx/intl.h"
43 
44 #include <typeinfo>
45 
46 // we will move this later to defs.h
47 
48 #if defined(__GNUC__) && !wxCHECK_GCC_VERSION( 3 , 4 )
49 #  define wxUSE_MEMBER_TEMPLATES 0
50 #endif
51 
52 #if defined(_MSC_VER) && _MSC_VER <= 1200
53 #  define wxUSE_MEMBER_TEMPLATES 0
54 #  define wxUSE_FUNC_TEMPLATE_POINTER 0
55 #endif
56 
57 #ifndef wxUSE_MEMBER_TEMPLATES
58 #  define wxUSE_MEMBER_TEMPLATES 1
59 #endif
60 
61 #ifndef wxUSE_FUNC_TEMPLATE_POINTER
62 #  define wxUSE_FUNC_TEMPLATE_POINTER 1
63 #endif
64 
65 #if wxUSE_MEMBER_TEMPLATES
66 #  define wxTEMPLATED_MEMBER_CALL( method , type ) method<type>()
67 #  define wxTEMPLATED_MEMBER_FIX( type )
68 #else
69 #  define wxTEMPLATED_MEMBER_CALL( method , type ) method((type*)NULL)
70 #  define wxTEMPLATED_MEMBER_FIX( type ) type* =NULL
71 #endif
72 
73 #if defined(_MSC_VER) && _MSC_VER <= 1200
74 #  define wxTEMPLATED_FUNCTION_FIX( type ) , wxTEMPLATED_MEMBER_FIX(type)
75 #  define wxINFUNC_CLASS_TYPE_FIX( type ) typedef type type;
76 #else
77 #  define wxTEMPLATED_FUNCTION_FIX( type )
78 #  define wxINFUNC_CLASS_TYPE_FIX( type )
79 #endif
80 
81 #define EMPTY_MACROVALUE /**/
82 
83 class WXDLLIMPEXP_BASE wxObject;
84 class WXDLLIMPEXP_BASE wxClassInfo;
85 class WXDLLIMPEXP_BASE wxDynamicClassInfo;
86 class WXDLLIMPEXP_BASE wxHashTable;
87 class WXDLLIMPEXP_BASE wxObjectRefData;
88 class WXDLLIMPEXP_BASE wxEvent;
89 class WXDLLIMPEXP_BASE wxEvtHandler;
90 
91 typedef void (wxObject::*wxObjectEventFunction)(wxEvent&);
92 
93 #if wxUSE_FUNC_TEMPLATE_POINTER
94 #  define wxTO_STRING(type) wxToStringConverter<type>
95 #  define wxTO_STRING_IMP(type)
96 #  define wxFROM_STRING(type) wxFromStringConverter<type>
97 #  define wxFROM_STRING_IMP(type)
98 #else
99 #  define wxTO_STRING(type) ToString##type
100 #  define wxTO_STRING_IMP(type) inline void ToString##type( const wxxVariant& data , wxString &result ) { wxToStringConverter<type>(data, result); }
101 #  define wxFROM_STRING(type) FromString##type
102 #  define wxFROM_STRING_IMP(type) inline void FromString##type( const wxString& data , wxxVariant &result ) { wxFromStringConverter<type>(data, result); }
103 #endif
104 
105 // ----------------------------------------------------------------------------
106 // Enum Support
107 //
108 // In the header files there would no change from pure c++ code, in the
109 // implementation, an enum would have
110 // to be enumerated eg :
111 //
112 // wxBEGIN_ENUM( wxFlavor )
113 //   wxENUM_MEMBER( Vanilla )
114 //   wxENUM_MEMBER( Chocolate )
115 //   wxENUM_MEMBER( Strawberry )
116 // wxEND_ENUM( wxFlavor )
117 // ----------------------------------------------------------------------------
118 
119 struct WXDLLIMPEXP_BASE wxEnumMemberData
120 {
121     const wxChar*   m_name;
122     int             m_value;
123 };
124 
125 class WXDLLIMPEXP_BASE wxEnumData
126 {
127 public :
128     wxEnumData( wxEnumMemberData* data ) ;
129 
130     // returns true if the member has been found and sets the int value
131     // pointed to accordingly (if ptr != null )
132     // if not found returns false, value left unchanged
133     bool HasEnumMemberValue( const wxChar *name , int *value = NULL ) const ;
134 
135     // returns the value of the member, if not found in debug mode an
136     // assert is issued, in release 0 is returned
137     int GetEnumMemberValue(const wxChar *name ) const ;
138 
139     // returns the name of the enum member having the passed in value
140     // returns an emtpy string if not found
141     const wxChar *GetEnumMemberName(int value) const ;
142 
143     // returns the number of members in this enum
GetEnumCount()144     int GetEnumCount() const { return m_count ; }
145 
146     // returns the value of the nth member
147     int GetEnumMemberValueByIndex( int n ) const ;
148 
149     // returns the value of the nth member
150     const wxChar *GetEnumMemberNameByIndex( int n ) const ;
151 private :
152     wxEnumMemberData *m_members;
153     int m_count ;
154 };
155 
156 #define wxBEGIN_ENUM( e ) \
157     wxEnumMemberData s_enumDataMembers##e[] = {
158 
159 #define wxENUM_MEMBER( v ) { wxT(#v), v } ,
160 
161 #define wxEND_ENUM( e ) { NULL , 0 } } ; \
162     wxEnumData s_enumData##e( s_enumDataMembers##e ) ; \
163     wxEnumData *wxGetEnumData(e) { return &s_enumData##e ; } \
164     template<>  void wxStringReadValue(const wxString& s , e &data ) \
165 { \
166     data = (e) s_enumData##e.GetEnumMemberValue(s) ; \
167 } \
168     template<>  void wxStringWriteValue(wxString &s , const e &data ) \
169 { \
170     s =  s_enumData##e.GetEnumMemberName((int)data) ; \
171 } \
172     void FromLong##e( long data , wxxVariant& result ) { result = wxxVariant((e)data) ;} \
173     void ToLong##e( const wxxVariant& data , long &result ) { result = (long) data.wxTEMPLATED_MEMBER_CALL(Get , e) ;} \
174     wxTO_STRING_IMP( e ) \
175     wxFROM_STRING_IMP( e ) \
176     wxEnumTypeInfo s_typeInfo##e(wxT_ENUM , &s_enumData##e , &wxTO_STRING( e ) , &wxFROM_STRING( e ) , &ToLong##e , &FromLong##e , typeid(e).name() ) ;
177 
178 // ----------------------------------------------------------------------------
179 // Set Support
180 //
181 // in the header :
182 //
183 // enum wxFlavor
184 // {
185 //  Vanilla,
186 //  Chocolate,
187 //  Strawberry,
188 // };
189 //
190 // typedef wxBitset<wxFlavor> wxCoupe ;
191 //
192 // in the implementation file :
193 //
194 // wxBEGIN_ENUM( wxFlavor )
195 //  wxENUM_MEMBER( Vanilla )
196 //  wxENUM_MEMBER( Chocolate )
197 //  wxENUM_MEMBER( Strawberry )
198 // wxEND_ENUM( wxFlavor )
199 //
200 // wxIMPLEMENT_SET_STREAMING( wxCoupe , wxFlavor )
201 //
202 // implementation note : no partial specialization for streaming, but a delegation to a
203 // different class
204 //
205 // ----------------------------------------------------------------------------
206 
207 // in order to remove dependancy on string tokenizer
208 void WXDLLIMPEXP_BASE wxSetStringToArray( const wxString &s , wxArrayString &array ) ;
209 
210 template<typename e>
wxSetFromString(const wxString & s,wxBitset<e> & data)211 void wxSetFromString(const wxString &s , wxBitset<e> &data )
212 {
213     wxEnumData* edata = wxGetEnumData((e) 0) ;
214     data.reset() ;
215 
216     wxArrayString array ;
217     wxSetStringToArray( s , array ) ;
218     wxString flag;
219     for ( int i = 0 ; i < array.Count() ; ++i )
220     {
221         flag = array[i] ;
222         int ivalue ;
223         if ( edata->HasEnumMemberValue( flag , &ivalue ) )
224         {
225             data.set( (e) ivalue ) ;
226         }
227     }
228 }
229 
230 template<typename e>
wxSetToString(wxString & s,const wxBitset<e> & data)231 void wxSetToString( wxString &s , const wxBitset<e> &data )
232 {
233     wxEnumData* edata = wxGetEnumData((e) 0) ;
234     int count = edata->GetEnumCount() ;
235     int i ;
236     s.Clear() ;
237     for ( i = 0 ; i < count ; i++ )
238     {
239         e value = (e) edata->GetEnumMemberValueByIndex(i) ;
240         if ( data.test( value ) )
241         {
242             // this could also be done by the templated calls
243             if ( !s.empty() )
244                 s +=wxT("|") ;
245             s += edata->GetEnumMemberNameByIndex(i) ;
246         }
247     }
248 }
249 
250 #define wxIMPLEMENT_SET_STREAMING(SetName,e) \
251     template<>  void wxStringReadValue(const wxString &s , wxBitset<e> &data ) \
252 { \
253     wxSetFromString( s , data ) ; \
254 } \
255     template<>  void wxStringWriteValue( wxString &s , const wxBitset<e> &data ) \
256 { \
257     wxSetToString( s , data ) ; \
258 } \
259     void FromLong##SetName( long data , wxxVariant& result ) { result = wxxVariant(SetName((unsigned long)data)) ;} \
260     void ToLong##SetName( const wxxVariant& data , long &result ) { result = (long) data.wxTEMPLATED_MEMBER_CALL(Get , SetName).to_ulong() ;} \
261     wxTO_STRING_IMP( SetName ) \
262     wxFROM_STRING_IMP( SetName ) \
263     wxEnumTypeInfo s_typeInfo##SetName(wxT_SET , &s_enumData##e , &wxTO_STRING( SetName ) , &wxFROM_STRING( SetName ) , &ToLong##SetName , &FromLong##SetName, typeid(SetName).name() ) ;  \
264 }
265 
266 template<typename e>
wxFlagsFromString(const wxString & s,e & data)267 void wxFlagsFromString(const wxString &s , e &data )
268 {
269     wxEnumData* edata = wxGetEnumData((e*) 0) ;
270     data.m_data = 0 ;
271 
272     wxArrayString array ;
273     wxSetStringToArray( s , array ) ;
274     wxString flag;
275     for ( size_t i = 0 ; i < array.Count() ; ++i )
276     {
277         flag = array[i] ;
278         int ivalue ;
279         if ( edata->HasEnumMemberValue( flag , &ivalue ) )
280         {
281             data.m_data |= ivalue ;
282         }
283     }
284 }
285 
286 template<typename e>
wxFlagsToString(wxString & s,const e & data)287 void wxFlagsToString( wxString &s , const e& data )
288 {
289     wxEnumData* edata = wxGetEnumData((e*) 0) ;
290     int count = edata->GetEnumCount() ;
291     int i ;
292     s.Clear() ;
293     long dataValue = data.m_data ;
294     for ( i = 0 ; i < count ; i++ )
295     {
296         int value = edata->GetEnumMemberValueByIndex(i) ;
297         // make this to allow for multi-bit constants to work
298         if ( value && ( dataValue & value ) == value )
299         {
300             // clear the flags we just set
301             dataValue &= ~value ;
302             // this could also be done by the templated calls
303             if ( !s.empty() )
304                 s +=wxT("|") ;
305             s += edata->GetEnumMemberNameByIndex(i) ;
306         }
307     }
308 }
309 
310 #define wxBEGIN_FLAGS( e ) \
311     wxEnumMemberData s_enumDataMembers##e[] = {
312 
313 #define wxFLAGS_MEMBER( v ) { wxT(#v), v } ,
314 
315 #define wxEND_FLAGS( e ) { NULL , 0 } } ; \
316     wxEnumData s_enumData##e( s_enumDataMembers##e ) ; \
317     wxEnumData *wxGetEnumData(e*) { return &s_enumData##e ; } \
318     template<>  void wxStringReadValue(const wxString &s , e &data ) \
319 { \
320     wxFlagsFromString<e>( s , data ) ; \
321 } \
322     template<>  void wxStringWriteValue( wxString &s , const e& data ) \
323 { \
324     wxFlagsToString<e>( s , data ) ; \
325 } \
326     void FromLong##e( long data , wxxVariant& result ) { result = wxxVariant(e(data)) ;} \
327     void ToLong##e( const wxxVariant& data , long &result ) { result = (long) data.wxTEMPLATED_MEMBER_CALL(Get , e).m_data ;} \
328     wxTO_STRING_IMP( e ) \
329     wxFROM_STRING_IMP( e ) \
330     wxEnumTypeInfo s_typeInfo##e(wxT_SET , &s_enumData##e , &wxTO_STRING( e ) , &wxFROM_STRING( e ) , &ToLong##e , &FromLong##e, typeid(e).name()  ) ;
331 // ----------------------------------------------------------------------------
332 // Type Information
333 // ----------------------------------------------------------------------------
334 //
335 //
336 //  All data exposed by the RTTI is characterized using the following classes.
337 //  The first characterization is done by wxTypeKind. All enums up to and including
338 //  wxT_CUSTOM represent so called simple types. These cannot be divided any further.
339 //  They can be converted to and from wxStrings, that's all.
340 
341 
342 enum wxTypeKind
343 {
344     wxT_VOID = 0, // unknown type
345     wxT_BOOL,
346     wxT_CHAR,
347     wxT_UCHAR,
348     wxT_INT,
349     wxT_UINT,
350     wxT_LONG,
351     wxT_ULONG,
352     wxT_FLOAT,
353     wxT_DOUBLE,
354     wxT_STRING, // must be wxString
355     wxT_SET, // must be wxBitset<> template
356     wxT_ENUM,
357     wxT_CUSTOM, // user defined type (e.g. wxPoint)
358 
359     wxT_LAST_SIMPLE_TYPE_KIND = wxT_CUSTOM ,
360 
361     wxT_OBJECT_PTR, // object reference
362     wxT_OBJECT , // embedded object
363     wxT_COLLECTION , // collection
364 
365     wxT_DELEGATE , // for connecting against an event source
366 
367     wxT_LAST_TYPE_KIND = wxT_DELEGATE // sentinel for bad data, asserts, debugging
368 };
369 
370 class WXDLLIMPEXP_BASE wxxVariant ;
371 class WXDLLIMPEXP_BASE wxTypeInfo ;
372 
373 WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxTypeInfo* , wxTypeInfoMap , class WXDLLIMPEXP_BASE ) ;
374 
375 class WXDLLIMPEXP_BASE wxTypeInfo
376 {
377 public :
378     typedef void (*converterToString_t)( const wxxVariant& data , wxString &result ) ;
379     typedef void (*converterFromString_t)( const wxString& data , wxxVariant &result ) ;
380 
381     wxTypeInfo(wxTypeKind kind,
382                converterToString_t to = NULL, converterFromString_t from = NULL,
383                const wxString &name = wxEmptyString):
m_toString(to)384             m_toString(to), m_fromString(from), m_kind(kind), m_name(name)
385     {
386         Register();
387     }
388 #if wxUSE_UNICODE
wxTypeInfo(wxTypeKind kind,converterToString_t to,converterFromString_t from,const char * name)389     wxTypeInfo(wxTypeKind kind,
390                converterToString_t to, converterFromString_t from,
391                const char *name):
392             m_toString(to), m_fromString(from), m_kind(kind), m_name(wxString::FromAscii(name))
393     {
394         Register();
395     }
396 #endif
397 
~wxTypeInfo()398     virtual ~wxTypeInfo()
399     {
400         Unregister() ;
401     }
402 
403     // return the kind of this type (wxT_... constants)
GetKind()404     wxTypeKind GetKind() const { return m_kind ; }
405 
406     // returns the unique name of this type
GetTypeName()407     const wxString& GetTypeName() const { return m_name ; }
408 
409     // is this type a delegate type
IsDelegateType()410     bool IsDelegateType() const { return m_kind == wxT_DELEGATE ; }
411 
412     // is this type a custom type
IsCustomType()413     bool IsCustomType() const { return m_kind == wxT_CUSTOM ; }
414 
415     // is this type an object type
IsObjectType()416     bool IsObjectType() const { return m_kind == wxT_OBJECT || m_kind == wxT_OBJECT_PTR ; }
417 
418     // can the content of this type be converted to and from strings ?
HasStringConverters()419     bool HasStringConverters() const { return m_toString != NULL && m_fromString != NULL ; }
420 
421     // convert a wxxVariant holding data of this type into a string
ConvertToString(const wxxVariant & data,wxString & result)422     void ConvertToString( const wxxVariant& data , wxString &result ) const
423 
424     { if ( m_toString ) (*m_toString)( data , result ) ; else wxLogError( _("String conversions not supported") ) ; }
425 
426     // convert a string into a wxxVariant holding the corresponding data in this type
ConvertFromString(const wxString & data,wxxVariant & result)427     void ConvertFromString( const wxString& data , wxxVariant &result ) const
428     { if( m_fromString ) (*m_fromString)( data , result ) ; else wxLogError( _("String conversions not supported") ) ; }
429 
430 #if wxUSE_UNICODE
FindType(const char * typeName)431     static wxTypeInfo        *FindType(const char *typeName) { return FindType( wxString::FromAscii(typeName) ) ; }
432 #endif
433     static wxTypeInfo        *FindType(const wxChar *typeName);
434 
435 private :
436 
437     void Register();
438     void Unregister();
439 
440     converterToString_t m_toString ;
441     converterFromString_t m_fromString ;
442 
443     static wxTypeInfoMap*      ms_typeTable ;
444 
445     wxTypeKind m_kind;
446     wxString m_name;
447 };
448 
449 class WXDLLIMPEXP_BASE wxBuiltInTypeInfo : public wxTypeInfo
450 {
451 public :
452     wxBuiltInTypeInfo( wxTypeKind kind , converterToString_t to = NULL , converterFromString_t from = NULL , const wxString &name = wxEmptyString ) :
wxTypeInfo(kind,to,from,name)453        wxTypeInfo( kind , to , from , name )
454        { wxASSERT_MSG( GetKind() < wxT_SET , wxT("Illegal Kind for Base Type") ) ; }
455 #if wxUSE_UNICODE
wxBuiltInTypeInfo(wxTypeKind kind,converterToString_t to,converterFromString_t from,const char * name)456     wxBuiltInTypeInfo( wxTypeKind kind , converterToString_t to  , converterFromString_t from  , const char *name  ) :
457        wxTypeInfo( kind , to , from , name )
458        { wxASSERT_MSG( GetKind() < wxT_SET , wxT("Illegal Kind for Base Type") ) ; }
459 #endif
460 } ;
461 
462 class WXDLLIMPEXP_BASE wxCustomTypeInfo : public wxTypeInfo
463 {
464 public :
wxCustomTypeInfo(const wxString & name,converterToString_t to,converterFromString_t from)465     wxCustomTypeInfo( const wxString &name , converterToString_t to , converterFromString_t from ) :
466        wxTypeInfo( wxT_CUSTOM , to , from , name )
467        {}
468 #if wxUSE_UNICODE
wxCustomTypeInfo(const char * name,converterToString_t to,converterFromString_t from)469     wxCustomTypeInfo( const char *name  , converterToString_t to , converterFromString_t from ) :
470        wxTypeInfo( wxT_CUSTOM , to , from , name )
471        {}
472 #endif
473 } ;
474 
475 class WXDLLIMPEXP_BASE wxEnumTypeInfo : public wxTypeInfo
476 {
477 public :
478     typedef void (*converterToLong_t)( const wxxVariant& data , long &result ) ;
479     typedef void (*converterFromLong_t)( long data , wxxVariant &result ) ;
480 
wxEnumTypeInfo(wxTypeKind kind,wxEnumData * enumInfo,converterToString_t to,converterFromString_t from,converterToLong_t toLong,converterFromLong_t fromLong,const wxString & name)481     wxEnumTypeInfo( wxTypeKind kind , wxEnumData* enumInfo , converterToString_t to , converterFromString_t from ,
482         converterToLong_t toLong , converterFromLong_t fromLong , const wxString &name  ) :
483     wxTypeInfo( kind , to , from , name ) , m_toLong( toLong ) , m_fromLong( fromLong )
484     { wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET , wxT("Illegal Kind for Enum Type")) ; m_enumInfo = enumInfo ;}
485 
486 #if wxUSE_UNICODE
wxEnumTypeInfo(wxTypeKind kind,wxEnumData * enumInfo,converterToString_t to,converterFromString_t from,converterToLong_t toLong,converterFromLong_t fromLong,const char * name)487     wxEnumTypeInfo( wxTypeKind kind , wxEnumData* enumInfo , converterToString_t to , converterFromString_t from ,
488         converterToLong_t toLong , converterFromLong_t fromLong , const char * name   ) :
489     wxTypeInfo( kind , to , from , name ) , m_toLong( toLong ) , m_fromLong( fromLong )
490     { wxASSERT_MSG( kind == wxT_ENUM || kind == wxT_SET , wxT("Illegal Kind for Enum Type")) ; m_enumInfo = enumInfo ;}
491 #endif
GetEnumData()492     const wxEnumData* GetEnumData() const { return m_enumInfo ; }
493 
494     // convert a wxxVariant holding data of this type into a long
ConvertToLong(const wxxVariant & data,long & result)495     void ConvertToLong( const wxxVariant& data , long &result ) const
496 
497     { if( m_toLong ) (*m_toLong)( data , result ) ; else wxLogError( _("Long Conversions not supported") ) ; }
498 
499     // convert a long into a wxxVariant holding the corresponding data in this type
ConvertFromLong(long data,wxxVariant & result)500     void ConvertFromLong( long data , wxxVariant &result ) const
501     { if( m_fromLong ) (*m_fromLong)( data , result ) ; else wxLogError( _("Long Conversions not supported") ) ;}
502 
503 private :
504     converterToLong_t m_toLong ;
505     converterFromLong_t m_fromLong ;
506 
507     wxEnumData *m_enumInfo; // Kind == wxT_ENUM or Kind == wxT_SET
508 } ;
509 
510 class WXDLLIMPEXP_BASE wxClassTypeInfo : public wxTypeInfo
511 {
512 public :
513     wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to = NULL , converterFromString_t from = NULL , const wxString &name = wxEmptyString) ;
514 #if wxUSE_UNICODE
515     wxClassTypeInfo( wxTypeKind kind , wxClassInfo* classInfo , converterToString_t to  , converterFromString_t from  , const char *name ) ;
516 #endif
GetClassInfo()517     const wxClassInfo *GetClassInfo() const { return m_classInfo ; }
518 private :
519     wxClassInfo *m_classInfo; // Kind == wxT_OBJECT - could be NULL
520 } ;
521 
522 class WXDLLIMPEXP_BASE wxCollectionTypeInfo : public wxTypeInfo
523 {
524 public :
wxCollectionTypeInfo(const wxString & elementName,converterToString_t to,converterFromString_t from,const wxString & name)525     wxCollectionTypeInfo( const wxString &elementName , converterToString_t to , converterFromString_t from  , const wxString &name) :
526        wxTypeInfo( wxT_COLLECTION , to , from , name )
527        { m_elementTypeName = elementName ; m_elementType = NULL ;}
528 #if wxUSE_UNICODE
wxCollectionTypeInfo(const char * elementName,converterToString_t to,converterFromString_t from,const char * name)529     wxCollectionTypeInfo( const char *elementName , converterToString_t to , converterFromString_t from  , const char *name ) :
530        wxTypeInfo( wxT_COLLECTION , to , from , name )
531        { m_elementTypeName = wxString::FromAscii( elementName ) ; m_elementType = NULL ;}
532 #endif
GetElementType()533        const wxTypeInfo* GetElementType() const
534        {
535            if ( m_elementType == NULL )
536                m_elementType = wxTypeInfo::FindType( m_elementTypeName ) ;
537            return m_elementType ; }
538 private :
539     mutable wxTypeInfo * m_elementType ;
540     wxString    m_elementTypeName ;
541 } ;
542 
543 // a delegate is an exposed event source
544 
545 class WXDLLIMPEXP_BASE wxDelegateTypeInfo : public wxTypeInfo
546 {
547 public :
548     wxDelegateTypeInfo( int eventType , wxClassInfo* eventClass , converterToString_t to = NULL , converterFromString_t from = NULL ) ;
549     wxDelegateTypeInfo( int eventType , int lastEventType, wxClassInfo* eventClass , converterToString_t to = NULL , converterFromString_t from = NULL ) ;
GetEventType()550     int GetEventType() const { return m_eventType ; }
GetLastEventType()551     int GetLastEventType() const { return m_lastEventType ; }
GetEventClass()552     const wxClassInfo* GetEventClass() const { return m_eventClass ; }
553 private :
554     const wxClassInfo *m_eventClass; // (extended will merge into classinfo)
555     int m_eventType ;
556     int m_lastEventType ;
557 } ;
558 
wxGetTypeInfo(T *)559 template<typename T> const wxTypeInfo* wxGetTypeInfo( T * ) { return wxTypeInfo::FindType(typeid(T).name()) ; }
560 
561 // this macro is for usage with custom, non-object derived classes and structs, wxPoint is such a custom type
562 
563 #if wxUSE_FUNC_TEMPLATE_POINTER
564 #define wxCUSTOM_TYPE_INFO( e , toString , fromString ) \
565     wxCustomTypeInfo s_typeInfo##e(typeid(e).name() , &toString , &fromString) ;
566 #else
567 #define wxCUSTOM_TYPE_INFO( e , toString , fromString ) \
568     void ToString##e( const wxxVariant& data , wxString &result ) { toString(data, result); } \
569     void FromString##e( const wxString& data , wxxVariant &result ) { fromString(data, result); } \
570     wxCustomTypeInfo s_typeInfo##e(typeid(e).name() , &ToString##e , &FromString##e) ;
571 #endif
572 
573 #define wxCOLLECTION_TYPE_INFO( element , collection ) \
574     wxCollectionTypeInfo s_typeInfo##collection( typeid(element).name() , NULL , NULL , typeid(collection).name() ) ;
575 
576 // sometimes a compiler invents specializations that are nowhere called, use this macro to satisfy the refs, currently
577 // we don't have to play tricks, but if we will have to according to the compiler, we will use that macro for that
578 
579 #define wxILLEGAL_TYPE_SPECIALIZATION( a )
580 
581 // ----------------------------------------------------------------------------
582 // wxxVariant as typesafe data holder
583 // ----------------------------------------------------------------------------
584 
585 class WXDLLIMPEXP_BASE wxxVariantData
586 {
587 public:
~wxxVariantData()588     virtual ~wxxVariantData() {}
589 
590     // return a heap allocated duplicate
591     virtual wxxVariantData* Clone() const = 0 ;
592 
593     // returns the type info of the contentc
594     virtual const wxTypeInfo* GetTypeInfo() const = 0 ;
595 } ;
596 
597 template<typename T> class wxxVariantDataT : public wxxVariantData
598 {
599 public:
wxxVariantDataT(const T & d)600     wxxVariantDataT(const T& d) : m_data(d) {}
~wxxVariantDataT()601     virtual ~wxxVariantDataT() {}
602 
603     // get a ref to the stored data
Get()604     T & Get() { return m_data; }
605 
606     // get a const ref to the stored data
Get()607     const T & Get() const { return m_data; }
608 
609     // set the data
Set(const T & d)610     void Set(const T& d) { m_data =  d; }
611 
612     // return a heap allocated duplicate
Clone()613     virtual wxxVariantData* Clone() const { return new wxxVariantDataT<T>( Get() ) ; }
614 
615     // returns the type info of the contentc
GetTypeInfo()616     virtual const wxTypeInfo* GetTypeInfo() const { return wxGetTypeInfo( (T*) NULL ) ; }
617 
618 private:
619     T m_data;
620 };
621 
622 class WXDLLIMPEXP_BASE wxxVariant
623 {
624 public :
wxxVariant()625     wxxVariant() { m_data = NULL ; }
m_data(data)626     wxxVariant( wxxVariantData* data , const wxString& name = wxEmptyString ) : m_data(data) , m_name(name) {}
wxxVariant(const wxxVariant & d)627     wxxVariant( const wxxVariant &d ) { if ( d.m_data ) m_data = d.m_data->Clone() ; else m_data = NULL ; m_name = d.m_name ; }
628 
629     template<typename T> wxxVariant( const T& data , const wxString& name = wxEmptyString ) :
m_data(new wxxVariantDataT<T> (data))630     m_data(new wxxVariantDataT<T>(data) ), m_name(name) {}
631 
~wxxVariant()632     ~wxxVariant() { delete m_data ; }
633 
634     // get a ref to the stored data
Get(wxTEMPLATED_MEMBER_FIX (T))635     template<typename T> T& Get(wxTEMPLATED_MEMBER_FIX(T))
636     {
637         wxxVariantDataT<T> *dataptr = dynamic_cast<wxxVariantDataT<T>*> (m_data) ;
638         wxASSERT_MSG( dataptr , wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) ) ;
639         return dataptr->Get() ;
640     }
641 
642     // get a ref to the stored data
Get(wxTEMPLATED_MEMBER_FIX (T))643     template<typename T> const T& Get(wxTEMPLATED_MEMBER_FIX(T)) const
644     {
645         const wxxVariantDataT<T> *dataptr = dynamic_cast<const wxxVariantDataT<T>*> (m_data) ;
646         wxASSERT_MSG( dataptr , wxString::Format(wxT("Cast to %s not possible"), typeid(T).name()) ) ;
647         return dataptr->Get() ;
648     }
649 
IsEmpty()650     bool IsEmpty() const { return m_data == NULL ; }
651 
HasData(wxTEMPLATED_MEMBER_FIX (T))652     template<typename T> bool HasData(wxTEMPLATED_MEMBER_FIX(T)) const
653     {
654         const wxxVariantDataT<T> *dataptr = dynamic_cast<const wxxVariantDataT<T>*> (m_data) ;
655         return dataptr != NULL ;
656     }
657 
658     // stores the data
Set(const T & data)659     template<typename T> void Set(const T& data) const
660     {
661         delete m_data ;
662         m_data = new wxxVariantDataT<T>(data) ;
663     }
664 
665     wxxVariant& operator=(const wxxVariant &d)
666     {
667         delete m_data;
668         m_data = d.m_data ? d.m_data->Clone() : NULL ;
669         m_name = d.m_name ;
670         return *this ;
671     }
672 
673     // gets the stored data casted to a wxObject* , returning NULL if cast is not possible
674     wxObject* GetAsObject() ;
675 
676     // get the typeinfo of the stored object
GetTypeInfo()677     const wxTypeInfo* GetTypeInfo() const { return m_data->GetTypeInfo() ; }
678 
679     // returns this value as string
GetAsString()680     wxString GetAsString() const
681     {
682         wxString s ;
683         GetTypeInfo()->ConvertToString( *this , s ) ;
684         return s ;
685     }
GetName()686     const wxString& GetName() const { return m_name ; }
687 private :
688     wxxVariantData* m_data ;
689     wxString m_name ;
690 } ;
691 
692 #include "wx/dynarray.h"
693 
694 WX_DECLARE_OBJARRAY_WITH_DECL(wxxVariant, wxxVariantArray, class WXDLLIMPEXP_BASE);
695 
696 // templated streaming, every type must have their specialization for these methods
697 
698 template<typename T>
699 void wxStringReadValue( const wxString &s , T &data );
700 
701 template<typename T>
702 void wxStringWriteValue( wxString &s , const T &data);
703 
704 template<typename T>
wxToStringConverter(const wxxVariant & v,wxString & s wxTEMPLATED_FUNCTION_FIX (T))705 void wxToStringConverter( const wxxVariant &v, wxString &s wxTEMPLATED_FUNCTION_FIX(T)) { wxStringWriteValue( s , v.wxTEMPLATED_MEMBER_CALL(Get , T) ) ; }
706 
707 template<typename T>
wxFromStringConverter(const wxString & s,wxxVariant & v wxTEMPLATED_FUNCTION_FIX (T))708 void wxFromStringConverter( const wxString &s, wxxVariant &v wxTEMPLATED_FUNCTION_FIX(T)) { T d ; wxStringReadValue( s , d ) ; v = wxxVariant(d) ; }
709 
710 // ----------------------------------------------------------------------------
711 // Property Support
712 //
713 // wxPropertyInfo is used to inquire of the property by name.  It doesn't
714 // provide access to the property, only information about it.  If you
715 // want access, look at wxPropertyAccessor.
716 // ----------------------------------------------------------------------------
717 
718 class WXDLLIMPEXP_BASE wxSetter
719 {
720 public:
wxSetter(const wxString name)721     wxSetter( const wxString name ) { m_name = name ; }
~wxSetter()722     virtual ~wxSetter() {}
723     virtual void Set( wxObject *object, const wxxVariant &variantValue ) const = 0;
GetName()724     const wxString& GetName() const { return m_name ; }
725 private:
726     wxString m_name;
727 };
728 
729 class WXDLLIMPEXP_BASE wxGetter
730 {
731 public:
wxGetter(const wxString name)732     wxGetter( const wxString name ) { m_name = name ; }
~wxGetter()733     virtual ~wxGetter() {}
734     virtual void Get( const wxObject *object , wxxVariant& result) const = 0;
GetName()735     const wxString& GetName() const { return m_name ; }
736 private:
737     wxString m_name;
738 };
739 
740 class WXDLLIMPEXP_BASE wxCollectionGetter
741 {
742 public :
wxCollectionGetter(const wxString name)743     wxCollectionGetter( const wxString name ) { m_name = name ; }
~wxCollectionGetter()744     virtual ~wxCollectionGetter() {}
745     virtual void Get( const wxObject *object , wxxVariantArray& result) const = 0;
GetName()746     const wxString& GetName() const { return m_name ; }
747 private :
748     wxString m_name ;
749 } ;
750 
751 template<typename coll_t> void WXDLLIMPEXP_BASE wxCollectionToVariantArray( const coll_t& coll , wxxVariantArray& result ) ;
752 
753 class WXDLLIMPEXP_BASE wxAdder
754 {
755 public :
wxAdder(const wxString name)756     wxAdder( const wxString name ) { m_name = name ; }
~wxAdder()757     virtual ~wxAdder() {}
758     virtual void Add( wxObject *object, const wxxVariant &variantValue ) const= 0;
GetName()759     const wxString& GetName() const { return m_name ; }
760 private :
761     wxString m_name ;
762 } ;
763 
764 
765 #define wxSETTER( property, Klass, valueType, setterMethod ) \
766 class wxSetter##property : public wxSetter \
767 { \
768 public: \
769     wxINFUNC_CLASS_TYPE_FIX(Klass) \
770     wxSetter##property() : wxSetter( wxT(#setterMethod) ) {} \
771     virtual ~wxSetter##property() {} \
772     void Set( wxObject *object, const wxxVariant &variantValue ) const \
773 { \
774     Klass *obj = dynamic_cast<Klass*>(object) ;  \
775     if ( variantValue.wxTEMPLATED_MEMBER_CALL(HasData, valueType) ) \
776     obj->setterMethod(variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType)) ; \
777             else \
778             obj->setterMethod(*variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType*)) ; \
779 } \
780 } ;
781 
782 #define wxGETTER( property, Klass, valueType , gettermethod ) \
783 class wxGetter##property : public wxGetter \
784 { \
785 public : \
786     wxINFUNC_CLASS_TYPE_FIX(Klass) \
787     wxGetter##property() : wxGetter( wxT(#gettermethod) ) {} \
788     virtual ~wxGetter##property() {} \
789     void Get( const wxObject *object , wxxVariant &result) const \
790 { \
791     const Klass *obj = dynamic_cast<const Klass*>(object) ;  \
792     result = wxxVariant( obj->gettermethod() ) ; \
793 } \
794 } ;
795 
796 #define wxADDER( property, Klass, valueType , addermethod ) \
797 class wxAdder##property : public wxAdder \
798 { \
799 public: \
800     wxINFUNC_CLASS_TYPE_FIX(Klass) \
801     wxAdder##property() : wxAdder( wxT(#addermethod) ) {} \
802     virtual ~wxAdder##property() {} \
803     void Add( wxObject *object, const wxxVariant &variantValue ) const \
804 { \
805     Klass *obj = dynamic_cast<Klass*>(object) ;  \
806     if ( variantValue.wxTEMPLATED_MEMBER_CALL(HasData, valueType) ) \
807     obj->addermethod(variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType)) ; \
808             else \
809             obj->addermethod(*variantValue.wxTEMPLATED_MEMBER_CALL(Get , valueType*)) ; \
810 } \
811 } ;
812 
813 #define wxCOLLECTION_GETTER( property, Klass, valueType , gettermethod ) \
814 class wxCollectionGetter##property : public wxCollectionGetter \
815 { \
816 public : \
817     wxINFUNC_CLASS_TYPE_FIX(Klass) \
818     wxCollectionGetter##property() : wxCollectionGetter( wxT(#gettermethod) ) {} \
819     virtual ~wxCollectionGetter##property() {} \
820     void Get( const wxObject *object , wxxVariantArray &result) const \
821 { \
822     const Klass *obj = dynamic_cast<const Klass*>(object) ;  \
823     wxCollectionToVariantArray( obj->gettermethod() , result ) ; \
824 } \
825 } ;
826 
827 class WXDLLIMPEXP_BASE wxPropertyAccessor
828 {
829 public :
wxPropertyAccessor(wxSetter * setter,wxGetter * getter,wxAdder * adder,wxCollectionGetter * collectionGetter)830     wxPropertyAccessor( wxSetter *setter , wxGetter *getter , wxAdder *adder , wxCollectionGetter *collectionGetter )
831     { m_setter = setter ; m_getter = getter ; m_adder = adder ; m_collectionGetter = collectionGetter ;}
832 
~wxPropertyAccessor()833     virtual ~wxPropertyAccessor() {}
834 
835     // Setting a simple property (non-collection)
SetProperty(wxObject * object,const wxxVariant & value)836     virtual void SetProperty(wxObject *object, const wxxVariant &value) const
837     { if ( m_setter ) m_setter->Set( object , value ) ; else wxLogError( _("SetProperty called w/o valid setter") ) ;}
838 
839     // Getting a simple property (non-collection)
GetProperty(const wxObject * object,wxxVariant & result)840     virtual void GetProperty(const wxObject *object, wxxVariant &result) const
841     { if ( m_getter ) m_getter->Get( object , result ) ; else wxLogError( _("GetProperty called w/o valid getter") ) ;}
842 
843     // Adding an element to a collection property
AddToPropertyCollection(wxObject * object,const wxxVariant & value)844     virtual void AddToPropertyCollection(wxObject *object, const wxxVariant &value) const
845     { if ( m_adder ) m_adder->Add( object , value ) ; else wxLogError( _("AddToPropertyCollection called w/o valid adder") ) ;}
846 
847     // Getting a collection property
GetPropertyCollection(const wxObject * obj,wxxVariantArray & result)848     virtual void GetPropertyCollection( const wxObject *obj, wxxVariantArray &result) const
849     { if ( m_collectionGetter ) m_collectionGetter->Get( obj , result) ; else wxLogError( _("GetPropertyCollection called w/o valid collection getter") ) ;}
850 
HasSetter()851     virtual bool HasSetter() const { return m_setter != NULL ; }
HasCollectionGetter()852     virtual bool HasCollectionGetter() const { return m_collectionGetter != NULL ; }
HasGetter()853     virtual bool HasGetter() const { return m_getter != NULL ; }
HasAdder()854     virtual bool HasAdder() const { return m_adder != NULL ; }
855 
GetCollectionGetterName()856     virtual const wxString& GetCollectionGetterName() const
857     { return m_collectionGetter->GetName() ; }
GetGetterName()858     virtual const wxString&  GetGetterName() const
859     { return m_getter->GetName() ; }
GetSetterName()860     virtual const wxString& GetSetterName() const
861     { return m_setter->GetName() ; }
GetAdderName()862     virtual const wxString& GetAdderName() const
863     { return m_adder->GetName() ; }
864 
865 protected :
866     wxSetter *m_setter ;
867     wxAdder *m_adder ;
868     wxGetter *m_getter ;
869     wxCollectionGetter* m_collectionGetter ;
870 };
871 
872 class WXDLLIMPEXP_BASE wxGenericPropertyAccessor : public wxPropertyAccessor
873 {
874 public :
875     wxGenericPropertyAccessor( const wxString &propName ) ;
876     virtual ~wxGenericPropertyAccessor() ;
877 
RenameProperty(const wxString & WXUNUSED_UNLESS_DEBUG (oldName),const wxString & newName)878     void RenameProperty( const wxString& WXUNUSED_UNLESS_DEBUG(oldName),
879         const wxString& newName )
880     {
881         wxASSERT( oldName == m_propertyName ) ; m_propertyName = newName ;
882     }
HasSetter()883     virtual bool HasSetter() const { return true ; }
HasGetter()884     virtual bool HasGetter() const { return true ; }
HasAdder()885     virtual bool HasAdder() const { return false ; }
HasCollectionGetter()886     virtual bool HasCollectionGetter() const { return false ; }
887 
GetGetterName()888     virtual const wxString&  GetGetterName() const
889     { return m_getterName ; }
GetSetterName()890     virtual const wxString& GetSetterName() const
891     { return m_setterName ; }
892 
893     virtual void SetProperty(wxObject *object, const wxxVariant &value) const ;
894     virtual void GetProperty(const wxObject *object, wxxVariant &value) const ;
895 
896     // Adding an element to a collection property
AddToPropertyCollection(wxObject * WXUNUSED (object),const wxxVariant & WXUNUSED (value))897     virtual void AddToPropertyCollection(wxObject *WXUNUSED(object), const wxxVariant &WXUNUSED(value)) const
898     { wxLogError( _("AddToPropertyCollection called on a generic accessor") ) ;}
899 
900     // Getting a collection property
GetPropertyCollection(const wxObject * WXUNUSED (obj),wxxVariantArray & WXUNUSED (result))901     virtual void GetPropertyCollection( const wxObject *WXUNUSED(obj), wxxVariantArray &WXUNUSED(result)) const
902     { wxLogError ( _("GetPropertyCollection called on a generic accessor") ) ;}
903 private :
904     struct wxGenericPropertyAccessorInternal ;
905     wxGenericPropertyAccessorInternal* m_data ;
906     wxString m_propertyName ;
907     wxString m_setterName ;
908     wxString m_getterName ;
909 } ;
910 
911 typedef long wxPropertyInfoFlags ;
912 enum {
913     // will be removed in future releases
914     wxPROP_DEPRECATED       = 0x00000001 ,
915     // object graph property, will be streamed with priority (after constructor properties)
916     wxPROP_OBJECT_GRAPH     = 0x00000002 ,
917     // this will only be streamed out and in as enum/set, the internal representation is still a long
918     wxPROP_ENUM_STORE_LONG  = 0x00000004 ,
919     // don't stream out this property, needed eg to avoid streaming out children that are always created by their parents
920     wxPROP_DONT_STREAM = 0x00000008 ,
921 }  ;
922 
923 class WXDLLIMPEXP_BASE wxPropertyInfo
924 {
925     friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ;
926 public :
927     wxPropertyInfo(wxPropertyInfo* &iter,
928                    wxClassInfo* itsClass,
929                    const wxString& name,
930                    const wxString& typeName,
931                    wxPropertyAccessor *accessor,
932                    wxxVariant dv,
933                    wxPropertyInfoFlags flags = 0,
934                    const wxString& helpString = wxEmptyString,
935                    const wxString& groupString = wxEmptyString) :
m_itsClass(itsClass)936                    m_itsClass(itsClass),
937            m_name(name),
938            m_typeInfo(NULL),
939            m_typeName(typeName) ,
940            m_collectionElementTypeInfo(NULL),
941            m_accessor(accessor),
942            m_defaultValue(dv),
943            m_flags(flags),
944            m_helpString(helpString),
945            m_groupString(groupString)
946        {
947            Insert(iter);
948        }
949 
950 #if wxUSE_UNICODE
951     wxPropertyInfo(wxPropertyInfo* &iter,
952                    wxClassInfo* itsClass,
953                    const wxString& name,
954                    const char* typeName,
955                    wxPropertyAccessor *accessor,
956                    wxxVariant dv,
957                    wxPropertyInfoFlags flags = 0,
958                    const wxString& helpString = wxEmptyString,
959                    const wxString& groupString = wxEmptyString) :
m_itsClass(itsClass)960                    m_itsClass(itsClass),
961            m_name(name),
962            m_typeInfo(NULL),
963            m_typeName(wxString::FromAscii(typeName)) ,
964            m_collectionElementTypeInfo(NULL),
965            m_accessor(accessor),
966            m_defaultValue(dv),
967            m_flags(flags),
968            m_helpString(helpString),
969            m_groupString(groupString)
970        {
971            Insert(iter);
972        }
973 #endif
974     wxPropertyInfo(wxPropertyInfo* &iter,
975                    wxClassInfo* itsClass,
976                    const wxString& name,
977                    wxDelegateTypeInfo* type,
978                    wxPropertyAccessor *accessor,
979                    wxxVariant dv,
980                    wxPropertyInfoFlags flags = 0,
981                    const wxString& helpString = wxEmptyString,
982                    const wxString& groupString = wxEmptyString) :
m_itsClass(itsClass)983            m_itsClass(itsClass),
984            m_name(name),
985            m_typeInfo(type),
986            m_collectionElementTypeInfo(NULL),
987            m_accessor(accessor),
988            m_defaultValue(dv),
989            m_flags(flags),
990            m_helpString(helpString),
991            m_groupString(groupString)
992        {
993            Insert(iter);
994        }
995 
996        wxPropertyInfo(wxPropertyInfo* &iter,
997                       wxClassInfo* itsClass, const wxString& name,
998                       const wxString& collectionTypeName,
999                       const wxString& elementTypeName,
1000                       wxPropertyAccessor *accessor,
1001                       wxPropertyInfoFlags flags = 0,
1002                       const wxString& helpString = wxEmptyString,
1003                       const wxString& groupString = wxEmptyString) :
m_itsClass(itsClass)1004            m_itsClass(itsClass),
1005            m_name(name),
1006            m_typeInfo(NULL),
1007            m_typeName(collectionTypeName) ,
1008            m_collectionElementTypeInfo(NULL),
1009            m_collectionElementTypeName(elementTypeName),
1010            m_accessor(accessor) ,
1011            m_flags(flags),
1012            m_helpString(helpString),
1013            m_groupString(groupString)
1014        {
1015            Insert(iter);
1016        }
1017 
1018 #if wxUSE_UNICODE
1019               wxPropertyInfo(wxPropertyInfo* &iter,
1020                       wxClassInfo* itsClass, const wxString& name,
1021                       const char* collectionTypeName,
1022                       const char* elementTypeName,
1023                       wxPropertyAccessor *accessor,
1024                       wxPropertyInfoFlags flags = 0,
1025                       const wxString& helpString = wxEmptyString,
1026                       const wxString& groupString = wxEmptyString) :
m_itsClass(itsClass)1027            m_itsClass(itsClass),
1028            m_name(name),
1029            m_typeInfo(NULL),
1030            m_typeName(wxString::FromAscii(collectionTypeName)) ,
1031            m_collectionElementTypeInfo(NULL),
1032            m_collectionElementTypeName(wxString::FromAscii(elementTypeName)),
1033            m_accessor(accessor) ,
1034            m_flags(flags),
1035            m_helpString(helpString),
1036            m_groupString(groupString)
1037        {
1038            Insert(iter);
1039        }
1040 #endif
1041        ~wxPropertyInfo() ;
1042 
1043        // return the class this property is declared in
GetDeclaringClass()1044        const wxClassInfo*  GetDeclaringClass() const { return m_itsClass ; }
1045 
1046        // return the name of this property
GetName()1047        const wxString&     GetName() const { return m_name ; }
1048 
1049        // returns the flags of this property
GetFlags()1050        wxPropertyInfoFlags GetFlags() const { return m_flags ;}
1051 
1052        // returns the short help string of this property
GetHelpString()1053        const wxString&     GetHelpString() const { return m_helpString ; }
1054 
1055        // returns the group string of this property
GetGroupString()1056        const wxString&     GetGroupString() const { return m_groupString ; }
1057 
1058        // return the element type info of this property (for collections, otherwise NULL)
GetCollectionElementTypeInfo()1059        const wxTypeInfo *  GetCollectionElementTypeInfo() const
1060        {
1061            if ( m_collectionElementTypeInfo == NULL )
1062                m_collectionElementTypeInfo = wxTypeInfo::FindType(m_collectionElementTypeName) ;
1063            return m_collectionElementTypeInfo ;
1064        }
1065 
1066        // return the type info of this property
GetTypeInfo()1067        const wxTypeInfo *  GetTypeInfo() const
1068        {
1069            if ( m_typeInfo == NULL )
1070                m_typeInfo = wxTypeInfo::FindType(m_typeName) ;
1071            return m_typeInfo ;
1072        }
1073 
1074        // return the accessor for this property
GetAccessor()1075        wxPropertyAccessor* GetAccessor() const { return m_accessor ; }
1076 
1077        // returns NULL if this is the last property of this class
GetNext()1078        wxPropertyInfo*     GetNext() const { return m_next ; }
1079 
1080        // returns the default value of this property, its kind may be wxT_VOID if it is not valid
GetDefaultValue()1081        wxxVariant          GetDefaultValue() const { return m_defaultValue ; }
1082 private :
Insert(wxPropertyInfo * & iter)1083     void Insert(wxPropertyInfo* &iter)
1084     {
1085         m_next = NULL ;
1086         if ( iter == NULL )
1087             iter = this ;
1088         else
1089         {
1090             wxPropertyInfo* i = iter ;
1091             while( i->m_next )
1092                 i = i->m_next ;
1093 
1094             i->m_next = this ;
1095         }
1096     }
1097 
1098     wxClassInfo*        m_itsClass ;
1099     wxString            m_name ;
1100     mutable wxTypeInfo*         m_typeInfo ;
1101     wxString            m_typeName ;
1102     mutable wxTypeInfo*         m_collectionElementTypeInfo ;
1103     wxString            m_collectionElementTypeName ;
1104     wxPropertyAccessor* m_accessor ;
1105     wxxVariant          m_defaultValue;
1106     wxPropertyInfoFlags m_flags ;
1107     wxString            m_helpString ;
1108     wxString            m_groupString ;
1109     // string representation of the default value
1110     //  to be assigned by the designer to the property
1111     //  when the component is dropped on the container.
1112     wxPropertyInfo*     m_next ;
1113 };
1114 
1115 WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxPropertyInfo* , wxPropertyInfoMap , class WXDLLIMPEXP_BASE ) ;
1116 
1117 #define wxBEGIN_PROPERTIES_TABLE(theClass) \
1118     wxPropertyInfo *theClass::GetPropertiesStatic()  \
1119 {  \
1120     typedef theClass class_t; \
1121     static wxPropertyInfo* first = NULL ;
1122 
1123 #define wxEND_PROPERTIES_TABLE() \
1124     return first ; }
1125 
1126 #define wxHIDE_PROPERTY( pname ) \
1127     static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(void).name() ,NULL , wxxVariant() , wxPROP_DONT_STREAM , wxEmptyString , wxEmptyString ) ;
1128 
1129 #define wxPROPERTY( pname , type , setter , getter , defaultValue , flags , help , group) \
1130     wxSETTER( pname , class_t , type , setter ) \
1131     static wxSetter##pname _setter##pname ; \
1132     wxGETTER( pname , class_t , type , getter ) \
1133     static wxGetter##pname _getter##pname ; \
1134     static wxPropertyAccessor _accessor##pname( &_setter##pname , &_getter##pname , NULL , NULL ) ; \
1135     static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(type).name() ,&_accessor##pname , wxxVariant(defaultValue) , flags , group , help ) ;
1136 
1137 #define wxPROPERTY_FLAGS( pname , flags , type , setter , getter ,defaultValue , pflags , help , group) \
1138     wxSETTER( pname , class_t , type , setter ) \
1139     static wxSetter##pname _setter##pname ; \
1140     wxGETTER( pname , class_t , type , getter ) \
1141     static wxGetter##pname _getter##pname ; \
1142     static wxPropertyAccessor _accessor##pname( &_setter##pname , &_getter##pname , NULL , NULL ) ; \
1143     static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(flags).name() ,&_accessor##pname , wxxVariant(defaultValue), wxPROP_ENUM_STORE_LONG | pflags , help , group ) ;
1144 
1145 #define wxREADONLY_PROPERTY( pname , type , getter ,defaultValue , flags , help , group) \
1146     wxGETTER( pname , class_t , type , getter ) \
1147     static wxGetter##pname _getter##pname ; \
1148     static wxPropertyAccessor _accessor##pname( NULL , &_getter##pname , NULL , NULL ) ; \
1149     static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(type).name() ,&_accessor##pname , wxxVariant(defaultValue), flags , help , group ) ;
1150 
1151 #define wxREADONLY_PROPERTY_FLAGS( pname , flags , type , getter ,defaultValue , pflags , help , group) \
1152     wxGETTER( pname , class_t , type , getter ) \
1153     static wxGetter##pname _getter##pname ; \
1154     static wxPropertyAccessor _accessor##pname( NULL , &_getter##pname , NULL , NULL ) ; \
1155     static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(flags).name() ,&_accessor##pname , wxxVariant(defaultValue), wxPROP_ENUM_STORE_LONG | pflags , help , group ) ;
1156 
1157 #define wxPROPERTY_COLLECTION( pname , colltype , addelemtype , adder , getter , flags , help , group ) \
1158     wxADDER( pname , class_t , addelemtype , adder ) \
1159     static wxAdder##pname _adder##pname ; \
1160     wxCOLLECTION_GETTER( pname , class_t , colltype , getter ) \
1161     static wxCollectionGetter##pname _collectionGetter##pname ; \
1162     static wxPropertyAccessor _accessor##pname( NULL , NULL ,&_adder##pname , &_collectionGetter##pname ) ; \
1163     static wxPropertyInfo _propertyInfo##pname( first , class_t::GetClassInfoStatic() , wxT(#pname) , typeid(colltype).name() ,typeid(addelemtype).name() ,&_accessor##pname , flags , help , group ) ;
1164 
1165 #define wxREADONLY_PROPERTY_COLLECTION( pname , colltype , addelemtype , getter , flags , help , group) \
1166     wxCOLLECTION_GETTER( pname , class_t , colltype , getter ) \
1167     static wxCollectionGetter##pname _collectionGetter##pname ; \
1168     static wxPropertyAccessor _accessor##pname( NULL , NULL , NULL , &_collectionGetter##pname ) ; \
1169     static wxPropertyInfo _propertyInfo##pname( first ,class_t::GetClassInfoStatic() ,  wxT(#pname) , typeid(colltype).name() ,typeid(addelemtype).name() ,&_accessor##pname , flags , help , group  ) ;
1170 
1171 
1172 #define wxEVENT_PROPERTY( name , eventType , eventClass ) \
1173     static wxDelegateTypeInfo _typeInfo##name( eventType , CLASSINFO( eventClass ) ) ; \
1174     static wxPropertyInfo _propertyInfo##name( first ,class_t::GetClassInfoStatic() , wxT(#name) , &_typeInfo##name , NULL , wxxVariant() ) ; \
1175 
1176 #define wxEVENT_RANGE_PROPERTY( name , eventType , lastEventType , eventClass ) \
1177     static wxDelegateTypeInfo _typeInfo##name( eventType , lastEventType , CLASSINFO( eventClass ) ) ; \
1178     static wxPropertyInfo _propertyInfo##name( first , class_t::GetClassInfoStatic() , wxT(#name) , &_typeInfo##name , NULL , wxxVariant() ) ; \
1179 
1180 // ----------------------------------------------------------------------------
1181 // Implementation Helper for Simple Properties
1182 // ----------------------------------------------------------------------------
1183 
1184 #define wxIMPLEMENT_PROPERTY(name, type) \
1185 private:\
1186     type m_##name; \
1187 public: \
1188   void  Set##name( type const & p) { m_##name = p; } \
1189   type const & Get##name() const  { return m_##name; }
1190 
1191 // ----------------------------------------------------------------------------
1192 // Handler Info
1193 //
1194 // this is describing an event sink
1195 // ----------------------------------------------------------------------------
1196 
1197 class WXDLLIMPEXP_BASE wxHandlerInfo
1198 {
1199     friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ;
1200 public :
wxHandlerInfo(wxHandlerInfo * & iter,wxClassInfo * itsClass,const wxString & name,wxObjectEventFunction address,const wxClassInfo * eventClassInfo)1201     wxHandlerInfo(wxHandlerInfo* &iter,
1202                    wxClassInfo* itsClass,
1203                   const wxString& name,
1204                   wxObjectEventFunction address,
1205                   const wxClassInfo* eventClassInfo) :
1206             m_eventFunction(address),
1207             m_name(name),
1208             m_eventClassInfo(eventClassInfo) ,
1209             m_itsClass(itsClass)
1210        {
1211            m_next = NULL ;
1212            if ( iter == NULL )
1213                iter = this ;
1214            else
1215            {
1216                wxHandlerInfo* i = iter ;
1217                while( i->m_next )
1218                    i = i->m_next ;
1219 
1220                i->m_next = this ;
1221            }
1222        }
1223 
1224        ~wxHandlerInfo() ;
1225 
1226        // return the name of this handler
GetName()1227        const wxString& GetName() const { return m_name ; }
1228 
1229        // return the class info of the event
GetEventClassInfo()1230        const wxClassInfo *GetEventClassInfo() const { return m_eventClassInfo ; }
1231 
1232        // get the handler function pointer
GetEventFunction()1233        wxObjectEventFunction GetEventFunction() const { return m_eventFunction ; }
1234 
1235        // returns NULL if this is the last handler of this class
GetNext()1236        wxHandlerInfo*     GetNext() const { return m_next ; }
1237 
1238        // return the class this property is declared in
GetDeclaringClass()1239        const wxClassInfo*   GetDeclaringClass() const { return m_itsClass ; }
1240 
1241 private :
1242     wxObjectEventFunction m_eventFunction ;
1243     wxString            m_name;
1244     const wxClassInfo*  m_eventClassInfo ;
1245     wxHandlerInfo*      m_next ;
1246     wxClassInfo*        m_itsClass ;
1247 };
1248 
1249 #define wxHANDLER(name,eventClassType) \
1250     static wxHandlerInfo _handlerInfo##name( first , class_t::GetClassInfoStatic() , wxT(#name) , (wxObjectEventFunction) (wxEventFunction) &name , CLASSINFO( eventClassType ) ) ;
1251 
1252 #define wxBEGIN_HANDLERS_TABLE(theClass) \
1253     wxHandlerInfo *theClass::GetHandlersStatic()  \
1254 {  \
1255     typedef theClass class_t; \
1256     static wxHandlerInfo* first = NULL ;
1257 
1258 #define wxEND_HANDLERS_TABLE() \
1259     return first ; }
1260 
1261 // ----------------------------------------------------------------------------
1262 // Constructor Bridges
1263 //
1264 // allow to set up constructors with params during runtime
1265 // ----------------------------------------------------------------------------
1266 
1267 class WXDLLIMPEXP_BASE wxConstructorBridge
1268 {
1269 public :
1270     virtual void Create(wxObject * &o, wxxVariant *args) = 0;
1271 };
1272 
1273 // a direct constructor bridge calls the operator new for this class and
1274 // passes all params to the constructor. needed for classes that cannot be
1275 // instantiated using alloc-create semantics
1276 class WXDLLIMPEXP_BASE wxDirectConstructorBrigde : public wxConstructorBridge
1277 {
1278 public :
1279     virtual void Create(wxObject * &o, wxxVariant *args) = 0;
1280 } ;
1281 
1282 // Creator Bridges for all Numbers of Params
1283 
1284 // no params
1285 
1286 template<typename Class>
1287 struct wxConstructorBridge_0 : public wxConstructorBridge
1288 {
CreatewxConstructorBridge_01289     void Create(wxObject * &o, wxxVariant *)
1290     {
1291         Class *obj = dynamic_cast<Class*>(o);
1292         obj->Create();
1293     }
1294 };
1295 
1296 struct wxConstructorBridge_Dummy : public wxConstructorBridge
1297 {
CreatewxConstructorBridge_Dummy1298     void Create(wxObject *&, wxxVariant *)
1299     {
1300     }
1301 } ;
1302 
1303 #define wxCONSTRUCTOR_0(klass) \
1304     wxConstructorBridge_0<klass> constructor##klass ; \
1305     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1306     const wxChar *klass::ms_constructorProperties[] = { NULL } ; \
1307     const int klass::ms_constructorPropertiesCount = 0 ;
1308 
1309 #define wxCONSTRUCTOR_DUMMY(klass) \
1310     wxConstructorBridge_Dummy constructor##klass ; \
1311     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1312     const wxChar *klass::ms_constructorProperties[] = { NULL } ; \
1313     const int klass::ms_constructorPropertiesCount = 0 ;
1314 
1315 // 1 param
1316 
1317 template<typename Class, typename T0>
1318 struct wxConstructorBridge_1 : public wxConstructorBridge
1319 {
CreatewxConstructorBridge_11320     void Create(wxObject * &o, wxxVariant *args)
1321     {
1322         Class *obj = dynamic_cast<Class*>(o);
1323         obj->Create(
1324             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0)
1325             );
1326     }
1327 };
1328 
1329 #define wxCONSTRUCTOR_1(klass,t0,v0) \
1330     wxConstructorBridge_1<klass,t0> constructor##klass ; \
1331     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1332     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) } ; \
1333     const int klass::ms_constructorPropertiesCount = 1 ;
1334 
1335 // 2 params
1336 
1337 template<typename Class,
1338 typename T0, typename T1>
1339 struct wxConstructorBridge_2 : public wxConstructorBridge
1340 {
CreatewxConstructorBridge_21341     void Create(wxObject * &o, wxxVariant *args)
1342     {
1343         Class *obj = dynamic_cast<Class*>(o);
1344         obj->Create(
1345             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1346             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1)
1347             );
1348     }
1349 };
1350 
1351 #define wxCONSTRUCTOR_2(klass,t0,v0,t1,v1) \
1352     wxConstructorBridge_2<klass,t0,t1> constructor##klass ; \
1353     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1354     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  } ; \
1355     const int klass::ms_constructorPropertiesCount = 2;
1356 
1357 // direct constructor version
1358 
1359 template<typename Class,
1360 typename T0, typename T1>
1361 struct wxDirectConstructorBridge_2 : public wxDirectConstructorBrigde
1362 {
CreatewxDirectConstructorBridge_21363     void Create(wxObject * &o, wxxVariant *args)
1364     {
1365         o = new Class(
1366             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1367             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1)
1368             );
1369     }
1370 };
1371 
1372 #define wxDIRECT_CONSTRUCTOR_2(klass,t0,v0,t1,v1) \
1373     wxDirectConstructorBridge_2<klass,t0,t1> constructor##klass ; \
1374     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1375     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  } ; \
1376     const int klass::ms_constructorPropertiesCount = 2;
1377 
1378 
1379 // 3 params
1380 
1381 template<typename Class,
1382 typename T0, typename T1, typename T2>
1383 struct wxConstructorBridge_3 : public wxConstructorBridge
1384 {
CreatewxConstructorBridge_31385     void Create(wxObject * &o, wxxVariant *args)
1386     {
1387         Class *obj = dynamic_cast<Class*>(o);
1388         obj->Create(
1389             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1390             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1391             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2)
1392             );
1393     }
1394 };
1395 
1396 #define wxCONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \
1397     wxConstructorBridge_3<klass,t0,t1,t2> constructor##klass ; \
1398     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1399     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  } ; \
1400     const int klass::ms_constructorPropertiesCount = 3 ;
1401 
1402 // direct constructor version
1403 
1404 template<typename Class,
1405 typename T0, typename T1, typename T2>
1406 struct wxDirectConstructorBridge_3 : public wxDirectConstructorBrigde
1407 {
CreatewxDirectConstructorBridge_31408     void Create(wxObject * &o, wxxVariant *args)
1409     {
1410         o = new Class(
1411             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1412             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1413             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2)
1414             );
1415     }
1416 };
1417 
1418 #define wxDIRECT_CONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \
1419     wxDirectConstructorBridge_3<klass,t0,t1,t2> constructor##klass ; \
1420     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1421     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1) , wxT(#v2) } ; \
1422     const int klass::ms_constructorPropertiesCount = 3;
1423 
1424 // 4 params
1425 
1426 template<typename Class,
1427 typename T0, typename T1, typename T2, typename T3>
1428 struct wxConstructorBridge_4 : public wxConstructorBridge
1429 {
CreatewxConstructorBridge_41430     void Create(wxObject * &o, wxxVariant *args)
1431     {
1432         Class *obj = dynamic_cast<Class*>(o);
1433         obj->Create(
1434             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1435             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1436             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) ,
1437             args[3].wxTEMPLATED_MEMBER_CALL(Get , T3)
1438             );
1439     }
1440 };
1441 
1442 #define wxCONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \
1443     wxConstructorBridge_4<klass,t0,t1,t2,t3> constructor##klass ; \
1444     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1445     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  , wxT(#v3)  } ; \
1446     const int klass::ms_constructorPropertiesCount = 4 ;
1447 
1448 // 5 params
1449 
1450 template<typename Class,
1451 typename T0, typename T1, typename T2, typename T3, typename T4>
1452 struct wxConstructorBridge_5 : public wxConstructorBridge
1453 {
CreatewxConstructorBridge_51454     void Create(wxObject * &o, wxxVariant *args)
1455     {
1456         Class *obj = dynamic_cast<Class*>(o);
1457         obj->Create(
1458             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1459             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1460             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) ,
1461             args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) ,
1462             args[4].wxTEMPLATED_MEMBER_CALL(Get , T4)
1463             );
1464     }
1465 };
1466 
1467 #define wxCONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \
1468     wxConstructorBridge_5<klass,t0,t1,t2,t3,t4> constructor##klass ; \
1469     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1470     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  , wxT(#v3)  , wxT(#v4)  } ; \
1471     const int klass::ms_constructorPropertiesCount = 5;
1472 
1473 // 6 params
1474 
1475 template<typename Class,
1476 typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
1477 struct wxConstructorBridge_6 : public wxConstructorBridge
1478 {
CreatewxConstructorBridge_61479     void Create(wxObject * &o, wxxVariant *args)
1480     {
1481         Class *obj = dynamic_cast<Class*>(o);
1482         obj->Create(
1483             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1484             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1485             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) ,
1486             args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) ,
1487             args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) ,
1488             args[5].wxTEMPLATED_MEMBER_CALL(Get , T5)
1489             );
1490     }
1491 };
1492 
1493 #define wxCONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \
1494     wxConstructorBridge_6<klass,t0,t1,t2,t3,t4,t5> constructor##klass ; \
1495     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1496     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  , wxT(#v3)  , wxT(#v4)  , wxT(#v5)  } ; \
1497     const int klass::ms_constructorPropertiesCount = 6;
1498 
1499 // direct constructor version
1500 
1501 template<typename Class,
1502 typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
1503 struct wxDirectConstructorBridge_6 : public wxDirectConstructorBrigde
1504 {
CreatewxDirectConstructorBridge_61505     void Create(wxObject * &o, wxxVariant *args)
1506     {
1507         o = new Class(
1508             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1509             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1510             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) ,
1511             args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) ,
1512             args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) ,
1513             args[5].wxTEMPLATED_MEMBER_CALL(Get , T5)
1514             );
1515     }
1516 };
1517 
1518 #define wxDIRECT_CONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \
1519     wxDirectConstructorBridge_6<klass,t0,t1,t2,t3,t4,t5> constructor##klass ; \
1520     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1521     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  , wxT(#v3)  , wxT(#v4)  , wxT(#v5)  } ; \
1522     const int klass::ms_constructorPropertiesCount = 6;
1523 
1524 // 7 params
1525 
1526 template<typename Class,
1527 typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
1528 struct wxConstructorBridge_7 : public wxConstructorBridge
1529 {
CreatewxConstructorBridge_71530     void Create(wxObject * &o, wxxVariant *args)
1531     {
1532         Class *obj = dynamic_cast<Class*>(o);
1533         obj->Create(
1534             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1535             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1536             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) ,
1537             args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) ,
1538             args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) ,
1539             args[5].wxTEMPLATED_MEMBER_CALL(Get , T5) ,
1540             args[6].wxTEMPLATED_MEMBER_CALL(Get , T6)
1541             );
1542     }
1543 };
1544 
1545 #define wxCONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \
1546     wxConstructorBridge_7<klass,t0,t1,t2,t3,t4,t5,t6> constructor##klass ; \
1547     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1548     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  , wxT(#v3)  , wxT(#v4)  , wxT(#v5)  , wxT(#v6) } ; \
1549     const int klass::ms_constructorPropertiesCount = 7;
1550 
1551 // 8 params
1552 
1553 template<typename Class,
1554 typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
1555 struct wxConstructorBridge_8 : public wxConstructorBridge
1556 {
CreatewxConstructorBridge_81557     void Create(wxObject * &o, wxxVariant *args)
1558     {
1559         Class *obj = dynamic_cast<Class*>(o);
1560         obj->Create(
1561             args[0].wxTEMPLATED_MEMBER_CALL(Get , T0) ,
1562             args[1].wxTEMPLATED_MEMBER_CALL(Get , T1) ,
1563             args[2].wxTEMPLATED_MEMBER_CALL(Get , T2) ,
1564             args[3].wxTEMPLATED_MEMBER_CALL(Get , T3) ,
1565             args[4].wxTEMPLATED_MEMBER_CALL(Get , T4) ,
1566             args[5].wxTEMPLATED_MEMBER_CALL(Get , T5) ,
1567             args[6].wxTEMPLATED_MEMBER_CALL(Get , T6) ,
1568             args[7].wxTEMPLATED_MEMBER_CALL(Get , T7)
1569             );
1570     }
1571 };
1572 
1573 #define wxCONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \
1574     wxConstructorBridge_8<klass,t0,t1,t2,t3,t4,t5,t6,t7> constructor##klass ; \
1575     wxConstructorBridge* klass::ms_constructor = &constructor##klass ; \
1576     const wxChar *klass::ms_constructorProperties[] = { wxT(#v0)  , wxT(#v1)  , wxT(#v2)  , wxT(#v3)  , wxT(#v4)  , wxT(#v5)  , wxT(#v6) , wxT(#v7) } ; \
1577     const int klass::ms_constructorPropertiesCount = 8;
1578 // ----------------------------------------------------------------------------
1579 // wxClassInfo
1580 // ----------------------------------------------------------------------------
1581 
1582 typedef wxObject *(*wxObjectConstructorFn)(void);
1583 typedef wxObject* (*wxVariantToObjectConverter)( wxxVariant &data ) ;
1584 typedef wxxVariant (*wxObjectToVariantConverter)( wxObject* ) ;
1585 
1586 class WXDLLIMPEXP_BASE wxWriter;
1587 class WXDLLIMPEXP_BASE wxPersister;
1588 
1589 typedef bool (*wxObjectStreamingCallback) ( const wxObject *, wxWriter * , wxPersister * , wxxVariantArray & ) ;
1590 
1591 class WXDLLIMPEXP_BASE wxClassInfo
1592 {
1593     friend class WXDLLIMPEXP_BASE wxPropertyInfo ;
1594     friend class WXDLLIMPEXP_BASE wxHandlerInfo ;
1595 public:
1596     wxClassInfo(const wxClassInfo **_Parents,
1597         const wxChar *_UnitName,
1598         const wxChar *_ClassName,
1599         int size,
1600         wxObjectConstructorFn ctor ,
1601         wxPropertyInfo *_Props ,
1602         wxHandlerInfo *_Handlers ,
1603         wxConstructorBridge* _Constructor ,
1604         const wxChar ** _ConstructorProperties ,
1605         const int _ConstructorPropertiesCount ,
1606         wxVariantToObjectConverter _PtrConverter1 ,
1607         wxVariantToObjectConverter _Converter2 ,
1608         wxObjectToVariantConverter _Converter3 ,
1609         wxObjectStreamingCallback _streamingCallback = NULL
1610         ) :
1611 
m_className(_ClassName)1612             m_className(_ClassName),
1613             m_objectSize(size),
1614             m_objectConstructor(ctor),
1615             m_next(sm_first),
1616             m_firstProperty(_Props),
1617             m_firstHandler(_Handlers),
1618             m_parents(_Parents),
1619             m_unitName(_UnitName),
1620             m_constructor(_Constructor),
1621             m_constructorProperties(_ConstructorProperties),
1622             m_constructorPropertiesCount(_ConstructorPropertiesCount),
1623             m_variantOfPtrToObjectConverter(_PtrConverter1),
1624             m_variantToObjectConverter(_Converter2),
1625             m_objectToVariantConverter(_Converter3),
1626             m_streamingCallback(_streamingCallback)
1627     {
1628         sm_first = this;
1629         Register() ;
1630     }
1631 
wxClassInfo(const wxChar * _UnitName,const wxChar * _ClassName,const wxClassInfo ** _Parents)1632     wxClassInfo(const wxChar *_UnitName, const wxChar *_ClassName,
1633                 const wxClassInfo **_Parents) :
1634             m_className(_ClassName),
1635             m_objectSize(0),
1636             m_objectConstructor(NULL),
1637             m_next(sm_first),
1638             m_firstProperty(NULL),
1639             m_firstHandler(NULL),
1640             m_parents(_Parents),
1641             m_unitName(_UnitName),
1642             m_constructor(NULL),
1643             m_constructorProperties(NULL),
1644             m_constructorPropertiesCount(0),
1645             m_variantOfPtrToObjectConverter(NULL),
1646             m_variantToObjectConverter(NULL),
1647             m_objectToVariantConverter(NULL),
1648             m_streamingCallback(NULL)
1649     {
1650         sm_first = this;
1651         Register() ;
1652     }
1653 
1654     virtual ~wxClassInfo() ;
1655 
1656     // allocates an instance of this class, this object does not have to be initialized or fully constructed
1657     // as this call will be followed by a call to Create
AllocateObject()1658     virtual wxObject *AllocateObject() const { return m_objectConstructor ? (*m_objectConstructor)() : 0; }
1659 
1660     // 'old naming' for AllocateObject staying here for backward compatibility
CreateObject()1661     wxObject *CreateObject() const { return AllocateObject() ; }
1662 
1663     // direct construction call for classes that cannot construct instances via alloc/create
ConstructObject(int ParamCount,wxxVariant * Params)1664     wxObject *ConstructObject(int ParamCount, wxxVariant *Params) const
1665     {
1666         if ( ParamCount != m_constructorPropertiesCount )
1667         {
1668             wxLogError( _("Illegal Parameter Count for ConstructObject Method") ) ;
1669             return NULL ;
1670         }
1671         wxObject *object = NULL ;
1672         m_constructor->Create( object , Params ) ;
1673         return object ;
1674     }
1675 
NeedsDirectConstruction()1676     bool NeedsDirectConstruction() const { return dynamic_cast<wxDirectConstructorBrigde*>( m_constructor) != NULL ; }
1677 
GetClassName()1678     const wxChar       *GetClassName() const { return m_className; }
GetBaseClassName1()1679     const wxChar       *GetBaseClassName1() const
1680         { return m_parents[0] ? m_parents[0]->GetClassName() : NULL; }
GetBaseClassName2()1681     const wxChar       *GetBaseClassName2() const
1682         { return (m_parents[0] && m_parents[1]) ? m_parents[1]->GetClassName() : NULL; }
GetIncludeName()1683     const wxChar       *GetIncludeName() const { return m_unitName ; }
GetParents()1684     const wxClassInfo **GetParents() const { return m_parents; }
GetSize()1685     int                 GetSize() const { return m_objectSize; }
IsDynamic()1686     bool                IsDynamic() const { return (NULL != m_objectConstructor); }
1687 
GetConstructor()1688     wxObjectConstructorFn      GetConstructor() const { return m_objectConstructor; }
GetFirst()1689     static const wxClassInfo  *GetFirst() { return sm_first; }
GetNext()1690     const wxClassInfo         *GetNext() const { return m_next; }
1691     static wxClassInfo        *FindClass(const wxChar *className);
1692 
1693     // Climb upwards through inheritance hierarchy.
1694     // Dual inheritance is catered for.
1695 
IsKindOf(const wxClassInfo * info)1696     bool IsKindOf(const wxClassInfo *info) const
1697     {
1698         if ( info != 0 )
1699         {
1700             if ( info == this )
1701                 return true ;
1702 
1703             for ( int i = 0 ; m_parents[i] ; ++ i )
1704             {
1705                 if ( m_parents[i]->IsKindOf( info ) )
1706                     return true ;
1707             }
1708         }
1709         return false ;
1710     }
1711 
1712     // if there is a callback registered with that class it will be called
1713     // before this object will be written to disk, it can veto streaming out
1714     // this object by returning false, if this class has not registered a
1715     // callback, the search will go up the inheritance tree if no callback has
1716     // been registered true will be returned by default
1717     bool BeforeWriteObject( const wxObject *obj, wxWriter *streamer , wxPersister *persister , wxxVariantArray &metadata) const  ;
1718 
1719     // gets the streaming callback from this class or any superclass
1720     wxObjectStreamingCallback GetStreamingCallback() const ;
1721 
1722 #if WXWIN_COMPATIBILITY_2_4
1723     // Initializes parent pointers and hash table for fast searching.
1724     wxDEPRECATED( static void InitializeClasses() );
1725     // Cleans up hash table used for fast searching.
1726     wxDEPRECATED( static void CleanUpClasses() );
1727 #endif
1728     static void CleanUp();
1729 
1730     // returns the first property
GetFirstProperty()1731     const wxPropertyInfo* GetFirstProperty() const { return m_firstProperty ; }
1732 
1733     // returns the first handler
GetFirstHandler()1734     const wxHandlerInfo* GetFirstHandler() const { return m_firstHandler ; }
1735 
1736     // Call the Create upon an instance of the class, in the end the object is fully
1737     // initialized
Create(wxObject * object,int ParamCount,wxxVariant * Params)1738     virtual void Create (wxObject *object, int ParamCount, wxxVariant *Params) const
1739     {
1740         if ( ParamCount != m_constructorPropertiesCount )
1741         {
1742             wxLogError( _("Illegal Parameter Count for Create Method") ) ;
1743             return ;
1744         }
1745         m_constructor->Create( object , Params ) ;
1746     }
1747 
1748     // get number of parameters for constructor
GetCreateParamCount()1749     virtual int GetCreateParamCount() const { return m_constructorPropertiesCount; }
1750 
1751     // get n-th constructor parameter
GetCreateParamName(int n)1752     virtual const wxChar* GetCreateParamName(int n) const { return m_constructorProperties[n] ; }
1753 
1754     // Runtime access to objects for simple properties (get/set) by property name, and variant data
1755     virtual void SetProperty (wxObject *object, const wxChar *propertyName, const wxxVariant &value) const ;
1756     virtual wxxVariant GetProperty (wxObject *object, const wxChar *propertyName) const;
1757 
1758     // Runtime access to objects for collection properties by property name
1759     virtual wxxVariantArray GetPropertyCollection(wxObject *object, const wxChar *propertyName) const ;
1760     virtual void AddToPropertyCollection(wxObject *object, const wxChar *propertyName , const wxxVariant& value) const ;
1761 
1762     // we must be able to cast variants to wxObject pointers, templates seem not to be suitable
VariantToInstance(wxxVariant & data)1763     wxObject* VariantToInstance( wxxVariant &data ) const
1764     {
1765         if ( data.GetTypeInfo()->GetKind() == wxT_OBJECT )
1766             return m_variantToObjectConverter( data ) ;
1767         else
1768             return m_variantOfPtrToObjectConverter( data ) ;
1769     }
1770 
InstanceToVariant(wxObject * object)1771     wxxVariant InstanceToVariant( wxObject *object ) const { return m_objectToVariantConverter( object ) ; }
1772 
1773     // find property by name
1774     virtual const wxPropertyInfo *FindPropertyInfo (const wxChar *PropertyName) const ;
1775 
1776     // find handler by name
1777     virtual const wxHandlerInfo *FindHandlerInfo (const wxChar *PropertyName) const ;
1778 
1779     // find property by name
1780     virtual wxPropertyInfo *FindPropertyInfoInThisClass (const wxChar *PropertyName) const ;
1781 
1782     // find handler by name
1783     virtual wxHandlerInfo *FindHandlerInfoInThisClass (const wxChar *PropertyName) const ;
1784 
1785     // puts all the properties of this class and its superclasses in the map, as long as there is not yet
1786     // an entry with the same name (overriding mechanism)
1787     void GetProperties( wxPropertyInfoMap &map ) const ;
1788 public:
1789     const wxChar            *m_className;
1790     int                      m_objectSize;
1791     wxObjectConstructorFn    m_objectConstructor;
1792 
1793     // class info object live in a linked list:
1794     // pointers to its head and the next element in it
1795 
1796     static wxClassInfo      *sm_first;
1797     wxClassInfo             *m_next;
1798 
1799     // FIXME: this should be private (currently used directly by way too
1800     //        many clients)
1801     static wxHashTable      *sm_classTable;
1802 
1803 protected :
1804     wxPropertyInfo *         m_firstProperty ;
1805     wxHandlerInfo *          m_firstHandler ;
1806 private:
1807     const wxClassInfo**      m_parents ;
1808     const wxChar*            m_unitName;
1809 
1810     wxConstructorBridge*     m_constructor ;
1811     const wxChar **          m_constructorProperties ;
1812     const int                m_constructorPropertiesCount ;
1813     wxVariantToObjectConverter m_variantOfPtrToObjectConverter ;
1814     wxVariantToObjectConverter m_variantToObjectConverter ;
1815     wxObjectToVariantConverter m_objectToVariantConverter ;
1816     wxObjectStreamingCallback m_streamingCallback ;
1817     const wxPropertyAccessor *FindAccessor (const wxChar *propertyName) const ;
1818 
1819 
1820     // InitializeClasses() helper
1821     static wxClassInfo *GetBaseByName(const wxChar *name) ;
1822 
1823 protected:
1824     // registers the class
1825     void Register();
1826     void Unregister();
1827 
1828     DECLARE_NO_COPY_CLASS(wxClassInfo)
1829 };
1830 
1831 
1832 WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxChar *name);
1833 
1834 // ----------------------------------------------------------------------------
1835 // wxDynamicObject
1836 // ----------------------------------------------------------------------------
1837 //
1838 // this object leads to having a pure runtime-instantiation
1839 
1840 class WXDLLIMPEXP_BASE wxDynamicClassInfo : public wxClassInfo
1841 {
1842     friend class WXDLLIMPEXP_BASE wxDynamicObject ;
1843 public :
1844     wxDynamicClassInfo( const wxChar *_UnitName, const wxChar *_ClassName , const wxClassInfo* superClass ) ;
1845     virtual ~wxDynamicClassInfo() ;
1846 
1847     // constructs a wxDynamicObject with an instance
1848     virtual wxObject *AllocateObject() const ;
1849 
1850     // Call the Create method for a class
1851     virtual void Create (wxObject *object, int ParamCount, wxxVariant *Params) const ;
1852 
1853     // get number of parameters for constructor
1854     virtual int GetCreateParamCount() const ;
1855 
1856     // get i-th constructor parameter
1857     virtual const wxChar* GetCreateParamName(int i) const ;
1858 
1859     // Runtime access to objects by property name, and variant data
1860     virtual void SetProperty (wxObject *object, const wxChar *PropertyName, const wxxVariant &Value) const ;
1861     virtual wxxVariant GetProperty (wxObject *object, const wxChar *PropertyName) const ;
1862 
1863     // adds a property to this class at runtime
1864     void AddProperty( const wxChar *propertyName , const wxTypeInfo* typeInfo ) ;
1865 
1866     // removes an existing runtime-property
1867     void RemoveProperty( const wxChar *propertyName ) ;
1868 
1869     // renames an existing runtime-property
1870     void RenameProperty( const wxChar *oldPropertyName , const wxChar *newPropertyName ) ;
1871 
1872     // as a handler to this class at runtime
1873     void AddHandler( const wxChar *handlerName , wxObjectEventFunction address , const wxClassInfo* eventClassInfo ) ;
1874 
1875     // removes an existing runtime-handler
1876     void RemoveHandler( const wxChar *handlerName ) ;
1877 
1878     // renames an existing runtime-handler
1879     void RenameHandler( const wxChar *oldHandlerName , const wxChar *newHandlerName ) ;
1880 private :
1881     struct wxDynamicClassInfoInternal ;
1882     wxDynamicClassInfoInternal* m_data ;
1883 } ;
1884 
1885 // ----------------------------------------------------------------------------
1886 // Dynamic class macros
1887 // ----------------------------------------------------------------------------
1888 
1889 #define _DECLARE_DYNAMIC_CLASS(name)           \
1890  public:                                      \
1891  static wxClassInfo ms_classInfo;          \
1892  static const wxClassInfo* ms_classParents[] ; \
1893  static wxPropertyInfo* GetPropertiesStatic() ; \
1894  static wxHandlerInfo* GetHandlersStatic() ; \
1895  static wxClassInfo *GetClassInfoStatic()   \
1896 { return &name::ms_classInfo; } \
1897     virtual wxClassInfo *GetClassInfo() const   \
1898 { return &name::ms_classInfo; }
1899 
1900 /*
1901 #define _DECLARE_DYNAMIC_CLASS(name)           \
1902  public:                                      \
1903  static wxClassInfo ms_class##name;          \
1904  static const wxClassInfo* ms_classParents##name[] ; \
1905  static wxPropertyInfo* GetPropertiesStatic() ; \
1906  static wxHandlerInfo* GetHandlersStatic() ; \
1907  static wxClassInfo *GetClassInfoStatic()   \
1908 { return &name::ms_class##name; } \
1909     virtual wxClassInfo *GetClassInfo() const   \
1910 { return &name::ms_class##name; }
1911 */
1912 #define DECLARE_DYNAMIC_CLASS(name)           \
1913     static wxConstructorBridge* ms_constructor ; \
1914     static const wxChar * ms_constructorProperties[] ; \
1915     static const int ms_constructorPropertiesCount ; \
1916     _DECLARE_DYNAMIC_CLASS(name)
1917 
1918 #define DECLARE_DYNAMIC_CLASS_NO_ASSIGN(name)   \
1919     DECLARE_NO_ASSIGN_CLASS(name)               \
1920     DECLARE_DYNAMIC_CLASS(name)
1921 
1922 #define DECLARE_DYNAMIC_CLASS_NO_COPY(name)   \
1923     DECLARE_NO_COPY_CLASS(name)               \
1924     DECLARE_DYNAMIC_CLASS(name)
1925 
1926 #define DECLARE_ABSTRACT_CLASS(name) _DECLARE_DYNAMIC_CLASS(name)
1927 #define DECLARE_CLASS(name) DECLARE_DYNAMIC_CLASS(name)
1928 
1929 // -----------------------------------
1930 // for concrete classes
1931 // -----------------------------------
1932 
1933 // Single inheritance with one base class
1934 
1935 #define _TYPEINFO_CLASSES(n , toString , fromString ) \
1936     wxClassTypeInfo s_typeInfo##n(wxT_OBJECT , &n::ms_classInfo , toString , fromString , typeid(n).name()) ; \
1937     wxClassTypeInfo s_typeInfoPtr##n(wxT_OBJECT_PTR , &n::ms_classInfo , toString , fromString , typeid(n*).name()) ;
1938 
1939 #define _IMPLEMENT_DYNAMIC_CLASS(name, basename, unit , callback)                 \
1940     wxObject* wxConstructorFor##name()                             \
1941 { return new name; }                                          \
1942     const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \
1943     wxObject* wxVariantOfPtrToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \
1944     wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast<name*> (data)  ) ; } \
1945     wxClassInfo name::ms_classInfo(name::ms_classParents , wxT(unit) , wxT(#name),   \
1946     (int) sizeof(name),                              \
1947     (wxObjectConstructorFn) wxConstructorFor##name   ,   \
1948     name::GetPropertiesStatic(),name::GetHandlersStatic(),name::ms_constructor , name::ms_constructorProperties ,     \
1949     name::ms_constructorPropertiesCount , wxVariantOfPtrToObjectConverter##name , NULL , wxObjectToVariantConverter##name , callback);
1950 
1951 #define _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY(name, basename, unit, callback )                 \
1952     wxObject* wxConstructorFor##name()                             \
1953 { return new name; }                                          \
1954     const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \
1955     wxObject* wxVariantToObjectConverter##name ( wxxVariant &data ) { return &data.wxTEMPLATED_MEMBER_CALL(Get , name) ; } \
1956     wxObject* wxVariantOfPtrToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \
1957     wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast<name*> (data)  ) ; } \
1958     wxClassInfo name::ms_classInfo(name::ms_classParents , wxT(unit) , wxT(#name),   \
1959     (int) sizeof(name),                              \
1960     (wxObjectConstructorFn) wxConstructorFor##name   ,   \
1961     name::GetPropertiesStatic(),name::GetHandlersStatic(),name::ms_constructor , name::ms_constructorProperties,     \
1962     name::ms_constructorPropertiesCount , wxVariantOfPtrToObjectConverter##name , wxVariantToObjectConverter##name , wxObjectToVariantConverter##name, callback);
1963 
1964 #define IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename ) \
1965     _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename , "" , NULL ) \
1966     _TYPEINFO_CLASSES(name, NULL , NULL) \
1967     const wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } \
1968     const wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \
1969     wxCONSTRUCTOR_DUMMY( name )
1970 
1971 #define IMPLEMENT_DYNAMIC_CLASS( name , basename ) \
1972     _IMPLEMENT_DYNAMIC_CLASS( name , basename , "" , NULL ) \
1973      _TYPEINFO_CLASSES(name, NULL , NULL) \
1974    wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } \
1975     wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \
1976     wxCONSTRUCTOR_DUMMY( name )
1977 
1978 #define IMPLEMENT_DYNAMIC_CLASS_XTI( name , basename , unit ) \
1979     _IMPLEMENT_DYNAMIC_CLASS( name , basename , unit , NULL ) \
1980     _TYPEINFO_CLASSES(name, NULL , NULL)
1981 
1982 #define IMPLEMENT_DYNAMIC_CLASS_XTI_CALLBACK( name , basename , unit , callback ) \
1983     _IMPLEMENT_DYNAMIC_CLASS( name , basename , unit , &callback ) \
1984     _TYPEINFO_CLASSES(name, NULL , NULL)
1985 
1986 #define IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI( name , basename , unit ) \
1987     _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename , unit , NULL  ) \
1988     _TYPEINFO_CLASSES(name, NULL , NULL)
1989 
1990 #define IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_AND_STREAMERS_XTI( name , basename , unit , toString , fromString ) \
1991     _IMPLEMENT_DYNAMIC_CLASS_WITH_COPY( name , basename , unit , NULL  ) \
1992     _TYPEINFO_CLASSES(name, toString , fromString)
1993 
1994 // this is for classes that do not derive from wxobject, there are no creators for these
1995 
1996 #define IMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_NO_BASE_XTI( name , unit ) \
1997     const wxClassInfo* name::ms_classParents[] = { NULL } ; \
1998     wxClassInfo name::ms_classInfo(name::ms_classParents , wxEmptyString , wxT(#name),   \
1999     (int) sizeof(name),                              \
2000     (wxObjectConstructorFn) 0   ,   \
2001     name::GetPropertiesStatic(),name::GetHandlersStatic(),0 , 0 ,     \
2002     0 , 0 , 0 );    \
2003     _TYPEINFO_CLASSES(name, NULL , NULL)
2004 
2005 // this is for subclasses that still do not derive from wxobject
2006 
2007 #define IMPLEMENT_DYNAMIC_CLASS_NO_WXOBJECT_XTI( name , basename, unit ) \
2008     const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \
2009     wxClassInfo name::ms_classInfo(name::ms_classParents , wxEmptyString , wxT(#name),   \
2010     (int) sizeof(name),                              \
2011     (wxObjectConstructorFn) 0   ,   \
2012     name::GetPropertiesStatic(),name::GetHandlersStatic(),0 , 0 ,     \
2013     0 , 0 , 0 );    \
2014     _TYPEINFO_CLASSES(name, NULL , NULL)
2015 
2016 
2017 // Multiple inheritance with two base classes
2018 
2019 #define _IMPLEMENT_DYNAMIC_CLASS2(name, basename, basename2, unit)                 \
2020     wxObject* wxConstructorFor##name()                             \
2021 { return new name; }                                          \
2022     const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,&basename2::ms_classInfo , NULL } ; \
2023     wxObject* wxVariantToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \
2024     wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast<name*> (data)  ) ; } \
2025     wxClassInfo name::ms_classInfo(name::ms_classParents , wxT(unit) , wxT(#name),   \
2026     (int) sizeof(name),                              \
2027     (wxObjectConstructorFn) wxConstructorFor##name   ,   \
2028     name::GetPropertiesStatic(),name::GetHandlersStatic(),name::ms_constructor , name::ms_constructorProperties ,     \
2029     name::ms_constructorPropertiesCount , wxVariantToObjectConverter##name, wxVariantToObjectConverter##name , wxObjectToVariantConverter##name);    \
2030 
2031 #define IMPLEMENT_DYNAMIC_CLASS2( name , basename , basename2) \
2032     _IMPLEMENT_DYNAMIC_CLASS2( name , basename , basename2 , "") \
2033     _TYPEINFO_CLASSES(name, NULL , NULL) \
2034     wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; } \
2035     wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \
2036     wxCONSTRUCTOR_DUMMY( name )
2037 
2038 #define IMPLEMENT_DYNAMIC_CLASS2_XTI( name , basename , basename2, unit) \
2039     _IMPLEMENT_DYNAMIC_CLASS2( name , basename , basename2 , unit) \
2040     _TYPEINFO_CLASSES(name, NULL , NULL)
2041 
2042 
2043 // -----------------------------------
2044 // for abstract classes
2045 // -----------------------------------
2046 
2047 // Single inheritance with one base class
2048 
2049 #define _IMPLEMENT_ABSTRACT_CLASS(name, basename)                \
2050     const wxClassInfo* name::ms_classParents[] = { &basename::ms_classInfo ,NULL } ; \
2051     wxObject* wxVariantToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \
2052     wxObject* wxVariantOfPtrToObjectConverter##name ( wxxVariant &data ) { return data.wxTEMPLATED_MEMBER_CALL(Get , name*) ; } \
2053     wxxVariant wxObjectToVariantConverter##name ( wxObject *data ) { return wxxVariant( dynamic_cast<name*> (data)  ) ; } \
2054     wxClassInfo name::ms_classInfo(name::ms_classParents , wxEmptyString , wxT(#name),   \
2055     (int) sizeof(name),                              \
2056     (wxObjectConstructorFn) 0   ,   \
2057     name::GetPropertiesStatic(),name::GetHandlersStatic(),0 , 0 ,     \
2058     0 , wxVariantOfPtrToObjectConverter##name ,wxVariantToObjectConverter##name , wxObjectToVariantConverter##name);    \
2059     _TYPEINFO_CLASSES(name, NULL , NULL)
2060 
2061 #define IMPLEMENT_ABSTRACT_CLASS( name , basename ) \
2062     _IMPLEMENT_ABSTRACT_CLASS( name , basename ) \
2063     wxHandlerInfo *name::GetHandlersStatic() { return (wxHandlerInfo*) NULL ; } \
2064     wxPropertyInfo *name::GetPropertiesStatic() { return (wxPropertyInfo*) NULL ; }
2065 
2066 // Multiple inheritance with two base classes
2067 
2068 #define IMPLEMENT_ABSTRACT_CLASS2(name, basename1, basename2)   \
2069     wxClassInfo name::ms_classInfo(wxT(#name), wxT(#basename1),  \
2070     wxT(#basename2), (int) sizeof(name),                \
2071     (wxObjectConstructorFn) 0);
2072 
2073 #define IMPLEMENT_CLASS IMPLEMENT_ABSTRACT_CLASS
2074 #define IMPLEMENT_CLASS2 IMPLEMENT_ABSTRACT_CLASS2
2075 
2076 #define wxBEGIN_EVENT_TABLE( a , b ) BEGIN_EVENT_TABLE( a , b )
2077 #define wxEND_EVENT_TABLE() END_EVENT_TABLE()
2078 
2079 // --------------------------------------------------------------------------
2080 // Collection Support
2081 // --------------------------------------------------------------------------
2082 
wxListCollectionToVariantArray(const collection_t & coll,wxxVariantArray & value)2083 template<typename iter , typename collection_t > void wxListCollectionToVariantArray( const collection_t& coll , wxxVariantArray &value )
2084 {
2085     iter current = coll.GetFirst() ;
2086     while (current)
2087     {
2088         value.Add( new wxxVariant(current->GetData()) ) ;
2089         current = current->GetNext();
2090     }
2091 }
2092 
wxArrayCollectionToVariantArray(const collection_t & coll,wxxVariantArray & value)2093 template<typename collection_t> void wxArrayCollectionToVariantArray( const collection_t& coll , wxxVariantArray &value )
2094 {
2095     for( size_t i = 0 ; i < coll.GetCount() ; i++ )
2096     {
2097         value.Add( new wxxVariant(coll[i]) ) ;
2098     }
2099 }
2100 
2101 
2102 #endif // _WX_XTIH__
2103