#ifndef _DOM_ELEMENTImpl_h_
#define _DOM_ELEMENTImpl_h_
#include "dom_nodeimpl.h"
#include "dom/dom_element.h"
#include "xml/dom_stringimpl.h"
#include "misc/shared.h"
#if APPLE_CHANGES
#ifdef __OBJC__
#define id id_AVOID_KEYWORD
#endif
#endif
namespace khtml {
class CSSStyleSelector;
}
namespace DOM {
class ElementImpl;
class DocumentImpl;
class NamedAttrMapImpl;
class AtomicStringList;
class AttributeImpl : public khtml::Shared<AttributeImpl>
{
friend class NamedAttrMapImpl;
friend class ElementImpl;
friend class AttrImpl;
public:
AttributeImpl(NodeImpl::Id id, const AtomicString& value)
: m_id(id), _value(value), _impl(0)
{ };
virtual ~AttributeImpl() {};
MAIN_THREAD_ALLOCATED;
const AtomicString& value() const { return _value; }
const AtomicString& prefix() const { return _prefix; }
NodeImpl::Id id() const { return m_id; }
AttrImpl* attrImpl() const { return _impl; }
bool isNull() const { return _value.isNull(); }
bool isEmpty() const { return _value.isEmpty(); }
virtual AttributeImpl* clone(bool preserveDecl=true) const;
private:
void setValue(const AtomicString& value) {
_value = value;
}
void setPrefix(const AtomicString& prefix) {
_prefix = prefix;
}
void allocateImpl(ElementImpl* e);
protected:
NodeImpl::Id m_id;
AtomicString _prefix;
AtomicString _value;
AttrImpl* _impl;
};
class AttrImpl : public NodeBaseImpl
{
friend class ElementImpl;
friend class NamedAttrMapImpl;
public:
AttrImpl(ElementImpl* element, DocumentPtr* docPtr, AttributeImpl* a);
~AttrImpl();
private:
AttrImpl(const AttrImpl &other);
AttrImpl &operator = (const AttrImpl &other);
public:
bool specified() const { return m_specified; }
ElementImpl* ownerElement() const { return m_element; }
AttributeImpl* attrImpl() const { return m_attribute; }
void setValue( const DOMString &v, int &exceptioncode );
virtual DOMString nodeName() const;
virtual unsigned short nodeType() const;
virtual DOMString prefix() const;
virtual void setPrefix(const DOMString &_prefix, int &exceptioncode );
virtual DOMString nodeValue() const;
virtual void setNodeValue( const DOMString &, int &exceptioncode );
virtual NodeImpl *cloneNode ( bool deep );
virtual bool isAttributeNode() const { return true; }
virtual bool childAllowed( NodeImpl *newChild );
virtual bool childTypeAllowed( unsigned short type );
virtual DOMString toString() const;
#if APPLE_CHANGES
static Attr createInstance(AttrImpl *impl);
#endif
protected:
ElementImpl* m_element;
AttributeImpl* m_attribute;
};
class ElementImpl : public NodeBaseImpl
{
friend class DocumentImpl;
friend class NamedAttrMapImpl;
friend class AttrImpl;
friend class NodeImpl;
friend class khtml::CSSStyleSelector;
public:
ElementImpl(DocumentPtr *doc);
~ElementImpl();
virtual const AtomicStringList* getClassList() const;
const AtomicString& getIDAttribute() const;
const AtomicString& getAttribute( NodeImpl::Id id ) const;
const AtomicString& getAttribute(const DOMString& localName) const { return getAttributeNS(QString::null, localName); }
const AtomicString& getAttributeNS(const DOMString &namespaceURI,
const DOMString &localName) const;
void setAttribute( NodeImpl::Id id, DOMStringImpl* value, int &exceptioncode );
void removeAttribute( NodeImpl::Id id, int &exceptioncode );
bool hasAttributes() const;
void scrollIntoView (bool alignToTop);
void focus();
void blur();
DOMString prefix() const { return m_prefix; }
void setPrefix(const DOMString &_prefix, int &exceptioncode );
virtual DOMString tagName() const;
virtual unsigned short nodeType() const;
virtual NodeImpl *cloneNode ( bool deep ) = 0;
virtual DOMString nodeName() const;
virtual bool isElementNode() const { return true; }
virtual void insertedIntoDocument();
virtual void removedFromDocument();
void setAttribute (NodeImpl::Id id, const DOMString &value);
NamedAttrMapImpl* attributes(bool readonly = false) const;
virtual void attributeChanged(AttributeImpl* attr, bool preserveDecls = false) {}
void setAttributeMap ( NamedAttrMapImpl* list );
virtual QString state() { return QString::null; }
virtual void attach();
virtual khtml::RenderStyle *styleForRenderer(khtml::RenderObject *parent);
virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
virtual void recalcStyle( StyleChange = NoChange );
virtual void mouseEventHandler( MouseEvent *, bool ) {};
virtual bool childAllowed( NodeImpl *newChild );
virtual bool childTypeAllowed( unsigned short type );
virtual AttributeImpl* createAttribute(NodeImpl::Id id, DOMStringImpl* value);
void dispatchAttrRemovalEvent(AttributeImpl *attr);
void dispatchAttrAdditionEvent(AttributeImpl *attr);
virtual void accessKeyAction(bool sendToAnyEvent) { };
virtual DOMString toString() const;
virtual bool isURLAttribute(AttributeImpl *attr) const;
#ifndef NDEBUG
virtual void dump(QTextStream *stream, QString ind = "") const;
#endif
#if APPLE_CHANGES
static Element createInstance(ElementImpl *impl);
#endif
#ifndef NDEBUG
virtual void formatForDebugger(char *buffer, unsigned length) const;
#endif
protected:
virtual void createAttributeMap() const;
DOMString openTagStartToString() const;
private:
void updateId(const AtomicString& oldId, const AtomicString& newId);
virtual void updateStyleAttributeIfNeeded() const {};
protected: mutable NamedAttrMapImpl *namedAttrMap;
DOMStringImpl *m_prefix;
};
class XMLElementImpl : public ElementImpl
{
public:
XMLElementImpl(DocumentPtr *doc, DOMStringImpl *_tagName);
XMLElementImpl(DocumentPtr *doc, DOMStringImpl *_qualifiedName, DOMStringImpl *_namespaceURI);
~XMLElementImpl();
virtual DOMString namespaceURI() const;
virtual DOMString localName() const;
virtual NodeImpl *cloneNode ( bool deep );
virtual bool isXMLElementNode() const { return true; }
virtual Id id() const { return m_id; }
protected:
Id m_id;
};
class NamedAttrMapImpl : public NamedNodeMapImpl
{
friend class ElementImpl;
public:
NamedAttrMapImpl(ElementImpl *e);
virtual ~NamedAttrMapImpl();
NamedAttrMapImpl(const NamedAttrMapImpl&);
NamedAttrMapImpl &operator =(const NamedAttrMapImpl &other);
virtual AttrImpl *getNamedItem ( NodeImpl::Id id ) const;
virtual Node removeNamedItem ( NodeImpl::Id id, int &exceptioncode );
virtual Node setNamedItem ( NodeImpl* arg, int &exceptioncode );
virtual AttrImpl *item ( unsigned long index ) const;
unsigned long length() const { return len; }
virtual NodeImpl::Id mapId(const DOMString& namespaceURI, const DOMString& localName, bool readonly);
AttributeImpl* attributeItem(unsigned long index) const { return attrs ? attrs[index] : 0; }
AttributeImpl* getAttributeItem(NodeImpl::Id id) const;
virtual bool isReadOnly() { return element ? element->isReadOnly() : false; }
void insertAttribute(AttributeImpl* newAttribute) {
if (!getAttributeItem(newAttribute->id()))
addAttribute(newAttribute);
else
newAttribute->deref();
}
virtual bool isHTMLAttributeMap() const;
const AtomicString& id() const { return m_id; }
void setID(const AtomicString& _id) { m_id = _id; }
protected:
void addAttribute(AttributeImpl* newAttribute);
void removeAttribute(NodeImpl::Id id);
virtual void clearAttributes();
void detachFromElement();
protected:
ElementImpl *element;
AttributeImpl **attrs;
uint len;
AtomicString m_id;
};
};
#if APPLE_CHANGES
#undef id
#endif
#endif