1d2e1084cdc1696b78d6f51b9cbf34d6430a891d
[WebKit-https.git] / Source / WebCore / html / shadow / TextControlInnerElements.h
1 /*
2  * Copyright (C) 2006, 2008, 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Google Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26  
27 #ifndef TextControlInnerElements_h
28 #define TextControlInnerElements_h
29
30 #include "HTMLDivElement.h"
31 #include "SpeechInputListener.h"
32 #include "Timer.h"
33 #include <wtf/Forward.h>
34
35 namespace WebCore {
36
37 class SpeechInput;
38
39 class TextControlInnerElement : public HTMLDivElement {
40 public:
41     static PassRefPtr<TextControlInnerElement> create(Document*);
42
43 protected:
44     TextControlInnerElement(Document*);
45     virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
46
47 private:
48     virtual bool isMouseFocusable() const { return false; }
49 };
50
51 class TextControlInnerTextElement : public HTMLDivElement {
52 public:
53     static PassRefPtr<TextControlInnerTextElement> create(Document*);
54
55     virtual void defaultEventHandler(Event*);
56
57 private:
58     TextControlInnerTextElement(Document*);
59     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
60     virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
61     virtual bool isMouseFocusable() const { return false; }
62 };
63
64 class SearchFieldResultsButtonElement : public HTMLDivElement {
65 public:
66     static PassRefPtr<SearchFieldResultsButtonElement> create(Document*);
67
68     virtual void defaultEventHandler(Event*);
69     virtual bool willRespondToMouseClickEvents() OVERRIDE;
70
71 private:
72     SearchFieldResultsButtonElement(Document*);
73     virtual const AtomicString& shadowPseudoId() const;
74     virtual bool isMouseFocusable() const { return false; }
75 };
76
77 class SearchFieldCancelButtonElement : public HTMLDivElement {
78 public:
79     static PassRefPtr<SearchFieldCancelButtonElement> create(Document*);
80
81     virtual void defaultEventHandler(Event*);
82     virtual bool willRespondToMouseClickEvents() OVERRIDE;
83
84 private:
85     SearchFieldCancelButtonElement(Document*);
86     virtual const AtomicString& shadowPseudoId() const;
87     virtual void detach();
88     virtual bool isMouseFocusable() const { return false; }
89
90     bool m_capturing;
91 };
92
93 class SpinButtonElement : public HTMLDivElement {
94 public:
95     enum UpDownState {
96         Indeterminate, // Hovered, but the event is not handled.
97         Down,
98         Up,
99     };
100
101     class StepActionHandler {
102     public:
103         virtual ~StepActionHandler() { }
104         virtual void spinButtonStepDown() = 0;
105         virtual void spinButtonStepUp() = 0;
106     };
107
108     // The owner of SpinButtonElement must call removeStepActionHandler
109     // because SpinButtonElement can be outlive StepActionHandler
110     // implementation, e.g. during event handling.
111     static PassRefPtr<SpinButtonElement> create(Document*, StepActionHandler&);
112     UpDownState upDownState() const { return m_upDownState; }
113     virtual void releaseCapture();
114     void removeStepActionHandler() { m_stepActionHandler = 0; }
115
116     void step(int amount);
117     
118     virtual bool willRespondToMouseMoveEvents() OVERRIDE;
119     virtual bool willRespondToMouseClickEvents() OVERRIDE;
120
121     void forwardEvent(Event*);
122
123 private:
124     SpinButtonElement(Document*, StepActionHandler&);
125
126     virtual const AtomicString& shadowPseudoId() const;
127     virtual void detach();
128     virtual bool isSpinButtonElement() const { return true; }
129     virtual bool isEnabledFormControl() const { return shadowHost()->isEnabledFormControl(); }
130     virtual bool shouldMatchReadOnlySelector() const OVERRIDE;
131     virtual bool shouldMatchReadWriteSelector() const OVERRIDE;
132     virtual void defaultEventHandler(Event*);
133     void doStepAction(int);
134     void startRepeatingTimer();
135     void stopRepeatingTimer();
136     void repeatingTimerFired(Timer<SpinButtonElement>*);
137     virtual void setHovered(bool = true);
138     virtual bool isMouseFocusable() const { return false; }
139
140     StepActionHandler* m_stepActionHandler;
141     bool m_capturing;
142     UpDownState m_upDownState;
143     UpDownState m_pressStartingState;
144     Timer<SpinButtonElement> m_repeatingTimer;
145 };
146
147 #if ENABLE(INPUT_SPEECH)
148
149 class InputFieldSpeechButtonElement
150     : public HTMLDivElement,
151       public SpeechInputListener {
152 public:
153     enum SpeechInputState {
154         Idle,
155         Recording,
156         Recognizing,
157     };
158
159     static PassRefPtr<InputFieldSpeechButtonElement> create(Document*);
160     virtual ~InputFieldSpeechButtonElement();
161
162     virtual void detach();
163     virtual void defaultEventHandler(Event*);
164     virtual bool willRespondToMouseClickEvents();
165     virtual bool isInputFieldSpeechButtonElement() const { return true; }
166     SpeechInputState state() const { return m_state; }
167     void startSpeechInput();
168     void stopSpeechInput();
169
170     // SpeechInputListener methods.
171     void didCompleteRecording(int);
172     void didCompleteRecognition(int);
173     void setRecognitionResult(int, const SpeechInputResultArray&);
174
175 private:
176     InputFieldSpeechButtonElement(Document*);
177     SpeechInput* speechInput();
178     void setState(SpeechInputState state);
179     virtual const AtomicString& shadowPseudoId() const;
180     virtual bool isMouseFocusable() const { return false; }
181     virtual void attach();
182
183     bool m_capturing;
184     SpeechInputState m_state;
185     int m_listenerId;
186     SpeechInputResultArray m_results;
187 };
188
189 inline InputFieldSpeechButtonElement* toInputFieldSpeechButtonElement(Element* element)
190 {
191     ASSERT(!element || element->isInputFieldSpeechButtonElement());
192     return static_cast<InputFieldSpeechButtonElement*>(element);
193 }
194
195 #endif // ENABLE(INPUT_SPEECH)
196
197 } // namespace
198
199 #endif