1/*
2 * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006, 2007, 2010 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 SVGSVGElement_h
22#define SVGSVGElement_h
23
24#if ENABLE(SVG)
25#include "SVGAnimatedBoolean.h"
26#include "SVGAnimatedLength.h"
27#include "SVGAnimatedPreserveAspectRatio.h"
28#include "SVGAnimatedRect.h"
29#include "SVGExternalResourcesRequired.h"
30#include "SVGFitToViewBox.h"
31#include "SVGLangSpace.h"
32#include "SVGStyledLocatableElement.h"
33#include "SVGTests.h"
34#include "SVGZoomAndPan.h"
35
36namespace WebCore {
37
38class SVGAngle;
39class SVGMatrix;
40class SVGTransform;
41class SVGViewSpec;
42class SVGViewElement;
43class SMILTimeContainer;
44
45class SVGSVGElement : public SVGStyledLocatableElement,
46                      public SVGTests,
47                      public SVGLangSpace,
48                      public SVGExternalResourcesRequired,
49                      public SVGFitToViewBox,
50                      public SVGZoomAndPan {
51public:
52    static PassRefPtr<SVGSVGElement> create(const QualifiedName&, Document*);
53
54    virtual bool isValid() const { return SVGTests::isValid(); }
55
56    // 'SVGSVGElement' functions
57    const AtomicString& contentScriptType() const;
58    void setContentScriptType(const AtomicString& type);
59
60    const AtomicString& contentStyleType() const;
61    void setContentStyleType(const AtomicString& type);
62
63    FloatRect viewport() const;
64
65    void setContainerSize(const IntSize& containerSize) { m_containerSize = containerSize; m_hasSetContainerSize = true; }
66    IntSize containerSize() const { return m_containerSize; }
67    bool hasSetContainerSize() const { return m_hasSetContainerSize; }
68    int relativeWidthValue() const;
69    int relativeHeightValue() const;
70
71    float pixelUnitToMillimeterX() const;
72    float pixelUnitToMillimeterY() const;
73    float screenPixelToMillimeterX() const;
74    float screenPixelToMillimeterY() const;
75
76    bool useCurrentView() const;
77    void setUseCurrentView(bool currentView);
78
79    SVGViewSpec* currentView() const;
80
81    float currentScale() const;
82    void setCurrentScale(float scale);
83
84    FloatPoint& currentTranslate() { return m_translation; }
85    void setCurrentTranslate(const FloatPoint&);
86
87    // Only used from the bindings.
88    void updateCurrentTranslate();
89
90    SMILTimeContainer* timeContainer() const { return m_timeContainer.get(); }
91
92    void pauseAnimations();
93    void unpauseAnimations();
94    bool animationsPaused() const;
95
96    float getCurrentTime() const;
97    void setCurrentTime(float seconds);
98
99    unsigned suspendRedraw(unsigned maxWaitMilliseconds);
100    void unsuspendRedraw(unsigned suspendHandleId);
101    void unsuspendRedrawAll();
102    void forceRedraw();
103
104    NodeList* getIntersectionList(const FloatRect&, SVGElement* referenceElement);
105    NodeList* getEnclosureList(const FloatRect&, SVGElement* referenceElement);
106    bool checkIntersection(SVGElement*, const FloatRect&);
107    bool checkEnclosure(SVGElement*, const FloatRect&);
108    void deselectAll();
109
110    static float createSVGNumber();
111    static SVGLength createSVGLength();
112    static SVGAngle createSVGAngle();
113    static FloatPoint createSVGPoint();
114    static SVGMatrix createSVGMatrix();
115    static FloatRect createSVGRect();
116    static SVGTransform createSVGTransform();
117    static SVGTransform createSVGTransformFromMatrix(const SVGMatrix&);
118
119    AffineTransform viewBoxToViewTransform(float viewWidth, float viewHeight) const;
120
121    void inheritViewAttributes(SVGViewElement*);
122
123    bool isOutermostSVG() const;
124
125    Element* getElementById(const AtomicString&) const;
126
127protected:
128    virtual void willMoveToNewOwnerDocument();
129    virtual void didMoveToNewOwnerDocument();
130
131private:
132    SVGSVGElement(const QualifiedName&, Document*);
133    virtual ~SVGSVGElement();
134
135    virtual bool isSVG() const { return true; }
136
137    virtual void parseMappedAttribute(Attribute*);
138
139    virtual bool rendererIsNeeded(RenderStyle* style) { return StyledElement::rendererIsNeeded(style); }
140    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
141
142    virtual void insertedIntoDocument();
143    virtual void removedFromDocument();
144
145    virtual void svgAttributeChanged(const QualifiedName&);
146    virtual void synchronizeProperty(const QualifiedName&);
147    virtual void fillAttributeToPropertyTypeMap();
148    virtual AttributeToPropertyTypeMap& attributeToPropertyTypeMap();
149
150    virtual bool selfHasRelativeLengths() const;
151
152    // Animated property declarations
153    DECLARE_ANIMATED_LENGTH(X, x)
154    DECLARE_ANIMATED_LENGTH(Y, y)
155    DECLARE_ANIMATED_LENGTH(Width, width)
156    DECLARE_ANIMATED_LENGTH(Height, height)
157
158    // SVGExternalResourcesRequired
159    DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
160
161    // SVGFitToViewBox
162    DECLARE_ANIMATED_RECT(ViewBox, viewBox)
163    DECLARE_ANIMATED_PRESERVEASPECTRATIO(PreserveAspectRatio, preserveAspectRatio)
164
165    virtual void documentWillBecomeInactive();
166    virtual void documentDidBecomeActive();
167
168    virtual AffineTransform localCoordinateSpaceTransform(SVGLocatable::CTMScope) const;
169
170    bool m_useCurrentView;
171    RefPtr<SMILTimeContainer> m_timeContainer;
172    FloatPoint m_translation;
173    float m_scale;
174    mutable OwnPtr<SVGViewSpec> m_viewSpec;
175    IntSize m_containerSize;
176    bool m_hasSetContainerSize;
177};
178
179} // namespace WebCore
180
181#endif // ENABLE(SVG)
182#endif
183