1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef VALUE_NODE_CONTAINER_H 6 #define VALUE_NODE_CONTAINER_H 7 8 9 #include <Locker.h> 10 11 #include <ObjectList.h> 12 #include <Referenceable.h> 13 14 15 class ValueNode; 16 class ValueNodeChild; 17 18 19 class ValueNodeContainer : public BReferenceable { 20 public: 21 class Listener; 22 23 public: 24 ValueNodeContainer(); 25 virtual ~ValueNodeContainer(); 26 27 status_t Init(); 28 Lock()29 inline bool Lock() { return fLock.Lock(); } Unlock()30 inline void Unlock() { fLock.Unlock(); } 31 32 int32 CountChildren() const; 33 ValueNodeChild* ChildAt(int32 index) const; 34 bool AddChild(ValueNodeChild* child); 35 void RemoveChild(ValueNodeChild* child); 36 void RemoveAllChildren(); 37 38 bool AddListener(Listener* listener); 39 void RemoveListener(Listener* listener); 40 41 // container must be locked 42 43 void NotifyValueNodeChanged( 44 ValueNodeChild* nodeChild, 45 ValueNode* oldNode, ValueNode* newNode); 46 void NotifyValueNodeChildrenCreated(ValueNode* node); 47 void NotifyValueNodeChildrenDeleted(ValueNode* node); 48 void NotifyValueNodeValueChanged(ValueNode* node); 49 50 private: 51 typedef BObjectList<ValueNodeChild> NodeChildList; 52 typedef BObjectList<Listener> ListenerList; 53 54 private: 55 BLocker fLock; 56 NodeChildList fChildren; 57 ListenerList fListeners; 58 }; 59 60 61 class ValueNodeContainer::Listener { 62 public: 63 virtual ~Listener(); 64 65 // container is locked 66 67 virtual void ValueNodeChanged(ValueNodeChild* nodeChild, 68 ValueNode* oldNode, ValueNode* newNode); 69 virtual void ValueNodeChildrenCreated(ValueNode* node); 70 virtual void ValueNodeChildrenDeleted(ValueNode* node); 71 virtual void ValueNodeValueChanged(ValueNode* node); 72 }; 73 74 75 #endif // VALUE_NODE_CONTAINER_H 76