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