windows-nt/Source/XPSP1/NT/windows/richedit/re30/_callmgr.h
2020-09-26 16:20:57 +08:00

137 lines
4.2 KiB
C++

/*
*
* @doc INTERNAL
*
* @module _CALLMGR.H CCallMgr declaration |
*
* Purpose: The call manager controls various aspects of
* a client call chain, including re-entrancy management,
* undo contexts, and change notifications.
*
* Author: <nl>
* alexgo 2/8/96
*
* Copyright (c) 1995-1998, Microsoft Corporation. All rights reserved.
*/
#ifndef _CALLMGR_H
#define _CALLMGR_H
class CTxtEdit;
class CCallMgr;
#include "textserv.h"
enum CompName
{
COMP_UNDOBUILDER = 1, // currently, these two are only compatible
COMP_REDOBUILDER = 2, // with CGenUndoBuilder undo contexts
COMP_UNDOGUARD = 3,
COMP_SELPHASEADJUSTER = 4
};
/*
* IReEntrantComponent
*
* @class A base class/interface for objects that want to work with the call
* manager for special re-entrancy requirements.
*
* This class is similar in spirit to ITxNotify, thus, it contains
* private data only accessible to CCallMgr
*/
class IReEntrantComponent
{
friend class CCallMgr;
//@access Public Data
public:
virtual void OnEnterContext() = 0; //@cmember Called when a
// context is entered
//@access Private Data
private:
CompName _idName; //@cmember Name for this component
IReEntrantComponent * _pnext; //@cmember Next one in list
};
/*
*
* CCallMgr
*
* @class A stack-based class to handle re-entrancy and notification
* management. CCallMgr's are created on the stack on every
* important entry point. If one already exists (i.e. the
* edit control has been re-entered), the Call Manager will
* adjust appropriately.
*/
class CCallMgr
{
friend class CGenUndoBuilder;
//@access Public Methods
public:
// Notification Methods
void SetChangeEvent(CHANGETYPE fType); //@cmember Something changed
void ClearChangeEvent(); //@cmember Ignore change
//@cmember Did something change?
BOOL GetChangeEvent() {return _pPrevcallmgr ?
_pPrevcallmgr->GetChangeEvent() : _fChange;}
BOOL GetMaxText() {return _pPrevcallmgr ?
_pPrevcallmgr->GetMaxText() : _fMaxText;}
BOOL GetOutOfMemory() {return _pPrevcallmgr ?
_pPrevcallmgr->GetOutOfMemory() : _fOutOfMemory;}
void SetNewUndo(); //@cmember New undo action added
void SetNewRedo(); //@cmember New redo action added
void SetMaxText(); //@cmember Max text length reached
void SetSelectionChanged(); //@cmember Selection changed
void SetOutOfMemory(); //@cmember Out of memory hit
void SetInProtected(BOOL f); //@cmember Set if in protected
// notification callback
BOOL GetInProtected(); //@cmember Get InProtected flag
// SubSystem Management methods
//@cmember Register a component
// for this call context
void RegisterComponent(IReEntrantComponent *pcomp, CompName name);
//@cmember Revoke a component from
// this call context
void RevokeComponent(IReEntrantComponent *pcomp);
IReEntrantComponent *GetComponent(CompName name);//@cmember Get registered
// component by name
// General Methods
BOOL IsReEntered() { return !!_pPrevcallmgr;} //@cmember Return TRUE if
// in a re-entrant state
BOOL IsZombie() { return !_ped;} //@cmember Zombie call
// Constructor/Destructor
CCallMgr(CTxtEdit *ped); //@cmember constructor
~CCallMgr(); //@cmember destructor
//@access Private Methods and data
private:
void SendAllNotifications(); //@cmember Flush any cached
// notifications
void NotifyEnterContext(); //@cmember Notify registered
// components of a new context.
CTxtEdit * _ped; //@cmember Current edit context
CCallMgr * _pPrevcallmgr; //@cmember Next highest call mgr
IReEntrantComponent *_pcomplist; //@cmember List of components
// registered for this call context
unsigned long _fTextChanged :1; //@cmember Text changed
unsigned long _fChange :1; //@cmember Generic change
unsigned long _fNewUndo :1; //@cmember New undo action added
unsigned long _fNewRedo :1; //@cmember New redo action added
unsigned long _fMaxText :1; //@cmember Max text length reached
unsigned long _fSelChanged :1; //@cmember Selection changed
unsigned long _fOutOfMemory :1; //@cmember Out of memory
unsigned long _fInProtected :1; //@cmember if in EN_PROTECTED not.
};
#endif // _CALLMGR_H