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