// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#include "PropertyBasedMgr.hxx"
+#include <boost/foreach.hpp>
+
#include <stdexcept>
#include <string>
//----------------------------------------------------------------------------
void PropertyBasedMgr::shutdown()
{
+ _props->removeAllChildren();
_props->removeChangeListener(this);
}
_elements[i]->update(delta_time_sec);
}
+ //----------------------------------------------------------------------------
+ PropertyBasedElementPtr
+ PropertyBasedMgr::createElement(const std::string& name)
+ {
+ SGPropertyNode* node = _props->addChild(_name_elements, 0, false);
+ if( !name.empty() )
+ node->setStringValue("name", name);
+
+ return getElement( node->getIndex() );
+ }
+
+ //----------------------------------------------------------------------------
+ PropertyBasedElementPtr PropertyBasedMgr::getElement(size_t index) const
+ {
+ if( index >= _elements.size() )
+ return PropertyBasedElementPtr();
+
+ return _elements[index];
+ }
+
+ //----------------------------------------------------------------------------
+ PropertyBasedElementPtr
+ PropertyBasedMgr::getElement(const std::string& name) const
+ {
+ if( name.empty() )
+ return PropertyBasedElementPtr();
+
+ BOOST_FOREACH(PropertyBasedElementPtr el, _elements)
+ if( el->getProps()->getStringValue("name") == name )
+ return el;
+
+ return PropertyBasedElementPtr();
+ }
+
+ //----------------------------------------------------------------------------
+ const SGPropertyNode* PropertyBasedMgr::getPropertyRoot() const
+ {
+ return _props;
+ }
+
+ //----------------------------------------------------------------------------
+ PropertyBasedMgr::PropertyBasedMgr( SGPropertyNode_ptr props,
+ const std::string& name_elements,
+ ElementFactory element_factory ):
+ _props( props ),
+ _name_elements( name_elements ),
+ _element_factory( element_factory )
+ {
+ _props->setAttribute(SGPropertyNode::PRESERVE, true);
+ }
+
+ //----------------------------------------------------------------------------
+ PropertyBasedMgr::~PropertyBasedMgr()
+ {
+
+ }
+
//----------------------------------------------------------------------------
void PropertyBasedMgr::childAdded( SGPropertyNode * parent,
SGPropertyNode * child )
_elements.resize(index + 1);
}
else if( _elements[index] )
+ {
SG_LOG
(
SG_GENERAL,
_name_elements << "[" << index << "] already exists!"
);
+ // Give anything holding a reference to this element to release it
+ _elements[index]->onDestroy();
+ }
+
PropertyBasedElementPtr el = _element_factory(child);
- el->_self = el;
_elements[index] = el;
elementCreated( el );
}
"can't removed unknown " << _name_elements << "[" << index << "]!"
);
else
+ {
// remove the element...
+ _elements[index]->onDestroy();
_elements[index].reset();
- }
-
- //----------------------------------------------------------------------------
- const SGPropertyNode* PropertyBasedMgr::getPropertyRoot() const
- {
- return _props;
- }
-
- //----------------------------------------------------------------------------
- PropertyBasedMgr::PropertyBasedMgr( SGPropertyNode_ptr props,
- const std::string& name_elements,
- ElementFactory element_factory ):
- _props( props ),
- _name_elements( name_elements ),
- _element_factory( element_factory )
- {
-
- }
-
- //----------------------------------------------------------------------------
- PropertyBasedMgr::~PropertyBasedMgr()
- {
-
+ }
}
} // namespace simgear