1/*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4 *           (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
6 *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * Library General Public License for more details.
17 *
18 * You should have received a copy of the GNU Library General Public License
19 * along with this library; see the file COPYING.LIB.  If not, write to
20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22 *
23 */
24
25#include "config.h"
26#include "HTMLLegendElement.h"
27
28#include "HTMLNames.h"
29#include <wtf/StdLibExtras.h>
30
31namespace WebCore {
32
33using namespace HTMLNames;
34
35HTMLLegendElement::HTMLLegendElement(const QualifiedName& tagName, Document *doc, HTMLFormElement *f)
36    : HTMLFormControlElement(tagName, doc, f)
37{
38    ASSERT(hasTagName(legendTag));
39}
40
41HTMLLegendElement::~HTMLLegendElement()
42{
43}
44
45bool HTMLLegendElement::supportsFocus() const
46{
47    return HTMLElement::supportsFocus();
48}
49
50const AtomicString& HTMLLegendElement::formControlType() const
51{
52    DEFINE_STATIC_LOCAL(const AtomicString, legend, ("legend"));
53    return legend;
54}
55
56String HTMLLegendElement::accessKey() const
57{
58    return getAttribute(accesskeyAttr);
59}
60
61void HTMLLegendElement::setAccessKey(const String &value)
62{
63    setAttribute(accesskeyAttr, value);
64}
65
66String HTMLLegendElement::align() const
67{
68    return getAttribute(alignAttr);
69}
70
71void HTMLLegendElement::setAlign(const String &value)
72{
73    setAttribute(alignAttr, value);
74}
75
76Element *HTMLLegendElement::formElement()
77{
78    // Check if there's a fieldset belonging to this legend.
79    Node *fieldset = parentNode();
80    while (fieldset && !fieldset->hasTagName(fieldsetTag))
81        fieldset = fieldset->parentNode();
82    if (!fieldset)
83        return 0;
84
85    // Find first form element inside the fieldset.
86    // FIXME: Should we care about tabindex?
87    Node *node = fieldset;
88    while ((node = node->traverseNextNode(fieldset))) {
89        if (node->isHTMLElement()) {
90            HTMLElement *element = static_cast<HTMLElement *>(node);
91            if (!element->hasLocalName(legendTag) && element->isFormControlElement())
92                return element;
93        }
94    }
95
96    return 0;
97}
98
99void HTMLLegendElement::focus(bool)
100{
101    if (isFocusable())
102        Element::focus();
103
104    // to match other browsers, never restore previous selection
105    if (Element *element = formElement())
106        element->focus(false);
107}
108
109void HTMLLegendElement::accessKeyAction(bool sendToAnyElement)
110{
111    if (Element *element = formElement())
112        element->accessKeyAction(sendToAnyElement);
113}
114
115} // namespace
116