|
|
//
// cleanup.cpp
//
#include "private.h"
#include "cleanup.h"
class CCleanupContextsEditSession : public ITfEditSession { public: CCleanupContextsEditSession(ITfContext *pic, ICleanupContextsClient *pClient); ~CCleanupContextsEditSession();
//
// IUnknown methods
//
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void);
//
// ITfEditCallback
//
STDMETHODIMP DoEditSession(TfEditCookie ec);
private: ITfContext *_pic; ICleanupContextsClient *_pClient;
LONG _cRef; };
//+---------------------------------------------------------------------------
//
// CleanupAllCompositions
//
//----------------------------------------------------------------------------
BOOL CleanupAllCompositions(TfEditCookie ecWrite, ITfContext *pic, REFCLSID clsidOwner, CLEANUP_COMPOSITIONS_CALLBACK pfnCleanupCompositons, void *pvPrivate) { IEnumITfCompositionView *pEnum; ITfCompositionView *pCompositionView; ITfContextComposition *picc; ITfComposition *pComposition; ITfRange *range; CLSID clsid; HRESULT hr; BOOL fRet;
// find all the compositions with our _tid, in _pic
if (pic->QueryInterface(IID_ITfContextComposition, (void **)&picc) != S_OK) return FALSE;
fRet = FALSE;
if (picc->EnumCompositions(&pEnum) != S_OK) goto Exit;
while (pEnum->Next(1, &pCompositionView, NULL) == S_OK) { pCompositionView->GetOwnerClsid(&clsid);
// make sure we ignore other TIPs' compositions!
if (!IsEqualCLSID(clsid, clsidOwner)) goto NextComposition;
if (pCompositionView->QueryInterface(IID_ITfComposition, (void **)&pComposition) != S_OK) goto NextComposition;
hr = pComposition->GetRange(&range);
// notify cicero, app
pComposition->EndComposition(ecWrite);
if (hr == S_OK) { // notify tip
pfnCleanupCompositons(ecWrite, range, pvPrivate); range->Release(); }
pComposition->Release();
NextComposition: pCompositionView->Release(); }
pEnum->Release();
fRet = TRUE;
Exit: picc->Release();
return fRet; }
//+---------------------------------------------------------------------------
//
// CleanupAllContexts
//
//----------------------------------------------------------------------------
BOOL CleanupAllContexts(ITfThreadMgr *tim, TfClientId tid, ICleanupContextsClient *pClient) { IEnumTfDocumentMgrs *pEnumDm; ITfDocumentMgr *pDm; IEnumTfContexts *pEnumCtxt; ITfContext *pic; CCleanupContextsEditSession *pes; BOOL fInterested; HRESULT hr;
if (tim->EnumDocumentMgrs(&pEnumDm) != S_OK) return FALSE;
while (pEnumDm->Next(1, &pDm, NULL) == S_OK) { if (pDm->EnumContexts(&pEnumCtxt) != S_OK) goto NextDm;
while (pEnumCtxt->Next(1, &pic, NULL) == S_OK) { if (pClient->IsInterestedInContext(pic, &fInterested) != S_OK || !fInterested) goto NextIC;
if ((pes = new CCleanupContextsEditSession(pic, pClient)) == NULL) goto NextIC;
pic->RequestEditSession(tid, pes, TF_ES_READWRITE, &hr); Assert(SUCCEEDED(hr)); pes->Release();
NextIC: pic->Release(); }
pEnumCtxt->Release();
NextDm: pDm->Release(); }
pEnumDm->Release();
return TRUE; }
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CCleanupContextsEditSession::CCleanupContextsEditSession(ITfContext *pic, ICleanupContextsClient *pClient) { _pic = pic; _pic->AddRef();
_pClient = pClient; _pClient->AddRef();
_cRef = 1; }
//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CCleanupContextsEditSession::~CCleanupContextsEditSession() { _pic->Release(); _pClient->Release(); }
//+---------------------------------------------------------------------------
//
// IUnknown
//
//----------------------------------------------------------------------------
STDAPI CCleanupContextsEditSession::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfEditSession)) { *ppvObj = SAFECAST(this, CCleanupContextsEditSession *); }
if (*ppvObj) { AddRef(); return S_OK; }
return E_NOINTERFACE; }
STDAPI_(ULONG) CCleanupContextsEditSession::AddRef() { return ++_cRef; }
STDAPI_(ULONG) CCleanupContextsEditSession::Release() { long cr;
cr = --_cRef; Assert(cr >= 0);
if (cr == 0) { delete this; }
return cr; }
//+---------------------------------------------------------------------------
//
// DoEditSession
//
//----------------------------------------------------------------------------
STDAPI CCleanupContextsEditSession::DoEditSession(TfEditCookie ec) { _pClient->CleanupContext(ec, _pic);
return S_OK; }
|