2006-09-25 Anders Carlsson <acarlsson@apple.com>
[WebKit-https.git] / WebCore / ksvg2 / misc / SVGDocumentExtensions.h
1 /*
2     Copyright (C) 2006 Apple Computer, Inc.
3
4     This file is part of the WebKit project
5
6     This library is free software; you can redistribute it and/or
7     modify it under the terms of the GNU Library General Public
8     License as published by the Free Software Foundation; either
9     version 2 of the License, or (at your option) any later version.
10
11     This library is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14     Library General Public License for more details.
15
16     You should have received a copy of the GNU Library General Public License
17     along with this library; see the file COPYING.LIB.  If not, write to
18     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19     Boston, MA 02111-1307, USA.
20 */
21
22 #ifndef SVGDocumentExtensions_H
23 #define SVGDocumentExtensions_H
24
25 #ifdef SVG_SUPPORT
26
27 #include <wtf/Forward.h>
28 #include <wtf/HashSet.h>
29 #include <wtf/HashMap.h>
30
31 #include "FloatRect.h"
32 #include "StringHash.h"
33 #include "StringImpl.h"
34 #include "AtomicString.h"
35
36 namespace WebCore {
37
38 class AtomicString;
39 class Document;
40 class EventListener;
41 class Node;
42 class SVGElement;
43 class String;
44 class TimeScheduler;
45 class SVGSVGElement;
46
47 class SVGDocumentExtensions {
48 public:
49     SVGDocumentExtensions(Document*);
50     ~SVGDocumentExtensions();
51     
52     PassRefPtr<EventListener> createSVGEventListener(const String& functionName, const String& code, Node*);
53     
54     void addTimeContainer(SVGSVGElement*);
55     void removeTimeContainer(SVGSVGElement*);
56     
57     void startAnimations();
58     void pauseAnimations();
59     void unpauseAnimations();
60
61 private:
62     Document* m_doc; // weak reference
63     HashSet<SVGSVGElement*> m_timeContainers; // For SVG 1.2 support this will need to be made more general.
64
65     SVGDocumentExtensions(const SVGDocumentExtensions&);
66     SVGDocumentExtensions& operator=(const SVGDocumentExtensions&);
67
68     template<typename ValueType>
69     HashMap<const SVGElement*, HashMap<StringImpl*, ValueType>*> baseValueMap() const
70     {
71         static HashMap<const SVGElement*, HashMap<StringImpl*, ValueType>*> s_valueType;
72         return s_valueType;
73     }
74
75 public:
76     template<typename ValueType>
77     ValueType baseValue(const SVGElement* element, const AtomicString& propertyName) const
78     {
79         HashMap<StringImpl*, ValueType>* propertyMap = baseValueMap<ValueType>().get(element);
80         if (propertyMap)
81             return propertyMap->get(propertyName.impl());
82
83         return 0;
84     }
85
86     template<typename ValueType>
87     void setBaseValue(const SVGElement* element, const AtomicString& propertyName, ValueType newValue)
88     {
89         HashMap<StringImpl*, ValueType>* propertyMap = baseValueMap<ValueType>().get(element);
90         if (!propertyMap) {
91             propertyMap = new HashMap<StringImpl*, ValueType>();
92             baseValueMap<ValueType>().set(element, propertyMap);
93         }
94
95         propertyMap->set(propertyName.impl(), newValue);
96     }
97
98     template<typename ValueType>
99     bool hasBaseValue(const SVGElement* element, const AtomicString& propertyName) const
100     {
101         HashMap<StringImpl*, ValueType>* propertyMap = baseValueMap<ValueType>().get(element);
102         if (propertyMap)
103             return propertyMap->contains(propertyName.impl());
104
105         return false;
106     }
107 };
108
109 // Special handling for WebCore::String
110 template<>
111 inline String SVGDocumentExtensions::baseValue<String>(const SVGElement* element, const AtomicString& propertyName) const
112 {
113     HashMap<StringImpl*, String>* propertyMap = baseValueMap<String>().get(element);
114     if (propertyMap)
115         return propertyMap->get(propertyName.impl());
116
117     return String();
118 }
119
120 // Special handling for WebCore::FloatRect
121 template<>
122 inline FloatRect SVGDocumentExtensions::baseValue<FloatRect>(const SVGElement* element, const AtomicString& propertyName) const
123 {
124     HashMap<StringImpl*, FloatRect>* propertyMap = baseValueMap<FloatRect>().get(element);
125     if (propertyMap)
126         return propertyMap->get(propertyName.impl());
127
128     return FloatRect();
129 }
130
131 // Special handling for booleans
132 template<>
133 inline bool SVGDocumentExtensions::baseValue<bool>(const SVGElement* element, const AtomicString& propertyName) const
134 {
135     HashMap<StringImpl*, bool>* propertyMap = baseValueMap<bool>().get(element);
136     if (propertyMap)
137         return propertyMap->get(propertyName.impl());
138
139     return false;
140 }
141
142 // Special handling for doubles
143 template<>
144 inline double SVGDocumentExtensions::baseValue<double>(const SVGElement* element, const AtomicString& propertyName) const
145 {
146     HashMap<StringImpl*, double>* propertyMap = baseValueMap<double>().get(element);
147     if (propertyMap)
148         return propertyMap->get(propertyName.impl());
149
150     return 0.0;
151 }
152
153 }
154
155 #endif // SVG_SUPPORT
156
157 #endif