xref: /haiku/headers/private/debugger/value/ValueNodeContainer.h (revision cbe0a0c436162d78cc3f92a305b64918c839d079)
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 
29 	inline	bool				Lock()		{ return fLock.Lock(); }
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