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