dom2_traversalimpl.h [plain text]
#ifndef _dom2_traversal_h
#define _dom2_traversal_h
#include "dom/dom2_traversal.h"
#include "dom/dom_node.h"
#include "dom/dom_misc.h"
#include "misc/shared.h"
#include "misc/main_thread_malloc.h"
namespace DOM {
class NodeImpl;
class DocumentImpl;
class NodeFilterImpl : public khtml::Shared<NodeFilterImpl>
{
public:
NodeFilterImpl(NodeFilterCondition *);
~NodeFilterImpl();
MAIN_THREAD_ALLOCATED;
short acceptNode(const Node &) const;
private:
NodeFilterImpl(const NodeFilterImpl &);
NodeFilterImpl &operator=(const NodeFilterImpl &);
NodeFilterCondition *m_condition;
};
class TraversalImpl : public khtml::Shared<TraversalImpl>
{
public:
TraversalImpl(NodeImpl *, long whatToShow, NodeFilterImpl *, bool expandEntityReferences);
~TraversalImpl();
MAIN_THREAD_ALLOCATED;
NodeImpl *root() const { return m_root; }
unsigned long whatToShow() const { return m_whatToShow; }
NodeFilterImpl *filter() const { return m_filter; }
bool expandEntityReferences() const { return m_expandEntityReferences; }
short acceptNode(NodeImpl *) const;
private:
TraversalImpl(const TraversalImpl &);
TraversalImpl &operator=(const TraversalImpl &);
NodeImpl *m_root;
long m_whatToShow;
NodeFilterImpl *m_filter;
bool m_expandEntityReferences;
};
class NodeIteratorImpl : public TraversalImpl
{
public:
NodeIteratorImpl(NodeImpl *, long whatToShow, NodeFilterImpl *, bool expandEntityReferences);
~NodeIteratorImpl();
NodeImpl *nextNode(int &exceptioncode);
NodeImpl *previousNode(int &exceptioncode);
void detach(int &exceptioncode);
NodeImpl *referenceNode() const { return m_referenceNode; }
bool pointerBeforeReferenceNode() const { return m_beforeReferenceNode; }
void notifyBeforeNodeRemoval(NodeImpl *removed);
private:
NodeIteratorImpl(const NodeIteratorImpl &);
NodeIteratorImpl &operator=(const NodeIteratorImpl &);
void setReferenceNode(NodeImpl *);
void setPointerBeforeReferenceNode(bool flag=true) { m_beforeReferenceNode = flag; }
bool detached() const { return m_detached; }
void setDetached(bool flag=true) { m_detached = flag; }
DocumentImpl * document() const { return m_doc; }
void setDocument(DocumentImpl *);
NodeImpl *findNextNode(NodeImpl *) const;
NodeImpl *findPreviousNode(NodeImpl *) const;
NodeImpl *m_referenceNode;
bool m_beforeReferenceNode;
bool m_detached;
DocumentImpl *m_doc;
};
class TreeWalkerImpl : public TraversalImpl
{
public:
TreeWalkerImpl(NodeImpl *, long whatToShow, NodeFilterImpl *, bool expandEntityReferences);
~TreeWalkerImpl();
NodeImpl *currentNode() const { return m_current; }
void setCurrentNode(NodeImpl *, int &exceptioncode);
NodeImpl *parentNode();
NodeImpl *firstChild();
NodeImpl *lastChild();
NodeImpl *previousSibling();
NodeImpl *nextSibling();
NodeImpl *previousNode();
NodeImpl *nextNode();
private:
TreeWalkerImpl(const TreeWalkerImpl &);
TreeWalkerImpl &operator=(const TreeWalkerImpl &);
void setCurrentNode(NodeImpl *);
bool ancestorRejected(const NodeImpl *) const;
NodeImpl *m_current;
};
}
#endif