* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include "ValueNodeContainer.h"
#include <AutoLocker.h>
#include "ValueNode.h"
ValueNodeContainer::ValueNodeContainer()
:
fLock("value node container"),
fChildren(20),
fListeners(20)
{
}
ValueNodeContainer::~ValueNodeContainer()
{
RemoveAllChildren();
fListeners.MakeEmpty();
}
status_t
ValueNodeContainer::Init()
{
return fLock.InitCheck();
}
int32
ValueNodeContainer::CountChildren() const
{
return fChildren.CountItems();
}
ValueNodeChild*
ValueNodeContainer::ChildAt(int32 index) const
{
return fChildren.ItemAt(index);
}
bool
ValueNodeContainer::AddChild(ValueNodeChild* child)
{
AutoLocker<ValueNodeContainer> locker(this);
if (!fChildren.AddItem(child))
return false;
child->AcquireReference();
child->SetContainer(this);
return true;
}
void
ValueNodeContainer::RemoveChild(ValueNodeChild* child)
{
if (child->Container() != this || !fChildren.RemoveItem(child))
return;
child->SetNode(NULL);
child->SetContainer(NULL);
child->ReleaseReference();
}
void
ValueNodeContainer::RemoveAllChildren()
{
for (int32 i = 0; ValueNodeChild* child = ChildAt(i); i++) {
child->SetNode(NULL);
child->SetContainer(NULL);
child->ReleaseReference();
}
fChildren.MakeEmpty();
}
bool
ValueNodeContainer::AddListener(Listener* listener)
{
return fListeners.AddItem(listener);
}
void
ValueNodeContainer::RemoveListener(Listener* listener)
{
fListeners.RemoveItem(listener);
}
void
ValueNodeContainer::NotifyValueNodeChanged(ValueNodeChild* nodeChild,
ValueNode* oldNode, ValueNode* newNode)
{
for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
fListeners.ItemAt(i)->ValueNodeChanged(nodeChild, oldNode, newNode);
}
void
ValueNodeContainer::NotifyValueNodeChildrenCreated(ValueNode* node)
{
for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
fListeners.ItemAt(i)->ValueNodeChildrenCreated(node);
}
void
ValueNodeContainer::NotifyValueNodeChildrenDeleted(ValueNode* node)
{
for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
fListeners.ItemAt(i)->ValueNodeChildrenDeleted(node);
}
void
ValueNodeContainer::NotifyValueNodeValueChanged(ValueNode* node)
{
for (int32 i = fListeners.CountItems() - 1; i >= 0; i--)
fListeners.ItemAt(i)->ValueNodeValueChanged(node);
}
ValueNodeContainer::Listener::~Listener()
{
}
void
ValueNodeContainer::Listener::ValueNodeChanged(ValueNodeChild* nodeChild,
ValueNode* oldNode, ValueNode* newNode)
{
}
void
ValueNodeContainer::Listener::ValueNodeChildrenCreated(ValueNode* node)
{
}
void
ValueNodeContainer::Listener::ValueNodeChildrenDeleted(ValueNode* node)
{
}
void
ValueNodeContainer::Listener::ValueNodeValueChanged(ValueNode* node)
{
}