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 SVGPathSegListPropertyTearOff_h 21 #define SVGPathSegListPropertyTearOff_h 22 23 #if ENABLE(SVG) 24 #include "SVGAnimatedListPropertyTearOff.h" 25 #include "SVGPathSegList.h" 26 27 namespace WebCore { 28 29 class SVGPathElement; 30 31 class SVGPathSegListPropertyTearOff : public SVGListProperty<SVGPathSegList> { 32 public: 33 typedef SVGListProperty<SVGPathSegList> Base; 34 typedef SVGAnimatedListPropertyTearOff<SVGPathSegList> AnimatedListPropertyTearOff; 35 typedef SVGPropertyTraits<SVGPathSegList>::ListItemType ListItemType; 36 typedef PassRefPtr<SVGPathSeg> PassListItemType; 37 create(AnimatedListPropertyTearOff * animatedProperty,SVGPropertyRole role,SVGPathSegRole pathSegRole)38 static PassRefPtr<SVGPathSegListPropertyTearOff> create(AnimatedListPropertyTearOff* animatedProperty, SVGPropertyRole role, SVGPathSegRole pathSegRole) 39 { 40 ASSERT(animatedProperty); 41 return adoptRef(new SVGPathSegListPropertyTearOff(animatedProperty, role, pathSegRole)); 42 } 43 removeItemFromList(const ListItemType & removeItem,bool shouldSynchronizeWrappers)44 int removeItemFromList(const ListItemType& removeItem, bool shouldSynchronizeWrappers) 45 { 46 SVGPathSegList& values = m_animatedProperty->values(); 47 48 unsigned size = values.size(); 49 for (unsigned i = 0; i < size; ++i) { 50 ListItemType& item = values.at(i); 51 if (item != removeItem) 52 continue; 53 54 values.remove(i); 55 56 if (shouldSynchronizeWrappers) 57 commitChange(); 58 59 return i; 60 } 61 62 return -1; 63 } 64 65 // SVGList API 66 void clear(ExceptionCode&); 67 numberOfItems()68 unsigned numberOfItems() const 69 { 70 SVGPathSegList& values = m_animatedProperty->values(); 71 return Base::numberOfItemsValues(values); 72 } 73 initialize(PassListItemType passNewItem,ExceptionCode & ec)74 PassListItemType initialize(PassListItemType passNewItem, ExceptionCode& ec) 75 { 76 // Not specified, but FF/Opera do it this way, and it's just sane. 77 if (!passNewItem) { 78 ec = SVGException::SVG_WRONG_TYPE_ERR; 79 return 0; 80 } 81 82 ListItemType newItem = passNewItem; 83 SVGPathSegList& values = m_animatedProperty->values(); 84 return Base::initializeValues(values, newItem, ec); 85 } 86 87 PassListItemType getItem(unsigned index, ExceptionCode&); 88 insertItemBefore(PassListItemType passNewItem,unsigned index,ExceptionCode & ec)89 PassListItemType insertItemBefore(PassListItemType passNewItem, unsigned index, ExceptionCode& ec) 90 { 91 // Not specified, but FF/Opera do it this way, and it's just sane. 92 if (!passNewItem) { 93 ec = SVGException::SVG_WRONG_TYPE_ERR; 94 return 0; 95 } 96 97 ListItemType newItem = passNewItem; 98 SVGPathSegList& values = m_animatedProperty->values(); 99 return Base::insertItemBeforeValues(values, newItem, index, ec); 100 } 101 replaceItem(PassListItemType passNewItem,unsigned index,ExceptionCode & ec)102 PassListItemType replaceItem(PassListItemType passNewItem, unsigned index, ExceptionCode& ec) 103 { 104 // Not specified, but FF/Opera do it this way, and it's just sane. 105 if (!passNewItem) { 106 ec = SVGException::SVG_WRONG_TYPE_ERR; 107 return 0; 108 } 109 110 ListItemType newItem = passNewItem; 111 SVGPathSegList& values = m_animatedProperty->values(); 112 return Base::replaceItemValues(values, newItem, index, ec); 113 } 114 115 PassListItemType removeItem(unsigned index, ExceptionCode&); 116 appendItem(PassListItemType passNewItem,ExceptionCode & ec)117 PassListItemType appendItem(PassListItemType passNewItem, ExceptionCode& ec) 118 { 119 // Not specified, but FF/Opera do it this way, and it's just sane. 120 if (!passNewItem) { 121 ec = SVGException::SVG_WRONG_TYPE_ERR; 122 return 0; 123 } 124 125 ListItemType newItem = passNewItem; 126 SVGPathSegList& values = m_animatedProperty->values(); 127 return Base::appendItemValues(values, newItem, ec); 128 } 129 130 private: SVGPathSegListPropertyTearOff(AnimatedListPropertyTearOff * animatedProperty,SVGPropertyRole role,SVGPathSegRole pathSegRole)131 SVGPathSegListPropertyTearOff(AnimatedListPropertyTearOff* animatedProperty, SVGPropertyRole role, SVGPathSegRole pathSegRole) 132 : SVGListProperty<SVGPathSegList>(role) 133 , m_animatedProperty(animatedProperty) 134 , m_pathSegRole(pathSegRole) 135 { 136 } 137 138 SVGPathElement* contextElement() const; 139 commitChange()140 virtual void commitChange() 141 { 142 SVGPathSegList& values = m_animatedProperty->values(); 143 values.commitChange(m_animatedProperty->contextElement()); 144 } 145 146 virtual void processIncomingListItemValue(const ListItemType& newItem, unsigned* indexToModify); processIncomingListItemWrapper(RefPtr<ListItemTearOff> &,unsigned *)147 virtual void processIncomingListItemWrapper(RefPtr<ListItemTearOff>&, unsigned*) 148 { 149 ASSERT_NOT_REACHED(); 150 } 151 152 private: 153 RefPtr<AnimatedListPropertyTearOff> m_animatedProperty; 154 SVGPathSegRole m_pathSegRole; 155 }; 156 157 } 158 159 #endif // ENABLE(SVG) 160 #endif // SVGListPropertyTearOff_h 161