00001
00002
00004
00005 #ifndef NODEVISITINGPROXY_H
00006 #define NODEVISITINGPROXY_H
00007
00008 #include "X3DAbstractNode.h"
00009 #include "VisitingFunctions.h"
00010 #include "EnterFunction.h"
00011 #include "WalkOnFunction.h"
00012 #include "LeaveFunction.h"
00013 #include "X3DNodeProxy.h"
00014
00015 #include <list>
00016
00017 namespace X3DTK {
00018
00019 class Type;
00020 class X3DComponentVisitor;
00021
00023
00024 class NodeVisitingProxy : public X3DNodeProxy
00025 {
00026 public:
00028 NodeVisitingProxy();
00030 virtual ~NodeVisitingProxy();
00031
00033 void setComponentVisitor(X3DComponentVisitor *component);
00035 inline void enter(SFAbstractNode N) const {visitingArray_[N->getType()->getId()]->enter(N);};
00037 inline bool walkOn(SFAbstractNode N, SFAbstractNode child = 0) const {return visitingArray_[N->getType()->getId()]->walkOn(N, child);};
00039 inline void leave(SFAbstractNode N) const {visitingArray_[N->getType()->getId()]->leave(N);};
00041 void reset();
00042
00043 friend NodeVisitingProxy *joinNodeVisitingProxies(NodeVisitingProxy *N0, NodeVisitingProxy *N1);
00044
00045 private:
00047 virtual void addType(const Type *type);
00049 EnterFunction *getEnterFunctionOf(const Type *type) const;
00050 WalkOnFunction *getWalkOnFunctionOf(const Type *type) const;
00051 LeaveFunction *getLeaveFunctionOf(const Type *type) const;
00052
00053
00054 VisitingArray visitingArray_;
00055 std::list<X3DComponentVisitor *> componentList_;
00056 };
00057
00058 }
00059
00060 #endif