1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 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. 13 * 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. 24 */ 25 26#include "config.h" 27#include "core/accessibility/AXSpinButton.h" 28 29#include "core/accessibility/AXObjectCache.h" 30#include "core/rendering/RenderObject.h" 31 32namespace WebCore { 33 34PassRefPtr<AXSpinButton> AXSpinButton::create() 35{ 36 return adoptRef(new AXSpinButton); 37} 38 39AXSpinButton::AXSpinButton() 40 : m_spinButtonElement(0) 41{ 42} 43 44AXSpinButton::~AXSpinButton() 45{ 46} 47 48LayoutRect AXSpinButton::elementRect() const 49{ 50 ASSERT(m_spinButtonElement); 51 52 if (!m_spinButtonElement || !m_spinButtonElement->renderer()) 53 return LayoutRect(); 54 55 Vector<FloatQuad> quads; 56 m_spinButtonElement->renderer()->absoluteFocusRingQuads(quads); 57 58 return boundingBoxForQuads(m_spinButtonElement->renderer(), quads); 59} 60 61void AXSpinButton::addChildren() 62{ 63 m_haveChildren = true; 64 65 AXSpinButtonPart* incrementor = static_cast<AXSpinButtonPart*>(axObjectCache()->getOrCreate(SpinButtonPartRole)); 66 incrementor->setIsIncrementor(true); 67 incrementor->setParent(this); 68 m_children.append(incrementor); 69 70 AXSpinButtonPart* decrementor = static_cast<AXSpinButtonPart*>(axObjectCache()->getOrCreate(SpinButtonPartRole)); 71 decrementor->setIsIncrementor(false); 72 decrementor->setParent(this); 73 m_children.append(decrementor); 74} 75 76void AXSpinButton::step(int amount) 77{ 78 ASSERT(m_spinButtonElement); 79 if (!m_spinButtonElement) 80 return; 81 82 m_spinButtonElement->step(amount); 83} 84 85// AXSpinButtonPart 86 87AXSpinButtonPart::AXSpinButtonPart() 88 : m_isIncrementor(false) 89{ 90} 91 92PassRefPtr<AXSpinButtonPart> AXSpinButtonPart::create() 93{ 94 return adoptRef(new AXSpinButtonPart); 95} 96 97LayoutRect AXSpinButtonPart::elementRect() const 98{ 99 // FIXME: This logic should exist in the render tree or elsewhere, but there is no 100 // relationship that exists that can be queried. 101 102 LayoutRect parentRect = parentObject()->elementRect(); 103 if (m_isIncrementor) { 104 parentRect.setHeight(parentRect.height() / 2); 105 } else { 106 parentRect.setY(parentRect.y() + parentRect.height() / 2); 107 parentRect.setHeight(parentRect.height() / 2); 108 } 109 110 return parentRect; 111} 112 113bool AXSpinButtonPart::press() const 114{ 115 if (!m_parent || !m_parent->isSpinButton()) 116 return false; 117 118 AXSpinButton* spinButton = toAXSpinButton(parentObject()); 119 if (m_isIncrementor) 120 spinButton->step(1); 121 else 122 spinButton->step(-1); 123 124 return true; 125} 126 127} // namespace WebCore 128