00001
00002
00003
00005
00006
00011
00016
00021
00023
00024 #ifndef NODEVISITINGPROXY_H
00025 #define NODEVISITINGPROXY_H
00026
00027 #include "X3DAbstractNode.h"
00028 #include "VisitingFunctions.h"
00029 #include "EnterFunction.h"
00030 #include "WalkOnFunction.h"
00031 #include "LeaveFunction.h"
00032 #include "X3DNodeProxy.h"
00033
00034 #include <list>
00035
00036 namespace X3DTK {
00037
00038 class Type;
00039 class X3DComponentVisitor;
00040
00042
00043 class NodeVisitingProxy : public X3DNodeProxy
00044 {
00045 public:
00047 NodeVisitingProxy();
00049 virtual ~NodeVisitingProxy();
00050
00052 void setComponentVisitor(X3DComponentVisitor *component);
00054 inline void enter(SFAbstractNode N) const {visitingArray_[N->getType()->getId()]->enter(N);};
00056 inline bool walkOn(SFAbstractNode N, SFAbstractNode child = 0) const {return visitingArray_[N->getType()->getId()]->walkOn(N, child);};
00058 inline void leave(SFAbstractNode N) const {visitingArray_[N->getType()->getId()]->leave(N);};
00060 void reset();
00061
00062 friend NodeVisitingProxy *joinNodeVisitingProxies(NodeVisitingProxy *N0, NodeVisitingProxy *N1);
00063
00064 private:
00066 virtual void addType(const Type *type);
00068 EnterFunction *getEnterFunctionOf(const Type *type) const;
00069 WalkOnFunction *getWalkOnFunctionOf(const Type *type) const;
00070 LeaveFunction *getLeaveFunctionOf(const Type *type) const;
00071
00072
00073 VisitingArray visitingArray_;
00074 std::list<X3DComponentVisitor *> componentList_;
00075 };
00076
00077 }
00078
00079 #endif