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