• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
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 SVGAnimatedPropertyTearOff_h
21 #define SVGAnimatedPropertyTearOff_h
22 
23 #include "bindings/v8/ScriptWrappable.h"
24 #include "core/svg/properties/SVGAnimatedProperty.h"
25 #include "core/svg/properties/SVGPropertyTearOff.h"
26 
27 namespace WebCore {
28 
29 template<typename PropertyType>
30 class SVGAnimatedPropertyTearOff : public SVGAnimatedProperty, public ScriptWrappable {
31 public:
32     typedef SVGPropertyTearOff<PropertyType> PropertyTearOff;
33     typedef PropertyType ContentType;
34 
~SVGAnimatedPropertyTearOff()35     virtual ~SVGAnimatedPropertyTearOff()
36     {
37         if (m_baseVal) {
38             ASSERT(m_baseVal->animatedProperty() == this);
39             m_baseVal->setAnimatedProperty(0);
40         }
41         if (m_animVal) {
42             ASSERT(m_animVal->animatedProperty() == this);
43             m_animVal->setAnimatedProperty(0);
44         }
45     }
46 
baseVal()47     PropertyTearOff* baseVal()
48     {
49         if (!m_baseVal)
50             m_baseVal = PropertyTearOff::create(this, BaseValRole, m_property);
51         return m_baseVal.get();
52     }
53 
animVal()54     PropertyTearOff* animVal()
55     {
56         if (!m_animVal)
57             m_animVal = PropertyTearOff::create(this, AnimValRole, m_property);
58         return m_animVal.get();
59     }
60 
create(SVGElement * contextElement,const QualifiedName & attributeName,AnimatedPropertyType animatedPropertyType,PropertyType & property)61     static PassRefPtr<SVGAnimatedPropertyTearOff<PropertyType> > create(SVGElement* contextElement, const QualifiedName& attributeName, AnimatedPropertyType animatedPropertyType, PropertyType& property)
62     {
63         ASSERT(contextElement);
64         return adoptRef(new SVGAnimatedPropertyTearOff<PropertyType>(contextElement, attributeName, animatedPropertyType, property));
65     }
66 
currentAnimatedValue()67     PropertyType& currentAnimatedValue()
68     {
69         ASSERT(m_isAnimating);
70         ASSERT(m_animVal);
71         return m_animVal->propertyReference();
72     }
73 
currentBaseValue()74     const PropertyType& currentBaseValue() const
75     {
76         return m_property;
77     }
78 
animationStarted(PropertyType * newAnimVal)79     void animationStarted(PropertyType* newAnimVal)
80     {
81         ASSERT(!m_isAnimating);
82         ASSERT(newAnimVal);
83         animVal()->setValue(*newAnimVal);
84         m_isAnimating = true;
85     }
86 
animationEnded()87     void animationEnded()
88     {
89         ASSERT(m_isAnimating);
90         ASSERT(m_animVal);
91         m_animVal->setValue(m_property);
92         m_isAnimating = false;
93     }
94 
animValWillChange()95     void animValWillChange()
96     {
97         // no-op for non list types.
98         ASSERT(m_isAnimating);
99         ASSERT(m_animVal);
100     }
101 
animValDidChange()102     void animValDidChange()
103     {
104         // no-op for non list types.
105         ASSERT(m_isAnimating);
106         ASSERT(m_animVal);
107     }
108 
109 private:
SVGAnimatedPropertyTearOff(SVGElement * contextElement,const QualifiedName & attributeName,AnimatedPropertyType animatedPropertyType,PropertyType & property)110     SVGAnimatedPropertyTearOff(SVGElement* contextElement, const QualifiedName& attributeName, AnimatedPropertyType animatedPropertyType, PropertyType& property)
111         : SVGAnimatedProperty(contextElement, attributeName, animatedPropertyType)
112         , m_property(property)
113     {
114         ScriptWrappable::init(this);
115     }
116 
117     PropertyType& m_property;
118     RefPtr<PropertyTearOff> m_baseVal;
119     RefPtr<PropertyTearOff> m_animVal;
120 };
121 
122 }
123 
124 #endif // SVGAnimatedPropertyTearOff_h
125