Home | History | Annotate | Download | only in svg
      1 /*
      2     Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann (at) kde.org>
      3 
      4     This library is free software; you can redistribute it and/or
      5     modify it under the terms of the GNU Library General Public
      6     License as published by the Free Software Foundation; either
      7     version 2 of the License, or (at your option) any later version.
      8 
      9     This library is distributed in the hope that it will be useful,
     10     but WITHOUT ANY WARRANTY; without even the implied warranty of
     11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12     Library General Public License for more details.
     13 
     14     You should have received a copy of the GNU Library General Public License
     15     along with this library; see the file COPYING.LIB.  If not, write to
     16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17     Boston, MA 02110-1301, USA.
     18 */
     19 
     20 #ifndef SVGElementInstance_h
     21 #define SVGElementInstance_h
     22 
     23 #if ENABLE(SVG)
     24 #include "EventTarget.h"
     25 #include "SVGElement.h"
     26 #include "TreeShared.h"
     27 
     28 namespace WebCore {
     29 
     30     namespace Private {
     31         template<class GenericNode, class GenericNodeContainer>
     32         void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
     33     };
     34 
     35     class SVGUseElement;
     36     class SVGElementInstanceList;
     37 
     38     // SVGElementInstance mimics Node, but without providing all its functionality
     39     class SVGElementInstance : public TreeShared<SVGElementInstance>,
     40                                public EventTarget {
     41     public:
     42         static PassRefPtr<SVGElementInstance> create(SVGUseElement* useElement, PassRefPtr<SVGElement> originalElement)
     43         {
     44             return adoptRef(new SVGElementInstance(useElement, originalElement));
     45         }
     46 
     47         virtual ~SVGElementInstance();
     48 
     49         virtual ScriptExecutionContext* scriptExecutionContext() const;
     50 
     51         virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
     52         virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
     53         virtual void removeAllEventListeners();
     54         using EventTarget::dispatchEvent;
     55         virtual bool dispatchEvent(PassRefPtr<Event>);
     56 
     57         SVGElement* correspondingElement() const { return m_element.get(); }
     58         SVGUseElement* correspondingUseElement() const { return m_useElement; }
     59         SVGElement* shadowTreeElement() const { return m_shadowTreeElement.get(); }
     60 
     61         SVGElementInstance* parentNode() const { return parent(); }
     62         PassRefPtr<SVGElementInstanceList> childNodes();
     63 
     64         SVGElementInstance* previousSibling() const { return m_previousSibling; }
     65         SVGElementInstance* nextSibling() const { return m_nextSibling; }
     66 
     67         SVGElementInstance* firstChild() const { return m_firstChild; }
     68         SVGElementInstance* lastChild() const { return m_lastChild; }
     69 
     70         Document* ownerDocument() const { return m_element ? m_element->ownerDocument() : 0; }
     71 
     72         static void invalidateAllInstancesOfElement(SVGElement*);
     73 
     74         using TreeShared<SVGElementInstance>::ref;
     75         using TreeShared<SVGElementInstance>::deref;
     76 
     77         // EventTarget API
     78         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), abort);
     79         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), blur);
     80         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), change);
     81         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), click);
     82         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), contextmenu);
     83         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dblclick);
     84         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), error);
     85         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), focus);
     86         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), input);
     87         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keydown);
     88         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keypress);
     89         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), keyup);
     90         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), load);
     91         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousedown);
     92         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousemove);
     93         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseout);
     94         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseover);
     95         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mouseup);
     96         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), mousewheel);
     97         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforecut);
     98         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), cut);
     99         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforecopy);
    100         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), copy);
    101         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), beforepaste);
    102         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), paste);
    103         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragenter);
    104         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragover);
    105         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragleave);
    106         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), drop);
    107         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragstart);
    108         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), drag);
    109         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), dragend);
    110         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), reset);
    111         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), resize);
    112         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), scroll);
    113         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), search);
    114         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), select);
    115         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), selectstart);
    116         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), submit);
    117         DEFINE_FORWARDING_ATTRIBUTE_EVENT_LISTENER(correspondingElement(), unload);
    118 
    119     private:
    120         friend class SVGUseElement;
    121 
    122         SVGElementInstance(SVGUseElement*, PassRefPtr<SVGElement> originalElement);
    123 
    124         virtual Node* toNode() { return shadowTreeElement(); }
    125         virtual SVGElementInstance* toSVGElementInstance() { return this; }
    126 
    127         void appendChild(PassRefPtr<SVGElementInstance> child);
    128         void setShadowTreeElement(SVGElement*);
    129 
    130         template<class GenericNode, class GenericNodeContainer>
    131         friend void appendChildToContainer(GenericNode* child, GenericNodeContainer* container);
    132 
    133         template<class GenericNode, class GenericNodeContainer>
    134         friend void removeAllChildrenInContainer(GenericNodeContainer* container);
    135 
    136         template<class GenericNode, class GenericNodeContainer>
    137         friend void Private::addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer* container);
    138 
    139         bool hasChildNodes() const { return m_firstChild; }
    140 
    141         void setFirstChild(SVGElementInstance* child) { m_firstChild = child; }
    142         void setLastChild(SVGElementInstance* child) { m_lastChild = child; }
    143 
    144         void setNextSibling(SVGElementInstance* sibling) { m_nextSibling = sibling; }
    145         void setPreviousSibling(SVGElementInstance* sibling) { m_previousSibling = sibling; }
    146 
    147         virtual void refEventTarget() { ref(); }
    148         virtual void derefEventTarget() { deref(); }
    149         virtual EventTargetData* eventTargetData();
    150         virtual EventTargetData* ensureEventTargetData();
    151 
    152         SVGUseElement* m_useElement;
    153         RefPtr<SVGElement> m_element;
    154         RefPtr<SVGElement> m_shadowTreeElement;
    155 
    156         SVGElementInstance* m_previousSibling;
    157         SVGElementInstance* m_nextSibling;
    158 
    159         SVGElementInstance* m_firstChild;
    160         SVGElementInstance* m_lastChild;
    161     };
    162 
    163 } // namespace WebCore
    164 
    165 #endif // ENABLE(SVG)
    166 #endif
    167