/// This file is part of the X3DToolKit library
/// Copyright (C) 2002-2004 Yannick Le Goc (legoc@imag.fr)
/// http://artis.imag.fr/Members/Yannick.Legoc/X3D/
/// This library is free software; you can redistribute it and/or
/// modify it under the terms of the GNU Lesser General Public
/// License as published by the Free Software Foundation; either
/// version 2.1 of the License, or (at your option) any later version.
/// This library is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
/// Lesser General Public License for more details.
/// You should have received a copy of the GNU Lesser General Public
/// License along with this library; if not, write to the Free Software
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#ifndef X3DTK_X3DABSTRACTNODE_H
#define X3DTK_X3DABSTRACTNODE_H
#include "X3DTypes.h"
#include "X3DFileElement.h"
#include "SFType.h"
#include "Recorder.h"
namespace X3DTK {
class FileElement;
/*! \brief Class declared in defining the root of the inheritance tree
* for the nodes of the different scene graphs.
*
* For more details, see the abstract scene graph API page.
*
* \ingroup abstractNode
*/
class X3DAbstractNode
{
public:
/// Constructor.
X3DAbstractNode();
/// Clones the node. This method has to be redefined in the children classes.
SFNode clone() const;
/// Virtual destructor.
virtual ~X3DAbstractNode();
/// Sets the name of the node. The name of the node is the DEF attribute in the X3D file.
void setName(const SFString &name);
/// Gets the name of the node.
inline const SFString &getName() const {return _name;};
/// Gets the SFType name of the node. It is a shortcut to getType()->getName().
inline const SFString &getTypeName() const {return _type->getName();};
/// Gets the scene graph name of the node.
inline const SFString &getSceneGraphName() const {return _type->getSceneGraphName();};
/// Gets the SFType of the node.
inline SFType *getType() const {return _type;};
/// Gets the list of children in the scene graph.
MFNode getChildList();
/// Gets the list of parents in the scene graph.
inline MFNode getParentList() const {return _parentList;};
/// Sets the child N. Returns FALSE if N is not a
/// valid child. If the child already exists then N becomes the new child.
bool setChild(SFNode N);
/// Removes the child if exists. Returns TRUE if succeeds.
bool removeChild(SFNode N);
/// Gets the name attribute.
X3DField get(const SFString &name) const;
/// Sets the name attribute.
void set(const SFString &name, const X3DField &field);
/// Loads the attribute from its name and its SFString value.
void loadAttribute(const SFString &name, const SFString &value);
/// Writes the attribute from its name.
SFString writeAttribute(const SFString &name);
/// Loads the attributes from an X3DFileElement.
void loadAttributes(const X3DFileElement *element);
/// Writes the attribute from its name.
void writeAttributes(SFString &output);
/// Adds the parent to child.
static void addParentToChild(SFNode parent, SFNode child);
/// Removes the parent from child.
static void removeParentFromChild(SFNode parent, SFNode child);
protected:
/// Defines a new type name.
inline void define(const TypeName &typeName) {SFType::defineTypeName(&_type, typeName.name, typeName.component, typeName.sceneGraph, typeName.cloner);};
/// Defines an attribute.
inline void define(const X3DAttributeRecorder &recorder) {recorder.record(this);};
/// Defines a node.
inline void define(const X3DSFNodeRecorder &recorder) {recorder.record(this);};
/// Defines a node.
inline void define(const X3DMFNodeRecorder &recorder) {recorder.record(this);};
#ifdef TEMPLATE_SPECIALIZATION_SUPPORTED
/// Method to call at the first line of the body of the constructor, and passing
/// in argument the name of the tag of the X3D file, and optionnally the name of the
/// component and of the scene graph.
inline void defineTypeName(const SFString &name, const SFString &component = SFString(""), const SFString &sceneGraph = SFString("")) {defineTempTypeName(this, name, component, sceneGraph);};
/// Method to avoid defineTypeName having a template parameter.
template
inline void defineTempTypeName(T * /* t */, const SFString &name, const SFString &component, const SFString &sceneGraph) {define(Recorder::getTypeName(name, component, sceneGraph));};
/// Defines an attribute.
template
inline void defineAttribute(const SFString &name, V T:: *member, const V &init);
/// Defines a node.
template
inline void defineNode(const SFString &name, V T:: *node);
/// Defines a node.
template
inline void defineNodes(const SFString &name, MFNode T:: *nodes);
#endif
/// Method which must be called in the destructor. Removes the links with child nodes.
void removeChildren();
private:
/// Copy constructor.
X3DAbstractNode(const X3DAbstractNode &N);
/// Adds one reference.
inline void addOneReference() const {_type->addOneReferenceRecursive();};
SFString _name;
SFType *_type;
MFNode _parentList;
/// Adds a parent.
void addParent(const SFNode &N);
/// Removes a parent.
bool removeParent(const SFNode &N);
};
inline void X3DAbstractNode_addParentToChild(SFNode parent, SFNode child) {
X3DAbstractNode::addParentToChild(parent,child);
}
inline void X3DAbstractNode_removeParentFromChild(SFNode parent, SFNode child) {
X3DAbstractNode::removeParentFromChild(parent,child);
}
inline SFType * X3DAbstractNode_getType(X3DAbstractNode * node) {
return node->getType();
}
}
#include "X3DAbstractNode.inl"
#endif