Home | History | Annotate | Download | only in wml
      1 /**
      2  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Library General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Library General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Library General Public License
     15  * along with this library; see the file COPYING.LIB.  If not, write to
     16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     17  * Boston, MA 02110-1301, USA.
     18  *
     19  */
     20 
     21 #include "config.h"
     22 
     23 #if ENABLE(WML)
     24 #include "WMLOptGroupElement.h"
     25 
     26 #include "Attribute.h"
     27 #include "Document.h"
     28 #include "HTMLNames.h"
     29 #include "NodeRenderStyle.h"
     30 #include "RenderStyle.h"
     31 #include "WMLNames.h"
     32 #include "WMLSelectElement.h"
     33 
     34 namespace WebCore {
     35 
     36 using namespace WMLNames;
     37 
     38 WMLOptGroupElement::WMLOptGroupElement(const QualifiedName& tagName, Document* doc)
     39     : WMLFormControlElement(tagName, doc)
     40 {
     41 }
     42 
     43 PassRefPtr<WMLOptGroupElement> WMLOptGroupElement::create(const QualifiedName& tagName, Document* document)
     44 {
     45     return adoptRef(new WMLOptGroupElement(tagName, document));
     46 }
     47 
     48 WMLOptGroupElement::~WMLOptGroupElement()
     49 {
     50 }
     51 
     52 const AtomicString& WMLOptGroupElement::formControlType() const
     53 {
     54     DEFINE_STATIC_LOCAL(const AtomicString, optgroup, ("optgroup"));
     55     return optgroup;
     56 }
     57 
     58 static inline WMLSelectElement* ownerSelectElement(Element* element)
     59 {
     60     ContainerNode* select = element->parentNode();
     61     while (select && !select->hasTagName(selectTag))
     62         select = select->parentNode();
     63 
     64     if (!select)
     65         return 0;
     66 
     67     return static_cast<WMLSelectElement*>(select);
     68 }
     69 
     70 void WMLOptGroupElement::accessKeyAction(bool)
     71 {
     72     WMLSelectElement* select = ownerSelectElement(this);
     73     if (!select || select->focused())
     74         return;
     75 
     76     // send to the parent to bring focus to the list box
     77     select->accessKeyAction(false);
     78 }
     79 
     80 void WMLOptGroupElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
     81 {
     82     recalcSelectOptions();
     83     WMLFormControlElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
     84 }
     85 
     86 void WMLOptGroupElement::parseMappedAttribute(Attribute* attr)
     87 {
     88     WMLFormControlElement::parseMappedAttribute(attr);
     89     recalcSelectOptions();
     90 }
     91 
     92 void WMLOptGroupElement::attach()
     93 {
     94     if (parentNode()->renderStyle())
     95         setRenderStyle(styleForRenderer());
     96     WMLFormControlElement::attach();
     97 }
     98 
     99 void WMLOptGroupElement::detach()
    100 {
    101     m_style.clear();
    102     WMLFormControlElement::detach();
    103 }
    104 
    105 void WMLOptGroupElement::setRenderStyle(PassRefPtr<RenderStyle> style)
    106 {
    107     m_style = style;
    108 }
    109 
    110 RenderStyle* WMLOptGroupElement::nonRendererRenderStyle() const
    111 {
    112     return m_style.get();
    113 }
    114 
    115 String WMLOptGroupElement::groupLabelText() const
    116 {
    117     String itemText = document()->displayStringModifiedByEncoding(title());
    118 
    119     // In WinIE, leading and trailing whitespace is ignored in options and optgroups. We match this behavior.
    120     itemText = itemText.stripWhiteSpace();
    121     // We want to collapse our whitespace too.  This will match other browsers.
    122     itemText = itemText.simplifyWhiteSpace();
    123 
    124     return itemText;
    125 }
    126 
    127 void WMLOptGroupElement::recalcSelectOptions()
    128 {
    129     if (WMLSelectElement* select = ownerSelectElement(this))
    130         select->setRecalcListItems();
    131 }
    132 
    133 }
    134 
    135 #endif
    136