|
|
//
// des.cpp
//
// CThreadMgrEventSink
//
#include "private.h"
#include "timsink.h"
#include "helpers.h"
//+---------------------------------------------------------------------------
//
// IUnknown
//
//----------------------------------------------------------------------------
STDAPI CThreadMgrEventSink::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfThreadMgrEventSink)) { *ppvObj = this; }
if (*ppvObj) { AddRef(); return S_OK; }
return E_NOINTERFACE; }
STDAPI_(ULONG) CThreadMgrEventSink::AddRef() { return ++_cRef; }
STDAPI_(ULONG) CThreadMgrEventSink::Release() { _cRef--; Assert(_cRef >= 0);
if (_cRef == 0) { delete this; return 0; }
return _cRef; }
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CThreadMgrEventSink::CThreadMgrEventSink(DIMCALLBACK pfnDIMCallback, ICCALLBACK pfnICCallback, void *pv) { Dbg_MemSetThisName(TEXT("CThreadMgrEventSink"));
_pfnDIMCallback = pfnDIMCallback; _pfnICCallback = pfnICCallback; _pv = pv;
_cRef = 1; }
//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CThreadMgrEventSink::~CThreadMgrEventSink() { }
//+---------------------------------------------------------------------------
//
// OnInitDocumentMgr
//
//----------------------------------------------------------------------------
STDAPI CThreadMgrEventSink::OnInitDocumentMgr(ITfDocumentMgr *dim) { if (!_pfnDIMCallback) return S_OK;
return _pfnDIMCallback(TIM_CODE_INITDIM, dim, NULL, _pv); }
//+---------------------------------------------------------------------------
//
// UninitializeDocumentMgr
//
//----------------------------------------------------------------------------
STDAPI CThreadMgrEventSink::OnUninitDocumentMgr(ITfDocumentMgr *dim) { if (!_pfnDIMCallback) return S_OK;
return _pfnDIMCallback(TIM_CODE_UNINITDIM, dim, NULL, _pv); }
//+---------------------------------------------------------------------------
//
// OnSetFocus
//
//----------------------------------------------------------------------------
STDAPI CThreadMgrEventSink::OnSetFocus(ITfDocumentMgr *dimFocus, ITfDocumentMgr *dimPrevFocus) { if (!_pfnDIMCallback) return S_OK;
return _pfnDIMCallback(TIM_CODE_SETFOCUS, dimFocus, dimPrevFocus, _pv); }
//+---------------------------------------------------------------------------
//
// OnPushContext
//
//----------------------------------------------------------------------------
STDAPI CThreadMgrEventSink::OnPushContext(ITfContext *pic) { if (!_pfnICCallback) return S_OK;
return _pfnICCallback(TIM_CODE_INITIC, pic, _pv); }
//+---------------------------------------------------------------------------
//
// OnPopDocumentMgr
//
//----------------------------------------------------------------------------
STDAPI CThreadMgrEventSink::OnPopContext(ITfContext *pic) { if (!_pfnICCallback) return S_OK;
return _pfnICCallback(TIM_CODE_UNINITIC, pic, _pv); }
//+---------------------------------------------------------------------------
//
// Advise
//
//----------------------------------------------------------------------------
HRESULT CThreadMgrEventSink::_Advise(ITfThreadMgr *tim) { HRESULT hr; ITfSource *source = NULL;
_tim = NULL; hr = E_FAIL;
if (tim->QueryInterface(IID_ITfSource, (void **)&source) != S_OK) goto Exit;
if (source->AdviseSink(IID_ITfThreadMgrEventSink, this, &_dwCookie) != S_OK) goto Exit;
_tim = tim; _tim->AddRef();
hr = S_OK;
Exit: SafeRelease(source); return hr; }
//+---------------------------------------------------------------------------
//
// Unadvise
//
//----------------------------------------------------------------------------
HRESULT CThreadMgrEventSink::_Unadvise() { HRESULT hr; ITfSource *source = NULL;
hr = E_FAIL;
if (_tim == NULL) goto Exit;
if (_tim->QueryInterface(IID_ITfSource, (void **)&source) != S_OK) goto Exit;
if (source->UnadviseSink(_dwCookie) != S_OK) goto Exit;
hr = S_OK;
Exit: SafeRelease(source); SafeReleaseClear(_tim); return hr; }
//+---------------------------------------------------------------------------
//
// InitDIMs
//
// This is a simple helper function to enumerate DIMs and ICs.
// When the tips is activated, it can call this method to call callbacks
// for exsiting DIMs and ICs.
//
//----------------------------------------------------------------------------
HRESULT CThreadMgrEventSink::_InitDIMs(BOOL fInit) { IEnumTfDocumentMgrs *pEnumDim = NULL; ITfDocumentMgr *pdim = NULL; ITfDocumentMgr *pdimFocus = NULL;
if (FAILED(_tim->GetFocus(&pdimFocus))) goto Exit;
if (_tim->EnumDocumentMgrs(&pEnumDim) != S_OK) goto Exit;
if (fInit) { while (pEnumDim->Next(1, &pdim, NULL) == S_OK) { if (_pfnDIMCallback) _pfnDIMCallback(TIM_CODE_INITDIM, pdim, NULL, _pv);
if (_pfnICCallback) { IEnumTfContexts *pEnumIc = NULL; if (SUCCEEDED(pdim->EnumContexts(&pEnumIc))) { ITfContext *pic = NULL; while (pEnumIc->Next(1, &pic, NULL) == S_OK) { _pfnICCallback(TIM_CODE_INITIC, pic, _pv); pic->Release(); } pEnumIc->Release(); } }
if (_pfnDIMCallback && (pdim == pdimFocus)) { _pfnDIMCallback(TIM_CODE_SETFOCUS, pdim, NULL, _pv); }
pdim->Release(); } } else { while (pEnumDim->Next(1, &pdim, NULL) == S_OK) { if (_pfnDIMCallback && (pdim == pdimFocus)) { _pfnDIMCallback(TIM_CODE_SETFOCUS, NULL, pdim, _pv); }
if (_pfnICCallback) { IEnumTfContexts *pEnumIc = NULL; if (SUCCEEDED(pdim->EnumContexts(&pEnumIc))) { ITfContext *pic = NULL; while (pEnumIc->Next(1, &pic, NULL) == S_OK) { _pfnICCallback(TIM_CODE_UNINITIC, pic, _pv); pic->Release(); } pEnumIc->Release(); } }
if (_pfnDIMCallback) _pfnDIMCallback(TIM_CODE_UNINITDIM, pdim, NULL, _pv);
pdim->Release(); } }
Exit: SafeRelease(pEnumDim); SafeRelease(pdimFocus); return S_OK; }
|