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(HTMLElement* shadowParent); 42 virtual void detach(); 43 44 void attachInnerElement(Node*, PassRefPtr<RenderStyle>, RenderArena*); 45 46 protected: 47 TextControlInnerElement(Document*, HTMLElement* shadowParent = 0); 48 49 private: 50 virtual bool isMouseFocusable() const { return false; } 51 }; 52 53 class TextControlInnerTextElement : public TextControlInnerElement { 54 public: 55 static PassRefPtr<TextControlInnerTextElement> create(Document*, HTMLElement* shadowParent); 56 57 virtual void defaultEventHandler(Event*); 58 59 private: 60 TextControlInnerTextElement(Document*, HTMLElement* shadowParent); 61 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 62 }; 63 64 class SearchFieldResultsButtonElement : public TextControlInnerElement { 65 public: 66 static PassRefPtr<SearchFieldResultsButtonElement> create(Document*); 67 68 virtual void defaultEventHandler(Event*); 69 70 private: 71 SearchFieldResultsButtonElement(Document*); 72 }; 73 74 class SearchFieldCancelButtonElement : public TextControlInnerElement { 75 public: 76 static PassRefPtr<SearchFieldCancelButtonElement> create(Document*); 77 78 virtual void defaultEventHandler(Event*); 79 80 private: 81 SearchFieldCancelButtonElement(Document*); 82 83 virtual void detach(); 84 85 bool m_capturing; 86 }; 87 88 class SpinButtonElement : public TextControlInnerElement { 89 public: 90 enum UpDownState { 91 Indeterminate, // Hovered, but the event is not handled. 92 Down, 93 Up, 94 }; 95 96 static PassRefPtr<SpinButtonElement> create(HTMLElement*); 97 UpDownState upDownState() const { return m_upDownState; } 98 99 private: 100 SpinButtonElement(HTMLElement*); 101 102 virtual void detach(); 103 virtual bool isSpinButtonElement() const { return true; } 104 virtual bool isEnabledFormControl() const { return static_cast<Element*>(shadowAncestorNode())->isEnabledFormControl(); } 105 virtual bool isReadOnlyFormControl() const { return static_cast<Element*>(shadowAncestorNode())->isReadOnlyFormControl(); } 106 virtual void defaultEventHandler(Event*); 107 void startRepeatingTimer(); 108 void stopRepeatingTimer(); 109 void repeatingTimerFired(Timer<SpinButtonElement>*); 110 virtual void setHovered(bool = true); 111 112 bool m_capturing; 113 UpDownState m_upDownState; 114 UpDownState m_pressStartingState; 115 Timer<SpinButtonElement> m_repeatingTimer; 116 }; 117 118 #if ENABLE(INPUT_SPEECH) 119 120 class InputFieldSpeechButtonElement 121 : public TextControlInnerElement, 122 public SpeechInputListener { 123 public: 124 enum SpeechInputState { 125 Idle, 126 Recording, 127 Recognizing, 128 }; 129 130 static PassRefPtr<InputFieldSpeechButtonElement> create(HTMLElement*); 131 virtual ~InputFieldSpeechButtonElement(); 132 133 virtual void detach(); 134 virtual void defaultEventHandler(Event*); 135 virtual bool isInputFieldSpeechButtonElement() const { return true; } 136 SpeechInputState state() const { return m_state; } 137 138 // SpeechInputListener methods. 139 void didCompleteRecording(int); 140 void didCompleteRecognition(int); 141 void setRecognitionResult(int, const SpeechInputResultArray&); 142 143 private: 144 InputFieldSpeechButtonElement(HTMLElement*); 145 SpeechInput* speechInput(); 146 void setState(SpeechInputState state); 147 148 bool m_capturing; 149 SpeechInputState m_state; 150 int m_listenerId; 151 SpeechInputResultArray m_results; 152 }; 153 154 inline InputFieldSpeechButtonElement* toInputFieldSpeechButtonElement(Element* element) 155 { 156 ASSERT(!element || element->isInputFieldSpeechButtonElement()); 157 return static_cast<InputFieldSpeechButtonElement*>(element); 158 } 159 160 #endif // ENABLE(INPUT_SPEECH) 161 162 } // namespace 163 164 #endif 165