X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/16d38102e8ad5534d185cc532b9aa8077a75e0a4..f1c40652a0c2d6752c57df1b8aed22fae7e118dd:/include/wx/clntdata.h diff --git a/include/wx/clntdata.h b/include/wx/clntdata.h index 02e90d267c..c0f33dbb38 100644 --- a/include/wx/clntdata.h +++ b/include/wx/clntdata.h @@ -5,19 +5,85 @@ // Modified by: // Created: 9-Oct-2001 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team +// Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_CLNTDATAH__ #define _WX_CLNTDATAH__ -#ifdef __GNUG__ - #pragma interface "clntdata.h" -#endif - #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; +}; + // ---------------------------------------------------------------------------- @@ -29,17 +95,17 @@ enum wxClientDataType wxClientData_Void // client data is untyped and we don't own it }; -class WXDLLEXPORT wxClientData +class WXDLLIMPEXP_BASE wxClientData { public: wxClientData() { } virtual ~wxClientData() { } }; -class WXDLLEXPORT wxStringClientData : public wxClientData +class WXDLLIMPEXP_BASE wxStringClientData : public wxClientData { public: - wxStringClientData() { } + 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; } @@ -48,16 +114,16 @@ 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 +// 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 window - but not both of them +// 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 WXDLLEXPORT wxClientDataContainer +class WXDLLIMPEXP_BASE wxClientDataContainer { public: wxClientDataContainer(); @@ -71,10 +137,10 @@ public: 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 window with wxClientData or vice - // versa) + // 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; @@ -93,6 +159,5 @@ protected: }; -// ---------------------------------------------------------------------------- -#endif +#endif // _WX_CLNTDATAH__