15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
27bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/accessibility/AXSpinButton.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<AXSpinButton> AXSpinButton::create()
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return adoptRef(new AXSpinButton);
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)AXSpinButton::AXSpinButton()
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_spinButtonElement(0)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)AXSpinButton::~AXSpinButton()
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
48bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)LayoutRect AXSpinButton::elementRect() const
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_spinButtonElement);
5102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_spinButtonElement || !m_spinButtonElement->renderer())
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LayoutRect();
5402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
55a372c30a9dc26aa32e51fa7b85e0c47b55479f89Ben Murdoch    return m_spinButtonElement->renderer()->absoluteFocusRingBoundingBoxRect();
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void AXSpinButton::addChildren()
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_haveChildren = true;
6102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    AXSpinButtonPart* incrementor = toAXSpinButtonPart(axObjectCache()->getOrCreate(SpinButtonPartRole));
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    incrementor->setIsIncrementor(true);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    incrementor->setParent(this);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_children.append(incrementor);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    AXSpinButtonPart* decrementor = toAXSpinButtonPart(axObjectCache()->getOrCreate(SpinButtonPartRole));
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    decrementor->setIsIncrementor(false);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    decrementor->setParent(this);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_children.append(decrementor);
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
73bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void AXSpinButton::step(int amount)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_spinButtonElement);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_spinButtonElement)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_spinButtonElement->step(amount);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)// AXSpinButtonPart
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)AXSpinButtonPart::AXSpinButtonPart()
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_isIncrementor(false)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
89bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<AXSpinButtonPart> AXSpinButtonPart::create()
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
91bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return adoptRef(new AXSpinButtonPart);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)LayoutRect AXSpinButtonPart::elementRect() const
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This logic should exist in the render tree or elsewhere, but there is no
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // relationship that exists that can be queried.
9802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect parentRect = parentObject()->elementRect();
100bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (m_isIncrementor) {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parentRect.setHeight(parentRect.height() / 2);
102bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    } else {
10302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        parentRect.setY(parentRect.y() + parentRect.height() / 2);
10402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        parentRect.setHeight(parentRect.height() / 2);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parentRect;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool AXSpinButtonPart::press() const
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_parent || !m_parent->isSpinButton())
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
11402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
115bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXSpinButton* spinButton = toAXSpinButton(parentObject());
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isIncrementor)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        spinButton->step(1);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        spinButton->step(-1);
12002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
125