]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/mediactrl.cpp
added test for wxScopeGuard
[wxWidgets.git] / src / mac / carbon / mediactrl.cpp
index 497cb3cc81a901f121f37f9463bff5f0a5a24f67..7bfdb8b1fbc3324e224b4b0673e1c94542900eab 100644 (file)
 // control - i.e. native positioning and event handling etc..
 //---------------------------------------------------------------------------
 #ifndef wxUSE_CREATEMOVIECONTROL
-#      if defined( __WXMAC_OSX__ ) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 )
-#              define wxUSE_CREATEMOVIECONTROL 1
-#      else
-#              define wxUSE_CREATEMOVIECONTROL 0
-#      endif
+#    if defined( __WXMAC_OSX__ ) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 )
+#        define wxUSE_CREATEMOVIECONTROL 1
+#    else
+#        define wxUSE_CREATEMOVIECONTROL 0
+#    endif
 #endif
 
 //===========================================================================
@@ -87,11 +87,11 @@ public:
     wxQTMediaBackend();
     ~wxQTMediaBackend();
 
-    virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, 
+    virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
                                      wxWindowID id,
-                                     const wxPoint& pos, 
+                                     const wxPoint& pos,
                                      const wxSize& size,
-                                     long style, 
+                                     long style,
                                      const wxValidator& validator,
                                      const wxString& name);
 
@@ -118,19 +118,23 @@ public:
     void FinishLoad();
 
     wxSize m_bestSize;              //Original movie size
+#ifdef __WXMAC_OSX__
     struct MovieType** m_movie;     //QT Movie handle/instance
+#else
+    Movie m_movie ;
+#endif
     wxControl* m_ctrl;              //Parent control
     bool m_bVideo;                  //Whether or not we have video
     class _wxQTTimer* m_timer;      //Timer for streaming the movie
 
-    DECLARE_DYNAMIC_CLASS(wxQTMediaBackend);
+    DECLARE_DYNAMIC_CLASS(wxQTMediaBackend)
 };
 
 
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //
 // wxQTMediaBackend
-// 
+//
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 IMPLEMENT_DYNAMIC_CLASS(wxQTMediaBackend, wxMediaBackend);
@@ -169,10 +173,10 @@ public:
         if (!m_bPaused)
         {
             if(!IsMovieDone(m_movie))
-                MoviesTask(m_movie, MOVIE_DELAY); 
+                MoviesTask(m_movie, MOVIE_DELAY);
             else
             {
-                wxMediaEvent theEvent(wxEVT_MEDIA_STOP, 
+                wxMediaEvent theEvent(wxEVT_MEDIA_STOP,
                                       m_parent->m_ctrl->GetId());
                 m_parent->m_ctrl->ProcessEvent(theEvent);
 
@@ -183,7 +187,7 @@ public:
                     wxASSERT(::GetMoviesError() == noErr);
 
                     //send the event to our child
-                    wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED, 
+                    wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED,
                                           m_parent->m_ctrl->GetId());
                     m_parent->m_ctrl->ProcessEvent(theEvent);
                 }
@@ -220,7 +224,7 @@ wxQTMediaBackend::~wxQTMediaBackend()
     if(m_timer)
         Cleanup();
 
-    //Note that ExitMovies() is not neccessary...
+    //Note that ExitMovies() is not necessary...
     ExitMovies();
 }
 
@@ -230,16 +234,16 @@ wxQTMediaBackend::~wxQTMediaBackend()
 // 1) Intializes QuickTime
 // 2) Creates the control window
 //---------------------------------------------------------------------------
-bool wxQTMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent, 
+bool wxQTMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
                                      wxWindowID id,
-                                     const wxPoint& pos, 
+                                     const wxPoint& pos,
                                      const wxSize& size,
-                                     long style, 
+                                     long style,
                                      const wxValidator& validator,
                                      const wxString& name)
 {
     //Don't bother in Native control mode
-#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_2 )    
+#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_2 )
     if (!_wxIsQuickTime4Installed())
         return false;
 #endif
@@ -255,19 +259,23 @@ bool wxQTMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
     // backends, we don't need wxCLIP_CHILDREN
     //
     if ( !
-    
-#if wxUSE_CREATEMOVIECONTROL    
-    ctrl->wxControl::Create(parent, id, pos, size,
-                            m_ctrl->MacRemoveBordersFromStyle(style),
-                            validator, name)
-#else
+
+#if wxUSE_CREATEMOVIECONTROL
     ctrl->wxWindow::Create(parent, id, pos, size,
-                            m_ctrl->MacRemoveBordersFromStyle(style),
+                            wxWindow::MacRemoveBordersFromStyle(style),
                             name)
-#endif                            
+#else
+    ctrl->wxControl::Create(parent, id, pos, size,
+                            wxWindow::MacRemoveBordersFromStyle(style),
+                            validator, name)
+#endif
         )
         return false;
 
+#if wxUSE_VALIDATORS
+        ctrl->SetValidator(validator);
+#endif
+
     m_ctrl = ctrl;
     return true;
 }
@@ -289,9 +297,15 @@ bool wxQTMediaBackend::Load(const wxString& fileName)
     OSErr err = noErr;
     short movieResFile;
     FSSpec sfFile;
-    
+
+    //FIXME:wxMacFilename2FSSpec crashes on empty string -
+    //does it crash on other strings too and should this
+    //"fix" be put in the carbon wxSound?
+    if (fileName.empty())
+        return false;
+
     wxMacFilename2FSSpec( fileName , &sfFile );
-    
+
     if (OpenMovieFile (&sfFile, &movieResFile, fsRdPerm) != noErr)
         return false;
 
@@ -342,8 +356,8 @@ bool wxQTMediaBackend::Load(const wxURI& location)
     BlockMove(theURI.mb_str(), *theHandle, theURI.length() + 1);
 
     //create the movie from the handle that refers to the URI
-    err = NewMovieFromDataRef(&m_movie, newMovieActive, 
-                                NULL, theHandle, 
+    err = NewMovieFromDataRef(&m_movie, newMovieActive,
+                                NULL, theHandle,
                                 URLDataHandlerSubType);
 
     DisposeHandle(theHandle);
@@ -391,19 +405,26 @@ void wxQTMediaBackend::FinishLoad()
     m_bestSize.y = outRect.bottom - outRect.top;
 
     //reparent movie/*AudioMediaCharacteristic*/
-    if(GetMovieIndTrackType(m_movie, 1, 
-                            VisualMediaCharacteristic, 
-                            movieTrackCharacteristic | 
+    if(GetMovieIndTrackType(m_movie, 1,
+                            VisualMediaCharacteristic,
+                            movieTrackCharacteristic |
                                 movieTrackEnabledOnly) != NULL)
-    {        
-#if wxUSE_CREATEMOVIECONTROL    
+    {
+#if wxUSE_CREATEMOVIECONTROL
     //
     //Native CreateMovieControl QT control (Thanks to Kevin Olliver's
     //wxQTMovie for some of this).
     //
-        Rect bounds = wxMacGetBoundsForControl(m_ctrl, 
+    #define GetControlPeer(whatever) ctrl->m_peer
+    wxMediaCtrl* ctrl = (wxMediaCtrl*) m_ctrl;
+        Rect bounds = wxMacGetBoundsForControl(m_ctrl,
                                                m_ctrl->GetPosition(),
                                                m_ctrl->GetSize());
+
+    //Dispose of old control for new one
+    if (GetControlPeer(m_ctrl) && GetControlPeer(m_ctrl)->Ok() )
+        GetControlPeer(m_ctrl)->Dispose();
+
     //Options-
     //kMovieControlOptionXXX
     //HideController - hide the movie controller
@@ -412,30 +433,29 @@ void wxQTMediaBackend::FinishLoad()
     //HandleEditingHI- Installs event stuff for edit menu - forces EnableEditing also
     //SetKeysEnabled - Allows keyboard input
     //ManuallyIdled - app handles movie idling rather than internal timer event loop
-        ::CreateMovieControl( 
+        ::CreateMovieControl(
                     (WindowRef)
-                       m_ctrl->MacGetTopLevelWindowRef(),      //parent
-                       &bounds,                                                        //control bounds
-                       m_movie,                                                                //movie handle
-                       kMovieControlOptionHideController 
-                       | kMovieControlOptionLocateTopLeft  
-                       | kMovieControlOptionSetKeysEnabled 
+                       ctrl->MacGetTopLevelWindowRef(), //parent
+                       &bounds,                         //control bounds
+                       m_movie,                         //movie handle
+                       kMovieControlOptionHideController
+                       | kMovieControlOptionLocateTopLeft
+                       | kMovieControlOptionSetKeysEnabled
 //                       | kMovieControlOptionManuallyIdled
-                       ,                                                                       //flags
-                       GetControlPeer(m_ctrl)->GetControlRefAddr() );
-                       
-        ::EmbedControl(GetControlPeer(m_ctrl)->GetControlRef(), 
-                       (ControlRef) m_ctrl->GetParent()->GetHandle());
+                       ,                                //flags
+                       ctrl->m_peer->GetControlRefAddr() );
+
+        ::EmbedControl(ctrl->m_peer->GetControlRef(), (ControlRef)ctrl->GetParent()->GetHandle());
 #else
     //
     //"Emulation"
     //
-        SetMovieGWorld(m_movie, 
-                       (CGrafPtr) 
+        SetMovieGWorld(m_movie,
+                       (CGrafPtr)
                        GetWindowPort(
                        (WindowRef)
                        m_ctrl->MacGetTopLevelWindowRef()
-                       ), 
+                       ),
                        nil);
 #endif
     }
@@ -447,7 +467,7 @@ void wxQTMediaBackend::FinishLoad()
     //
     //Here, if the parent of the control has a sizer - we
     //tell it to recalculate the size of this control since
-    //the user opened a seperate media file
+    //the user opened a separate media file
     //
     m_ctrl->InvalidateBestSize();
     m_ctrl->GetParent()->Layout();
@@ -498,7 +518,7 @@ bool wxQTMediaBackend::Stop()
     ::StopMovie(m_movie);
     if(::GetMoviesError() != noErr)
         return false;
-    
+
     ::GoToBeginningOfMovie(m_movie);
     return ::GetMoviesError() == noErr;
 }
@@ -573,11 +593,11 @@ wxLongLong wxQTMediaBackend::GetDuration()
 //---------------------------------------------------------------------------
 wxMediaState wxQTMediaBackend::GetState()
 {
-    if ( !m_timer || (m_timer->IsRunning() == false && 
+    if ( !m_timer || (m_timer->IsRunning() == false &&
                       m_timer->GetPaused() == false) )
         return wxMEDIASTATE_STOPPED;
 
-    if( m_timer->IsRunning() == true )
+    if( m_timer->IsRunning() )
         return wxMEDIASTATE_PLAYING;
     else
         return wxMEDIASTATE_PAUSED;
@@ -593,9 +613,9 @@ void wxQTMediaBackend::Cleanup()
 {
     delete m_timer;
     m_timer = NULL;
-    
-#if wxUSE_CREATEMOVIECONTROL    
-    DisposeControl(GetControlPeer(m_ctrl)->GetControlRef());
+
+#if wxUSE_CREATEMOVIECONTROL
+    DisposeControl(((wxMediaCtrl*)m_ctrl)->m_peer->GetControlRef());
 #endif
 
     StopMovie(m_movie);
@@ -615,30 +635,39 @@ wxSize wxQTMediaBackend::GetVideoSize() const
 //---------------------------------------------------------------------------
 // wxQTMediaBackend::Move
 //
-// If not using a native 10.2 QT control performs some emulated window
-// movement stuff
+// We need to do this even when using native qt control because
+// CreateMovieControl is broken in this regard...
 //---------------------------------------------------------------------------
 void wxQTMediaBackend::Move(int x, int y, int w, int h)
 {
-#if !wxUSE_CREATEMOVIECONTROL    
+#if !wxUSE_CREATEMOVIECONTROL
     if(m_timer)
     {
         if ( m_ctrl )
         {
             m_ctrl->GetParent()->MacWindowToRootWindow(&x, &y);
         }
-        
+
         Rect theRect = {y, x, y+h, x+w};
 
         ::SetMovieBox(m_movie, &theRect);
         wxASSERT(::GetMoviesError() == noErr);
     }
+#else
+    if(m_timer && m_ctrl)
+    {
+        m_ctrl->GetParent()->MacWindowToRootWindow(&x, &y);
+
+        ::MoveControl( (ControlRef) m_ctrl->GetHandle(), x, y );
+        m_ctrl->GetParent()->Refresh();
+        m_ctrl->GetParent()->Update();
+    }
 #endif
 }
 
 
 //in source file that contains stuff you don't directly use
-#include <wx/html/forcelnk.h>
+#include "wx/html/forcelnk.h"
 FORCE_LINK_ME(basewxmediabackends);
 
 #endif //wxUSE_MEDIACTRL