00001
00002
00003
00004
00005
00006
00007
00008
00013 #ifndef _ATX_PROPERTIES_H_
00014 #define _ATX_PROPERTIES_H_
00015
00016
00017
00018
00019 #include "AtxInterfaces.h"
00020 #include "AtxTypes.h"
00021 #include "AtxIterator.h"
00022
00023
00024
00025
00026 #define ATX_ERROR_NO_SUCH_PROPERTY (ATX_ERROR_BASE_PROPERTIES - 0)
00027 #define ATX_ERROR_NO_SUCH_LISTENER (ATX_ERROR_BASE_PROPERTIES - 1)
00028 #define ATX_ERROR_PROPERTY_TYPE_MISMATCH (ATX_ERROR_BASE_PROPERTIES - 2)
00029
00030
00031
00032
00036 typedef enum {
00037 ATX_PROPERTY_VALUE_TYPE_INTEGER,
00038 ATX_PROPERTY_VALUE_TYPE_FLOAT,
00039 ATX_PROPERTY_VALUE_TYPE_STRING,
00040 ATX_PROPERTY_VALUE_TYPE_BOOLEAN,
00041 ATX_PROPERTY_VALUE_TYPE_RAW_DATA
00042 } ATX_PropertyValueType;
00043
00044 typedef struct {
00045 ATX_Size size;
00046 ATX_Any data;
00047 } ATX_PropertyRawData;
00048
00053 typedef union {
00054 void* any;
00055 ATX_CString string;
00056 ATX_Int32 integer;
00057 ATX_Float fp;
00058 ATX_Boolean boolean;
00059 ATX_PropertyRawData raw_data;
00060 } ATX_PropertyValueData;
00061
00065 typedef struct {
00066 ATX_PropertyValueType type;
00067 ATX_PropertyValueData data;
00068 } ATX_PropertyValue;
00069
00070 typedef const void* ATX_PropertyListenerHandle;
00071
00076 typedef struct {
00077 ATX_CString name;
00078 ATX_PropertyValue value;
00079 } ATX_Property;
00080
00081
00082
00083
00084 ATX_DECLARE_INTERFACE(ATX_PropertyListener)
00085 ATX_BEGIN_INTERFACE_DEFINITION(ATX_PropertyListener)
00098 void (*OnPropertyChanged)(ATX_PropertyListener* self,
00099 ATX_CString name,
00100 const ATX_PropertyValue* value);
00101 ATX_END_INTERFACE_DEFINITION
00102
00103
00104
00105
00106 ATX_DECLARE_INTERFACE(ATX_Properties)
00115 ATX_BEGIN_INTERFACE_DEFINITION(ATX_Properties)
00127 ATX_Result (*GetProperty)(ATX_Properties* self,
00128 ATX_CString name,
00129 ATX_PropertyValue* value);
00130
00139 ATX_Result (*SetProperty)(ATX_Properties* self,
00140 ATX_CString name,
00141 const ATX_PropertyValue* value);
00142
00148 ATX_Result (*Clear)(ATX_Properties* self);
00149
00154 ATX_Result (*GetIterator)(ATX_Properties* self,
00155 ATX_Iterator** iterator);
00156
00168 ATX_Result (*AddListener)(ATX_Properties* self,
00169 ATX_CString name,
00170 ATX_PropertyListener* listener,
00171 ATX_PropertyListenerHandle* handle);
00172
00173 ATX_Result (*RemoveListener)(ATX_Properties* self,
00174 ATX_PropertyListenerHandle handle);
00175
00176 ATX_END_INTERFACE_DEFINITION
00177
00178
00179
00180
00185 #define ATX_Properties_GetProperty(object, name, value) \
00186 ATX_INTERFACE(object)->GetProperty(object, \
00187 name, \
00188 value)
00189
00194 #define ATX_Properties_SetProperty(object, name, value) \
00195 ATX_INTERFACE(object)->SetProperty(object, \
00196 name, \
00197 value)
00198
00203 #define ATX_Properties_Clear(object) \
00204 ATX_INTERFACE(object)->Clear(object)
00205
00210 #define ATX_Properties_GetIterator(object, iterator) \
00211 ATX_INTERFACE(object)->GetIterator(object, iterator)
00212
00217 #define ATX_Properties_AddListener(object, name, listener, handle) \
00218 ATX_INTERFACE(object)->AddListener(object, \
00219 name, \
00220 listener, \
00221 handle)
00222
00227 #define ATX_Properties_RemoveListener(object, handle) \
00228 ATX_INTERFACE(object)->RemoveListener(object, handle)
00229
00234 #define ATX_PropertyListener_OnPropertyChanged(object, name, value) \
00235 ATX_INTERFACE(object)->OnPropertyChanged(object, \
00236 name, \
00237 value)
00238
00239
00240
00241
00242 #define ATX_IMPLEMENT_STATIC_PROPERTIES_INTERFACE(_class) \
00243 ATX_BEGIN_INTERFACE_MAP(_class, ATX_Properties) \
00244 _class##_GetProperty, \
00245 ATX_BaseProperties_SetProperty, \
00246 ATX_BaseProperties_Clear, \
00247 ATX_BaseProperties_GetIterator, \
00248 ATX_BaseProperties_AddListener, \
00249 ATX_BaseProperties_RemoveListener \
00250 ATX_END_INTERFACE_MAP
00251
00252
00253
00254
00255 #ifdef __cplusplus
00256 extern "C" {
00257 #endif
00258
00259 ATX_Result
00260 ATX_BaseProperties_SetProperty(ATX_Properties* self,
00261 ATX_CString name,
00262 const ATX_PropertyValue* value);
00263 ATX_Result
00264 ATX_BaseProperties_Clear(ATX_Properties* self);
00265 ATX_Result
00266 ATX_BaseProperties_GetIterator(ATX_Properties* self, ATX_Iterator** iterator);
00267 ATX_Result
00268 ATX_BaseProperties_AddListener(ATX_Properties* self,
00269 ATX_CString name,
00270 ATX_PropertyListener* listener,
00271 ATX_PropertyListenerHandle* handle);
00272 ATX_Result
00273 ATX_BaseProperties_RemoveListener(ATX_Properties* self,
00274 ATX_PropertyListenerHandle handle);
00275
00276 ATX_Result ATX_Properties_Create(ATX_Properties** properties);
00277
00278 #ifdef __cplusplus
00279 }
00280 #endif
00281
00282 #endif