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