Merge SVGLangSpace into SVGElement
[WebKit-https.git] / Source / WebCore / svg / SVGTextContentElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef SVGTextContentElement_h
22 #define SVGTextContentElement_h
23
24 #if ENABLE(SVG)
25 #include "SVGAnimatedBoolean.h"
26 #include "SVGAnimatedEnumeration.h"
27 #include "SVGAnimatedLength.h"
28 #include "SVGExternalResourcesRequired.h"
29 #include "SVGStyledElement.h"
30 #include "SVGTests.h"
31
32 namespace WebCore {
33
34 enum SVGLengthAdjustType {
35     SVGLengthAdjustUnknown,
36     SVGLengthAdjustSpacing,
37     SVGLengthAdjustSpacingAndGlyphs
38 };
39
40 template<>
41 struct SVGPropertyTraits<SVGLengthAdjustType> {
42     static unsigned highestEnumValue() { return SVGLengthAdjustSpacingAndGlyphs; }
43
44     static String toString(SVGLengthAdjustType type)
45     {
46         switch (type) {
47         case SVGLengthAdjustUnknown:
48             return emptyString();
49         case SVGLengthAdjustSpacing:
50             return "spacing";
51         case SVGLengthAdjustSpacingAndGlyphs:
52             return "spacingAndGlyphs";
53         }
54
55         ASSERT_NOT_REACHED();
56         return emptyString();
57     }
58
59     static SVGLengthAdjustType fromString(const String& value)
60     {
61         if (value == "spacingAndGlyphs")
62             return SVGLengthAdjustSpacingAndGlyphs;
63         if (value == "spacing")
64             return SVGLengthAdjustSpacing;
65         return SVGLengthAdjustUnknown;
66     }
67 };
68
69 class SVGTextContentElement : public SVGStyledElement,
70                               public SVGTests,
71                               public SVGExternalResourcesRequired {
72 public:
73     // Forward declare enumerations in the W3C naming scheme, for IDL generation.
74     enum {
75         LENGTHADJUST_UNKNOWN = SVGLengthAdjustUnknown,
76         LENGTHADJUST_SPACING = SVGLengthAdjustSpacing,
77         LENGTHADJUST_SPACINGANDGLYPHS = SVGLengthAdjustSpacingAndGlyphs
78     };
79
80     unsigned getNumberOfChars();
81     float getComputedTextLength();
82     float getSubStringLength(unsigned charnum, unsigned nchars, ExceptionCode&);
83     FloatPoint getStartPositionOfChar(unsigned charnum, ExceptionCode&);
84     FloatPoint getEndPositionOfChar(unsigned charnum, ExceptionCode&);
85     FloatRect getExtentOfChar(unsigned charnum, ExceptionCode&);
86     float getRotationOfChar(unsigned charnum, ExceptionCode&);
87     int getCharNumAtPosition(const FloatPoint&);
88     void selectSubString(unsigned charnum, unsigned nchars, ExceptionCode&);
89
90     static SVGTextContentElement* elementFromRenderer(RenderObject*);
91
92     // textLength is not declared using the standard DECLARE_ANIMATED_LENGTH macro
93     // as its getter needs special handling (return getComputedTextLength(), instead of m_textLength).
94     SVGLength& specifiedTextLength() { return m_specifiedTextLength; }
95     PassRefPtr<SVGAnimatedLength> textLengthAnimated();
96     static const SVGPropertyInfo* textLengthPropertyInfo();
97
98 protected:
99     SVGTextContentElement(const QualifiedName&, Document*);
100
101     virtual bool isValid() const { return SVGTests::isValid(); }
102
103     bool isSupportedAttribute(const QualifiedName&);
104     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
105     virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE;
106     virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStylePropertySet*) OVERRIDE;
107     virtual void svgAttributeChanged(const QualifiedName&);
108
109     virtual bool selfHasRelativeLengths() const;
110
111 private:
112     virtual bool isTextContent() const { return true; }
113
114     // Custom 'textLength' property
115     static void synchronizeTextLength(SVGElement* contextElement);
116     static PassRefPtr<SVGAnimatedProperty> lookupOrCreateTextLengthWrapper(SVGElement* contextElement);
117     mutable SVGSynchronizableAnimatedProperty<SVGLength> m_textLength;
118     SVGLength m_specifiedTextLength;
119   
120     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGTextContentElement)
121         DECLARE_ANIMATED_ENUMERATION(LengthAdjust, lengthAdjust, SVGLengthAdjustType)
122         DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired) 
123     END_DECLARE_ANIMATED_PROPERTIES
124
125     // SVGTests
126     virtual void synchronizeRequiredFeatures() { SVGTests::synchronizeRequiredFeatures(this); }
127     virtual void synchronizeRequiredExtensions() { SVGTests::synchronizeRequiredExtensions(this); }
128     virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
129 };
130
131 inline SVGTextContentElement* toSVGTextContentElement(SVGElement* element)
132 {
133     ASSERT_WITH_SECURITY_IMPLICATION(!element || element->isTextContent());
134     return static_cast<SVGTextContentElement*>(element);
135 }
136
137 } // namespace WebCore
138
139 #endif // ENABLE(SVG)
140 #endif