1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/**
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is free software; you can redistribute it and/or
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modify it under the terms of the GNU Library General Public
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * License as published by the Free Software Foundation; either
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * version 2 of the License, or (at your option) any later version.
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is distributed in the hope that it will be useful,
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Library General Public License for more details.
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * You should have received a copy of the GNU Library General Public License
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Boston, MA 02110-1301, USA.
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLOptGroupElement.h"
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
26e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Document.h"
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "HTMLNames.h"
298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "NodeRenderStyle.h"
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderStyle.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h"
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "WMLSelectElement.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace WMLNames;
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWMLOptGroupElement::WMLOptGroupElement(const QualifiedName& tagName, Document* doc)
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    : WMLFormControlElement(tagName, doc)
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<WMLOptGroupElement> WMLOptGroupElement::create(const QualifiedName& tagName, Document* document)
445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return adoptRef(new WMLOptGroupElement(tagName, document));
465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWMLOptGroupElement::~WMLOptGroupElement()
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianconst AtomicString& WMLOptGroupElement::formControlType() const
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, optgroup, ("optgroup"));
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return optgroup;
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic inline WMLSelectElement* ownerSelectElement(Element* element)
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ContainerNode* select = element->parentNode();
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    while (select && !select->hasTagName(selectTag))
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        select = select->parentNode();
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!select)
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return static_cast<WMLSelectElement*>(select);
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLOptGroupElement::accessKeyAction(bool)
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    WMLSelectElement* select = ownerSelectElement(this);
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!select || select->focused())
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // send to the parent to bring focus to the list box
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    select->accessKeyAction(false);
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLOptGroupElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    recalcSelectOptions();
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    WMLFormControlElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
86e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid WMLOptGroupElement::parseMappedAttribute(Attribute* attr)
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    WMLFormControlElement::parseMappedAttribute(attr);
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    recalcSelectOptions();
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLOptGroupElement::attach()
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (parentNode()->renderStyle())
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        setRenderStyle(styleForRenderer());
965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    WMLFormControlElement::attach();
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLOptGroupElement::detach()
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_style.clear();
1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    WMLFormControlElement::detach();
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLOptGroupElement::setRenderStyle(PassRefPtr<RenderStyle> style)
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_style = style;
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectRenderStyle* WMLOptGroupElement::nonRendererRenderStyle() const
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_style.get();
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString WMLOptGroupElement::groupLabelText() const
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    String itemText = document()->displayStringModifiedByEncoding(title());
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // In WinIE, leading and trailing whitespace is ignored in options and optgroups. We match this behavior.
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    itemText = itemText.stripWhiteSpace();
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // We want to collapse our whitespace too.  This will match other browsers.
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    itemText = itemText.simplifyWhiteSpace();
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return itemText;
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLOptGroupElement::recalcSelectOptions()
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (WMLSelectElement* select = ownerSelectElement(this))
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        select->setRecalcListItems();
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
136