1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "ValueNodeContainer.h"
8
9#include <AutoLocker.h>
10
11#include "ValueNode.h"
12
13
14// #pragma mark - ValueNodeContainer
15
16
17ValueNodeContainer::ValueNodeContainer()
18	:
19	fLock("value node container"),
20	fChildren(20, false),
21	fListeners(20, false)
22{
23}
24
25
26ValueNodeContainer::~ValueNodeContainer()
27{
28	RemoveAllChildren();
29	fListeners.MakeEmpty();
30}
31
32
33status_t
34ValueNodeContainer::Init()
35{
36	return fLock.InitCheck();
37}
38
39
40int32
41ValueNodeContainer::CountChildren() const
42{
43	return fChildren.CountItems();
44}
45
46
47ValueNodeChild*
48ValueNodeContainer::ChildAt(int32 index) const
49{
50	return fChildren.ItemAt(index);
51}
52
53
54bool
55ValueNodeContainer::AddChild(ValueNodeChild* child)
56{
57	AutoLocker<ValueNodeContainer> locker(this);
58
59	if (!fChildren.AddItem(child))
60		return false;
61
62	child->AcquireReference();
63	child->SetContainer(this);
64
65	return true;
66}
67
68
69void
70ValueNodeContainer::RemoveChild(ValueNodeChild* child)
71{
72	if (child->Container() != this || !fChildren.RemoveItem(child))
73		return;
74
75	child->SetNode(NULL);
76	child->SetContainer(NULL);
77	child->ReleaseReference();
78}
79
80
81void
82ValueNodeContainer::RemoveAllChildren()
83{
84	for (int32 i = 0; ValueNodeChild* child = ChildAt(i); i++) {
85		child->SetNode(NULL);
86		child->SetContainer(NULL);
87		child->ReleaseReference();
88	}
89
90	fChildren.MakeEmpty();
91}
92
93
94bool
95ValueNodeContainer::AddListener(Listener* listener)
96{
97	return fListeners.AddItem(listener);
98}
99
100
101void
102ValueNodeContainer::RemoveListener(Listener* listener)
103{
104	fListeners.RemoveItem(listener);
105}
106
107
108void
109ValueNodeContainer::NotifyValueNodeChanged(ValueNodeChild* nodeChild,
110	ValueNode* oldNode, ValueNode* newNode)
111{
112	for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
113		fListeners.ItemAt(i)->ValueNodeChanged(nodeChild, oldNode, newNode);
114}
115
116
117void
118ValueNodeContainer::NotifyValueNodeChildrenCreated(ValueNode* node)
119{
120	for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
121		fListeners.ItemAt(i)->ValueNodeChildrenCreated(node);
122}
123
124
125void
126ValueNodeContainer::NotifyValueNodeChildrenDeleted(ValueNode* node)
127{
128	for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
129		fListeners.ItemAt(i)->ValueNodeChildrenDeleted(node);
130}
131
132
133void
134ValueNodeContainer::NotifyValueNodeValueChanged(ValueNode* node)
135{
136	for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
137		fListeners.ItemAt(i)->ValueNodeValueChanged(node);
138}
139
140
141// #pragma mark - ValueNodeContainer
142
143
144ValueNodeContainer::Listener::~Listener()
145{
146}
147
148
149void
150ValueNodeContainer::Listener::ValueNodeChanged(ValueNodeChild* nodeChild,
151	ValueNode* oldNode, ValueNode* newNode)
152{
153}
154
155
156void
157ValueNodeContainer::Listener::ValueNodeChildrenCreated(ValueNode* node)
158{
159}
160
161
162void
163ValueNodeContainer::Listener::ValueNodeChildrenDeleted(ValueNode* node)
164{
165}
166
167
168void
169ValueNodeContainer::Listener::ValueNodeValueChanged(ValueNode* node)
170{
171}
172