141 lines
3.9 KiB
C++
141 lines
3.9 KiB
C++
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (C) 2003 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// ThreadMgrEventSink.cpp
|
|
//
|
|
// ITfThreadMgrEventSink implementation.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Globals.h"
|
|
#include "TextService.h"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnInitDocumentMgr
|
|
//
|
|
// Sink called by the framework just before the first context is pushed onto
|
|
// a document.
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CTextService::OnInitDocumentMgr(ITfDocumentMgr *pDocMgr)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnUninitDocumentMgr
|
|
//
|
|
// Sink called by the framework just after the last context is popped off a
|
|
// document.
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CTextService::OnUninitDocumentMgr(ITfDocumentMgr *pDocMgr)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnSetFocus
|
|
//
|
|
// Sink called by the framework when focus changes from one document to
|
|
// another. Either document may be NULL, meaning previously there was no
|
|
// focus document, or now no document holds the input focus.
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CTextService::OnSetFocus(ITfDocumentMgr *pDocMgrFocus, ITfDocumentMgr *pDocMgrPrevFocus)
|
|
{
|
|
//
|
|
// Whenever focus is changed, we initialize the TextEditSink.
|
|
//
|
|
_InitTextEditSink(pDocMgrFocus);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnPushContext
|
|
//
|
|
// Sink called by the framework when a context is pushed.
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CTextService::OnPushContext(ITfContext *pContext)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnPopContext
|
|
//
|
|
// Sink called by the framework when a context is popped.
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CTextService::OnPopContext(ITfContext *pContext)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _InitThreadMgrEventSink
|
|
//
|
|
// Advise our sink.
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CTextService::_InitThreadMgrEventSink()
|
|
{
|
|
ITfSource *pSource;
|
|
BOOL fRet;
|
|
|
|
if (_pThreadMgr->QueryInterface(IID_ITfSource, (void **)&pSource) != S_OK)
|
|
return FALSE;
|
|
|
|
fRet = FALSE;
|
|
|
|
if (pSource->AdviseSink(IID_ITfThreadMgrEventSink, (ITfThreadMgrEventSink *)this, &_dwThreadMgrEventSinkCookie) != S_OK)
|
|
{
|
|
// make sure we don't try to Unadvise _dwThreadMgrEventSinkCookie later
|
|
_dwThreadMgrEventSinkCookie = TF_INVALID_COOKIE;
|
|
goto Exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
|
|
Exit:
|
|
pSource->Release();
|
|
return fRet;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _UninitThreadMgrEventSink
|
|
//
|
|
// Unadvise our sink.
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CTextService::_UninitThreadMgrEventSink()
|
|
{
|
|
ITfSource *pSource;
|
|
|
|
if (_dwThreadMgrEventSinkCookie == TF_INVALID_COOKIE)
|
|
return; // never Advised
|
|
|
|
if (_pThreadMgr->QueryInterface(IID_ITfSource, (void **)&pSource) == S_OK)
|
|
{
|
|
pSource->UnadviseSink(_dwThreadMgrEventSinkCookie);
|
|
pSource->Release();
|
|
}
|
|
|
|
_dwThreadMgrEventSinkCookie = TF_INVALID_COOKIE;
|
|
}
|