61ba0f8eee701e3f9d31052cf2af11e24ffb038f
[WebKit-https.git] / WebCore / html / HTMLSelectElement.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
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., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25
26 #ifndef HTMLSelectElement_h
27 #define HTMLSelectElement_h
28
29 #include "Event.h"
30 #include "HTMLCollection.h"
31 #include "HTMLGenericFormElement.h"
32 #include <wtf/Vector.h>
33
34 namespace WebCore {
35
36 class HTMLOptionElement;
37 class HTMLOptionsCollection;
38 class KeyboardEvent;
39
40 class HTMLSelectElement : public HTMLGenericFormElement {
41
42 public:
43     HTMLSelectElement(Document*, HTMLFormElement* = 0);
44     HTMLSelectElement(const QualifiedName& tagName, Document*, HTMLFormElement* = 0);
45     ~HTMLSelectElement();
46
47     virtual int tagPriority() const { return 6; }
48     virtual bool checkDTD(const Node* newChild);
49
50     virtual const AtomicString& type() const;
51     
52     virtual bool isKeyboardFocusable(KeyboardEvent*) const;
53     virtual bool isMouseFocusable() const;
54     virtual bool canSelectAll() const;
55     virtual void selectAll();
56
57     virtual void recalcStyle(StyleChange);
58
59     virtual void dispatchBlurEvent();
60
61     int selectedIndex() const;
62     void setSelectedIndex(int index, bool deselect = true, bool fireOnChange = false);
63     void notifyOptionSelected(HTMLOptionElement* selectedOption, bool selected);
64     int lastSelectedListIndex() const;
65
66     virtual bool isEnumeratable() const { return true; }
67
68     unsigned length() const;
69
70     int minWidth() const { return m_minwidth; }
71
72     int size() const { return m_size; }
73
74     bool multiple() const { return m_multiple; }
75
76     void add(HTMLElement* element, HTMLElement* before, ExceptionCode&);
77     void remove(int index);
78
79     String value();
80     void setValue(const String&);
81     
82     PassRefPtr<HTMLOptionsCollection> options();
83
84     virtual String stateValue() const;
85     virtual void restoreState(const String&);
86
87     virtual bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode&);
88     virtual bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode&);
89     virtual bool removeChild(Node* child, ExceptionCode&);
90     virtual bool appendChild(PassRefPtr<Node> newChild, ExceptionCode&);
91     virtual ContainerNode* addChild(PassRefPtr<Node>);
92
93     virtual void childrenChanged();
94
95     virtual void parseMappedAttribute(MappedAttribute*);
96
97     virtual RenderObject* createRenderer(RenderArena*, RenderStyle *);
98     virtual bool appendFormData(FormDataList&, bool);
99
100     // get the actual listbox index of the optionIndexth option
101     int optionToListIndex(int optionIndex) const;
102     // reverse of optionToListIndex - get optionIndex from listboxIndex
103     int listToOptionIndex(int listIndex) const;
104
105     void setRecalcListItems();
106
107     const Vector<HTMLElement*>& listItems() const
108     {
109         if (m_recalcListItems)
110             recalcListItems();
111         return m_listItems;
112     }
113     virtual void reset();
114
115     virtual void defaultEventHandler(Event*);
116     virtual void accessKeyAction(bool sendToAnyElement);
117
118     void setMultiple(bool);
119
120     void setSize(int);
121
122     void setOption(unsigned index, HTMLOptionElement*, ExceptionCode&);
123     void setLength(unsigned, ExceptionCode&);
124
125     Node* namedItem(const String& name, bool caseSensitive = true);
126     Node* item(unsigned index);
127
128     HTMLCollection::CollectionInfo* collectionInfo() { return &m_collectionInfo; }
129     
130     void setActiveSelectionAnchorIndex(int index);
131     void setActiveSelectionEndIndex(int index) { m_activeSelectionEndIndex = index; }
132     void updateListBoxSelection(bool deselectOtherOptions);
133     void listBoxOnChange();
134     
135     int activeSelectionStartListIndex() const;
136     int activeSelectionEndListIndex() const;
137
138 private:
139     void recalcListItems() const;
140     void deselectItems(HTMLOptionElement* excludeElement = 0);
141     bool usesMenuList() const { return !m_multiple && m_size <= 1; }
142     int nextSelectableListIndex(int startIndex);
143     int previousSelectableListIndex(int startIndex);
144     void menuListDefaultEventHandler(Event*);
145     void listBoxDefaultEventHandler(Event*);
146     void typeAheadFind(KeyboardEvent*);
147
148     mutable Vector<HTMLElement*> m_listItems;
149     Vector<bool> m_cachedStateForActiveSelection;
150     Vector<bool> m_lastOnChangeSelection;
151     int m_minwidth;
152     int m_size;
153     bool m_multiple;
154     mutable bool m_recalcListItems;
155     int m_lastOnChangeIndex;
156     
157     int m_activeSelectionAnchorIndex;
158     int m_activeSelectionEndIndex;  
159     bool m_activeSelectionState;
160
161     // Instance variables for type-ahead find
162     UChar m_repeatingChar;
163     DOMTimeStamp m_lastCharTime;
164     String m_typedString;
165
166     HTMLCollection::CollectionInfo m_collectionInfo;
167 };
168
169 } // namespace
170
171 #endif