99 lines
2.8 KiB
C++
99 lines
2.8 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) Microsoft Corporation. All rights reserved
|
|
|
|
#include "Private.h"
|
|
#include "Globals.h"
|
|
#include "EditSession.h"
|
|
#include "SampleIME.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ITfEditSession
|
|
// CEditSessionBase
|
|
// CEndCompositionEditSession class
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CEndCompositionEditSession
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CEndCompositionEditSession : public CEditSessionBase
|
|
{
|
|
public:
|
|
CEndCompositionEditSession(_In_ CSampleIME *pTextService, _In_ ITfContext *pContext) : CEditSessionBase(pTextService, pContext)
|
|
{
|
|
}
|
|
|
|
// ITfEditSession
|
|
STDMETHODIMP DoEditSession(TfEditCookie ec)
|
|
{
|
|
_pTextService->_TerminateComposition(ec, _pContext, TRUE);
|
|
return S_OK;
|
|
}
|
|
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CSampleIME class
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _TerminateComposition
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CSampleIME::_TerminateComposition(TfEditCookie ec, _In_ ITfContext *pContext, BOOL isCalledFromDeactivate)
|
|
{
|
|
isCalledFromDeactivate;
|
|
|
|
if (_pComposition != nullptr)
|
|
{
|
|
// remove the display attribute from the composition range.
|
|
_ClearCompositionDisplayAttributes(ec, pContext);
|
|
|
|
if (FAILED(_pComposition->EndComposition(ec)))
|
|
{
|
|
// if we fail to EndComposition, then we need to close the reverse reading window.
|
|
_DeleteCandidateList(TRUE, pContext);
|
|
}
|
|
|
|
_pComposition->Release();
|
|
_pComposition = nullptr;
|
|
|
|
if (_pContext)
|
|
{
|
|
_pContext->Release();
|
|
_pContext = nullptr;
|
|
}
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _EndComposition
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CSampleIME::_EndComposition(_In_opt_ ITfContext *pContext)
|
|
{
|
|
CEndCompositionEditSession *pEditSession = new (std::nothrow) CEndCompositionEditSession(this, pContext);
|
|
HRESULT hr = S_OK;
|
|
|
|
if (nullptr != pEditSession)
|
|
{
|
|
pContext->RequestEditSession(_tfClientId, pEditSession, TF_ES_ASYNCDONTCARE | TF_ES_READWRITE, &hr);
|
|
pEditSession->Release();
|
|
}
|
|
}
|
|
|