Home | History | Annotate | Download | only in svg
      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 SVGAnimatedPropertySynchronizer_h
     21 #define SVGAnimatedPropertySynchronizer_h
     22 
     23 #include "SVGAnimatedPropertyTraits.h"
     24 
     25 #if ENABLE(SVG)
     26 namespace WebCore {
     27 
     28 class SVGElement;
     29 
     30 // GetOwnerElementForType implementation
     31 template<typename OwnerType, bool isDerivedFromSVGElement>
     32 struct GetOwnerElementForType;
     33 
     34 template<typename OwnerType>
     35 struct GetOwnerElementForType<OwnerType, true> : public Noncopyable {
     36     static SVGElement* ownerElement(OwnerType* type)
     37     {
     38         return type;
     39     }
     40 };
     41 
     42 template<typename OwnerType>
     43 struct GetOwnerElementForType<OwnerType, false> : public Noncopyable {
     44     static SVGElement* ownerElement(OwnerType* type)
     45     {
     46         SVGElement* context = type->contextElement();
     47         ASSERT(context);
     48         return context;
     49     }
     50 };
     51 
     52 // IsDerivedFromSVGElement implementation
     53 template<typename OwnerType>
     54 struct IsDerivedFromSVGElement : public Noncopyable {
     55     static const bool value = true;
     56 };
     57 
     58 class SVGViewSpec;
     59 template<>
     60 struct IsDerivedFromSVGElement<SVGViewSpec> : public Noncopyable {
     61     static const bool value = false;
     62 };
     63 
     64 // Helper template used for synchronizing SVG <-> XML properties
     65 template<bool isDerivedFromSVGElement>
     66 struct SVGAnimatedPropertySynchronizer {
     67     static void synchronize(SVGElement*, const QualifiedName&, const AtomicString&);
     68 };
     69 
     70 template<>
     71 struct SVGAnimatedPropertySynchronizer<true> {
     72     static void synchronize(SVGElement* ownerElement, const QualifiedName& attrName, const AtomicString& value)
     73     {
     74         NamedNodeMap* namedAttrMap = ownerElement->attributes(false);
     75         Attribute* old = namedAttrMap->getAttributeItem(attrName);
     76         if (old && value.isNull())
     77             namedAttrMap->removeAttribute(old->name());
     78         else if (!old && !value.isNull())
     79             namedAttrMap->addAttribute(ownerElement->createAttribute(attrName, value));
     80         else if (old && !value.isNull())
     81             old->setValue(value);
     82     }
     83 };
     84 
     85 template<>
     86 struct SVGAnimatedPropertySynchronizer<false> {
     87     static void synchronize(SVGElement*, const QualifiedName&, const AtomicString&)
     88     {
     89         // no-op, for types not inheriting from Element, thus nothing to synchronize
     90     }
     91 };
     92 
     93 };
     94 
     95 #endif
     96 #endif
     97