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