| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/xtiprop.h
- // Purpose: XTI properties
- // Author: Stefan Csomor
- // Modified by: Francesco Montorsi
- // Created: 27/07/03
- // Copyright: (c) 1997 Julian Smart
- // (c) 2003 Stefan Csomor
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _XTIPROP_H_
- #define _XTIPROP_H_
- #include "wx/defs.h"
- #if wxUSE_EXTENDED_RTTI
- #include "wx/xti.h"
- #include "wx/any.h"
- /*
- class WXDLLIMPEXP_BASE wxObject;
- class WXDLLIMPEXP_BASE wxClassInfo;
- class WXDLLIMPEXP_BASE wxDynamicClassInfo;
- */
- class WXDLLIMPEXP_BASE wxHashTable;
- class WXDLLIMPEXP_BASE wxHashTable_Node;
- class WXDLLIMPEXP_BASE wxEvent;
- class WXDLLIMPEXP_BASE wxEvtHandler;
- // ----------------------------------------------------------------------------
- // Property Accessors
- //
- // wxPropertySetter/Getter/CollectionGetter/CollectionAdder are all property
- // accessors which are managed by wxPropertyAccessor class which in turn is
- // handled by wxPropertyInfo.
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_BASE wxPropertySetter
- {
- public:
- wxPropertySetter( const wxString name ) { m_name = name; }
- virtual ~wxPropertySetter() {}
- virtual void Set( wxObject *object, const wxAny &variantValue ) const = 0;
- const wxString& GetName() const { return m_name; }
- private:
- wxString m_name;
- };
- class WXDLLIMPEXP_BASE wxPropertyGetter
- {
- public:
- wxPropertyGetter( const wxString name ) { m_name = name; }
- virtual ~wxPropertyGetter() {}
- virtual void Get( const wxObject *object, wxAny& result) const = 0;
- const wxString& GetName() const { return m_name; }
- private:
- wxString m_name;
- };
- class WXDLLIMPEXP_BASE wxPropertyCollectionGetter
- {
- public:
- wxPropertyCollectionGetter( const wxString name ) { m_name = name; }
- virtual ~wxPropertyCollectionGetter() {}
- virtual void Get( const wxObject *object, wxAnyList& result) const = 0;
- const wxString& GetName() const { return m_name; }
- private:
- wxString m_name;
- };
- template<typename coll_t> void WXDLLIMPEXP_BASE \
- wxCollectionToVariantArray( const coll_t& coll, wxAnyList& result );
- class WXDLLIMPEXP_BASE wxPropertyCollectionAdder
- {
- public:
- wxPropertyCollectionAdder( const wxString name ) { m_name = name; }
- virtual ~wxPropertyCollectionAdder() {}
- virtual void Add( wxObject *object, const wxAny &variantValue ) const= 0;
- const wxString& GetName() const { return m_name; }
- private:
- wxString m_name;
- };
- #define wxPROPERTY_SETTER( property, Klass, valueType, setterMethod ) \
- class wxPropertySetter##property : public wxPropertySetter \
- { \
- public: \
- wxINFUNC_CLASS_TYPE_FIX(Klass) \
- wxPropertySetter##property() : wxPropertySetter( wxT(#setterMethod) ) {} \
- virtual ~wxPropertySetter##property() {} \
- \
- void Set( wxObject *object, const wxAny &variantValue ) const \
- { \
- Klass *obj = dynamic_cast<Klass*>(object); \
- valueType tempobj; \
- if ( variantValue.GetAs(&tempobj) ) \
- obj->setterMethod(tempobj); \
- else \
- obj->setterMethod(*wxANY_AS(variantValue, valueType*)); \
- } \
- };
- #define wxPROPERTY_GETTER( property, Klass, valueType, gettermethod ) \
- class wxPropertyGetter##property : public wxPropertyGetter \
- { \
- public: \
- wxINFUNC_CLASS_TYPE_FIX(Klass) \
- wxPropertyGetter##property() : wxPropertyGetter( wxT(#gettermethod) ) {} \
- virtual ~wxPropertyGetter##property() {} \
- \
- void Get( const wxObject *object, wxAny &result) const \
- { \
- const Klass *obj = dynamic_cast<const Klass*>(object); \
- result = wxAny( obj->gettermethod() ); \
- } \
- };
- #define wxPROPERTY_COLLECTION_ADDER( property, Klass, valueType, addermethod ) \
- class wxPropertyCollectionAdder##property : public wxPropertyCollectionAdder \
- { \
- public: \
- wxINFUNC_CLASS_TYPE_FIX(Klass) \
- wxPropertyCollectionAdder##property() : wxPropertyCollectionAdder( wxT(#addermethod) ) {} \
- virtual ~wxPropertyCollectionAdder##property() {} \
- \
- void Add( wxObject *object, const wxAny &variantValue ) const \
- { \
- Klass *obj = dynamic_cast<Klass*>(object); \
- valueType tempobj; \
- if ( variantValue.GetAs(&tempobj) ) \
- obj->addermethod(tempobj); \
- else \
- obj->addermethod(*wxANY_AS(variantValue, valueType*)); \
- } \
- };
- #define wxPROPERTY_COLLECTION_GETTER( property, Klass, valueType, gettermethod ) \
- class wxPropertyCollectionGetter##property : public wxPropertyCollectionGetter \
- { \
- public: \
- wxINFUNC_CLASS_TYPE_FIX(Klass) \
- wxPropertyCollectionGetter##property() : wxPropertyCollectionGetter( wxT(#gettermethod) ) {} \
- virtual ~wxPropertyCollectionGetter##property() {} \
- \
- void Get( const wxObject *object, wxAnyList &result) const \
- { \
- const Klass *obj = dynamic_cast<const Klass*>(object); \
- wxCollectionToVariantArray( obj->gettermethod(), result ); \
- } \
- };
- class WXDLLIMPEXP_BASE wxPropertyAccessor
- {
- public:
- wxPropertyAccessor( wxPropertySetter *setter, wxPropertyGetter *getter,
- wxPropertyCollectionAdder *adder, wxPropertyCollectionGetter *collectionGetter )
- { m_setter = setter; m_getter = getter; m_adder = adder;
- m_collectionGetter = collectionGetter; }
- virtual ~wxPropertyAccessor() {}
- // Setting a simple property (non-collection)
- virtual void SetProperty(wxObject *object, const wxAny &value) const
- {
- if ( m_setter )
- m_setter->Set( object, value );
- else
- wxLogError( wxGetTranslation("SetProperty called w/o valid setter") );
- }
- // Getting a simple property (non-collection)
- virtual void GetProperty(const wxObject *object, wxAny &result) const
- {
- if ( m_getter )
- m_getter->Get( object, result );
- else
- wxLogError( wxGetTranslation("GetProperty called w/o valid getter") );
- }
- // Adding an element to a collection property
- virtual void AddToPropertyCollection(wxObject *object, const wxAny &value) const
- {
- if ( m_adder )
- m_adder->Add( object, value );
- else
- wxLogError( wxGetTranslation("AddToPropertyCollection called w/o valid adder") );
- }
- // Getting a collection property
- virtual void GetPropertyCollection( const wxObject *obj, wxAnyList &result) const
- {
- if ( m_collectionGetter )
- m_collectionGetter->Get( obj, result);
- else
- wxLogError( wxGetTranslation("GetPropertyCollection called w/o valid collection getter") );
- }
- virtual bool HasSetter() const { return m_setter != NULL; }
- virtual bool HasCollectionGetter() const { return m_collectionGetter != NULL; }
- virtual bool HasGetter() const { return m_getter != NULL; }
- virtual bool HasAdder() const { return m_adder != NULL; }
- virtual const wxString& GetCollectionGetterName() const
- { return m_collectionGetter->GetName(); }
- virtual const wxString& GetGetterName() const
- { return m_getter->GetName(); }
- virtual const wxString& GetSetterName() const
- { return m_setter->GetName(); }
- virtual const wxString& GetAdderName() const
- { return m_adder->GetName(); }
- protected:
- wxPropertySetter *m_setter;
- wxPropertyCollectionAdder *m_adder;
- wxPropertyGetter *m_getter;
- wxPropertyCollectionGetter* m_collectionGetter;
- };
- class WXDLLIMPEXP_BASE wxGenericPropertyAccessor : public wxPropertyAccessor
- {
- public:
- wxGenericPropertyAccessor( const wxString &propName );
- virtual ~wxGenericPropertyAccessor();
- void RenameProperty( const wxString& WXUNUSED_UNLESS_DEBUG(oldName),
- const wxString& newName )
- {
- wxASSERT( oldName == m_propertyName ); m_propertyName = newName;
- }
- virtual bool HasSetter() const { return true; }
- virtual bool HasGetter() const { return true; }
- virtual bool HasAdder() const { return false; }
- virtual bool HasCollectionGetter() const { return false; }
- virtual const wxString& GetGetterName() const
- { return m_getterName; }
- virtual const wxString& GetSetterName() const
- { return m_setterName; }
- virtual void SetProperty(wxObject *object, const wxAny &value) const;
- virtual void GetProperty(const wxObject *object, wxAny &value) const;
- // Adding an element to a collection property
- virtual void AddToPropertyCollection(wxObject *WXUNUSED(object),
- const wxAny &WXUNUSED(value)) const
- {
- wxLogError( wxGetTranslation("AddToPropertyCollection called on a generic accessor") );
- }
- // Getting a collection property
- virtual void GetPropertyCollection( const wxObject *WXUNUSED(obj),
- wxAnyList &WXUNUSED(result)) const
- {
- wxLogError ( wxGetTranslation("GetPropertyCollection called on a generic accessor") );
- }
- private:
- struct wxGenericPropertyAccessorInternal;
- wxGenericPropertyAccessorInternal* m_data;
- wxString m_propertyName;
- wxString m_setterName;
- wxString m_getterName;
- };
- typedef long wxPropertyInfoFlags;
- enum
- {
- // will be removed in future releases
- wxPROP_DEPRECATED = 0x00000001,
- // object graph property, will be streamed with priority (after constructor properties)
- wxPROP_OBJECT_GRAPH = 0x00000002,
- // this will only be streamed out and in as enum/set, the internal representation
- // is still a long
- wxPROP_ENUM_STORE_LONG = 0x00000004,
- // don't stream out this property, needed eg to avoid streaming out children
- // that are always created by their parents
- wxPROP_DONT_STREAM = 0x00000008
- };
- // ----------------------------------------------------------------------------
- // Property Support
- //
- // wxPropertyInfo is used to inquire of the property by name. It doesn't
- // provide access to the property, only information about it. If you
- // want access, look at wxPropertyAccessor.
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_BASE wxPropertyInfo
- {
- friend class /* WXDLLIMPEXP_BASE */ wxDynamicClassInfo;
- public:
- wxPropertyInfo(wxPropertyInfo* &iter,
- wxClassInfo* itsClass,
- const wxString& name,
- const wxString& typeName,
- wxPropertyAccessor *accessor,
- wxAny dv,
- wxPropertyInfoFlags flags = 0,
- const wxString& helpString = wxEmptyString,
- const wxString& groupString = wxEmptyString) :
- m_itsClass(itsClass),
- m_name(name),
- m_typeInfo(NULL),
- m_typeName(typeName),
- m_collectionElementTypeInfo(NULL),
- m_accessor(accessor),
- m_defaultValue(dv),
- m_flags(flags),
- m_helpString(helpString),
- m_groupString(groupString)
- {
- Insert(iter);
- }
- wxPropertyInfo(wxPropertyInfo* &iter,
- wxClassInfo* itsClass,
- const wxString& name,
- wxEventSourceTypeInfo* type,
- wxPropertyAccessor *accessor,
- wxAny dv,
- wxPropertyInfoFlags flags = 0,
- const wxString& helpString = wxEmptyString,
- const wxString& groupString = wxEmptyString) :
- m_itsClass(itsClass),
- m_name(name),
- m_typeInfo(type),
- m_collectionElementTypeInfo(NULL),
- m_accessor(accessor),
- m_defaultValue(dv),
- m_flags(flags),
- m_helpString(helpString),
- m_groupString(groupString)
- {
- Insert(iter);
- }
- wxPropertyInfo(wxPropertyInfo* &iter,
- wxClassInfo* itsClass, const wxString& name,
- const wxString& collectionTypeName,
- const wxString& elementTypeName,
- wxPropertyAccessor *accessor,
- wxPropertyInfoFlags flags = 0,
- const wxString& helpString = wxEmptyString,
- const wxString& groupString = wxEmptyString) :
- m_itsClass(itsClass),
- m_name(name),
- m_typeInfo(NULL),
- m_typeName(collectionTypeName),
- m_collectionElementTypeInfo(NULL),
- m_collectionElementTypeName(elementTypeName),
- m_accessor(accessor),
- m_flags(flags),
- m_helpString(helpString),
- m_groupString(groupString)
- {
- Insert(iter);
- }
- ~wxPropertyInfo()
- { Remove(); }
- // return the class this property is declared in
- const wxClassInfo* GetDeclaringClass() const { return m_itsClass; }
- // return the name of this property
- const wxString& GetName() const { return m_name; }
- // returns the flags of this property
- wxPropertyInfoFlags GetFlags() const { return m_flags; }
- // returns the short help string of this property
- const wxString& GetHelpString() const { return m_helpString; }
- // returns the group string of this property
- const wxString& GetGroupString() const { return m_groupString; }
- // return the element type info of this property (for collections, otherwise NULL)
- const wxTypeInfo * GetCollectionElementTypeInfo() const
- {
- if ( m_collectionElementTypeInfo == NULL )
- m_collectionElementTypeInfo = wxTypeInfo::FindType(m_collectionElementTypeName);
- return m_collectionElementTypeInfo;
- }
- // return the type info of this property
- const wxTypeInfo * GetTypeInfo() const
- {
- if ( m_typeInfo == NULL )
- m_typeInfo = wxTypeInfo::FindType(m_typeName);
- return m_typeInfo;
- }
- // return the accessor for this property
- wxPropertyAccessor* GetAccessor() const { return m_accessor; }
- // returns NULL if this is the last property of this class
- wxPropertyInfo* GetNext() const { return m_next; }
- // returns the default value of this property, its kind may be wxT_VOID if it is not valid
- wxAny GetDefaultValue() const { return m_defaultValue; }
- private:
- // inserts this property at the end of the linked chain which begins
- // with "iter" property.
- void Insert(wxPropertyInfo* &iter);
- // removes this property from the linked chain of the m_itsClass properties.
- void Remove();
- wxClassInfo* m_itsClass;
- wxString m_name;
- mutable wxTypeInfo* m_typeInfo;
- wxString m_typeName;
- mutable wxTypeInfo* m_collectionElementTypeInfo;
- wxString m_collectionElementTypeName;
- wxPropertyAccessor* m_accessor;
- wxAny m_defaultValue;
- wxPropertyInfoFlags m_flags;
- wxString m_helpString;
- wxString m_groupString;
- wxPropertyInfo* m_next;
- // FIXME: what's this comment about??
- // string representation of the default value
- // to be assigned by the designer to the property
- // when the component is dropped on the container.
- };
- // stl is giving problems when forwarding declarations, therefore we define it as a subclass
- WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxPropertyInfo*, wxPropertyInfoMapBase,
- class WXDLLIMPEXP_BASE );
- class WXDLLIMPEXP_BASE wxPropertyInfoMap : public wxPropertyInfoMapBase {
- };
- WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxAny, wxStringToAnyHashMapBase,
- class WXDLLIMPEXP_BASE );
- class WXDLLIMPEXP_FWD_BASE wxStringToAnyHashMap : public wxStringToAnyHashMapBase {
- };
- #define wxBEGIN_PROPERTIES_TABLE(theClass) \
- wxPropertyInfo *theClass::GetPropertiesStatic() \
- { \
- typedef theClass class_t; \
- static wxPropertyInfo* first = NULL;
- #define wxEND_PROPERTIES_TABLE() \
- return first; }
- #define wxHIDE_PROPERTY( pname ) \
- static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(void).name(), NULL, wxAny(), wxPROP_DONT_STREAM, \
- wxEmptyString, wxEmptyString );
- #define wxPROPERTY( pname, type, setter, getter, defaultValue, flags, help, group) \
- wxPROPERTY_SETTER( pname, class_t, type, setter ) \
- static wxPropertySetter##pname _setter##pname; \
- wxPROPERTY_GETTER( pname, class_t, type, getter ) \
- static wxPropertyGetter##pname _getter##pname; \
- static wxPropertyAccessor _accessor##pname( &_setter##pname, \
- &_getter##pname, NULL, NULL ); \
- static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(type).name(), &_accessor##pname, \
- wxAny(defaultValue), flags, group, help );
- #define wxPROPERTY_FLAGS( pname, flags, type, setter, getter,defaultValue, \
- pflags, help, group) \
- wxPROPERTY_SETTER( pname, class_t, type, setter ) \
- static wxPropertySetter##pname _setter##pname; \
- wxPROPERTY_GETTER( pname, class_t, type, getter ) \
- static wxPropertyGetter##pname _getter##pname; \
- static wxPropertyAccessor _accessor##pname( &_setter##pname, \
- &_getter##pname, NULL, NULL ); \
- static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(flags).name(), &_accessor##pname, \
- wxAny(defaultValue), wxPROP_ENUM_STORE_LONG | pflags, help, group );
- #define wxREADONLY_PROPERTY( pname, type, getter,defaultValue, flags, help, group) \
- wxPROPERTY_GETTER( pname, class_t, type, getter ) \
- static wxPropertyGetter##pname _getter##pname; \
- static wxPropertyAccessor _accessor##pname( NULL, &_getter##pname, NULL, NULL ); \
- static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(type).name(),&_accessor##pname, \
- wxAny(defaultValue), flags, help, group );
- #define wxREADONLY_PROPERTY_FLAGS( pname, flags, type, getter,defaultValue, \
- pflags, help, group) \
- wxPROPERTY_GETTER( pname, class_t, type, getter ) \
- static wxPropertyGetter##pname _getter##pname; \
- static wxPropertyAccessor _accessor##pname( NULL, &_getter##pname, NULL, NULL ); \
- static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(flags).name(),&_accessor##pname, \
- wxAny(defaultValue), wxPROP_ENUM_STORE_LONG | pflags, help, group );
- #define wxPROPERTY_COLLECTION( pname, colltype, addelemtype, adder, getter, \
- flags, help, group ) \
- wxPROPERTY_COLLECTION_ADDER( pname, class_t, addelemtype, adder ) \
- static wxPropertyCollectionAdder##pname _adder##pname; \
- wxPROPERTY_COLLECTION_GETTER( pname, class_t, colltype, getter ) \
- static wxPropertyCollectionGetter##pname _collectionGetter##pname; \
- static wxPropertyAccessor _accessor##pname( NULL, NULL,&_adder##pname, \
- &_collectionGetter##pname ); \
- static wxPropertyInfo _propertyInfo##pname( first, class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(colltype).name(),typeid(addelemtype).name(), \
- &_accessor##pname, flags, help, group );
- #define wxREADONLY_PROPERTY_COLLECTION( pname, colltype, addelemtype, getter, \
- flags, help, group) \
- wxPROPERTY_COLLECTION_GETTER( pname, class_t, colltype, getter ) \
- static wxPropertyCollectionGetter##pname _collectionGetter##pname; \
- static wxPropertyAccessor _accessor##pname( NULL, NULL, NULL, \
- &_collectionGetter##pname ); \
- static wxPropertyInfo _propertyInfo##pname( first,class_t::GetClassInfoStatic(), \
- wxT(#pname), typeid(colltype).name(),typeid(addelemtype).name(), \
- &_accessor##pname, flags, help, group );
- #define wxEVENT_PROPERTY( name, eventType, eventClass ) \
- static wxEventSourceTypeInfo _typeInfo##name( eventType, wxCLASSINFO( eventClass ) ); \
- static wxPropertyInfo _propertyInfo##name( first,class_t::GetClassInfoStatic(), \
- wxT(#name), &_typeInfo##name, NULL, wxAny() );
- #define wxEVENT_RANGE_PROPERTY( name, eventType, lastEventType, eventClass ) \
- static wxEventSourceTypeInfo _typeInfo##name( eventType, lastEventType, \
- wxCLASSINFO( eventClass ) ); \
- static wxPropertyInfo _propertyInfo##name( first, class_t::GetClassInfoStatic(), \
- wxT(#name), &_typeInfo##name, NULL, wxAny() );
- // ----------------------------------------------------------------------------
- // Implementation Helper for Simple Properties
- // ----------------------------------------------------------------------------
- #define wxIMPLEMENT_PROPERTY(name, type) \
- private: \
- type m_##name; \
- public: \
- void Set##name( type const & p) { m_##name = p; } \
- type const & Get##name() const { return m_##name; }
- #endif // wxUSE_EXTENDED_RTTI
- #endif // _XTIPROP_H_
|