]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/mediactrl.h
Support using GetTextExtent() with empty string to get descent in wxOSX.
[wxWidgets.git] / include / wx / mediactrl.h
index d9c9442a96ddc7173fa858270682eee0c43d891d..280b66c1d2ceb1fad0bcfaebb4dac43aad2da5ed 100644 (file)
 // ----------------------------------------------------------------------------
 // Pre-compiled header stuff
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // Pre-compiled header stuff
 // ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma interface "mediactrl.h"
-#endif
+
+#include "wx/defs.h"
 
 // ----------------------------------------------------------------------------
 // Compilation guard
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // Compilation guard
 // ----------------------------------------------------------------------------
+
 #if wxUSE_MEDIACTRL
 
 // ----------------------------------------------------------------------------
 #if wxUSE_MEDIACTRL
 
 // ----------------------------------------------------------------------------
@@ -55,9 +55,24 @@ enum wxMediaState
     wxMEDIASTATE_PLAYING
 };
 
     wxMEDIASTATE_PLAYING
 };
 
+enum wxMediaCtrlPlayerControls
+{
+    wxMEDIACTRLPLAYERCONTROLS_NONE           =   0,
+    //Step controls like fastforward, step one frame etc.
+    wxMEDIACTRLPLAYERCONTROLS_STEP           =   1 << 0,
+    //Volume controls like the speaker icon, volume slider, etc.
+    wxMEDIACTRLPLAYERCONTROLS_VOLUME         =   1 << 1,
+    wxMEDIACTRLPLAYERCONTROLS_DEFAULT        =
+                    wxMEDIACTRLPLAYERCONTROLS_STEP |
+                    wxMEDIACTRLPLAYERCONTROLS_VOLUME
+};
+
 #define wxMEDIABACKEND_DIRECTSHOW   wxT("wxAMMediaBackend")
 #define wxMEDIABACKEND_MCI          wxT("wxMCIMediaBackend")
 #define wxMEDIABACKEND_QUICKTIME    wxT("wxQTMediaBackend")
 #define wxMEDIABACKEND_DIRECTSHOW   wxT("wxAMMediaBackend")
 #define wxMEDIABACKEND_MCI          wxT("wxMCIMediaBackend")
 #define wxMEDIABACKEND_QUICKTIME    wxT("wxQTMediaBackend")
+#define wxMEDIABACKEND_GSTREAMER    wxT("wxGStreamerMediaBackend")
+#define wxMEDIABACKEND_REALPLAYER   wxT("wxRealPlayerMediaBackend")
+#define wxMEDIABACKEND_WMP10        wxT("wxWMP10MediaBackend")
 
 // ----------------------------------------------------------------------------
 //
 
 // ----------------------------------------------------------------------------
 //
@@ -73,8 +88,8 @@ public:
     //
     // Normal constructor, much the same as wxNotifyEvent
     // ------------------------------------------------------------------------
     //
     // Normal constructor, much the same as wxNotifyEvent
     // ------------------------------------------------------------------------
-    wxMediaEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
-        : wxNotifyEvent(commandType, id)
+    wxMediaEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
+        : wxNotifyEvent(commandType, winid)
     {                                       }
 
     // ------------------------------------------------------------------------
     {                                       }
 
     // ------------------------------------------------------------------------
@@ -109,55 +124,55 @@ public:
 class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl
 {
 public:
 class WXDLLIMPEXP_MEDIA wxMediaCtrl : public wxControl
 {
 public:
-    wxMediaCtrl() : m_imp(NULL), m_bLoaded(false), m_bLoop(false)
+    wxMediaCtrl() : m_imp(NULL), m_bLoaded(false)
     {                                                                   }
 
     {                                                                   }
 
-    wxMediaCtrl(wxWindow* parent, wxWindowID id,
-                const wxString& fileName = wxT(""),
+    wxMediaCtrl(wxWindow* parent, wxWindowID winid,
+                const wxString& fileName = wxEmptyString,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
-                const wxString& szBackend = wxT(""),
+                const wxString& szBackend = wxEmptyString,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxT("mediaCtrl"))
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxT("mediaCtrl"))
-                : m_imp(NULL), m_bLoaded(false), m_bLoop(false)
-    {   Create(parent, id, fileName, pos, size, style,
+                : m_imp(NULL), m_bLoaded(false)
+    {   Create(parent, winid, fileName, pos, size, style,
                szBackend, validator, name);                             }
 
                szBackend, validator, name);                             }
 
-    wxMediaCtrl(wxWindow* parent, wxWindowID id,
+    wxMediaCtrl(wxWindow* parent, wxWindowID winid,
                 const wxURI& location,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxURI& location,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
-                const wxString& szBackend = wxT(""),
+                const wxString& szBackend = wxEmptyString,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxT("mediaCtrl"))
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxT("mediaCtrl"))
-                : m_imp(NULL), m_bLoop(false)
-    {   Create(parent, id, location, pos, size, style,
+                : m_imp(NULL), m_bLoaded(false)
+    {   Create(parent, winid, location, pos, size, style,
                szBackend, validator, name);                             }
 
                szBackend, validator, name);                             }
 
-    ~wxMediaCtrl();
+    virtual ~wxMediaCtrl();
 
 
-    bool Create(wxWindow* parent, wxWindowID id,
-                const wxString& fileName = wxT(""),
+    bool Create(wxWindow* parent, wxWindowID winid,
+                const wxString& fileName = wxEmptyString,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
-                const wxString& szBackend = wxT(""),
+                const wxString& szBackend = wxEmptyString,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxT("mediaCtrl"));
 
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxT("mediaCtrl"));
 
-    bool Create(wxWindow* parent, wxWindowID id,
+    bool Create(wxWindow* parent, wxWindowID winid,
                 const wxURI& location,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxURI& location,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
-                const wxString& szBackend = wxT(""),
+                const wxString& szBackend = wxEmptyString,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxValidator& validator = wxDefaultValidator,
-                const wxString& name = wxT("mediaCtrl")); //DirectShow only
+                const wxString& name = wxT("mediaCtrl"));
 
 
-    bool DoCreate(wxClassInfo* instance,
-                wxWindow* parent, wxWindowID id,
+    bool DoCreate(const wxClassInfo* instance,
+                wxWindow* parent, wxWindowID winid,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
@@ -169,42 +184,66 @@ public:
     bool Stop();
 
     bool Load(const wxString& fileName);
     bool Stop();
 
     bool Load(const wxString& fileName);
-    bool Load(const wxURI& location); //DirectShow only
-
-    void Loop(bool bLoop = true);
-    bool IsLooped();
 
     wxMediaState GetState();
 
 
     wxMediaState GetState();
 
-    double GetPlaybackRate();           //All but MCI
-    bool SetPlaybackRate(double dRate); //All but MCI
-
     wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart);
     wxFileOffset Tell(); //FIXME: This should be const
     wxFileOffset Length(); //FIXME: This should be const
 
     wxFileOffset Seek(wxFileOffset where, wxSeekMode mode = wxFromStart);
     wxFileOffset Tell(); //FIXME: This should be const
     wxFileOffset Length(); //FIXME: This should be const
 
+    double GetPlaybackRate();           //All but MCI & GStreamer
+    bool SetPlaybackRate(double dRate); //All but MCI & GStreamer
+
+    bool Load(const wxURI& location);
+    bool Load(const wxURI& location, const wxURI& proxy);
+
+    wxFileOffset GetDownloadProgress(); // DirectShow only
+    wxFileOffset GetDownloadTotal();    // DirectShow only
+
+    double GetVolume();
+    bool   SetVolume(double dVolume);
+
+    bool    ShowPlayerControls(
+        wxMediaCtrlPlayerControls flags = wxMEDIACTRLPLAYERCONTROLS_DEFAULT);
+
+    //helpers for the wxPython people
+    bool LoadURI(const wxString& fileName)
+    {   return Load(wxURI(fileName));       }
+    bool LoadURIWithProxy(const wxString& fileName, const wxString& proxy)
+    {   return Load(wxURI(fileName), wxURI(proxy));       }
+
 protected:
 protected:
-    static wxClassInfo* NextBackend();
+    static const wxClassInfo* NextBackend(wxClassInfo::const_iterator* it);
 
     void OnMediaFinished(wxMediaEvent& evt);
     virtual void DoMoveWindow(int x, int y, int w, int h);
     wxSize DoGetBestSize() const;
 
 
     void OnMediaFinished(wxMediaEvent& evt);
     virtual void DoMoveWindow(int x, int y, int w, int h);
     wxSize DoGetBestSize() const;
 
-#ifdef __WXMAC__
-    friend class wxMediaBackend;
+    //FIXME:  This is nasty... find a better way to work around
+    //inheritance issues
+#if defined(__WXOSX_CARBON__)
+    virtual void MacVisibilityChanged();
+#endif
+#if defined(__WXOSX_CARBON__) || defined(__WXCOCOA__)
+    friend class wxQTMediaBackend;
 #endif
     class wxMediaBackend* m_imp;
     bool m_bLoaded;
 #endif
     class wxMediaBackend* m_imp;
     bool m_bLoaded;
-    bool m_bLoop;
 
 
-    DECLARE_DYNAMIC_CLASS(wxMediaCtrl);
+    DECLARE_DYNAMIC_CLASS(wxMediaCtrl)
 };
 
 // ----------------------------------------------------------------------------
 //
 // wxMediaBackend
 //
 };
 
 // ----------------------------------------------------------------------------
 //
 // wxMediaBackend
 //
-// Currently an internal class - API stability not guaranteed.
+// Derive from this and use standard wxWidgets RTTI
+// (DECLARE_DYNAMIC_CLASS and IMPLEMENT_CLASS) to make a backend
+// for wxMediaCtrl.  Backends are searched alphabetically -
+// the one with the earliest letter is tried first.
+//
+// Note that this is currently not API or ABI compatible -
+// so statically link or make the client compile on-site.
 //
 // ----------------------------------------------------------------------------
 
 //
 // ----------------------------------------------------------------------------
 
@@ -218,7 +257,7 @@ public:
 
     virtual bool CreateControl(wxControl* WXUNUSED(ctrl),
                                wxWindow* WXUNUSED(parent),
 
     virtual bool CreateControl(wxControl* WXUNUSED(ctrl),
                                wxWindow* WXUNUSED(parent),
-                               wxWindowID WXUNUSED(id),
+                               wxWindowID WXUNUSED(winid),
                                const wxPoint& WXUNUSED(pos),
                                const wxSize& WXUNUSED(size),
                                long WXUNUSED(style),
                                const wxPoint& WXUNUSED(pos),
                                const wxSize& WXUNUSED(size),
                                long WXUNUSED(style),
@@ -259,31 +298,101 @@ public:
     virtual wxMediaState GetState()
     {   return wxMEDIASTATE_STOPPED;    }
 
     virtual wxMediaState GetState()
     {   return wxMEDIASTATE_STOPPED;    }
 
-#ifdef __WXMAC__
-    wxMacControl* GetControlPeer(wxControl* ctrl) 
-    {  return ((wxMediaCtrl*)ctrl)->m_peer;    }
-#endif
+    virtual double GetVolume()
+    {   return 0.0;                     }
+    virtual bool SetVolume(double WXUNUSED(dVolume))
+    {   return false;                   }
+
+    virtual bool Load(const wxURI& WXUNUSED(location),
+                      const wxURI& WXUNUSED(proxy))
+    {   return false;                   }
+
+    virtual bool   ShowPlayerControls(
+                    wxMediaCtrlPlayerControls WXUNUSED(flags))
+    {   return false;                   }
+    virtual bool   IsInterfaceShown()
+    {   return false;                   }
+
+    virtual wxLongLong GetDownloadProgress()
+    {    return 0;                      }
+    virtual wxLongLong GetDownloadTotal()
+    {    return 0;                      }
+
+    virtual void MacVisibilityChanged()
+    {                                   }
+    virtual void RESERVED9() {}
 
 
-    DECLARE_CLASS(wxMediaBackend)
+    DECLARE_DYNAMIC_CLASS(wxMediaBackend)
 };
 
 };
 
-//Event ID to give to our events
-#define wxMEDIA_FINISHED_ID    13000
-#define wxMEDIA_STOP_ID    13001
 
 
-//Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
-DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID)
-DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STOP,     wxMEDIA_STOP_ID)
+//Our events
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_FINISHED, wxMediaEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STOP, wxMediaEvent );
 
 //Function type(s) our events need
 typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&);
 
 
 //Function type(s) our events need
 typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&);
 
+#define wxMediaEventHandler(func) \
+    wxEVENT_HANDLER_CAST(wxMediaEventFunction, func)
+
 //Macro for usage with message maps
 //Macro for usage with message maps
-#define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxMediaEventFunction) & fn, (wxObject *) NULL ),
-#define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxMediaEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_MEDIA_FINISHED(winid, fn)   wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ),
+#define EVT_MEDIA_STOP(winid, fn)       wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ),
+
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_LOADED, wxMediaEvent );
+#define EVT_MEDIA_LOADED(winid, fn)     wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_LOADED, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ),
+
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_STATECHANGED, wxMediaEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PLAY, wxMediaEvent );
+wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_MEDIA, wxEVT_MEDIA_PAUSE, wxMediaEvent );
+#define EVT_MEDIA_STATECHANGED(winid, fn)   wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STATECHANGED, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ),
+#define EVT_MEDIA_PLAY(winid, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PLAY, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ),
+#define EVT_MEDIA_PAUSE(winid, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_PAUSE, winid, wxID_ANY, wxMediaEventHandler(fn), NULL ),
+
+// ----------------------------------------------------------------------------
+// common backend base class used by many other backends
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_MEDIA wxMediaBackendCommonBase : public wxMediaBackend
+{
+public:
+    // add a pending wxMediaEvent of the given type
+    void QueueEvent(wxEventType evtType);
+
+    // notify that the movie playback is finished
+    void QueueFinishEvent()
+    {
+        QueueEvent(wxEVT_MEDIA_STATECHANGED);
+        QueueEvent(wxEVT_MEDIA_FINISHED);
+    }
+
+    // send the stop event and return true if it hasn't been vetoed
+    bool SendStopEvent();
+
+    // Queue pause event
+    void QueuePlayEvent();
+
+    // Queue pause event
+    void QueuePauseEvent();
+
+    // Queue stop event (no veto)
+    void QueueStopEvent();
+
+protected:
+    // call this when the movie size has changed but not because it has just
+    // been loaded (in this case, call NotifyMovieLoaded() below)
+    void NotifyMovieSizeChanged();
+
+    // call this when the movie is fully loaded
+    void NotifyMovieLoaded();
+
+
+    wxMediaCtrl *m_ctrl;      // parent control
+};
 
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
-// End compilation gaurd
+// End compilation guard
 // ----------------------------------------------------------------------------
 #endif // wxUSE_MEDIACTRL
 
 // ----------------------------------------------------------------------------
 #endif // wxUSE_MEDIACTRL