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