/*
Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
This file is part of the KDE project
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef SVGElementInstance_h
#define SVGElementInstance_h
#if ENABLE(SVG)
#include "EventTarget.h"
#include "SVGElement.h"
#include "TreeShared.h"
#include <wtf/RefPtr.h>
#include <wtf/PassRefPtr.h>
namespace WebCore {
namespace Private {
template<class GenericNode, class GenericNodeContainer>
void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
};
class EventListener;
class Frame;
class SVGUseElement;
class SVGElementInstanceList;
// SVGElementInstance mimics Node, but without providing all its functionality
class SVGElementInstance : public TreeShared<SVGElementInstance>,
public EventTarget
{
public:
SVGElementInstance(SVGUseElement*, SVGElement* originalElement);
virtual ~SVGElementInstance();
bool needsUpdate() const { return m_needsUpdate; }
void setNeedsUpdate(bool);
virtual ScriptExecutionContext* scriptExecutionContext() const;
virtual EventTargetNode* toNode() { return shadowTreeElement(); }
virtual SVGElementInstance* toSVGElementInstance() { return this; }
virtual void addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
virtual void removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
virtual bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&);
SVGElement* correspondingElement() const { return m_element.get(); }
SVGUseElement* correspondingUseElement() const { return m_useElement; }
SVGElement* shadowTreeElement() const { return m_shadowTreeElement.get(); }
SVGElementInstance* parentNode() const { return parent(); }
PassRefPtr<SVGElementInstanceList> childNodes();
SVGElementInstance* previousSibling() const { return m_previousSibling; }
SVGElementInstance* nextSibling() const { return m_nextSibling; }
SVGElementInstance* firstChild() const { return m_firstChild; }
SVGElementInstance* lastChild() const { return m_lastChild; }
Document* ownerDocument() const { return m_element ? m_element->ownerDocument() : 0; }
static void invalidateAllInstancesOfElement(SVGElement*);
using TreeShared<SVGElementInstance>::ref;
using TreeShared<SVGElementInstance>::deref;
// EventTarget API
EventListener* onabort() const;
void setOnabort(PassRefPtr<EventListener>);
EventListener* onblur() const;
void setOnblur(PassRefPtr<EventListener>);
EventListener* onchange() const;
void setOnchange(PassRefPtr<EventListener>);
EventListener* onclick() const;
void setOnclick(PassRefPtr<EventListener>);
EventListener* oncontextmenu() const;
void setOncontextmenu(PassRefPtr<EventListener>);
EventListener* ondblclick() const;
void setOndblclick(PassRefPtr<EventListener>);
EventListener* onerror() const;
void setOnerror(PassRefPtr<EventListener>);
EventListener* onfocus() const;
void setOnfocus(PassRefPtr<EventListener>);
EventListener* oninput() const;
void setOninput(PassRefPtr<EventListener>);
EventListener* onkeydown() const;
void setOnkeydown(PassRefPtr<EventListener>);
EventListener* onkeypress() const;
void setOnkeypress(PassRefPtr<EventListener>);
EventListener* onkeyup() const;
void setOnkeyup(PassRefPtr<EventListener>);
EventListener* onload() const;
void setOnload(PassRefPtr<EventListener>);
EventListener* onmousedown() const;
void setOnmousedown(PassRefPtr<EventListener>);
EventListener* onmousemove() const;
void setOnmousemove(PassRefPtr<EventListener>);
EventListener* onmouseout() const;
void setOnmouseout(PassRefPtr<EventListener>);
EventListener* onmouseover() const;
void setOnmouseover(PassRefPtr<EventListener>);
EventListener* onmouseup() const;
void setOnmouseup(PassRefPtr<EventListener>);
EventListener* onmousewheel() const;
void setOnmousewheel(PassRefPtr<EventListener>);
EventListener* onbeforecut() const;
void setOnbeforecut(PassRefPtr<EventListener>);
EventListener* oncut() const;
void setOncut(PassRefPtr<EventListener>);
EventListener* onbeforecopy() const;
void setOnbeforecopy(PassRefPtr<EventListener>);
EventListener* oncopy() const;
void setOncopy(PassRefPtr<EventListener>);
EventListener* onbeforepaste() const;
void setOnbeforepaste(PassRefPtr<EventListener>);
EventListener* onpaste() const;
void setOnpaste(PassRefPtr<EventListener>);
EventListener* ondragenter() const;
void setOndragenter(PassRefPtr<EventListener>);
EventListener* ondragover() const;
void setOndragover(PassRefPtr<EventListener>);
EventListener* ondragleave() const;
void setOndragleave(PassRefPtr<EventListener>);
EventListener* ondrop() const;
void setOndrop(PassRefPtr<EventListener>);
EventListener* ondragstart() const;
void setOndragstart(PassRefPtr<EventListener>);
EventListener* ondrag() const;
void setOndrag(PassRefPtr<EventListener>);
EventListener* ondragend() const;
void setOndragend(PassRefPtr<EventListener>);
EventListener* onreset() const;
void setOnreset(PassRefPtr<EventListener>);
EventListener* onresize() const;
void setOnresize(PassRefPtr<EventListener>);
EventListener* onscroll() const;
void setOnscroll(PassRefPtr<EventListener>);
EventListener* onsearch() const;
void setOnsearch(PassRefPtr<EventListener>);
EventListener* onselect() const;
void setOnselect(PassRefPtr<EventListener>);
EventListener* onselectstart() const;
void setOnselectstart(PassRefPtr<EventListener>);
EventListener* onsubmit() const;
void setOnsubmit(PassRefPtr<EventListener>);
EventListener* onunload() const;
void setOnunload(PassRefPtr<EventListener>);
private:
friend class SVGUseElement;
void appendChild(PassRefPtr<SVGElementInstance> child);
void setShadowTreeElement(SVGElement*);
void forgetWrapper();
template<class GenericNode, class GenericNodeContainer>
friend void appendChildToContainer(GenericNode* child, GenericNodeContainer* container);
template<class GenericNode, class GenericNodeContainer>
friend void removeAllChildrenInContainer(GenericNodeContainer* container);
template<class GenericNode, class GenericNodeContainer>
friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
bool hasChildNodes() const { return m_firstChild; }
void setFirstChild(SVGElementInstance* child) { m_firstChild = child; }
void setLastChild(SVGElementInstance* child) { m_lastChild = child; }
void setNextSibling(SVGElementInstance* sibling) { m_nextSibling = sibling; }
void setPreviousSibling(SVGElementInstance* sibling) { m_previousSibling = sibling; }
virtual void refEventTarget() { ref(); }
virtual void derefEventTarget() { deref(); }
private:
bool m_needsUpdate : 1;
SVGUseElement* m_useElement;
RefPtr<SVGElement> m_element;
RefPtr<SVGElement> m_shadowTreeElement;
SVGElementInstance* m_previousSibling;
SVGElementInstance* m_nextSibling;
SVGElementInstance* m_firstChild;
SVGElementInstance* m_lastChild;
};
} // namespace WebCore
#endif // ENABLE(SVG)
#endif