| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/clntdata.h
- // Purpose: A mixin class for holding a wxClientData or void pointer
- // Author: Robin Dunn
- // Modified by:
- // Created: 9-Oct-2001
- // Copyright: (c) wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_CLNTDATAH__
- #define _WX_CLNTDATAH__
- #include "wx/defs.h"
- #include "wx/string.h"
- #include "wx/hashmap.h"
- typedef int (*wxShadowObjectMethod)(void*, void*);
- WX_DECLARE_STRING_HASH_MAP_WITH_DECL(
- wxShadowObjectMethod,
- wxShadowObjectMethods,
- class WXDLLIMPEXP_BASE
- );
- WX_DECLARE_STRING_HASH_MAP_WITH_DECL(
- void *,
- wxShadowObjectFields,
- class WXDLLIMPEXP_BASE
- );
- class WXDLLIMPEXP_BASE wxShadowObject
- {
- public:
- wxShadowObject() { }
- void AddMethod( const wxString &name, wxShadowObjectMethod method )
- {
- wxShadowObjectMethods::iterator it = m_methods.find( name );
- if (it == m_methods.end())
- m_methods[ name ] = method;
- else
- it->second = method;
- }
- bool InvokeMethod( const wxString &name, void* window, void* param, int* returnValue )
- {
- wxShadowObjectMethods::iterator it = m_methods.find( name );
- if (it == m_methods.end())
- return false;
- wxShadowObjectMethod method = it->second;
- int ret = (*method)(window, param);
- if (returnValue)
- *returnValue = ret;
- return true;
- }
- void AddField( const wxString &name, void* initialValue = NULL )
- {
- wxShadowObjectFields::iterator it = m_fields.find( name );
- if (it == m_fields.end())
- m_fields[ name ] = initialValue;
- else
- it->second = initialValue;
- }
- void SetField( const wxString &name, void* value )
- {
- wxShadowObjectFields::iterator it = m_fields.find( name );
- if (it == m_fields.end())
- return;
- it->second = value;
- }
- void* GetField( const wxString &name, void *defaultValue = NULL )
- {
- wxShadowObjectFields::iterator it = m_fields.find( name );
- if (it == m_fields.end())
- return defaultValue;
- return it->second;
- }
- private:
- wxShadowObjectMethods m_methods;
- wxShadowObjectFields m_fields;
- };
- // ----------------------------------------------------------------------------
- // what kind of client data do we have?
- enum wxClientDataType
- {
- wxClientData_None, // we don't know yet because we don't have it at all
- wxClientData_Object, // our client data is typed and we own it
- wxClientData_Void // client data is untyped and we don't own it
- };
- class WXDLLIMPEXP_BASE wxClientData
- {
- public:
- wxClientData() { }
- virtual ~wxClientData() { }
- };
- class WXDLLIMPEXP_BASE wxStringClientData : public wxClientData
- {
- public:
- wxStringClientData() : m_data() { }
- wxStringClientData( const wxString &data ) : m_data(data) { }
- void SetData( const wxString &data ) { m_data = data; }
- const wxString& GetData() const { return m_data; }
- private:
- wxString m_data;
- };
- // This class is a mixin that provides storage and management of "client
- // data." The client data stored can either be a pointer to a wxClientData
- // object in which case it is managed by the container (i.e. it will delete
- // the data when it's destroyed) or an untyped pointer which won't be deleted
- // by the container - but not both of them
- //
- // NOTE: This functionality is currently duplicated in wxEvtHandler in order
- // to avoid having more than one vtable in that class hierarchy.
- class WXDLLIMPEXP_BASE wxClientDataContainer
- {
- public:
- wxClientDataContainer();
- virtual ~wxClientDataContainer();
- void SetClientObject( wxClientData *data ) { DoSetClientObject(data); }
- wxClientData *GetClientObject() const { return DoGetClientObject(); }
- void SetClientData( void *data ) { DoSetClientData(data); }
- void *GetClientData() const { return DoGetClientData(); }
- protected:
- // The user data: either an object which will be deleted by the container
- // when it's deleted or some raw pointer which we do nothing with. Only
- // one type of data can be used with the given window, i.e. you cannot set
- // the void data and then associate the container with wxClientData or vice
- // versa.
- union
- {
- wxClientData *m_clientObject;
- void *m_clientData;
- };
- // client data accessors
- virtual void DoSetClientObject( wxClientData *data );
- virtual wxClientData *DoGetClientObject() const;
- virtual void DoSetClientData( void *data );
- virtual void *DoGetClientData() const;
- // what kind of data do we have?
- wxClientDataType m_clientDataType;
- };
- #endif // _WX_CLNTDATAH__
|