#ifndef _DOM_NodeImpl_h_
#define _DOM_NodeImpl_h_
#include "dom/dom_misc.h"
#include "dom/dom_string.h"
#include "dom/dom_node.h"
#include "misc/helper.h"
#include "misc/shared.h"
#define XHTML_NAMESPACE "http://www.w3.org/1999/xhtml"
class QPainter;
template <class type> class QPtrList;
class KHTMLView;
class RenderArena;
class QRect;
class QMouseEvent;
class QKeyEvent;
class QTextStream;
class QStringList;
namespace khtml {
class RenderObject;
class RenderStyle;
};
namespace DOM {
class NodeListImpl;
class NamedNodeMapImpl;
class DocumentImpl;
class CSSStyleDeclarationImpl;
class RegisteredEventListener;
class EventImpl;
class DocumentPtr : public khtml::Shared<DocumentPtr>
{
public:
DocumentImpl *document() const { return doc; }
private:
DocumentPtr() { doc = 0; }
friend class DocumentImpl;
friend class DOMImplementationImpl;
DocumentImpl *doc;
};
class NodeImpl : public khtml::TreeShared<NodeImpl>
{
friend class DocumentImpl;
public:
NodeImpl(DocumentPtr *doc);
virtual ~NodeImpl();
virtual DOMString nodeName() const;
virtual DOMString nodeValue() const;
virtual void setNodeValue( const DOMString &_nodeValue, int &exceptioncode );
virtual unsigned short nodeType() const;
NodeImpl *parentNode() const { return m_parent; }
NodeImpl *previousSibling() const { return m_previous; }
NodeImpl *nextSibling() const { return m_next; }
virtual NodeListImpl *childNodes();
virtual NodeImpl *firstChild() const;
virtual NodeImpl *lastChild() const;
virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
virtual NodeImpl *replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *removeChild ( NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
virtual bool hasChildNodes ( ) const;
virtual NodeImpl *cloneNode ( bool deep ) = 0;
virtual DOMString localName() const;
virtual DOMString prefix() const;
virtual void setPrefix(const DOMString &_prefix, int &exceptioncode );
void normalize ();
virtual bool isElementNode() const { return false; }
virtual bool isHTMLElement() const { return false; }
virtual bool isAttributeNode() const { return false; }
virtual bool isTextNode() const { return false; }
virtual bool isDocumentNode() const { return false; }
virtual bool isXMLElementNode() const { return false; }
virtual bool isMalformed() { return false; }
virtual void setMalformed(bool malformed) {};
virtual bool containsOnlyWhitespace() const { return false; }
void setPreviousSibling(NodeImpl *previous) { m_previous = previous; }
void setNextSibling(NodeImpl *next) { m_next = next; }
virtual void setFirstChild(NodeImpl *child);
virtual void setLastChild(NodeImpl *child);
virtual NodeImpl *addChild(NodeImpl *newChild);
typedef Q_UINT32 Id;
static const Q_UINT32 IdNSMask;
static const Q_UINT32 IdLocalMask;
virtual Id id() const { return 0; };
enum MouseEventType {
MousePress,
MouseRelease,
MouseClick,
MouseDblClick,
MouseMove
};
struct MouseEvent
{
MouseEvent( int _button, MouseEventType _type,
const DOMString &_url = DOMString(), const DOMString& _target = DOMString(),
NodeImpl *_innerNode = 0)
{
button = _button; type = _type;
url = _url; target = _target;
innerNode = _innerNode;
}
int button;
MouseEventType type;
DOMString url; DOMString target;
Node innerNode;
};
virtual void sheetLoaded() {}
bool hasID() const { return m_hasId; }
bool hasClass() const { return m_hasClass; }
bool hasStyle() const { return m_hasStyle; }
bool active() const { return m_active; }
bool focused() const { return m_focused; }
bool attached() const { return m_attached; }
bool changed() const { return m_changed; }
bool hasChangedChild() const { return m_hasChangedChild; }
bool hasAnchor() const { return m_hasAnchor; }
bool inDocument() const { return m_inDocument; }
bool styleElement() const { return m_styleElement; }
bool implicitNode() const { return m_implicit; }
void setHasID(bool b=true) { m_hasId = b; }
void setHasClass(bool b=true) { m_hasClass = b; }
void setHasStyle(bool b=true) { m_hasStyle = b; }
void setHasChangedChild( bool b = true ) { m_hasChangedChild = b; }
void setInDocument(bool b=true) { m_inDocument = b; }
virtual void setFocus(bool b=true) { m_focused = b; }
virtual void setActive(bool b=true) { m_active = b; }
virtual void setChanged(bool b=true);
unsigned short tabIndex() const { return m_tabIndex; }
void setTabIndex(unsigned short _tabIndex) { m_tabIndex = _tabIndex; }
virtual bool isFocusable() const;
virtual bool isKeyboardFocusable() const;
virtual bool isMouseFocusable() const;
virtual bool isInline() const;
virtual QString toHTML() const;
QString recursive_toHTML(bool start = false) const;
virtual void getCursor(int offset, int &_x, int &_y, int &height);
virtual QRect getRect() const;
enum StyleChange { NoChange, NoInherit, Inherit, Detach, Force };
virtual void recalcStyle( StyleChange = NoChange ) {}
StyleChange diff( khtml::RenderStyle *s1, khtml::RenderStyle *s2 ) const;
unsigned long nodeIndex() const;
DocumentImpl* getDocument() const { return document->document(); }
void setDocument(DocumentPtr *doc);
void addEventListener(int id, EventListener *listener, const bool useCapture);
void removeEventListener(int id, EventListener *listener, bool useCapture);
void removeHTMLEventListener(int id);
void setHTMLEventListener(int id, EventListener *listener);
EventListener *getHTMLEventListener(int id);
bool dispatchEvent(EventImpl *evt, int &exceptioncode, bool tempEvent = false);
bool dispatchGenericEvent( EventImpl *evt, int &exceptioncode);
bool dispatchHTMLEvent(int _id, bool canBubbleArg, bool cancelableArg);
bool dispatchWindowEvent(int _id, bool canBubbleArg, bool cancelableArg);
bool dispatchMouseEvent(QMouseEvent *e, int overrideId = 0, int overrideDetail = 0);
bool dispatchUIEvent(int _id, int detail = 0);
bool dispatchSubtreeModifiedEvent();
bool dispatchKeyEvent(QKeyEvent *key);
void handleLocalEvents(EventImpl *evt, bool useCapture);
virtual void defaultEventHandler(EventImpl *evt);
virtual bool disabled() const;
virtual bool isReadOnly();
virtual bool childTypeAllowed( unsigned short ) { return false; }
virtual unsigned long childNodeCount();
virtual NodeImpl *childNode(unsigned long index);
NodeImpl *traverseNextNode(NodeImpl *stayWithin = 0) const;
NodeImpl *traversePreviousNode() const;
DocumentPtr *docPtr() const { return document; }
khtml::RenderObject *renderer() const { return m_render; }
khtml::RenderObject *nextRenderer();
khtml::RenderObject *previousRenderer();
void setRenderer(khtml::RenderObject* renderer) { m_render = renderer; }
void checkSetPrefix(const DOMString &_prefix, int &exceptioncode);
void checkAddChild(NodeImpl *newChild, int &exceptioncode);
bool isAncestor( NodeImpl *other );
virtual bool childAllowed( NodeImpl *newChild );
#ifndef NDEBUG
virtual void dump(QTextStream *stream, QString ind = "") const;
#endif
virtual void attach();
virtual void detach();
void closeRenderer();
void createRendererIfNeeded();
virtual khtml::RenderStyle *styleForRenderer(khtml::RenderObject *parent);
virtual bool rendererIsNeeded(khtml::RenderStyle *);
virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
virtual bool maintainsState();
virtual QString state();
virtual void restoreState(QStringList &stateList);
virtual void insertedIntoDocument();
virtual void removedFromDocument();
virtual void childrenChanged();
virtual DOMString toString() const = 0;
private: DocumentPtr *document;
NodeImpl *m_previous;
NodeImpl *m_next;
protected:
khtml::RenderObject *m_render;
QPtrList<RegisteredEventListener> *m_regdListeners;
unsigned short m_tabIndex : 15;
bool m_hasTabIndex : 1;
bool m_hasId : 1;
bool m_hasClass : 1;
bool m_hasStyle : 1;
bool m_attached : 1;
bool m_changed : 1;
bool m_hasChangedChild : 1;
bool m_inDocument : 1;
bool m_hasAnchor : 1;
bool m_specified : 1; bool m_focused : 1;
bool m_active : 1;
bool m_styleElement : 1; bool m_implicit : 1; bool m_rendererNeedsClose : 1;
};
class NodeBaseImpl : public NodeImpl
{
public:
NodeBaseImpl(DocumentPtr *doc);
virtual ~NodeBaseImpl();
virtual NodeImpl *firstChild() const;
virtual NodeImpl *lastChild() const;
virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
virtual NodeImpl *replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *removeChild ( NodeImpl *oldChild, int &exceptioncode );
virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
virtual bool hasChildNodes ( ) const;
void removeChildren();
void cloneChildNodes(NodeImpl *clone);
virtual void setFirstChild(NodeImpl *child);
virtual void setLastChild(NodeImpl *child);
virtual NodeImpl *addChild(NodeImpl *newChild);
virtual void attach();
virtual void detach();
virtual NodeListImpl *getElementsByTagNameNS ( DOMStringImpl* namespaceURI,
DOMStringImpl* localName );
virtual QRect getRect() const;
bool getUpperLeftCorner(int &xPos, int &yPos) const;
bool getLowerRightCorner(int &xPos, int &yPos) const;
virtual void setFocus(bool=true);
virtual void setActive(bool=true);
virtual unsigned long childNodeCount();
virtual NodeImpl *childNode(unsigned long index);
bool checkNoOwner( NodeImpl *other, int &exceptioncode );
NodeImpl *_first;
NodeImpl *_last;
bool checkSameDocument( NodeImpl *newchild, int &exceptioncode );
bool checkIsChild( NodeImpl *oldchild, int &exceptioncode );
void dispatchChildInsertedEvents( NodeImpl *child, int &exceptioncode );
void dispatchChildRemovalEvents( NodeImpl *child, int &exceptioncode );
};
class Node;
class NodeImpl;
class NodeListImpl : public khtml::Shared<NodeListImpl>
{
public:
virtual ~NodeListImpl() {}
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
#if APPLE_CHANGES
static NodeList createInstance(NodeListImpl *impl);
#endif
protected:
unsigned long recursiveLength(NodeImpl *start) const;
NodeImpl *recursiveItem ( NodeImpl *start, unsigned long &offset ) const;
virtual bool nodeMatches( NodeImpl *testNode ) const = 0;
};
class ChildNodeListImpl : public NodeListImpl
{
public:
ChildNodeListImpl( NodeImpl *n);
virtual ~ChildNodeListImpl();
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
protected:
virtual bool nodeMatches( NodeImpl *testNode ) const;
NodeImpl *refNode;
};
class TagNodeListImpl : public NodeListImpl
{
public:
TagNodeListImpl( NodeImpl *n, NodeImpl::Id tagId, NodeImpl::Id tagIdMask );
virtual ~TagNodeListImpl();
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
protected:
virtual bool nodeMatches( NodeImpl *testNode ) const;
NodeImpl *refNode;
NodeImpl::Id m_id;
NodeImpl::Id m_idMask;
};
class NameNodeListImpl : public NodeListImpl
{
public:
NameNodeListImpl( NodeImpl *doc, const DOMString &t );
virtual ~NameNodeListImpl();
virtual unsigned long length() const;
virtual NodeImpl *item ( unsigned long index ) const;
protected:
virtual bool nodeMatches( NodeImpl *testNode ) const;
NodeImpl *refNode;
DOMString nodeName;
};
class NamedNodeMapImpl : public khtml::Shared<NamedNodeMapImpl>
{
public:
NamedNodeMapImpl();
virtual ~NamedNodeMapImpl();
virtual NodeImpl *getNamedItem ( NodeImpl::Id id ) const = 0;
virtual Node removeNamedItem ( NodeImpl::Id id, int &exceptioncode ) = 0;
virtual Node setNamedItem ( NodeImpl* arg, int &exceptioncode ) = 0;
virtual NodeImpl *item ( unsigned long index ) const = 0;
virtual unsigned long length( ) const = 0;
virtual NodeImpl::Id mapId(const DOMString& namespaceURI, const DOMString& localName, bool readonly) = 0;
virtual bool isReadOnly() { return false; }
#if APPLE_CHANGES
static NamedNodeMap createInstance(NamedNodeMapImpl *impl);
#endif
};
#if 0
class GenericRONamedNodeMapImpl : public NamedNodeMapImpl
{
public:
GenericRONamedNodeMapImpl(DocumentPtr* doc);
virtual ~GenericRONamedNodeMapImpl();
virtual NodeImpl *getNamedItem ( const DOMString &name, int &exceptioncode ) const;
virtual Node setNamedItem ( const Node &arg, int &exceptioncode );
virtual Node removeNamedItem ( const DOMString &name, int &exceptioncode );
virtual NodeImpl *item ( unsigned long index ) const;
virtual unsigned long length( ) const;
virtual NodeImpl *getNamedItemNS( const DOMString &namespaceURI, const DOMString &localName,
int &exceptioncode ) const;
virtual NodeImpl *setNamedItemNS( NodeImpl *arg, int &exceptioncode );
virtual NodeImpl *removeNamedItemNS( const DOMString &namespaceURI, const DOMString &localName,
int &exceptioncode );
virtual bool isReadOnly() { return true; }
void addNode(NodeImpl *n);
protected:
DocumentImpl* m_doc;
QPtrList<NodeImpl> *m_contents;
};
#endif
}; #endif