2025-11-28 00:35:46 +09:00

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;
}