1 /* 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 3 * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org) 4 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 5 * (C) 2000 Dirk Mueller (mueller (at) kde.org) 6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 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 "core/html/HTMLContentElement.h" 30 #include "core/html/HTMLFormControlElementWithState.h" 31 #include "core/html/HTMLOptionsCollection.h" 32 #include "core/html/forms/TypeAhead.h" 33 #include "wtf/Vector.h" 34 35 namespace blink { 36 37 class AutoscrollController; 38 class ExceptionState; 39 class HTMLOptionElement; 40 class MouseEvent; 41 42 class HTMLSelectElement FINAL : public HTMLFormControlElementWithState, public TypeAheadDataSource { 43 DEFINE_WRAPPERTYPEINFO(); 44 public: 45 static PassRefPtrWillBeRawPtr<HTMLSelectElement> create(Document&); 46 static PassRefPtrWillBeRawPtr<HTMLSelectElement> create(Document&, HTMLFormElement*); 47 48 int selectedIndex() const; 49 void setSelectedIndex(int); 50 int suggestedIndex() const; 51 void setSuggestedIndex(int); 52 53 void optionSelectedByUser(int index, bool dispatchChangeEvent, bool allowMultipleSelection = false); 54 55 // For ValidityState 56 virtual String validationMessage() const OVERRIDE; 57 virtual bool valueMissing() const OVERRIDE; 58 59 virtual void resetImpl() OVERRIDE; 60 61 unsigned length() const; 62 63 int size() const { return m_size; } 64 bool multiple() const { return m_multiple; } 65 66 bool usesMenuList() const; 67 68 void add(HTMLElement*, HTMLElement* beforeElement, ExceptionState&); 69 void addBeforeOptionAtIndex(HTMLElement*, int beforeIndex, ExceptionState&); 70 71 using Node::remove; 72 void remove(int index); 73 74 String value() const; 75 void setValue(const String&, bool sendEvents = false); 76 String suggestedValue() const; 77 void setSuggestedValue(const String&); 78 79 PassRefPtrWillBeRawPtr<HTMLOptionsCollection> options(); 80 PassRefPtrWillBeRawPtr<HTMLCollection> selectedOptions(); 81 82 void optionElementChildrenChanged(); 83 84 void setRecalcListItems(); 85 void invalidateSelectedItems(); 86 void updateListItemSelectedStates(); 87 88 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems() const; 89 90 virtual void accessKeyAction(bool sendMouseEvents) OVERRIDE; 91 void accessKeySetSelectedIndex(int); 92 93 void setMultiple(bool); 94 95 void setSize(int); 96 97 void setOption(unsigned index, HTMLOptionElement*, ExceptionState&); 98 void setLength(unsigned, ExceptionState&); 99 100 Element* namedItem(const AtomicString& name); 101 HTMLOptionElement* item(unsigned index); 102 103 void scrollToSelection(); 104 void scrollTo(int listIndex); 105 106 void listBoxSelectItem(int listIndex, bool allowMultiplySelections, bool shift, bool fireOnChangeNow = true); 107 108 bool canSelectAll() const; 109 void selectAll(); 110 int listToOptionIndex(int listIndex) const; 111 void listBoxOnChange(); 112 int optionToListIndex(int optionIndex) const; 113 int activeSelectionStartListIndex() const; 114 int activeSelectionEndListIndex() const; 115 void setActiveSelectionAnchorIndex(int); 116 void setActiveSelectionEndIndex(int); 117 118 // For use in the implementation of HTMLOptionElement. 119 void optionSelectionStateChanged(HTMLOptionElement*, bool optionIsSelected); 120 void optionRemoved(const HTMLOptionElement&); 121 bool anonymousIndexedSetter(unsigned, PassRefPtrWillBeRawPtr<HTMLOptionElement>, ExceptionState&); 122 123 void updateListOnRenderer(); 124 125 HTMLOptionElement* spatialNavigationFocusedOption(); 126 void handleMouseRelease(); 127 128 virtual void trace(Visitor*) OVERRIDE; 129 130 protected: 131 HTMLSelectElement(Document&, HTMLFormElement*); 132 133 private: 134 virtual const AtomicString& formControlType() const OVERRIDE; 135 136 virtual bool shouldShowFocusRingOnMouseFocus() const OVERRIDE; 137 138 virtual void dispatchFocusEvent(Element* oldFocusedElement, FocusType) OVERRIDE; 139 virtual void dispatchBlurEvent(Element* newFocusedElemnet) OVERRIDE; 140 141 virtual bool canStartSelection() const OVERRIDE { return false; } 142 143 virtual bool isEnumeratable() const OVERRIDE { return true; } 144 virtual bool isInteractiveContent() const OVERRIDE; 145 virtual bool supportsAutofocus() const OVERRIDE; 146 virtual bool supportLabels() const OVERRIDE { return true; } 147 148 virtual FormControlState saveFormControlState() const OVERRIDE; 149 virtual void restoreFormControlState(const FormControlState&) OVERRIDE; 150 151 virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE; 152 virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE; 153 154 virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE; 155 virtual bool appendFormData(FormDataList&, bool) OVERRIDE; 156 virtual void didAddUserAgentShadowRoot(ShadowRoot&) OVERRIDE; 157 158 virtual void defaultEventHandler(Event*) OVERRIDE; 159 160 void dispatchInputAndChangeEventForMenuList(bool requiresUserGesture = true); 161 162 void recalcListItems(bool updateSelectedStates = true) const; 163 164 void typeAheadFind(KeyboardEvent*); 165 void saveLastSelection(); 166 167 virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE; 168 169 virtual bool isOptionalFormControl() const OVERRIDE { return !isRequiredFormControl(); } 170 virtual bool isRequiredFormControl() const OVERRIDE; 171 172 bool hasPlaceholderLabelOption() const; 173 174 enum SelectOptionFlag { 175 DeselectOtherOptions = 1 << 0, 176 DispatchInputAndChangeEvent = 1 << 1, 177 UserDriven = 1 << 2, 178 }; 179 typedef unsigned SelectOptionFlags; 180 void selectOption(int optionIndex, SelectOptionFlags = 0); 181 void deselectItemsWithoutValidation(HTMLElement* elementToExclude = 0); 182 void parseMultipleAttribute(const AtomicString&); 183 int lastSelectedListIndex() const; 184 void updateSelectedState(int listIndex, bool multi, bool shift); 185 void menuListDefaultEventHandler(Event*); 186 void handlePopupOpenKeyboardEvent(Event*); 187 bool shouldOpenPopupForKeyDownEvent(KeyboardEvent*); 188 bool shouldOpenPopupForKeyPressEvent(KeyboardEvent*); 189 void listBoxDefaultEventHandler(Event*); 190 void setOptionsChangedOnRenderer(); 191 size_t searchOptionsForValue(const String&, size_t listIndexStart, size_t listIndexEnd) const; 192 void updateListBoxSelection(bool deselectOtherOptions, bool scroll = true); 193 194 enum SkipDirection { 195 SkipBackwards = -1, 196 SkipForwards = 1 197 }; 198 int nextValidIndex(int listIndex, SkipDirection, int skip) const; 199 int nextSelectableListIndex(int startIndex) const; 200 int previousSelectableListIndex(int startIndex) const; 201 int firstSelectableListIndex() const; 202 int lastSelectableListIndex() const; 203 int nextSelectableListIndexPageAway(int startIndex, SkipDirection) const; 204 int listIndexForEventTargetOption(const Event&); 205 int listIndexForOption(const HTMLOptionElement&); 206 AutoscrollController* autoscrollController() const; 207 208 virtual void childrenChanged(const ChildrenChange&) OVERRIDE; 209 virtual bool areAuthorShadowsAllowed() const OVERRIDE { return false; } 210 virtual void finishParsingChildren() OVERRIDE; 211 212 // TypeAheadDataSource functions. 213 virtual int indexOfSelectedOption() const OVERRIDE; 214 virtual int optionCount() const OVERRIDE; 215 virtual String optionAtIndex(int index) const OVERRIDE; 216 217 // m_listItems contains HTMLOptionElement, HTMLOptGroupElement, and HTMLHRElement objects. 218 mutable WillBeHeapVector<RawPtrWillBeMember<HTMLElement> > m_listItems; 219 Vector<bool> m_lastOnChangeSelection; 220 Vector<bool> m_cachedStateForActiveSelection; 221 TypeAhead m_typeAhead; 222 int m_size; 223 int m_lastOnChangeIndex; 224 int m_activeSelectionAnchorIndex; 225 int m_activeSelectionEndIndex; 226 bool m_isProcessingUserDrivenChange; 227 bool m_multiple; 228 bool m_activeSelectionState; 229 mutable bool m_shouldRecalcListItems; 230 int m_suggestedIndex; 231 }; 232 233 } // namespace blink 234 235 #endif // HTMLSelectElement_h 236