18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2000 Dirk Mueller (mueller@kde.org)
65af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
7d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2010 Google Inc. All rights reserved.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef HTMLSelectElement_h
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HTMLSelectElement_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CollectionCache.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormControlElement.h"
315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SelectElement.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLOptionElement;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLOptionsCollection;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass HTMLSelectElement : public HTMLFormControlElementWithState, public SelectElement {
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    static PassRefPtr<HTMLSelectElement> create(const QualifiedName&, Document*, HTMLFormElement*);
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual int selectedIndex() const;
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    virtual void setSelectedIndex(int index, bool deselect = true);
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual void setSelectedIndexByUser(int index, bool deselect = true, bool fireOnChangeNow = false, bool allowMultipleSelection = false);
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // For ValidityState
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool valueMissing() const;
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned length() const;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual int size() const { return m_data.size(); }
525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool multiple() const { return m_data.multiple(); }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54cad810f21b803229eb11403f9209855525a25d57Steve Block    void add(HTMLElement*, HTMLElement* beforeElement, ExceptionCode&);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void remove(int index);
56cad810f21b803229eb11403f9209855525a25d57Steve Block    void remove(HTMLOptionElement*);
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    String value() const;
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setValue(const String&);
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    PassRefPtr<HTMLOptionsCollection> options();
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setRecalcListItems();
66d0825bca7fe65beaee391d30da42e937db621564Steve Block    void recalcListItemsIfNeeded();
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual const Vector<Element*>& listItems() const { return m_data.listItems(this); }
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void accessKeyAction(bool sendToAnyElement);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void accessKeySetSelectedIndex(int);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setMultiple(bool);
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setSize(int);
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setOption(unsigned index, HTMLOptionElement*, ExceptionCode&);
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setLength(unsigned, ExceptionCode&);
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Node* namedItem(const AtomicString& name);
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* item(unsigned index);
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
83d0825bca7fe65beaee391d30da42e937db621564Steve Block    CollectionCache* collectionInfo() { m_collectionInfo.checkConsistency(); return &m_collectionInfo; }
845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void scrollToSelection();
865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void listBoxSelectItem(int listIndex, bool allowMultiplySelections, bool shift, bool fireOnChangeNow = true);
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void updateValidity() { setNeedsValidityCheck(); }
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeprotected:
925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    HTMLSelectElement(const QualifiedName&, Document*, HTMLFormElement*);
935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianprivate:
955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual const AtomicString& formControlType() const;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool isKeyboardFocusable(KeyboardEvent*) const;
985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool isMouseFocusable() const;
995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool canSelectAll() const;
1005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void selectAll();
1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void recalcStyle(StyleChange);
1035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void dispatchFocusEvent();
1055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void dispatchBlurEvent();
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool canStartSelection() const { return false; }
1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool isEnumeratable() const { return true; }
1105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool saveFormControlState(String& value) const;
1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void restoreFormControlState(const String&);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
114e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    virtual void parseMappedAttribute(Attribute*);
1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual RenderObject* createRenderer(RenderArena*, RenderStyle *);
1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual bool appendFormData(FormDataList&, bool);
1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual int optionToListIndex(int optionIndex) const;
120bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block    virtual int listToOptionIndex(int listIndex) const;
1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void reset();
1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void defaultEventHandler(Event*);
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void setActiveSelectionAnchorIndex(int index);
1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void setActiveSelectionEndIndex(int index);
1285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void updateListBoxSelection(bool deselectOtherOptions);
1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void listBoxOnChange();
1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void menuListOnChange();
1315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual int activeSelectionStartListIndex() const;
1335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual int activeSelectionEndListIndex() const;
1345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void recalcListItems(bool updateSelectedStates = true) const;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void deselectItems(HTMLOptionElement* excludeElement = 0);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void typeAheadFind(KeyboardEvent*);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void saveLastSelection();
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    virtual void insertedIntoTree(bool);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
143f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool isOptionalFormControl() const { return !isRequiredFormControl(); }
144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool isRequiredFormControl() const;
145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool hasPlaceholderLabelOption() const;
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    SelectElementData m_data;
1495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CollectionCache m_collectionInfo;
1505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian};
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
155