]>
git.saurik.com Git - wxWidgets.git/blob - src/common/mediactrlcmn.cpp
1955ac10ced1a4d3569942b362526d8427dcd842
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: common/mediactrl.cpp
3 // Purpose: wxMediaCtrl common code
4 // Author: Ryan Norton <wxprojects@comcast.net>
8 // Copyright: (c) Ryan Norton
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 //===========================================================================
14 //===========================================================================
16 //---------------------------------------------------------------------------
17 // Pre-compiled header stuff
18 //---------------------------------------------------------------------------
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation "mediactrl.h"
24 #include "wx/wxprec.h"
30 //---------------------------------------------------------------------------
32 //---------------------------------------------------------------------------
33 #include "wx/mediactrl.h"
36 //---------------------------------------------------------------------------
38 //---------------------------------------------------------------------------
41 //===========================================================================
45 //===========================================================================
47 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
48 // RTTI and Event implementations
49 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51 IMPLEMENT_CLASS(wxMediaCtrl
, wxControl
);
52 IMPLEMENT_CLASS(wxMediaBackend
, wxObject
);
53 IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent
, wxEvent
);
54 DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED
);
55 DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP
);
57 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
61 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
63 //---------------------------------------------------------------------------
64 // wxMediaCtrl::Create (file version)
65 // wxMediaCtrl::Create (URL version)
67 // Searches for a backend that is installed on the system (backends
68 // starting with lower characters in the alphabet are given priority),
69 // and creates the control from it
71 // This searches by searching the global RTTI hashtable, class by class,
72 // attempting to call CreateControl on each one found that is a derivative
73 // of wxMediaBackend - if it succeeded Create returns true, otherwise
74 // it keeps iterating through the hashmap.
75 //---------------------------------------------------------------------------
76 bool wxMediaCtrl::Create(wxWindow
* parent
, wxWindowID id
,
77 const wxString
& fileName
,
81 const wxString
& szBackend
,
82 const wxValidator
& validator
,
85 if(!szBackend
.empty())
87 if(!DoCreate(wxClassInfo::FindClass(szBackend
), parent
, id
,
88 pos
, size
, style
, validator
, name
))
94 if (!fileName
.empty())
104 SetBestFittingSize(size
);
109 wxClassInfo::sm_classTable
->BeginFind();
111 wxClassInfo
* classInfo
= NextBackend();
115 if(!DoCreate(classInfo
, parent
, id
,
116 pos
, size
, style
, validator
, name
))
119 if (!fileName
.empty())
123 SetBestFittingSize(size
);
131 SetBestFittingSize(size
);
135 classInfo
= NextBackend();
143 bool wxMediaCtrl::Create(wxWindow
* parent
, wxWindowID id
,
144 const wxURI
& location
,
148 const wxString
& szBackend
,
149 const wxValidator
& validator
,
150 const wxString
& name
)
152 if(!szBackend
.empty())
154 if(!DoCreate(wxClassInfo::FindClass(szBackend
), parent
, id
,
155 pos
, size
, style
, validator
, name
))
168 SetBestFittingSize(size
);
173 wxClassInfo::sm_classTable
->BeginFind();
175 wxClassInfo
* classInfo
= NextBackend();
179 if(!DoCreate(classInfo
, parent
, id
,
180 pos
, size
, style
, validator
, name
))
185 SetBestFittingSize(size
);
191 classInfo
= NextBackend();
199 //---------------------------------------------------------------------------
200 // wxMediaCtrl::DoCreate
202 // Attempts to create the control from a backend
203 //---------------------------------------------------------------------------
204 bool wxMediaCtrl::DoCreate(wxClassInfo
* classInfo
,
205 wxWindow
* parent
, wxWindowID id
,
209 const wxValidator
& validator
,
210 const wxString
& name
)
212 m_imp
= (wxMediaBackend
*)classInfo
->CreateObject();
214 if( m_imp
->CreateControl(this, parent
, id
, pos
, size
,
215 style
, validator
, name
) )
224 //---------------------------------------------------------------------------
225 // wxMediaCtrl::NextBackend
228 // Search through the RTTI hashmap one at a
229 // time, attempting to create each derivative
233 // STL isn't compatable with and will have a compilation error
234 // on a wxNode, however, wxHashTable::compatibility_iterator is
235 // incompatible with the old 2.4 stable version - but since
236 // we're in 2.5 only we don't need to worry about this
238 //---------------------------------------------------------------------------
239 wxClassInfo
* wxMediaCtrl::NextBackend()
241 wxHashTable::compatibility_iterator
242 node
= wxClassInfo::sm_classTable
->Next();
245 wxClassInfo
* classInfo
= (wxClassInfo
*)node
->GetData();
246 if ( classInfo
->IsKindOf(CLASSINFO(wxMediaBackend
)) &&
247 classInfo
!= CLASSINFO(wxMediaBackend
) )
251 node
= wxClassInfo::sm_classTable
->Next();
255 // Nope - couldn't successfully find one... fail
261 //---------------------------------------------------------------------------
262 // wxMediaCtrl Destructor
264 // Free up the backend if it exists
265 //---------------------------------------------------------------------------
266 wxMediaCtrl::~wxMediaCtrl()
272 //---------------------------------------------------------------------------
273 // wxMediaCtrl::Load (file version)
274 // wxMediaCtrl::Load (URL version)
276 // Here we call load of the backend - keeping
277 // track of whether it was successful or not - which
278 // will determine which later method calls work
279 //---------------------------------------------------------------------------
280 bool wxMediaCtrl::Load(const wxString
& fileName
)
283 return (m_bLoaded
= m_imp
->Load(fileName
));
287 bool wxMediaCtrl::Load(const wxURI
& location
)
290 return (m_bLoaded
= m_imp
->Load(location
));
294 //---------------------------------------------------------------------------
296 // wxMediaCtrl::Pause
298 // wxMediaCtrl::GetPlaybackRate
299 // wxMediaCtrl::SetPlaybackRate
300 // wxMediaCtrl::Seek --> SetPosition
301 // wxMediaCtrl::Tell --> GetPosition
302 // wxMediaCtrl::Length --> GetDuration
303 // wxMediaCtrl::GetState
304 // wxMediaCtrl::DoGetBestSize
306 // 1) Check to see whether the backend exists and is loading
307 // 2) Call the backend's version of the method, returning success
308 // if the backend's version succeeds
309 //---------------------------------------------------------------------------
310 bool wxMediaCtrl::Play()
312 if(m_imp
&& m_bLoaded
)
313 return m_imp
->Play();
317 bool wxMediaCtrl::Pause()
319 if(m_imp
&& m_bLoaded
)
320 return m_imp
->Pause();
324 bool wxMediaCtrl::Stop()
326 if(m_imp
&& m_bLoaded
)
327 return m_imp
->Stop();
331 double wxMediaCtrl::GetPlaybackRate()
333 if(m_imp
&& m_bLoaded
)
334 return m_imp
->GetPlaybackRate();
338 bool wxMediaCtrl::SetPlaybackRate(double dRate
)
340 if(m_imp
&& m_bLoaded
)
341 return m_imp
->SetPlaybackRate(dRate
);
345 wxFileOffset
wxMediaCtrl::Seek(wxFileOffset where
, wxSeekMode mode
)
355 offset
= Length() - where
;
357 // case wxFromCurrent:
359 offset
= Tell() + where
;
363 if(m_imp
&& m_bLoaded
&& m_imp
->SetPosition(offset
))
365 return wxInvalidOffset
;
368 wxFileOffset
wxMediaCtrl::Tell()
371 if(m_imp
&& m_bLoaded
)
372 return (wxFileOffset
) m_imp
->GetPosition().ToLong();
373 return wxInvalidOffset
;
376 wxFileOffset
wxMediaCtrl::Length()
379 if(m_imp
&& m_bLoaded
)
380 return (wxFileOffset
) m_imp
->GetDuration().ToLong();
381 return wxInvalidOffset
;
384 wxMediaState
wxMediaCtrl::GetState()
386 if(m_imp
&& m_bLoaded
)
387 return m_imp
->GetState();
388 return wxMEDIASTATE_STOPPED
;
391 wxSize
wxMediaCtrl::DoGetBestSize() const
394 return m_imp
->GetVideoSize();
398 //---------------------------------------------------------------------------
399 // wxMediaCtrl::DoMoveWindow
401 // 1) Call parent's version so that our control's window moves where
403 // 2) If the backend exists and is loaded, move the video
404 // of the media to where our control's window is now located
405 //---------------------------------------------------------------------------
406 void wxMediaCtrl::DoMoveWindow(int x
, int y
, int w
, int h
)
408 wxControl::DoMoveWindow(x
,y
,w
,h
);
411 m_imp
->Move(x
, y
, w
, h
);
414 //DARWIN gcc compiler badly screwed up - needs destructor impl in source
415 wxMediaBackend::~wxMediaBackend()
417 #include "wx/html/forcelnk.h"
418 FORCE_LINK(basewxmediabackends
);
420 //---------------------------------------------------------------------------
421 // End of compilation guard and of file
422 //---------------------------------------------------------------------------
423 #endif //wxUSE_MEDIACTRL