2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "AccessibilitySpinButton.h"
29 #include "AXObjectCache.h"
30 #include "RenderObject.h"
34 PassRefPtr<AccessibilitySpinButton> AccessibilitySpinButton::create()
36 return adoptRef(new AccessibilitySpinButton);
39 AccessibilitySpinButton::AccessibilitySpinButton()
40 : m_spinButtonElement(0)
44 AccessibilitySpinButton::~AccessibilitySpinButton()
48 AccessibilityObject* AccessibilitySpinButton::incrementButton()
53 ASSERT(m_children.size() == 2);
55 return m_children[0].get();
58 AccessibilityObject* AccessibilitySpinButton::decrementButton()
63 ASSERT(m_children.size() == 2);
65 return m_children[1].get();
68 LayoutRect AccessibilitySpinButton::elementRect() const
70 ASSERT(m_spinButtonElement);
72 if (!m_spinButtonElement || !m_spinButtonElement->renderer())
75 Vector<FloatQuad> quads;
76 m_spinButtonElement->renderer()->absoluteFocusRingQuads(quads);
78 return boundingBoxForQuads(m_spinButtonElement->renderer(), quads);
81 void AccessibilitySpinButton::addChildren()
83 m_haveChildren = true;
85 AccessibilitySpinButtonPart* incrementor = static_cast<AccessibilitySpinButtonPart*>(axObjectCache()->getOrCreate(SpinButtonPartRole));
86 incrementor->setIsIncrementor(true);
87 incrementor->setParent(this);
88 m_children.append(incrementor);
90 AccessibilitySpinButtonPart* decrementor = static_cast<AccessibilitySpinButtonPart*>(axObjectCache()->getOrCreate(SpinButtonPartRole));
91 decrementor->setIsIncrementor(false);
92 decrementor->setParent(this);
93 m_children.append(decrementor);
96 void AccessibilitySpinButton::step(int amount)
98 ASSERT(m_spinButtonElement);
99 if (!m_spinButtonElement)
102 m_spinButtonElement->step(amount);
105 // AccessibilitySpinButtonPart
107 AccessibilitySpinButtonPart::AccessibilitySpinButtonPart()
108 : m_isIncrementor(false)
112 PassRefPtr<AccessibilitySpinButtonPart> AccessibilitySpinButtonPart::create()
114 return adoptRef(new AccessibilitySpinButtonPart);
117 LayoutRect AccessibilitySpinButtonPart::elementRect() const
119 // FIXME: This logic should exist in the render tree or elsewhere, but there is no
120 // relationship that exists that can be queried.
122 LayoutRect parentRect = parentObject()->elementRect();
124 parentRect.setHeight(parentRect.height() / 2);
126 parentRect.setY(parentRect.y() + parentRect.height() / 2);
127 parentRect.setHeight(parentRect.height() / 2);
133 bool AccessibilitySpinButtonPart::press() const
135 if (!m_parent || !m_parent->isSpinButton())
138 AccessibilitySpinButton* spinButton = toAccessibilitySpinButton(parentObject());
142 spinButton->step(-1);
147 } // namespace WebCore