|
|
// mediabar.h : Declaration of the CMediaBand
#ifndef __MEDIABAND_H_
#define __MEDIABAND_H_
#include "dpa.h"
#include "bands.h"
#include "player.h"
#include "mediautil.h"
#include "mbutil.h"
#include "mbBehave.h"
#include "iface.h"
#define ERROREXIT(hr) if(FAILED(hr)){hr = E_FAIL; goto done;}
enum { MW_PLAY = 0, MW_STOP, MW_BACK, MW_NEXT, MW_MUTE, MW_VOLUME, MW_OPTIONS, MW_POP, MW_SEEK, MW_NUMBER };
#define WM_MB_DEFERRED_NAVIGATE (WM_USER + 700) // lParam: hwnd of window sending this message (used for reflection)
class CMediaBand : public CToolBand, public IMediaBar, public IWinEventHandler, public INamespaceWalkCB, public IElementBehaviorFactory, public IBrowserBand, public IBandNavigate, public IMediaHost, public IDispatchImpl<DWebBrowserEvents2, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw>, public CMediaBarUtil { public: CMediaBand();
// IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void) { return CToolBand::AddRef(); }; STDMETHODIMP_(ULONG) Release(void) { return CToolBand::Release(); }; // IOleCommandTarget
STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
// IOleWindow
// (overriding CNSCBand implementation
STDMETHODIMP GetWindow(HWND *phwnd);
// IServiceProvider
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, VOID ** ppvObj);
// IInputObject
// (overriding CNSCBand/CToolBand's implementation)
STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg); STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg); STDMETHODIMP HasFocusIO();
// IDockingWindow
STDMETHODIMP ShowDW(BOOL fShow); STDMETHODIMP CloseDW(DWORD dwReserved); // IElementBehaviorFactory
STDMETHODIMP FindBehavior(BSTR bstrBehavior, BSTR bstrBehaviorUrl, IElementBehaviorSite* pSite, IElementBehavior** ppBehavior); // IBrowserBand
STDMETHOD(GetObjectBB)(THIS_ REFIID riid, LPVOID *ppv); STDMETHODIMP SetBrowserBandInfo(THIS_ DWORD dwMask, PBROWSERBANDINFO pbbi) { ASSERT(FALSE); return E_NOTIMPL; } STDMETHODIMP GetBrowserBandInfo(THIS_ DWORD dwMask, PBROWSERBANDINFO pbbi) { ASSERT(FALSE); return E_NOTIMPL; }
// IBandNavigate
STDMETHOD(Select)(LPCITEMIDLIST pidl);
// IMediaHost
STDMETHOD(getMediaPlayer)(IUnknown **ppPlayer); STDMETHOD(playURL)(BSTR bstrURL, BSTR bstrMIME); STDMETHOD(addProxy)(IUnknown *pProxy); STDMETHOD(removeProxy)(IUnknown *pProxy); // IMediaHost2
STDMETHOD(OnDisableUIChanged)(BOOL fDisabled);
// IObjectWithSite
STDMETHODIMP SetSite(IUnknown* punkSite);
// IWinEventHandler
STDMETHODIMP OnWinEvent(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plres); STDMETHODIMP IsWindowOwner(HWND hwnd);
// IMediaBar
STDMETHOD(Notify)(long lReason); STDMETHOD(OnMediaError)(int iErrCode); // IDeskBand
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD fViewMode, DESKBANDINFO* pdbi);
// IPersistStream
STDMETHODIMP GetClassID(CLSID *pClassID); STDMETHODIMP Load(IStream *pStm); STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty);
// IDispatch
STDMETHODIMP Invoke( /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS *pDispParams, /* [out] */ VARIANT *pVarResult, /* [out] */ EXCEPINFO *pExcepInfo, /* [out] */ UINT *puArgErr);
// INamespaceWalkCB
STDMETHODIMP FoundItem(IShellFolder *psf, LPCITEMIDLIST pidl); STDMETHODIMP EnterFolder(IShellFolder *psf, LPCITEMIDLIST pidl) { return S_OK; } STDMETHODIMP LeaveFolder(IShellFolder *psf, LPCITEMIDLIST pidl) { return S_OK; } STDMETHODIMP InitializeProgressDialog(LPWSTR *ppszTitle, LPWSTR *ppszCancel);
private: ~CMediaBand();
LRESULT _OnVolumeCustomDraw(LPNMCUSTOMDRAW pnm); LRESULT _OnSeekBarCustomDraw(LPNMCUSTOMDRAW pnm); BOOL EnsurePlayer(); BOOL CreatePlayer(); VOID DestroyPlayer();
STDMETHOD(_TogglePause)(); STDMETHOD(_PutUrl)(LPWSTR pstrUrl, LPWSTR pstrMime);
STDMETHOD(_EnumPlayItems)(VOID);
HRESULT CreateControls(); HRESULT CreateSeekBar(); HRESULT CreateVolumeControl(); HRESULT CreateParentPane(); HRESULT CreateLayoutPane();
HRESULT _NavigateMainWindow(LPCTSTR lpstrUrl, bool fSuppressFirstAutoPlay = false);
HRESULT InitPlayerPopup(); HWND GetBrowserWindow();
VOID _ResizeChildWindows(HWND hwnd, LONG width, LONG height, BOOL fRepaint); HRESULT _InitializeMediaUI(); VOID _ResizeVideo(LONG* lWidth, LONG* lHeight);
VOID AdjustLayout(LONG_PTR lWidth=0,LONG_PTR lHeight=0); VOID DrawBackground(HDC hdc, HWND hwnd);
LPTSTR GetUrlForStatusBarToolTip(); HRESULT _OpenInDefaultPlayer(BSTR bstrUrl); VOID _ShowAllWindows(BOOL fShow); HRESULT ShowPlayListMenu(HWND hwnd,RECTL* rc); HRESULT ShowGenericMenu(HWND hwnd, RECTL* rc); HRESULT HandleMenuTasks(INT iTask); VOID ComputeMinMax(MINMAXINFO *pMinMax); VOID DockMediaPlayer();
static INT_PTR CALLBACK s_PopupDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK s_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK s_LayoutWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK s_SeekWndSubClassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK s_VolumeWndSubClassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK s_PromptMimeDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT GetTrackTitle (BSTR* pbstrTitle); VOID GetToolbarSize(HWND hwndTB, SIZE* pSize);
float GetSeekPos() ; VOID SetSeekPos(float fPosition) ; HRESULT Seek(double dblProgress);
VOID SetStatusText(LPWSTR lpwStatusInfo); VOID ShowPlayingStatus(BOOL fInitial=FALSE);
VOID AdjustVideoHeight(BOOL fForceResize=FALSE); VOID TogglePlayPause(); VOID ToggleMute();
LONG GetLayoutHeight(LONG lWidth=0); LONG GetVideoHeight(LONG lWidth=0, BOOL fNewVideo=FALSE); LONG GetControlsHeight();
// Menu helpers
HRESULT AddToFavorites(BSTR bstrUrl, BSTR bstrTitle); HRESULT ResetMimePreferences(); BOOL PromptSettings(UINT IDPROMPT); // Handler for property change notifications
VOID _OnTitleChange();
// Navigation timeout helpers
VOID _OnNavigationTimeOut(); VOID _UpdateTimeOutCounter(double dblCurrBufProgress, double dblCurrPlayProgress); VOID _EndTimeOutCounter(); VOID _BeginTimeOutCounter(BOOL fClear = TRUE);
// per mime type checking stuff
VOID _HandleAutoPlay(VARIANTARG *pvarargMime, VARIANTARG *pvarargUrl);
STDMETHODIMP ProfferService(IUnknown *punkSite, REFGUID sidWhat, IServiceProvider *pService, DWORD *pdwCookie);
public: // mediabar behavior
// non-COM public calls
private: HRESULT _AddProxyToList(IUnknown *punkProxy); void _AttachPlayerToProxies(BOOL fAttach); void _DetachProxies(); BOOL _isUIDisabled(); BOOL _isProxiesNextEnabled(); void _OnUserOverrideDisableUI(); void _FireEventToProxies(enum contentProxyEvent event); void _CleanupStopTimer(); BOOL _IsProxyRunning(void) { return (_apContentProxies && (_apContentProxies.GetPtrCount() > 0)); } HRESULT _EnsureWMPInstalled(BOOL fShowErrorMsg = TRUE);
BOOL _fAttached; UINT_PTR _idStopTimer;
private: double _dblMediaDur; // natural length of the media
int _iCurTrack; PTSTR _pszStatus; HWND _hwndVolume; HWND _hwndSeek; HWND _hwndPopup; HWND _hwndVideo ; HWND _hwndLayout; HMENU _hPlayListMenu; IMediaBarPlayer *_pMediaPlayer;
DWORD _dwCookieServiceMediaBar;
// navigation timeout
DWORD _dwStartTime; LONG _lTickCount; double _dblLastBufProgress; double _dblLastPlayProgress;
SIZE _sizeLayout; SIZE _sizeVideo ; BOOL _fPlayButton:1 ; BOOL _fSeeking:1; // We are seeking, so don't update the seekbar position while we seek.
BOOL _fIsVideo:1; BOOL _fMuted:1; BOOL _fVideoAdjust:1; BOOL _fPlaying:1; BOOL _fPlayEnabled:1; BOOL _fInitialized:1; BOOL _fHiColour:1; BOOL _fUserPaused:1; BOOL _fHighDPI:1; float _scaleX, _scaleY; CMediaWidget* _pmw[MW_NUMBER]; HIMAGELIST _himlGripper; HBITMAP _hbmpBackground; HIMAGELIST _himlVolumeBack, _himlVolumeFill; HIMAGELIST _himlSeekBack, _himlSeekFill; HBRUSH _hbrSeekBrush; VOID Resize(HWND hwnd, LONG lWidth, LONG lHeight); LONG GetPopoutHeight(BOOL fVideo=FALSE, LONG lWidth=0); LONG GetMinPopoutWidth(); BOOL ResetPlayer(); HRESULT PlayLocalTrack(INT iTrackNum); HRESULT PlayNextTrack(); BOOL SetPlayerControl(UINT ui, BOOL fState); BOOL UpdateBackForwardControls(); VOID UpdateMenuItems(HMENU hmenu); LPTSTR _szToolTipUrl; BOOL OnNotify(LPNMHDR pnm, LRESULT* plres); VOID SetPlayPause(BOOL fState); VOID SwitchBitmaps(BOOL fNewSetting);
HRESULT _GetMusicFromFolder(); void _ClearFolderItems();
LPITEMIDLIST *_ppidls; UINT _cidls;
INT _iElement; double _dblVol; TCHAR _szConnecting[MAX_PATH]; INT _iOptionsWidth; CComBSTR _strLastUrl; CComBSTR _strLastMime; BOOL _fLastUrlIsAutoPlay;
// Content pane
HWND _hwndContent; DWORD _dwcpCookie; CComPtr<IWebBrowser2> _spBrowser; CComBSTR _strDeferredURL; CComBSTR _strCurrentContentUrl; CComPtr<IOleInPlaceActiveObject> _poipao; BOOL _fContentInFocus;
VOID InitContentPane(); HRESULT NavigateContentPane(BSTR bstrUrl); HRESULT NavigateContentPane(LPCITEMIDLIST pidl); VOID NavigateMoreMedia(); HRESULT _NavigateContentToDefaultURL(void); HRESULT _ConnectToCP(BOOL fConnect); HRESULT _BuildPageURLWithParam(LPCTSTR pszURL, LPCTSTR pszParam, OUT LPTSTR pszBuffer, UINT uiBufSize); BOOL _DeferredNavigate(LPCTSTR pszURL); HRESULT _ContentActivateIO(BOOL fActivate, PMSG pMsg); LRESULT _OnNotify(LPNMHDR pnm);
BOOL _fSavedPopoutState; WINDOWPLACEMENT _wpPopout; BOOL _fPopoutHasFocus; void ActivatePopout(BOOL fState);
HKEY _hkeyWMP; BOOL _fShow;
// mediaBehavior
CDPA<IContentProxy> _apContentProxies; };
#define _pmwPlay ((CMediaWidgetButton*)_pmw[MW_PLAY])
#define _pmwStop ((CMediaWidgetButton*)_pmw[MW_STOP])
#define _pmwBack ((CMediaWidgetButton*)_pmw[MW_BACK])
#define _pmwNext ((CMediaWidgetButton*)_pmw[MW_NEXT])
#define _pmwMute ((CMediaWidgetToggle*)_pmw[MW_MUTE])
#define _pmwVolume ((CMediaWidgetVolume*)_pmw[MW_VOLUME])
#define _pmwOptions ((CMediaWidgetOptions*)_pmw[MW_OPTIONS])
#define _pmwPop ((CMediaWidgetButton*)_pmw[MW_POP])
#define _pmwSeek ((CMediaWidgetSeek*)_pmw[MW_SEEK])
#define ISVALIDWIDGET(x) (x && x->_hwnd)
#endif // __MEDIABAND_H_
|