16b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner/* 26b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * Copyright (C) Research In Motion Limited 2010. All rights reserved. 36b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * 46b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * This library is free software; you can redistribute it and/or 56b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * modify it under the terms of the GNU Library General Public 66b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * License as published by the Free Software Foundation; either 76b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * version 2 of the License, or (at your option) any later version. 86b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * 96b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * This library is distributed in the hope that it will be useful, 106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * but WITHOUT ANY WARRANTY; without even the implied warranty of 116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * Library General Public License for more details. 136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * 146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * You should have received a copy of the GNU Library General Public License 156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * along with this library; see the file COPYING.LIB. If not, write to 166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner * Boston, MA 02110-1301, USA. 186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner */ 196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#ifndef SVGStaticPropertyWithParentTearOff_h 216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#define SVGStaticPropertyWithParentTearOff_h 226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if ENABLE(SVG) 246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "SVGPropertyTearOff.h" 256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennernamespace WebCore { 276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if COMPILER(MSVC) 296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner// UpdateMethod is 12 bytes. We have to pack to a size greater than or equal to that to avoid an 306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner// alignment warning (C4121). 16 is the next-largest size allowed for packing, so we use that. 316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#pragma pack(push, 16) 326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif 336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennertemplate<typename ParentType, typename PropertyType> 346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerclass SVGStaticPropertyWithParentTearOff : public SVGPropertyTearOff<PropertyType> { 356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerpublic: 366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner typedef SVGStaticPropertyWithParentTearOff<ParentType, PropertyType> Self; 376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner typedef void (ParentType::*UpdateMethod)(); 386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner // Used for non-animated POD types that are not associated with a SVGAnimatedProperty object, nor with a XML DOM attribute 406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner // and that contain a parent type that's exposed to the bindings via a SVGStaticPropertyTearOff object 416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner // (for example: SVGTransform::matrix). 426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner static PassRefPtr<Self> create(SVGProperty* parent, PropertyType& value, UpdateMethod update) 436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner { 446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(parent); 456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return adoptRef(new Self(parent, value, update)); 466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner virtual void commitChange() 496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner { 506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner (static_cast<SVGPropertyTearOff<ParentType>*>(m_parent.get())->propertyReference().*m_update)(); 516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_parent->commitChange(); 526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerprivate: 556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner SVGStaticPropertyWithParentTearOff(SVGProperty* parent, PropertyType& value, UpdateMethod update) 564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang : SVGPropertyTearOff<PropertyType>(0, UndefinedRole, value) 576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner , m_update(update) 586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner , m_parent(parent) 596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner { 606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner UpdateMethod m_update; 636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner RefPtr<SVGProperty> m_parent; 646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}; 656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if COMPILER(MSVC) 666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#pragma pack(pop) 676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif 686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif // ENABLE(SVG) 726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif // SVGStaticPropertyWithParentTearOff_h 73