COMPMGR.H
//--------------------------------------------------------------------------- 
// CompMgr.h 
//--------------------------------------------------------------------------- 
// This file contains the exported interfaces and declarations for  
// Component Manager Interfaces. 
//--------------------------------------------------------------------------- 
// Copyright (c) 1995-1997 Microsoft Corporation 
//--------------------------------------------------------------------------- 
 
 
#ifdef INITGUID 
    #define DEFINE_GUID2(name, bCategory, bIndex) \ 
        EXTERN_C const GUID name = {0x000C0000 | MAKEWORD(bIndex, bCategory),} 
#else 
    #define DEFINE_GUID2(name, bCategory, bIndex) \ 
        EXTERN_C const GUID name 
#endif 
 
DEFINE_GUID2(IID_IOleComponent,        0x06, 0x00); 
DEFINE_GUID2(IID_IOleComponentManager, 0x06, 0x01); 
 
 
 
//*************************************************************************** 
// Component integration structures and constants 
//*************************************************************************** 
 
//--------------------------------------------------------------------------- 
// Component registration flags 
//--------------------------------------------------------------------------- 
enum 
    { 
    cmgrrfNeedIdleTime         = 1,  // needs idle time 
    cmgrrfNeedPeriodicIdleTime = 2,  // needs idle time every N milliseconds 
    cmgrrfPreTranslateKeys     = 4,  // must process keyboard msgs  
                             // before translation 
    cmgrrfPreTranslateAll      = 8,  // must process all msgs  
                             // before translation 
    }; 
 
 
//--------------------------------------------------------------------------- 
// Component registration advise flags (see cmgrstate enumeration) 
//--------------------------------------------------------------------------- 
enum 
    { 
    cmgradvfModal              = 1,  // needs modal state change notification 
                             // (must be registered by components 
                             // managing a toplevel window) 
    cmgradvfRedrawOff          = 2,  // needs redrawOff state change notif 
    cmgradvfWarningsOff        = 4,  // needs warningsOff state change notif 
    cmgradvfRecording          = 8,  // needs Recording state change notif 
    cmgradvfExclusiveActive    = 16, // needs ExclusiveActive change notif 
                             // (must be registered by components 
                             //  managing a window with UI). 
    }; 
 
 
//--------------------------------------------------------------------------- 
// Component registration information 
//--------------------------------------------------------------------------- 
typedef struct _CMGRRINFO 
    { 
    ULONG cbSize;             // size of CMGRRINFO structure in bytes. 
    ULONG uIdleTimeInterval;  // If cmgrrfNeedPeriodicIdleTime is registered 
                      // in grfcrf, component needs to perform 
                      // periodic idle time tasks during an idle phase 
                      // every uIdleTimeInterval milliseconds. 
    DWORD grfcrf;             // bit flags taken from cmgrrf values (above) 
    DWORD grfcadvf;           // bit flags taken from cmgradvf values (above) 
    } CMGRRINFO; 
 
 
//--------------------------------------------------------------------------- 
// Idle flags, passed to IOleComponent::FDoIdle and  
// IOleStdComponentMgr::FDoIdle. 
//--------------------------------------------------------------------------- 
enum 
    { 
    cmgridlefPeriodic    = 1,  // periodic idle tasks 
    cmgridlefNonPeriodic = 2,  // any nonperiodic idle task 
    cmgridlefPriority    = 4,  // high priority, nonperiodic idle tasks 
    cmgridlefAll         = -1  // all idle tasks 
    }; 
 
 
//--------------------------------------------------------------------------- 
// Reasons for pushing a message loop, passed to  
// IOleComponentHost::FPushMessageLoop.  The host should remain in message 
// loop until IOleComponent::FContinueMessageLoop returns FALSE. 
//--------------------------------------------------------------------------- 
enum 
    { 
    cmgrloopFocusWait = 1,  // component is activating host  
    cmgrloopDoEvents  = 2,  // component is asking host to process messages 
    cmgrloopDebug     = 3,  // component has entered debug mode 
    cmgrloopModalForm = 4   // component is displaying a modal form   
    }; 
 
 
//--------------------------------------------------------------------------- 
// cmgrstate values: state IDs passed to  
//  IOleComponent::OnEnterState,  
//  IOleComponentManager::OnComponentEnterState/FOnComponentExitState/FInState, 
// 
//  When the host or a component is notified through one of these methods that  
//  another entity (component or host) is entering or exiting a state  
//  identified by one of these state IDs, the host/component should take 
//  appropriate action: 
//      cmgrstateModal (modal state): 
//    If app is entering modal state, host/component should disable 
//    its toplevel windows, and reenable them when app exits this 
//    state.  Also, when this state is entered or exited, host/component 
//    should notify approprate inplace objects via  
//    IOleInPlaceActiveObject::EnableModeless. 
//cmgrstateRedrawOff (redrawOff state): 
//    If app is entering redrawOff state, host/component should disable 
//    repainting of its windows, and reenable repainting when app exits 
//    this state. 
//cmgrstateWarningsOff (warningsOff state): 
//    If app is entering warningsOff state, host/component should disable 
//    the presentation of any user warnings, and reenable this when 
//    app exits this state. 
//cmgrstateRecording (Recording state): 
//    Used to notify host/component when Recording is turned on or off. 
//cmgrstateExclusiveActive (Exclusive Active state) 
//    TODO: add comments on what host/component should do. 
//--------------------------------------------------------------------------- 
enum 
    { 
    cmgrstateModal       = 1,     // Modal state; disable toplevel windows 
    cmgrstateRedrawOff   = 2,     // RedrawOff state; disable window repainting 
    cmgrstateWarningsOff = 3,     // WarningsOff state; disable user warnings 
    cmgrstateRecording   = 4,     // Recording state 
    cmgrstateExclusiveActive = 5, // ExclusiveActive state; TODO: add brief 
                          // comment on what should be done here 
    }; 
 
 
//--------------------------------------------------------------------------- 
// ** Comments on State Contexts ** 
//--------------------------------------------------------------------------- 
// IOleComponentManager::FCreateSubComponentManager allows one to create a  
// hierarchical tree of component managers.  This tree is used to maintain  
// multiple contexts with regard to cmgrstateXXX states.  These contexts are  
// referred to as 'state contexts'. 
// Each component manager in the tree defines a state context.  The 
// components registered with a particular component manager or any of its 
// descendents live within that component manager's state context.  Calls 
// to IOleComponentManager::OnComponentEnterState/FOnComponentExitState 
// can be used to affect all components, only components within the component 
// manager's state context, or only those components that are outside of the 
// component manager's state context.  IOleComponentManager::FInState is used 
// to query the state of the component manager's state context at its root. 
// 
// cmgrcontext values: context indicators passed to  
// IOleComponentManager::OnComponentEnterState/FOnComponentExitState. 
// These values indicate the state context that is to be affected by the 
// state change.  
// In IOleComponentManager::OnComponentEnterState/FOnComponentExitState, 
// the comp mgr informs only those components/host that are within the 
// specified state context. 
//--------------------------------------------------------------------------- 
enum 
    { 
    cmgrcontextAll    = 0, // all state contexts in state context tree 
    cmgrcontextMine   = 1, // component manager's state context 
    cmgrcontextOthers = 2, // all other state contexts outside of comp mgr's 
    }; 
 
 
//--------------------------------------------------------------------------- 
// Defines the IOleComponent interface 
//--------------------------------------------------------------------------- 
// Any component that needs idle time, the ability to process messages before 
// they are translated (for example, to call TranslateAccelerator() or 
// IsDialogMessage), notification about modal states, or the ability push 
// message loops must implement this interface and register with the 
// Component Manager. 
//--------------------------------------------------------------------------- 
#undef  INTERFACE 
#define INTERFACE  IOleComponent 
 
DECLARE_INTERFACE_(IOleComponent, IUnknown) 
{ 
// *** IUnknown methods *** 
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppvObj) PURE; 
STDMETHOD_(ULONG, AddRef) (THIS) PURE; 
STDMETHOD_(ULONG, Release) (THIS) PURE; 
 
// Give component a chance to process the message pMsg before it is 
// translated and dispatched. Component can do TranslateAccelerator, 
// do IsDialogMessage, modify pMsg, or take some other action. 
// Return TRUE if the message is consumed, FALSE otherwise. 
STDMETHOD_(BOOL, FPreTranslateMessage) (THIS_ MSG *pMsg) PURE; 
 
#if MAC 
// Give Macintosh component a chance to process the event pEvt 
// before it is processed by the host.  
// Return TRUE if the event is consumed, FALSE otherwise. 
// (WLM components can simply return FALSE.) 
STDMETHOD_(BOOL, FPreProcessMacEvent) (THIS_ EventRecord *pEvt) PURE; 
#endif // MAC 
 
// Notify component when app enters or exits (as indicated by fEnter) 
// the state identified by uStateID (a value from cmgrstate enumeration). 
// Component should take action depending on value of uStateID 
// (see cmgrstate comments, above). 
//  
// Note: If n calls are made with TRUE fEnter, component should consider  
// the state to be in effect until n calls are made with FALSE fEnter. 
//  
// Note: Components should be aware that it is possible for this method to 
// be called with FALSE fEnter more times than it was called with TRUE  
// fEnter (so, for example, if component is maintaining a state counter 
// (incremented when this method is called with TRUE fEnter, decremented 
// when called with FALSE fEnter), the counter should not be decremented 
// for FALSE fEnter if it is already at zero.) 
STDMETHOD_(void, OnEnterState) (THIS_ ULONG uStateID, BOOL fEnter) PURE; 
 
// Notify component when the host application gains or loses activation. 
// If fActive is TRUE, the host app is being activated and dwOtherThreadID 
// is the ID of the thread owning the window being deactivated. 
// If fActive is FALSE, the host app is being deactivated and  
// dwOtherThreadID is the ID of the thread owning the window being  
// activated. 
// Note: this method is not called when both the window being activated 
// and the one being deactivated belong to the host app. 
STDMETHOD_(void, OnAppActivate) (THIS_  
BOOL fActive, DWORD dwOtherThreadID) PURE; 
 
// Notify the active component that it has lost its active status because 
// the host or another component has become active. 
STDMETHOD_(void, OnLoseActivation) (THIS) PURE; 
 
// Give component a chance to do idle time tasks.  grfidlef is a group of 
// bit flags taken from the enumeration of cmgridlef values (above), 
// indicating the type of idle tasks to perform.   
// Component may periodically call IOleComponentManager::FContinueIdle;  
// if this method returns FALSE, component should terminate its idle  
// time processing and return.   
// Return TRUE if more time is needed to perform the idle time tasks,  
// FALSE otherwise. 
// Note: If a component reaches a point where it has no idle tasks 
// and does not need FDoIdle calls, it should remove its idle task 
// registration via IOleComponentManager::FUpdateComponentRegistration. 
// Note: If this method is called on while component is performing a  
// tracking operation, component should only perform idle time tasks that 
// it deems are appropriate to perform during tracking. 
STDMETHOD_(BOOL, FDoIdle) (THIS_ DWORD grfidlef) PURE; 
 
// Called once per iteration of a message loop that the component pushed. 
// uReason and pvLoopData are the reason and the component private data 
// that were passed to IOleComponentManager::FPushMessageLoop. 
// Return TRUE if the message loop should continue, FALSE otherwise. 
STDMETHOD_(BOOL, FContinueMessageLoop) (THIS_  
ULONG uReason, void *pvLoopData) PURE; 
 
// Called when component manager wishes to know if the component is in a 
// state in which it can terminate.  If fPromptUser is FALSE, component 
// should simply return TRUE if it can terminate, FALSE otherwise. 
// If fPromptUser is TRUE, component should return TRUE if it can 
// terminate without prompting the user; otherwise it should prompt the 
// user, either 1.) asking user if it can terminate and returning TRUE 
// or FALSE appropriately, or 2.) giving an indication as to why it 
// cannot terminate and returning FALSE. 
STDMETHOD_(BOOL, FQueryTerminate) (THIS_ BOOL fPromptUser) PURE; 
 
// Called when component manager wishes to terminate the component's 
// registration.  Component should revoke its registration with component 
// manager, release references to component manager and perform any 
// necessary cleanup. 
STDMETHOD_(void, Terminate) (THIS) PURE; 
}; 
 
 
 
//--------------------------------------------------------------------------- 
// Defines the IOleComponentManager interface 
//--------------------------------------------------------------------------- 
// A component manager is an object implementing the IOleComponentManager 
// interface.  The component manager coordinates components with its message 
// loop for proper distribution of idle time and pre-translation message 
// processing. 
// It also coordinates modalities and the pushing of message loops. 
//--------------------------------------------------------------------------- 
#undef  INTERFACE 
#define INTERFACE  IOleComponentManager 
 
DECLARE_INTERFACE_(IOleComponentManager, IUnknown) 
{ 
// *** IUnknown methods *** 
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppvObj) PURE; 
STDMETHOD_(ULONG, AddRef) (THIS) PURE; 
STDMETHOD_(ULONG, Release) (THIS) PURE; 
 
// Return in *ppvObj an implementation of interface iid for service 
// guidService (same as IServiceProvider::QueryService). 
// Return NOERROR if the requested service is supported, otherwise return 
// NULL in *ppvObj and an appropriate error (eg E_FAIL, E_NOINTERFACE). 
STDMETHOD(QueryService) (THIS_ 
REFGUID guidService, REFIID iid, void **ppvObj) PURE; 
 
// Register component piComponent and its registration info pcrinfo with 
// this component manager.  Return in *pdwComponentID a cookie which will 
// identify the component when it calls other IOleComponentManager 
// methods. 
// Return TRUE if successful, FALSE otherwise. 
STDMETHOD_(BOOL, FRegisterComponent) (THIS_ 
IOleComponent *piComponent, const CMGRRINFO *pcrinfo,  
DWORD *pdwComponentID) PURE; 
 
// Undo the registration of the component identified by dwComponentID 
// (the cookie returned from the FRegisterComponent method). 
// Return TRUE if successful, FALSE otherwise. 
STDMETHOD_(BOOL, FRevokeComponent) (THIS_ DWORD dwComponentID) PURE; 
 
// Update the registration info of the component identified by 
// dwComponentID (the cookie returned from FRegisterComponent) with the 
// new registration information pcrinfo. 
// Typically this is used to update the idle time registration data, but 
// can be used to update other registration data as well. 
// Return TRUE if successful, FALSE otherwise. 
STDMETHOD_(BOOL, FUpdateComponentRegistration) (THIS_  
DWORD dwComponentID, const CMGRRINFO *pcrinfo) PURE; 
 
// Notify component manager that component identified by dwComponentID 
// (cookie returned from FRegisterComponent) has been activated. 
// The active component gets the chance to process messages before they 
// are dispatched (via IOleComponent::FPreTranslateMessage) and typically 
// gets first crack at idle time after the host. 
STDMETHOD_(void, OnComponentActivate) (THIS_ DWORD dwComponentID) PURE; 
 
// Called to inform component manager that  component identified by  
// dwComponentID (cookie returned from FRegisterComponent) wishes 
// to perform a tracking operation (such as mouse tracking). 
// The component calls this method with fTrack == TRUE to begin the 
// tracking operation and with fTrack == FALSE to end the operation. 
// During the tracking operation the component manager routes messages 
// to the tracking component (via IOleComponent::FPreTranslateMessage) 
// rather than to the active component.  When the tracking operation ends, 
// the component manager should resume routing messages to the active 
// component.   
// Note: component manager should perform no idle time processing during a 
// tracking operation other than give the tracking component idle 
// time via IOleComponent::FDoIdle. 
// Note: there can only be one tracking component at a time. 
// Return TRUE if successful, FALSE otherwise. 
STDMETHOD_(BOOL, FSetTrackingComponent) (THIS_  
DWORD dwComponentID, BOOL fTrack) PURE; 
 
// Notify component manager that component identified by dwComponentID 
// (cookie returned from FRegisterComponent) is entering the state 
// identified by uStateID (cmgrstateXXX value).  (For convenience when 
// dealing with sub CompMgrs, the host can call this method passing 0 for 
// dwComponentID.)   
// Component manager should notify all other interested components within 
// the state context indicated by uContext (a cmgrcontextXXX value), 
// excluding those within the state context of a CompMgr in rgpicmExclude, 
// via IOleComponent::OnEnterState (see "Comments on State Contexts",  
// above). 
// Component Manager should also take appropriate action depending on the  
// value of uStateID (see cmgrstate comments, above). 
// dwReserved is reserved for future use and should be zero. 
        //  
// rgpicmExclude (can be NULL) is an array of cpicmExclude CompMgrs (can 
// include root CompMgr and/or sub CompMgrs); components within the state 
// context of a CompMgr appearing in thisarray should NOT be notified of  
// the state change (note: if uContextis cmgrcontextMine, the only  
// CompMgrs in rgpicmExclude that are checked for exclusion are those that  
// are sub CompMgrs of this Component Manager, since all other CompMgrs  
// are outside of this Component Manager's state context anyway.) 
        //  
// Note: Calls to this method are symmetric with calls to  
// FOnComponentExitState.  
// That is, if n OnComponentEnterState calls are made, the component is 
// considered to be in the state until n FOnComponentExitState calls are 
// made.  Before revoking its registration a component must make a  
// sufficient number of FOnComponentExitState calls to offset any 
// outstanding OnComponentEnterState calls it has made. 
        //  
// Note: inplace objects should not call this method with 
// uStateID == cmgrstateModal when entering modal state. Such objects 
// should call IOleInPlaceFrame::EnableModeless instead. 
STDMETHOD_(void, OnComponentEnterState) (THIS_  
DWORD dwComponentID,  
ULONG uStateID,  
ULONG uContext, 
ULONG cpicmExclude, 
IOleComponentManager **rgpicmExclude,  
DWORD dwReserved) PURE; 
 
// Notify component manager that component identified by dwComponentID 
// (cookie returned from FRegisterComponent) is exiting the state 
// identified by uStateID (a cmgrstateXXX value).  (For convenience when 
// dealing with sub CompMgrs, the host can call this method passing 0 for 
// dwComponentID.) 
// uContext, cpicmExclude, and rgpicmExclude are as they are in  
// OnComponentEnterState. 
// Component managershould notify all appropriate interested components 
// (taking into account uContext, cpicmExclude, rgpicmExclude) via 
// IOleComponent::OnEnterState (see "Comments on State Contexts", above).  
// Component Manager should also take appropriate action depending on 
// the value of uStateID (see cmgrstate comments, above). 
// Return TRUE if, at the end of this call, the state is still in effect 
// at the root of this component manager's state context 
// (because the host or some other component is still in the state), 
// otherwise return FALSE (ie. return what FInState would return). 
// Caller can normally ignore the return value. 
//  
// Note: n calls to this method are symmetric with n calls to  
// OnComponentEnterState (see OnComponentEnterState comments, above). 
STDMETHOD_(BOOL, FOnComponentExitState) (THIS_  
DWORD dwComponentID,  
ULONG uStateID,  
ULONG uContext, 
ULONG cpicmExclude, 
IOleComponentManager **rgpicmExclude) PURE; 
 
// Return TRUE if the state identified by uStateID (a cmgrstateXXX value) 
// is in effect at the root of this component manager's state context,  
// FALSE otherwise (see "Comments on State Contexts", above). 
// pvoid is reserved for future use and should be NULL. 
STDMETHOD_(BOOL, FInState) (THIS_ ULONG uStateID, void *pvoid) PURE; 
 
// Called periodically by a component during IOleComponent::FDoIdle. 
// Return TRUE if component can continue its idle time processing,  
// FALSE if not (in which case component returns from FDoIdle.) 
STDMETHOD_(BOOL, FContinueIdle) (THIS) PURE; 
 
// Component identified by dwComponentID (cookie returned from  
// FRegisterComponent) wishes to push a message loop for reason uReason. 
// uReason is one the values from the cmgrloop enumeration (above). 
// pvLoopData is data private to the component. 
// The host should push its message loop,  
// calling IOleComponent::FContinueMessageLoop(uReason, pvLoopData) 
// once per loop iteration.  When IOleComponent::FContinueMessageLoop 
// returns FALSE, the host should terminate the loop. 
STDMETHOD_(BOOL, FPushMessageLoop) (THIS_  
DWORD dwComponentID, ULONG uReason, void *pvLoopData) PURE; 
 
// Cause the component manager to create a "sub" component manager, which 
// will be one of its children in the hierarchical tree of component 
// managers used to maintiain state contexts (see "Comments on State 
// Contexts", above). 
// piunkOuter is the controlling unknown (can be NULL), riid is the 
// desired IID, and *ppvObj returns the created sub component manager. 
// piunkServProv (can be NULL) is a ptr to an object supporting 
// IServiceProvider interface to which the created sub component manager 
// will delegate its IOleComponentManager::QueryService calls.  
// (see objext.h or docobj.h for definition of IServiceProvider). 
// Returns TRUE if successful. 
STDMETHOD_(BOOL, FCreateSubComponentManager) (THIS_  
IUnknown *piunkOuter,  
IUnknown *piunkServProv, 
REFIID riid,  
void **ppvObj) PURE; 
 
// Return in *ppicm an AddRef'ed ptr to this component manager's parent 
// in the hierarchical tree of component managers used to maintain state 
// contexts (see "Comments on State Contexts", above). 
// Returns TRUE if the parent is returned, FALSE if no parent exists or 
// some error occurred. 
STDMETHOD_(BOOL, FGetParentComponentManager) (THIS_  
IOleComponentManager **ppicm) PURE; 
 
// Return in *ppic an AddRef'ed ptr to the current active component. 
// Returns TRUE if the active component is returned, FALSE if no component 
// is active or some error occurred. 
// dwReserved is reserved for future use and should be zero. 
STDMETHOD_(BOOL, FGetActiveComponent) (THIS_  
DWORD dwReserved, IOleComponent **ppic) PURE; 
}; 
 
//--- EOF -------------------------------------------------------------------