123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #ifndef _ATTRHANDLER_H
- #define _ATTRHANDLER_H
- #include "attrcb.h"
- #include "attribs.h"
- #include <bfc/map.h>
- class WAComponentClient;
- class Attribute;
- template <class TCallback>
- class AttrHandler {
- protected:
-
- class AttrHandlerChild : public AttrCallback {
- public:
- AttrHandlerChild(AttrHandler *_parent) : AttrCallback() {
- ASSERT(_parent != NULL);
- recursion = 0;
- callback = NULL;
- parent = _parent;
- }
-
- virtual void onValueChange(Attribute *attr) {
- if (!recursion) {
-
- recursion = 1;
- if ((callback != NULL) && (parent != NULL)) {
- int id;
-
- int success = parent->attribmap.getItem(attr,&id);
- if (success) {
-
- switch (attr->getAttributeType()) {
- case AttributeType::INT:
- callback->onIntChange(id,*static_cast<_int *>(attr));
- break;
- case AttributeType::BOOL:
- callback->onBoolChange(id, *static_cast<_bool *>(attr));
- break;
- case AttributeType::FLOAT:
- callback->onFloatChange(id, *static_cast<_float *>(attr));
- break;
- case AttributeType::STRING:
- callback->onStringChange(id, *static_cast<_string *>(attr));
- break;
- }
- }
- }
- recursion = 0;
- }
- }
- virtual void bindCallbackObj(TCallback *callbackobj) {
-
- callback = callbackobj;
- }
- private:
- int recursion;
- TCallback *callback;
- AttrHandler *parent;
- };
- public:
- AttrHandler() {
- component = NULL;
- callback = NULL;
- }
-
- virtual void bindComponent(WAComponentClient *parentcomponent) {
- component = parentcomponent;
- }
-
- virtual void bindCallbackObj(TCallback *callbackobj) {
-
- callback = callbackobj;
-
- int i, num = attrchildren.getNumItems();
- for (i = 0; i < num; i++) {
- AttrHandlerChild *child = attrchildren.enumItem(i);
- child->bindCallbackObj(callback);
- }
- }
-
- virtual void registerAttribute(Attribute *attr, int id) {
- ASSERTPR(component != NULL, "BIND YOUR COMPONENT before registering Attributes to a Handler.");
-
- AttrHandlerChild *child = new AttrHandlerChild(this);
- attrchildren.addItem(child);
- component->registerAttribute(attr, child);
-
- attribmap.addItem(attr, id);
- }
- #if 0
-
-
-
- virtual void onIntChange(int id, int *attr);
- virtual void onBoolChange(int id, bool *attr);
- virtual void onFloatChange(int id, double *attr);
- virtual void onStringChange(int id, const char *attr);
- #endif
-
- private:
- friend AttrHandlerChild;
- TCallback *callback;
- WAComponentClient *component;
- Map< Attribute *, int > attribmap;
- PtrList<AttrHandlerChild> attrchildren;
- };
- #endif
|