Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
4.6 KiB

//
// tes.cpp
//
#include "private.h"
#include "tes.h"
#include "helpers.h"
//////////////////////////////////////////////////////////////////////////////
//
// CTextEventSink
//
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// IUnknown
//
//----------------------------------------------------------------------------
STDAPI CTextEventSink::QueryInterface(REFIID riid, void **ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_ITfTextEditSink))
{
*ppvObj = SAFECAST(this, ITfTextEditSink *);
}
else if (IsEqualIID(riid, IID_ITfTextLayoutSink))
{
*ppvObj = SAFECAST(this, ITfTextLayoutSink *);
}
if (*ppvObj)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDAPI_(ULONG) CTextEventSink::AddRef()
{
return ++_cRef;
}
STDAPI_(ULONG) CTextEventSink::Release()
{
long cr;
cr = --_cRef;
Assert(cr >= 0);
if (cr == 0)
{
delete this;
}
return cr;
}
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CTextEventSink::CTextEventSink(TESCALLBACK pfnCallback, void *pv)
{
Dbg_MemSetThisName(TEXT("CTextEventSink"));
_cRef = 1;
_dwEditCookie = TES_INVALID_COOKIE;
_dwLayoutCookie = TES_INVALID_COOKIE;
_pfnCallback = pfnCallback;
_pv = pv;
}
//+---------------------------------------------------------------------------
//
// EndEdit
//
//----------------------------------------------------------------------------
STDAPI CTextEventSink::OnEndEdit(ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord)
{
TESENDEDIT ee;
ee.ecReadOnly = ecReadOnly;
ee.pEditRecord = pEditRecord;
ee.pic = pic;
return _pfnCallback(ICF_TEXTDELTA, _pv, &ee);
}
//+---------------------------------------------------------------------------
//
// OnLayoutChange
//
//----------------------------------------------------------------------------
STDAPI CTextEventSink::OnLayoutChange(ITfContext *pic, TfLayoutCode lcode, ITfContextView *pView)
{
UINT uCode;
switch (lcode)
{
case TF_LC_CREATE:
uCode = ICF_LAYOUTDELTA_CREATE;
break;
case TF_LC_CHANGE:
uCode = ICF_LAYOUTDELTA;
break;
case TF_LC_DESTROY:
uCode = ICF_LAYOUTDELTA_DESTROY;
break;
default:
Assert(0); // no other codes defined
return E_INVALIDARG;
}
return _pfnCallback(uCode, _pv, pView);
}
//+---------------------------------------------------------------------------
//
// CTextEventSink::Advise
//
//----------------------------------------------------------------------------
HRESULT CTextEventSink::_Advise(ITfContext *pic, DWORD dwFlags)
{
HRESULT hr;
ITfSource *source = NULL;
_pic = NULL;
hr = E_FAIL;
_dwFlags = dwFlags;
if (FAILED(pic->QueryInterface(IID_ITfSource, (void **)&source)))
goto Exit;
if (dwFlags & ICF_TEXTDELTA)
{
if (FAILED(source->AdviseSink(IID_ITfTextEditSink, (ITfTextEditSink *)this, &_dwEditCookie)))
goto Exit;
}
if (dwFlags & ICF_LAYOUTDELTA)
{
if (FAILED(source->AdviseSink(IID_ITfTextLayoutSink, (ITfTextLayoutSink *)this, &_dwLayoutCookie)))
{
source->UnadviseSink(_dwEditCookie);
goto Exit;
}
}
_pic = pic;
_pic->AddRef();
hr = S_OK;
Exit:
SafeRelease(source);
return hr;
}
//+---------------------------------------------------------------------------
//
// CTextEventSink::Unadvise
//
//----------------------------------------------------------------------------
HRESULT CTextEventSink::_Unadvise()
{
HRESULT hr;
BOOL f;
ITfSource *source = NULL;
hr = E_FAIL;
if (_pic == NULL)
goto Exit;
if (FAILED(_pic->QueryInterface(IID_ITfSource, (void **)&source)))
goto Exit;
f = TRUE;
if (_dwFlags & ICF_TEXTDELTA)
{
f = SUCCEEDED(source->UnadviseSink(_dwEditCookie));
}
if (_dwFlags & ICF_LAYOUTDELTA)
{
f &= SUCCEEDED(source->UnadviseSink(_dwLayoutCookie));
}
if (!f)
goto Exit;
hr = S_OK;
Exit:
SafeRelease(source);
SafeReleaseClear(_pic);
return hr;
}