00001 #ifndef X3DTK_X3DABSTRACTNODE_H
00002 #define X3DTK_X3DABSTRACTNODE_H
00003
00004 #include "X3DTypes.h"
00005 #include "X3DFileElement.h"
00006 #include "SFType.h"
00007 #include "Recorder.h"
00008
00009 namespace X3DTK {
00010
00011 class FileElement;
00012
00021 class X3DAbstractNode
00022 {
00023 public:
00025 X3DAbstractNode();
00027 SFNode clone() const;
00029 virtual ~X3DAbstractNode();
00030
00032 void setName(const SFString &name);
00033
00035 inline const SFString &getName() const {return _name;};
00037 inline const SFString &getTypeName() const {return _type->getName();};
00039 inline const SFString &getSceneGraphName() const {return _type->getSceneGraphName();};
00041 inline SFType *getType() const {return _type;};
00043 MFNode getChildList();
00045 inline MFNode getParentList() const {return _parentList;};
00046
00049 bool setChild(SFNode N);
00051 bool removeChild(SFNode N);
00052
00054 X3DField get(const SFString &name) const;
00056 void set(const SFString &name, const X3DField &field);
00058 void loadAttribute(const SFString &name, const SFString &value);
00060 SFString writeAttribute(const SFString &name);
00062 void loadAttributes(const X3DFileElement *element);
00064 void writeAttributes(SFString &output);
00066 static void addParentToChild(SFNode parent, SFNode child);
00068 static void removeParentFromChild(SFNode parent, SFNode child);
00069
00070 protected:
00072 inline void define(const TypeName &typeName) {SFType::defineTypeName(&_type, typeName.name, typeName.component, typeName.sceneGraph, typeName.cloner);};
00074 inline void define(const X3DAttributeRecorder &recorder) {recorder.record(this);};
00076 inline void define(const X3DSFNodeRecorder &recorder) {recorder.record(this);};
00078 inline void define(const X3DMFNodeRecorder &recorder) {recorder.record(this);};
00079
00080 #ifdef TEMPLATE_SPECIALIZATION_SUPPORTED
00084 inline void defineTypeName(const SFString &name, const SFString &component = SFString(""), const SFString &sceneGraph = SFString("")) {defineTempTypeName(this, name, component, sceneGraph);};
00085
00086 template<class T>
00087 inline void defineTempTypeName(T *t, const SFString &name, const SFString &component, const SFString &sceneGraph) {define(Recorder<T>::getTypeName(name, component, sceneGraph));};
00089 template<class T, class V>
00090 inline void defineAttribute(const SFString &name, V T:: *member, const V &init);
00092 template<class T, class V>
00093 inline void defineNode(const SFString &name, V T:: *node);
00095 template<class T, class V>
00096 inline void defineNodes(const SFString &name, MFNode T:: *nodes);
00097 #endif
00098
00100 void removeChildren();
00101
00102 private:
00104 X3DAbstractNode(const X3DAbstractNode &N);
00106 inline void addOneReference() const {_type->addOneReferenceRecursive();};
00107
00108 SFString _name;
00109 SFType *_type;
00110 MFNode _parentList;
00111
00113 void addParent(const SFNode &N);
00115 bool removeParent(const SFNode &N);
00116 };
00117
00118 }
00119
00120 #include "X3DAbstractNode.inl"
00121
00122 #endif