2009-08-25 Eric Carlson <eric.carlson@apple.com>
[WebKit-https.git] / WebCore / rendering / MediaControlElements.h
1 /*
2  * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef MediaControlElements_h
30 #define MediaControlElements_h
31
32 #if ENABLE(VIDEO)
33
34 #include "HTMLDivElement.h"
35 #include "HTMLInputElement.h"
36 #include "HTMLMediaElement.h"
37 #include "RenderBlock.h"
38
39 // These are the shadow elements used in RenderMedia
40
41 namespace WebCore {
42
43 class Event;
44 class Frame;
45
46 // Must match WebKitSystemInterface.h
47 enum MediaControlElementType {
48     MediaFullscreenButton = 0,
49     MediaMuteButton,
50     MediaPlayButton,
51     MediaSeekBackButton,
52     MediaSeekForwardButton,
53     MediaSlider,
54     MediaSliderThumb,
55     MediaRewindButton,
56     MediaReturnToRealtimeButton,
57     MediaUnMuteButton,
58     MediaPauseButton,
59     MediaTimelineContainer,
60     MediaCurrentTimeDisplay,
61     MediaTimeRemainingDisplay,
62     MediaStatusDisplay,
63     MediaControlsPanel,
64     MediaVolumeSliderContainer,
65     MediaVolumeSlider,
66     MediaVolumeSliderThumb
67 };
68
69 class MediaControlShadowRootElement : public HTMLDivElement {
70 public:
71     MediaControlShadowRootElement(Document*, HTMLMediaElement*);
72     
73     virtual bool isShadowNode() const { return true; }
74     virtual Node* shadowParentNode() { return m_mediaElement; }
75
76     void updateStyle();
77     
78 private:
79     HTMLMediaElement* m_mediaElement;    
80 };
81
82 // ----------------------------
83
84 class MediaControlElement : public HTMLDivElement {
85 public:
86     MediaControlElement(Document*, PseudoId, HTMLMediaElement*);
87     virtual void attach();
88     virtual bool rendererIsNeeded(RenderStyle*);
89
90     virtual PassRefPtr<RenderStyle> styleForElement();
91     void attachToParent(Element*);
92     void update();
93     virtual void updateStyle();
94
95     MediaControlElementType displayType() const { return m_displayType; }
96
97     HTMLMediaElement* mediaElement() const { return m_mediaElement; }
98     virtual bool isMediaControlElement() const { return true; }
99
100 protected:
101     HTMLMediaElement* m_mediaElement;   
102     PseudoId m_pseudoStyleId;
103     MediaControlElementType m_displayType;  // some elements can show multiple types (e.g. play/pause)
104 };
105
106 // ----------------------------
107
108 class MediaControlTimelineContainerElement : public MediaControlElement {
109 public:
110     MediaControlTimelineContainerElement(Document*, HTMLMediaElement*);
111     virtual bool rendererIsNeeded(RenderStyle*);
112 };
113
114 // ----------------------------
115
116 class MediaControlVolumeSliderContainerElement : public MediaControlElement {
117 public:
118     MediaControlVolumeSliderContainerElement(Document*, HTMLMediaElement*);
119     virtual PassRefPtr<RenderStyle> styleForElement();
120     void setVisible(bool);
121     bool isVisible() { return m_isVisible; }
122     void setPosition(int x, int y);
123     bool hitTest(const IntPoint& absPoint);
124
125 private:
126     bool m_isVisible;
127     int m_x, m_y;
128 };
129
130 // ----------------------------
131
132 class MediaControlStatusDisplayElement : public MediaControlElement {
133 public:
134     MediaControlStatusDisplayElement(Document*, HTMLMediaElement*);
135     virtual void update();
136     virtual bool rendererIsNeeded(RenderStyle*);
137 private:
138     enum StateBeingDisplayed { Nothing, Loading, LiveBroadcast };
139     StateBeingDisplayed m_stateBeingDisplayed;
140 };
141
142 // ----------------------------
143
144 class MediaControlInputElement : public HTMLInputElement {
145 public:
146     MediaControlInputElement(Document*, PseudoId, const String& type, HTMLMediaElement*);
147     virtual void attach();
148     virtual bool rendererIsNeeded(RenderStyle*);
149
150     virtual PassRefPtr<RenderStyle> styleForElement();
151     void attachToParent(Element*);
152     void update();
153     void updateStyle();
154
155     bool hitTest(const IntPoint& absPoint);
156     MediaControlElementType displayType() const { return m_displayType; }
157
158     // Some elements are disabled by movie state (eg. mute if no audio).
159     virtual bool disabled() const  { return false; }
160
161     HTMLMediaElement* mediaElement() const { return m_mediaElement; }
162     virtual bool isMediaControlElement() const { return true; }
163
164 protected:
165     virtual void updateDisplayType() { }
166     void setDisplayType(MediaControlElementType);
167
168     HTMLMediaElement* m_mediaElement;   
169     PseudoId m_pseudoStyleId;
170     MediaControlElementType m_displayType;
171 };
172
173 // ----------------------------
174
175 class MediaControlMuteButtonElement : public MediaControlInputElement {
176 public:
177     MediaControlMuteButtonElement(Document*, HTMLMediaElement*);
178     virtual void defaultEventHandler(Event*);
179     virtual void updateDisplayType();
180     virtual bool disabled() const;
181     virtual bool rendererIsNeeded(RenderStyle*);
182 };
183
184 // ----------------------------
185
186 class MediaControlPlayButtonElement : public MediaControlInputElement {
187 public:
188     MediaControlPlayButtonElement(Document*, HTMLMediaElement*);
189     virtual void defaultEventHandler(Event*);
190     virtual void updateDisplayType();
191 };
192
193 // ----------------------------
194
195 class MediaControlSeekButtonElement : public MediaControlInputElement {
196 public:
197     MediaControlSeekButtonElement(Document*, HTMLMediaElement*, bool forward);
198     virtual void defaultEventHandler(Event*);
199     virtual void detach();
200     void seekTimerFired(Timer<MediaControlSeekButtonElement>*);
201
202 private:
203     bool m_forward;
204     bool m_seeking;
205     bool m_capturing;
206     Timer<MediaControlSeekButtonElement> m_seekTimer;
207 };
208     
209 // ----------------------------
210
211 class MediaControlRewindButtonElement : public MediaControlInputElement {
212 public:
213     MediaControlRewindButtonElement(Document*, HTMLMediaElement*);
214     virtual void defaultEventHandler(Event*);
215     virtual bool rendererIsNeeded(RenderStyle*);
216 };
217
218 // ----------------------------
219
220 class MediaControlReturnToRealtimeButtonElement : public MediaControlInputElement {
221 public:
222     MediaControlReturnToRealtimeButtonElement(Document*, HTMLMediaElement*);
223     virtual void defaultEventHandler(Event*);
224     virtual bool rendererIsNeeded(RenderStyle*);
225 };    
226
227 // ----------------------------
228
229 class MediaControlTimelineElement : public MediaControlInputElement {
230 public:
231     MediaControlTimelineElement(Document*, HTMLMediaElement*);
232     virtual void defaultEventHandler(Event*);
233     void update(bool updateDuration = true);
234 };
235
236 // ----------------------------
237
238 class MediaControlVolumeSliderElement : public MediaControlInputElement {
239 public:
240     MediaControlVolumeSliderElement(Document*, HTMLMediaElement*);
241     virtual void defaultEventHandler(Event*);
242 };
243
244 // ----------------------------
245
246 class MediaControlFullscreenButtonElement : public MediaControlInputElement {
247 public:
248     MediaControlFullscreenButtonElement(Document*, HTMLMediaElement*);
249     virtual void defaultEventHandler(Event*);
250     virtual bool rendererIsNeeded(RenderStyle*);
251 };
252
253 // ----------------------------
254
255 class MediaControlTimeDisplayElement : public MediaControlElement {
256 public:
257     MediaControlTimeDisplayElement(Document*, PseudoId, HTMLMediaElement*);
258     void setVisible(bool);
259     virtual PassRefPtr<RenderStyle> styleForElement();
260
261     void setCurrentValue(float);
262     float currentValue() const { return m_currentValue; }
263
264 private:
265     String formatTime(float time);
266
267     float m_currentValue;
268     bool m_isVisible;
269 };
270
271 // ----------------------------
272
273 class RenderMediaControlShadowRoot : public RenderBlock {
274 public:
275     RenderMediaControlShadowRoot(Element* e) : RenderBlock(e) { }
276     void setParent(RenderObject* p) { RenderObject::setParent(p); }
277 };
278     
279 // ----------------------------
280
281
282 } //namespace WebCore
283 #endif // enable(video)
284 #endif // MediaControlElements_h