1 /* 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 3 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 4 * (C) 1999 Antti Koivisto (koivisto@kde.org) 5 * (C) 2000 Dirk Mueller (mueller@kde.org) 6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserved. 7 * Copyright (C) 2010 Google Inc. All rights reserved. 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Library General Public 11 * License as published by the Free Software Foundation; either 12 * version 2 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Library General Public License for more details. 18 * 19 * You should have received a copy of the GNU Library General Public License 20 * along with this library; see the file COPYING.LIB. If not, write to 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 22 * Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef HTMLSelectElement_h 27 #define HTMLSelectElement_h 28 29 #include "CollectionCache.h" 30 #include "HTMLFormControlElement.h" 31 #include "SelectElement.h" 32 33 namespace WebCore { 34 35 class HTMLOptionElement; 36 class HTMLOptionsCollection; 37 38 class HTMLSelectElement : public HTMLFormControlElementWithState, public SelectElement { 39 public: 40 static PassRefPtr<HTMLSelectElement> create(const QualifiedName&, Document*, HTMLFormElement*); 41 42 virtual int selectedIndex() const; 43 virtual void setSelectedIndex(int index, bool deselect = true); 44 virtual void setSelectedIndexByUser(int index, bool deselect = true, bool fireOnChangeNow = false, bool allowMultipleSelection = false); 45 46 // For ValidityState 47 bool valueMissing() const; 48 49 unsigned length() const; 50 size()51 virtual int size() const { return m_data.size(); } multiple()52 virtual bool multiple() const { return m_data.multiple(); } 53 54 void add(HTMLElement*, HTMLElement* beforeElement, ExceptionCode&); 55 void remove(int index); 56 void remove(HTMLOptionElement*); 57 58 String value() const; 59 void setValue(const String&); 60 61 PassRefPtr<HTMLOptionsCollection> options(); 62 63 virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0); 64 65 void setRecalcListItems(); 66 void recalcListItemsIfNeeded(); 67 listItems()68 virtual const Vector<Element*>& listItems() const { return m_data.listItems(this); } 69 70 virtual void accessKeyAction(bool sendToAnyElement); 71 void accessKeySetSelectedIndex(int); 72 73 void setMultiple(bool); 74 75 void setSize(int); 76 77 void setOption(unsigned index, HTMLOptionElement*, ExceptionCode&); 78 void setLength(unsigned, ExceptionCode&); 79 80 Node* namedItem(const AtomicString& name); 81 Node* item(unsigned index); 82 collectionInfo()83 CollectionCache* collectionInfo() { m_collectionInfo.checkConsistency(); return &m_collectionInfo; } 84 85 void scrollToSelection(); 86 87 void listBoxSelectItem(int listIndex, bool allowMultiplySelections, bool shift, bool fireOnChangeNow = true); 88 updateValidity()89 virtual void updateValidity() { setNeedsValidityCheck(); } 90 91 protected: 92 HTMLSelectElement(const QualifiedName&, Document*, HTMLFormElement*); 93 94 private: 95 virtual const AtomicString& formControlType() const; 96 97 virtual bool isKeyboardFocusable(KeyboardEvent*) const; 98 virtual bool isMouseFocusable() const; 99 virtual bool canSelectAll() const; 100 virtual void selectAll(); 101 102 virtual void recalcStyle(StyleChange); 103 104 virtual void dispatchFocusEvent(); 105 virtual void dispatchBlurEvent(); 106 canStartSelection()107 virtual bool canStartSelection() const { return false; } 108 isEnumeratable()109 virtual bool isEnumeratable() const { return true; } 110 111 virtual bool saveFormControlState(String& value) const; 112 virtual void restoreFormControlState(const String&); 113 114 virtual void parseMappedAttribute(Attribute*); 115 116 virtual RenderObject* createRenderer(RenderArena*, RenderStyle *); 117 virtual bool appendFormData(FormDataList&, bool); 118 119 virtual int optionToListIndex(int optionIndex) const; 120 virtual int listToOptionIndex(int listIndex) const; 121 122 virtual void reset(); 123 124 virtual void defaultEventHandler(Event*); 125 126 virtual void setActiveSelectionAnchorIndex(int index); 127 virtual void setActiveSelectionEndIndex(int index); 128 virtual void updateListBoxSelection(bool deselectOtherOptions); 129 virtual void listBoxOnChange(); 130 virtual void menuListOnChange(); 131 132 virtual int activeSelectionStartListIndex() const; 133 virtual int activeSelectionEndListIndex() const; 134 135 void recalcListItems(bool updateSelectedStates = true) const; 136 137 void deselectItems(HTMLOptionElement* excludeElement = 0); 138 void typeAheadFind(KeyboardEvent*); 139 void saveLastSelection(); 140 141 virtual void insertedIntoTree(bool); 142 isOptionalFormControl()143 virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); } 144 virtual bool isRequiredFormControl() const; 145 146 bool hasPlaceholderLabelOption() const; 147 148 SelectElementData m_data; 149 CollectionCache m_collectionInfo; 150 }; 151 152 } // namespace 153 154 #endif 155