windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/shell/include/events.h
2020-09-26 16:20:57 +08:00

341 lines
13 KiB
C++

/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
Events.h
Abstract:
This file contains the declaration of the classes related to events.
Revision History:
Davide Massarenti (dmassare) 10/31/99
modified
******************************************************************************/
#if !defined(__INCLUDED___PCH___EVENTS_H___)
#define __INCLUDED___PCH___EVENTS_H___
#include <MPC_COM.h>
#include <dispex.h>
#include <ocmm.h>
#include <HelpSession.h>
/////////////////////////////////////////////////////////////////////////////
class CPCHEvent;
class CPCHEvents;
class CPCHWebBrowserEvents;
class CPCHHelpCenterExternal;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/*
// DISPID_STATUSTEXTCHANGE void StatusTextChange([in] BSTR Text);
// DISPID_PROGRESSCHANGE void ProgressChange([in] long Progress, [in] long ProgressMax);
// DISPID_COMMANDSTATECHANGE void CommandStateChange([in] long Command, [in] VARIANT_BOOL Enable);
// DISPID_DOWNLOADBEGIN void DownloadBegin();
// DISPID_DOWNLOADCOMPLETE void DownloadComplete();
// DISPID_TITLECHANGE void TitleChange([in] BSTR Text);
// DISPID_PROPERTYCHANGE void PropertyChange([in] BSTR szProperty);
// DISPID_BEFORENAVIGATE2 void BeforeNavigate2([in] IDispatch* pDisp, [in] VARIANT* URL, [in] VARIANT* Flags, [in] VARIANT* TargetFrameName, [in] VARIANT* PostData, [in] VARIANT* Headers, [in, out] VARIANT_BOOL* Cancel);
// DISPID_NEWWINDOW2 void NewWindow2([in, out] IDispatch** ppDisp, [in, out] VARIANT_BOOL* Cancel);
// DISPID_NAVIGATECOMPLETE2 void NavigateComplete2([in] IDispatch* pDisp, [in] VARIANT* URL);
// DISPID_DOCUMENTCOMPLETE void DocumentComplete([in] IDispatch* pDisp, [in] VARIANT* URL);
// DISPID_ONQUIT void OnQuit();
// DISPID_ONVISIBLE void OnVisible([in] VARIANT_BOOL Visible);
// DISPID_ONTOOLBAR void OnToolBar([in] VARIANT_BOOL ToolBar);
// DISPID_ONMENUBAR void OnMenuBar([in] VARIANT_BOOL MenuBar);
// DISPID_ONSTATUSBAR void OnStatusBar([in] VARIANT_BOOL StatusBar);
// DISPID_ONFULLSCREEN void OnFullScreen([in] VARIANT_BOOL FullScreen);
// DISPID_ONTHEATERMODE void OnTheaterMode([in] VARIANT_BOOL TheaterMode);
*/
////////////////////////////////////////////////////////////////////////////////
class CPCHTimerHandle
{
struct CallbackBase : public ITimerSink
{
long m_lRef;
public:
CallbackBase();
virtual void Detach() = 0;
////////////////////
//
// IUnknown
//
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)( REFIID iid, void ** ppvObject );
};
template <class C> class Callback : public CallbackBase
{
public:
typedef HRESULT (C::*CLASS_METHOD)( /*[in]*/ VARIANT );
private:
C* m_pThis;
CLASS_METHOD m_pCallback;
public:
Callback( /*[in]*/ C* pThis, /*[in]*/ CLASS_METHOD pCallback )
{
m_pThis = pThis;
m_pCallback = pCallback;
}
virtual void Detach()
{
m_pThis = NULL;
m_pCallback = NULL;
}
//
// ITimerSink
//
STDMETHOD(OnTimer)( /*[in]*/ VARIANT vtimeAdvise )
{
if(m_pThis == NULL || m_pCallback == NULL) return S_FALSE;
return (m_pThis->*m_pCallback)( vtimeAdvise );
}
};
////////////////////
CComPtr<ITimer> m_timer;
DWORD m_dwCookie;
CallbackBase* m_callback;
////////////////////
HRESULT Advise ( /*[in]*/ CallbackBase* callback, /*[in]*/ DWORD dwWait );
void Unadvise( );
public:
CPCHTimerHandle();
~CPCHTimerHandle();
void Initialize( /*[in]*/ ITimer* timer );
template <class C> HRESULT Start( /*[in/out]*/ C* pThis, /*[in]*/ HRESULT (C::*pCallback)( /*[in]*/ VARIANT ), /*[in]*/ DWORD dwWait )
{
if(pThis == NULL || pCallback == NULL) return E_INVALIDARG;
return Advise( new Callback<C>( pThis, pCallback ), dwWait );
}
void Stop()
{
Unadvise();
}
};
////////////////////////////////////////////////////////////////////////////////
typedef IDispEventImpl<0,CPCHWebBrowserEvents,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1> CPCHWebBrowserEvents_DWebBrowserEvents2;
class CPCHWebBrowserEvents :
public CPCHWebBrowserEvents_DWebBrowserEvents2
{
CPCHHelpCenterExternal* m_parent;
HscPanel m_idPanel;
CComPtr<IWebBrowser2> m_pWB2;
bool m_fLoading;
CPCHTimerHandle m_TimerDelay;
CPCHTimerHandle m_TimerExpire;
////////////////////
enum TimerMode
{
TIMERMODE_STOP ,
TIMERMODE_RESTART ,
TIMERMODE_MORETIME,
TIMERMODE_COMPLETE,
};
void TimerControl( /*[in]*/ TimerMode mode );
public:
BEGIN_SINK_MAP(CPCHWebBrowserEvents)
SINK_ENTRY_EX(0,DIID_DWebBrowserEvents2,DISPID_BEFORENAVIGATE2 ,BeforeNavigate2 )
SINK_ENTRY_EX(0,DIID_DWebBrowserEvents2,DISPID_NEWWINDOW2 ,NewWindow2 )
SINK_ENTRY_EX(0,DIID_DWebBrowserEvents2,DISPID_NAVIGATECOMPLETE2,NavigateComplete2)
SINK_ENTRY_EX(0,DIID_DWebBrowserEvents2,DISPID_DOCUMENTCOMPLETE ,DocumentComplete )
END_SINK_MAP()
CPCHWebBrowserEvents();
virtual ~CPCHWebBrowserEvents();
void Initialize( /*[in]*/ CPCHHelpCenterExternal* parent, /*[in]*/ HscPanel idPanel );
void Passivate ( );
void Attach ( /*[in]*/ IWebBrowser2* pWB );
void Detach ( );
void NotifyStartOfNavigation( /*[in]*/ BSTR url );
void NotifyEndOfNavigation ( );
void NotifyStop ( );
////////////////////////////////////////
HRESULT OnTimer( VARIANT vtimeAdvise );
public:
// Event Handlers
void __stdcall BeforeNavigate2 ( IDispatch* pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel );
void __stdcall NewWindow2 ( IDispatch* *ppDisp, VARIANT_BOOL* Cancel );
void __stdcall NavigateComplete2( IDispatch* pDisp, VARIANT* URL );
void __stdcall DocumentComplete ( IDispatch* pDisp, VARIANT* URL );
};
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CPCHEvent : // Hungarian: hce
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IPCHEvent, &IID_IPCHEvent, &LIBID_HelpCenterTypeLib>
{
friend class CPCHEvents;
DISPID m_idAction;
VARIANT_BOOL m_fCancel;
CComBSTR m_bstrURL;
CComBSTR m_bstrFrame;
CComBSTR m_bstrPanel;
CComBSTR m_bstrPlace;
CComBSTR m_bstrContextData;
CComPtr<CPCHHelpSessionItem> m_hsiCurrentContext;
CComPtr<CPCHHelpSessionItem> m_hsiPreviousContext;
CComPtr<CPCHHelpSessionItem> m_hsiNextContext;
public:
BEGIN_COM_MAP(CPCHEvent)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IPCHEvent)
END_COM_MAP()
CPCHEvent();
virtual ~CPCHEvent();
//
// IPCHEvent
//
public:
STDMETHOD(get_Action )( /*[out, retval]*/ BSTR * pVal );
STDMETHOD(put_Cancel )( /*[in ]*/ VARIANT_BOOL newVal );
STDMETHOD(get_Cancel )( /*[out, retval]*/ VARIANT_BOOL * pVal );
HRESULT put_URL ( /*[in]*/ BSTR newVal ); // Internal method.
STDMETHOD(get_URL )( /*[out, retval]*/ BSTR * pVal );
HRESULT put_Frame ( /*[in]*/ BSTR newVal ); // Internal method.
STDMETHOD(get_Frame )( /*[out, retval]*/ BSTR * pVal );
HRESULT put_Panel ( /*[in]*/ BSTR newVal ); // Internal method.
STDMETHOD(get_Panel )( /*[out, retval]*/ BSTR * pVal );
HRESULT put_Place ( /*[in]*/ BSTR newVal ); // Internal method.
STDMETHOD(get_Place )( /*[out, retval]*/ BSTR * pVal );
STDMETHOD(get_CurrentContext )( /*[out, retval]*/ IPCHHelpSessionItem* * pVal );
STDMETHOD(get_PreviousContext)( /*[out, retval]*/ IPCHHelpSessionItem* * pVal );
STDMETHOD(get_NextContext )( /*[out, retval]*/ IPCHHelpSessionItem* * pVal );
};
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
class CPCHEvents
{
class EventRegistration
{
public:
long m_lCookie;
DISPID m_id;
long m_lPriority;
MPC::CComPtrThreadNeutral<IDispatch> m_fnCallback;
bool operator==( /*[in]*/ const long lCookie ) const;
bool operator< ( /*[in]*/ const long lPriority ) const;
};
typedef std::list<EventRegistration> List;
typedef List::iterator Iter;
typedef List::const_iterator IterConst;
CPCHHelpCenterExternal* m_parent;
List m_lstEvents;
List m_lstEvents_Staging;
long m_lLastCookie;
public:
CPCHEvents();
~CPCHEvents();
void Initialize( /*[in]*/ CPCHHelpCenterExternal* parent );
void Passivate ( );
HRESULT RegisterEvents ( /*[in]*/ long id, /*[in]*/ long pri, /*[in]*/ IDispatch* function, /*[out,retval]*/ long *cookie );
HRESULT RegisterEvents ( /*[in]*/ BSTR id, /*[in]*/ long pri, /*[in]*/ IDispatch* function, /*[out,retval]*/ long *cookie );
HRESULT UnregisterEvents( /*[in]*/ long cookie );
HRESULT FireEvent( /*[in]*/ CPCHEvent* eventObj );
////////////////////////////////////////
HRESULT FireEvent_Generic ( /*[in]*/ DISPID id , /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_BeforeNavigate ( /*[in]*/ BSTR bstrURL ,
/*[in]*/ BSTR bstrFrame,
/*[in]*/ HscPanel idPanel , /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_NavigateComplete ( /*[in]*/ BSTR bstrURL ,
/*[in]*/ HscPanel idPanel , /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_BeforeTransition ( /*[in]*/ BSTR bstrPlace, /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_Transition ( /*[in]*/ BSTR bstrPlace );
HRESULT FireEvent_BeforeContextSwitch( /*[in]*/ HscContext iVal ,
/*[in]*/ BSTR bstrInfo ,
/*[in]*/ BSTR bstrURL , /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_ContextSwitch ( );
HRESULT FireEvent_PersistLoad ( );
HRESULT FireEvent_PersistSave ( );
HRESULT FireEvent_TravelDone ( );
HRESULT FireEvent_Shutdown ( /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_Print ( /*[out,retval]*/ VARIANT_BOOL *Cancel = NULL );
HRESULT FireEvent_SwitchedHelpFiles ( );
HRESULT FireEvent_FavoritesUpdate ( );
HRESULT FireEvent_OptionsChanged ( );
HRESULT FireEvent_CssChanged ( );
////////////////////////////////////////
static DISPID Lookup ( LPCWSTR szName );
static LPCWSTR ReverseLookup( DISPID idEvent );
};
#endif // !defined(__INCLUDED___PCH___EVENTS_H___)