📄 antievt.cpp
字号:
}
/*
* CReplaceFormattingAE::~CReplaceFormattingAE
*
* @mfunc Destructor
*/
CReplaceFormattingAE::~CReplaceFormattingAE()
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CReplaceFormattingAE::~CReplaceFormattingAE");
IFormatCache *pf;
if( _fPara )
{
GetParaFormatCache((IParaFormatCache **)&pf);
}
else
{
GetCharFormatCache((ICharFormatCache **)&pf);
}
if( _prgRuns )
{
if( pf )
{
DWORD i;
for( i = 0; i < _cRuns; i++ )
{
pf->ReleaseFormat(_prgRuns[i]._iFormat);
}
}
delete _prgRuns;
}
}
//
// CReplaceObjectAE PUBLIC methods
//
/*
* CReplaceObjectAE::Destroy
*
* @mfunc Destroy's this object
*
* @rdesc void
*/
void CReplaceObjectAE::Destroy(void)
{
COleObject *pobj;
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CReplaceObjectAE::Destroy");
pobj = _pobj;
_pobj = NULL;
// we only need to zombie the object if it wasn't put back into
// the document.
if( !_fUndoInvoked )
{
pobj->MakeZombie();
}
pobj->Release();
CBaseAE::Destroy();
delete this;
}
/*
* CReplaceObjectAE::Undo
*
* @mfunc Undo'es the delete operation and restores the object
* to it's original state
*
* @rdesc void
*/
HRESULT CReplaceObjectAE::Undo(
CTxtEdit *ped, //@parm the edit context
IUndoBuilder *publdr) //@parm the undo/redo context
{
CObjectMgr *pobjmgr;
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CReplaceObjectAE::Undo");
pobjmgr = ped->GetObjectMgr();
if( _pobj && pobjmgr )
{
_fUndoInvoked = TRUE;
_pobj->Restore();
pobjmgr->RestoreObject(_pobj);
}
return CBaseAE::Undo(ped, publdr);
}
/*
* CReplaceObjectAE::OnCommit
*
* @mfunc called when the anti-event chain is committed to the
* undo stack. This gives us a chance to make 'dangerous'
* calls that could cause us to be re-entered.
*
* @rdesc void
*/
void CReplaceObjectAE::OnCommit(
CTxtEdit *ped) //@parm the edit context
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CReplaceObjectAE::OnCommit");
_pobj->Close(OLECLOSE_SAVEIFDIRTY);
}
//
// CReplaceObjectAE PRIVATE methods
//
/*
* CReplaceObjectAE::CReplaceObjectAE
*
* @mfunc constructor
*
* @rdesc void
*/
CReplaceObjectAE::CReplaceObjectAE(
COleObject *pobj) //@parm the object that was deleted
{
_fUndoInvoked = FALSE;
_pobj = pobj;
_pobj->AddRef();
}
/*
* CReplaceObjectAE::~CReplaceObjectAE
*
* @mfunc destructor
*
* @rdesc void
*/
CReplaceObjectAE::~CReplaceObjectAE(void)
{
Assert(_pobj == NULL);
}
//
// CResizeObjectAE PUBLIC methods
//
/*
* CResizeObjectAE::Destroy
*
* @mfunc Destroy's this object
*
* @rdesc void
*/
void CResizeObjectAE::Destroy(void)
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CResizeObjectAE::Destroy");
_pobj = NULL;
CBaseAE::Destroy();
delete this;
}
/*
* CResizeObjectAE::Undo
*
* @mfunc Undo'es the resize operation and restores the object
* to it's original size/position
*
* @rdesc void
*/
HRESULT CResizeObjectAE::Undo(
CTxtEdit *ped, //@parm the edit context
IUndoBuilder *publdr) //@parm the undo/redo context
{
CObjectMgr *pobjmgr;
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CReplaceObjectAE::Undo");
pobjmgr = ped->GetObjectMgr();
if( _pobj && pobjmgr )
{
_fUndoInvoked = TRUE;
_pobj->Resize(_rcPos);
}
return CBaseAE::Undo(ped, publdr);
}
/*
* CResizeObjectAE::OnCommit
*
* @mfunc called when the anti-event chain is committed to the
* undo stack. This gives us a chance to make 'dangerous'
* calls that could cause us to be re-entered.
*
* @rdesc void
*/
void CResizeObjectAE::OnCommit(
CTxtEdit *ped) //@parm the edit context
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CReplaceObjectAE::OnCommit");
}
//
// CResizeObjectAE PRIVATE methods
//
/*
* CResizeObjectAE::CResizeObjectAE
*
* @mfunc constructor
*
* @rdesc void
*/
CResizeObjectAE::CResizeObjectAE(
COleObject *pobj, //@parm the object that was resized
RECT rcPos) //@parm the old position/size rect
{
_fUndoInvoked = FALSE;
_pobj = pobj;
_rcPos = rcPos;
}
/*
* CResizeObjectAE::~CResizeObjectAE
*
* @mfunc destructor
*
* @rdesc void
*/
CResizeObjectAE::~CResizeObjectAE(void)
{
Assert(_pobj == NULL);
}
//
// CSelectionAE PUBLIC methods
//
/*
* CSelectionAE::Destroy
*
* @mfunc gets rid of this instance
*
* @rdesc void
*/
void CSelectionAE::Destroy(void)
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CSelectionAE::Destroy");
CBaseAE::Destroy();
delete this;
}
/*
* CSelectionAE::Undo
*
* @mfunc restore the selection to it's former position
*
* @rdesc NOERROR
*/
HRESULT CSelectionAE::Undo(
CTxtEdit *ped, //@parm the context for this undo operation
IUndoBuilder *publdr) //@parm the undo context
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CSelectionAE::Destroy");
CTxtSelection *psel = ped->GetSel();
if( psel )
{
psel->SetDelayedSelectionRange(_cp, _cch);
}
if( publdr )
{
IAntiEvent *pae;
pae = gAEDispenser.CreateSelectionAE(ped, _cpNext, _cchNext,
_cp, _cch);
if( pae )
{
publdr->AddAntiEvent(pae);
}
}
return CBaseAE::Undo(ped, publdr);
}
/*
* CSelectionAE::MergeData
*
* @mfunc merges new selection data
*
* @rdesc S_FALSE, NOERROR
*
* @comm The mergine algorithm is fairly tricky. There are basically two
* cases of interest: group typing and drag-move.
*
* In the group typing case, the "start" of the typing becomes a
* fixed reference from which characters are added or removed (i.e.
* you type or hit the backspace key). "Undo" should return you to
* that reference point; redo, on the other hand, should return the
* selection to the last insertion point. Thus, we only update
* _xxNext for the SELAE_MERGE action.
*
* Drag-Move is somewhat different; in this case, there are really
* two actions--the "paste" on the drop, and the subsequent "cut"
* operation. Thus, we need to be able to update the selection
* anti-event during the cut (since this only happens on move; not
* copies). This is accomplished with teh FORCEREPLACE flag
* and by setting fields to -1 to be ignored.
*
*/
HRESULT CSelectionAE::MergeData(
DWORD dwDataType, //@parm the type of data in <p pdata>
void *pdata) //@parm the merge data
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CSelectionAE::MergeData");
SelRange *psrg = (SelRange *)pdata;
if( dwDataType == MD_SELECTIONRANGE )
{
if( psrg->flags == SELAE_MERGE )
{
Assert(psrg->cpNext != -1);
_cpNext = psrg->cpNext;
_cchNext = psrg->cchNext;
}
else
{
// -1 is used a no-op, so we should ignore it
if( psrg->cp != -1 )
{
_cp = psrg->cp;
_cch = psrg->cch;
}
if( psrg->cpNext != -1 )
{
_cpNext = psrg->cpNext;
_cchNext = psrg->cchNext;
}
}
return NOERROR;
}
return S_FALSE;
}
//
// CSelectionAE PRIVATE methods
//
/*
* CSelectionAE::CSelectionAE
*
* @mfunc Constructor
*
* @rdesc void
*/
CSelectionAE::CSelectionAE(
LONG cp, //@parm the actve end cp
LONG cch, //@parm the signed extension
LONG cpNext, //@parm the cp to use for the AE of this AE
LONG cchNext) //@parm the cch for the AE of this AE
{
_cp = cp;
_cch = cch;
_cpNext = cpNext;
_cchNext = cchNext;
}
/*
* CSelectionAE::~CSelectionAE
*
* @mfunc desctructor
*/
CSelectionAE::~CSelectionAE()
{
;
}
/*
* CAntiEventDispenser::CreateReplaceRangeAE (cpMin, cpMax, ped)
*
* @mfunc
* creates an anti-event for a replace range operation
*/
IAntiEvent * CAntiEventDispenser::CreateReplaceRangeAE(
CTxtEdit *ped, //@parm edit context
DWORD cpMin, //@parm the cp starting the *final* range
DWORD cpMax, //@parm the cp ending the *final* range
DWORD cchDel, //@parm # of chars deleted during ReplaceRange
TCHAR *pchDel, //@parm the deleted characters. Ownership of
// the memory is transferred to this object.
IAntiEvent *paeCF, //@parm the anti-event for any character formatting
// replacement
IAntiEvent *paePF) //@parm the anti-event for any paragraph formatting
// replacement
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CAntiEventDispenser::CreateReplaceRangeAE");
// FUTURE (alexgo): improve the efficiency of this routine!!
IAntiEvent *pae;
pae = (IAntiEvent *)(new CReplaceRangeAE(cpMin, cpMax, cchDel, pchDel,
paeCF, paePF));
if( !pae )
{
// we don't need to do anything else; the callmgr will discard
// undo for us.
ped->GetCallMgr()->SetOutOfMemory();
}
return pae;
}
/*
* CAntiEventDispenser::CreateReplaceFormattingAE
*
* @mfunc Creates an anti-event for replacing formatting
*/
IAntiEvent * CAntiEventDispenser::CreateReplaceFormattingAE(
CTxtEdit *ped, //@parm the edit context
CFormatRunPtr &rp, //@parm the run pointer to start with
DWORD cch, //@parm the number of characters to
//find formatting info on
IFormatCache *pf, //@parm the format cache (to AddRef/
//Release formats)
BOOL fPara) //@parm If TRUE, the the formatting is
//for paragraphs
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN, "CAntiEventDispenser::CreateReplaceFormattingAE");
// FUTURE (alexgo): improve the efficiency of this routine!!!
IAntiEvent *pae;
pae = (IAntiEvent *)(new CReplaceFormattingAE(rp, cch, pf, fPara));
if( !pae )
{
// we don't need to do anything else; the callmgr will discard
// undo for us.
ped->GetCallMgr()->SetOutOfMemory();
}
return pae;
}
/*
* CAntiEventDispenser::CreateReplaceObjectAE
*
* @mfunc Creates an anti-event for replacing an object
*
* @rdesc the created anti-event
*/
IAntiEvent * CAntiEventDispenser::CreateReplaceObjectAE(
CTxtEdit *ped, //@parm the edit context.
COleObject *pobj) //@parm the object that was deleted
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN,
"CAntiEventDispenser::CreateReplaceObjectAE");
IAntiEvent *pae;
// always allocating is probably a reasonable strategy for objects;
// they are not expected to be the bread & butter case.
pae = (IAntiEvent *)(new CReplaceObjectAE(pobj));
if( !pae )
{
// we don't need to do anything else; the callmgr will discard
// undo for us.
ped->GetCallMgr()->SetOutOfMemory();
}
return pae;
}
/*
* CAntiEventDispenser::CreateResizeObjectAE
*
* @mfunc Creates an anti-event for resizing an object
*
* @rdesc the created anti-event
*/
IAntiEvent * CAntiEventDispenser::CreateResizeObjectAE(
CTxtEdit *ped, //@parm the edit context.
COleObject *pobj, //@parm the object that was resized
RECT rcPos) //@parm the old object position rectangle
{
TRACEBEGIN(TRCSUBSYSUNDO, TRCSCOPEINTERN,
"CAntiEventDispenser::CreateResizeeObjectAE");
IAntiEvent *pae;
// always allocating is probably a reasonable strategy for objects;
// they are not expected to be the bread & butter case.
pae = (IAntiEvent *)(new CResizeObjectAE(pobj, rcPos));
if( !pae )
{
// we don't need to do anything else; the callmgr will discard
// undo for us.
ped->GetCallMgr()->SetOutOfMemory();
}
return pae;
}
/*
* CAntiEventDispenser::CreateSelectionAE
*
* @mfunc Creates an anti-event for restoring a non-degenerate selection
*
* @rdesc the created anti-event
*/
IAntiEvent * CAntiEventDispenser::CreateSelectionAE(
CTxtEdit *ped, //@parm edit context
LONG cp, //@parm the active end of the selection
LONG cch, //@parm the signed extension
LONG cpNext, //@parm the cp to use for the AE of this AE
LONG cchNext) //@parm the cch to use for the AE
{
// FUTURE (alexgo): improve the efficiency of this routine
IAntiEvent *pae;
pae = (IAntiEvent *)(new CSelectionAE(cp, cch, cpNext, cchNext));
if( !pae )
{
// we don't need to do anything else; the callmgr will discard
// undo for us.
ped->GetCallMgr()->SetOutOfMemory();
}
return pae;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -