#ifndef _TRSITE_H #define _TRSITE_H class CTransitionSite; class CTransitionSitePropertyBag; ///////////////////////////////////////////////////////////////////////////// // Typedefs and Structs ///////////////////////////////////////////////////////////////////////////// enum TransitionEvent // Transition Event type { teFirstEvent = 0, teSiteEnter = teFirstEvent, tePageEnter, teSiteExit, tePageExit, teNumEvents, // NOTE: Must follow last event! teUserDefault = teNumEvents }; struct TRANSITIONINFO // Transition Event information { CLSID clsid; CTransitionSitePropertyBag * pPropBag; }; struct NAMEVALUE { WCHAR * pwszName; VARIANT varValue; }; ///////////////////////////////////////////////////////////////////////////// // CTransitionSite ///////////////////////////////////////////////////////////////////////////// class CTransitionSite : public IViewFilter, public IViewFilterSite, public IAdviseSink, public IDispatch { // Construction/Destruction public: CTransitionSite(IShellBrowser * pcont); ~CTransitionSite(); HRESULT _SetTransitionInfo(TransitionEvent te, TRANSITIONINFO * pti); HRESULT _ApplyTransition(BOOL bSiteChange); HRESULT _StartTransition(); HRESULT _StopTransition(); HRESULT _UpdateEventList(); enum TRSTATE { TRSTATE_NONE = 0, TRSTATE_INITIALIZING = 1, TRSTATE_STARTPAINTING = 2, TRSTATE_PAINTING = 3 }; TRSTATE _uState; IShellView * _psvNew; // Valid only while we are playing IViewObject * _pvoNew; BOOL _fViewIsVisible; HWND _hwndViewNew; IViewFilter * _pTransition; IDispatch * _pDispTransition; DWORD _dwTransitionSink; // Data private: IShellBrowser * _pContainer; // CBaseBrowser container of parent IViewFilterSite * _pSite; TRANSITIONINFO * _ptiCurrent; TRANSITIONINFO _tiEventInfo[teNumEvents]; // Internal methods private: HRESULT _LoadTransition(); HRESULT _InitWait(); HRESULT _OnComplete(); // Interfaces public: // IUnknown STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); STDMETHOD_(ULONG, AddRef) (void); STDMETHOD_(ULONG, Release) (void); // IViewFilter STDMETHOD(SetSource) (IViewFilter *pFilter); STDMETHOD(GetSource) (IViewFilter **ppFilter); STDMETHOD(SetSite) (IViewFilterSite *pSink); STDMETHOD(GetSite) (IViewFilterSite **ppSink); STDMETHOD(SetPosition) (LPCRECT prc); STDMETHOD(Draw) (HDC hdc, LPCRECT prc); STDMETHOD(GetStatusBits) (DWORD *pdwFlags); // IViewFilterSite STDMETHOD(GetDC) (LPCRECT prc, DWORD dwFlags, HDC *phdc); STDMETHOD(ReleaseDC) (HDC hdc); STDMETHOD(InvalidateRect) (LPCRECT prc, BOOL fErase); STDMETHOD(InvalidateRgn) (HRGN hrgn, BOOL fErase); STDMETHOD(OnStatusBitsChange) (DWORD dwFlags); // IAdviseSink STDMETHOD_(void, OnDataChange) (FORMATETC * pFormatetc, STGMEDIUM * pStgmed) {} STDMETHOD_(void, OnViewChange) (DWORD dwAspect, LONG lindex); STDMETHOD_(void, OnRename) (IMoniker * pmk) {} STDMETHOD_(void, OnSave) () {} STDMETHOD_(void, OnClose) () {} // IDispatch STDMETHOD(GetTypeInfoCount) (UINT * pctinfo) { return E_NOTIMPL; } STDMETHOD(GetTypeInfo) (UINT itinfo, LCID lcid, ITypeInfo ** pptinfo) { return E_NOTIMPL; } STDMETHOD(GetIDsOfNames) (REFIID riid, OLECHAR ** rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid) { return E_NOTIMPL; } STDMETHOD(Invoke) (DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr); }; ///////////////////////////////////////////////////////////////////////////// // CTransitionSitePropertyBag ///////////////////////////////////////////////////////////////////////////// class CTransitionSitePropertyBag : public IPropertyBag { // Construction/Destruction public: CTransitionSitePropertyBag(); virtual ~CTransitionSitePropertyBag(); HRESULT _AddProperty(WCHAR * wszPropName, VARIANT * pvarValue); // Data protected: UINT _cRef; HDPA _hdpaProperties; // Implementation protected: static int _DPA_FreeProperties(LPVOID pv, LPVOID pData); // Interfaces public: // IUnknown STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv); STDMETHOD_(ULONG, AddRef) (void); STDMETHOD_(ULONG, Release) (void); // IPropertyBag STDMETHOD(Read) (LPCOLESTR pszPropName, VARIANT * pVar, IErrorLog * pErrorLog); STDMETHOD(Write)(LPCOLESTR pszPropName, VARIANT * pVar) { return E_NOTIMPL; } }; ///////////////////////////////////////////////////////////////////////////// // Helper functions ///////////////////////////////////////////////////////////////////////////// HRESULT CLSIDFromTransitionName(LPCTSTR pszName, LPCLSID clsidName); BOOL ParseTransitionInfo(WCHAR * pwz, TRANSITIONINFO * pti); #define ISSPACE(ch) (((ch) == 32) || ((unsigned)((ch) - 9)) <= 13 - 9) #endif // _TRSITE_H