* Copyright 2015, Rene Gollent, rene@gollent.com.
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include "ValueNode.h"
#include "Value.h"
#include "ValueLocation.h"
#include "ValueNodeContainer.h"
ValueNode::ValueNode(ValueNodeChild* nodeChild)
:
fContainer(NULL),
fNodeChild(nodeChild),
fLocation(NULL),
fValue(NULL),
fLocationResolutionState(VALUE_NODE_UNRESOLVED),
fChildrenCreated(false)
{
fNodeChild->AcquireReference();
}
ValueNode::~ValueNode()
{
SetLocationAndValue(NULL, NULL, VALUE_NODE_UNRESOLVED);
SetContainer(NULL);
fNodeChild->ReleaseReference();
}
const BString&
ValueNode::Name() const
{
return fNodeChild->Name();
}
void
ValueNode::SetContainer(ValueNodeContainer* container)
{
if (container == fContainer)
return;
if (fContainer != NULL)
fContainer->ReleaseReference();
fContainer = container;
if (fContainer != NULL)
fContainer->AcquireReference();
int32 childCount = CountChildren();
for (int32 i = 0; i < childCount; i++)
ChildAt(i)->SetContainer(fContainer);
}
bool
ValueNode::IsRangedContainer() const
{
return false;
}
bool
ValueNode::IsContainerRangeFixed() const
{
return false;
}
void
ValueNode::ClearChildren()
{
}
status_t
ValueNode::CreateChildrenInRange(TeamTypeInformation* info, int32 lowIndex,
int32 highIndex)
{
return B_NOT_SUPPORTED;
}
status_t
ValueNode::SupportedChildRange(int32& lowIndex, int32& highIndex) const
{
return B_NOT_SUPPORTED;
}
void
ValueNode::SetLocationAndValue(ValueLocation* location, Value* value,
status_t resolutionState)
{
if (fLocation != location) {
if (fLocation != NULL)
fLocation->ReleaseReference();
fLocation = location;
if (fLocation != NULL)
fLocation->AcquireReference();
}
if (fValue != value) {
if (fValue != NULL)
fValue->ReleaseReference();
fValue = value;
if (fValue != NULL)
fValue->AcquireReference();
}
fLocationResolutionState = resolutionState;
if (fContainer != NULL)
fContainer->NotifyValueNodeValueChanged(this);
}
ValueNodeChild::ValueNodeChild()
:
fContainer(NULL),
fNode(NULL),
fLocation(NULL),
fLocationResolutionState(VALUE_NODE_UNRESOLVED)
{
}
ValueNodeChild::~ValueNodeChild()
{
SetLocation(NULL, VALUE_NODE_UNRESOLVED);
SetNode(NULL);
SetContainer(NULL);
}
bool
ValueNodeChild::IsInternal() const
{
return false;
}
status_t
ValueNodeChild::CreateInternalNode(ValueNode*& _node)
{
return B_BAD_VALUE;
}
void
ValueNodeChild::SetContainer(ValueNodeContainer* container)
{
if (container == fContainer)
return;
if (fContainer != NULL)
fContainer->ReleaseReference();
fContainer = container;
if (fContainer != NULL)
fContainer->AcquireReference();
if (fNode != NULL)
fNode->SetContainer(fContainer);
}
void
ValueNodeChild::SetNode(ValueNode* node)
{
if (node == fNode)
return;
ValueNode* oldNode = fNode;
BReference<ValueNode> oldNodeReference(oldNode, true);
if (fNode != NULL)
fNode->SetContainer(NULL);
fNode = node;
if (fNode != NULL) {
fNode->AcquireReference();
fNode->SetContainer(fContainer);
}
if (fContainer != NULL)
fContainer->NotifyValueNodeChanged(this, oldNode, fNode);
}
ValueLocation*
ValueNodeChild::Location() const
{
return fLocation;
}
void
ValueNodeChild::SetLocation(ValueLocation* location, status_t resolutionState)
{
if (fLocation != location) {
if (fLocation != NULL)
fLocation->ReleaseReference();
fLocation = location;
if (fLocation != NULL)
fLocation->AcquireReference();
}
fLocationResolutionState = resolutionState;
}
ChildlessValueNode::ChildlessValueNode(ValueNodeChild* nodeChild)
:
ValueNode(nodeChild)
{
fChildrenCreated = true;
}
status_t
ChildlessValueNode::CreateChildren(TeamTypeInformation* info)
{
return B_OK;
}
int32
ChildlessValueNode::CountChildren() const
{
return 0;
}
ValueNodeChild*
ChildlessValueNode::ChildAt(int32 index) const
{
return NULL;
}