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.
537 lines
14 KiB
537 lines
14 KiB
//
|
|
//
|
|
// Sapilayr Edit Sessions implementation.
|
|
//
|
|
//
|
|
#include "private.h"
|
|
#include "sapilayr.h"
|
|
|
|
//
|
|
// CEditSessionBase
|
|
//
|
|
|
|
CEditSessionBase::CEditSessionBase(ITfContext *pContext)
|
|
{
|
|
_cRef = 1;
|
|
m_cpic = pContext;
|
|
m_pData = NULL;
|
|
m_lData1 = 0;
|
|
m_lData2 = 0;
|
|
m_fBool = FALSE;
|
|
m_lRetData = 0;
|
|
}
|
|
|
|
|
|
CEditSessionBase::~CEditSessionBase()
|
|
{
|
|
if (m_pData)
|
|
cicMemFree(m_pData);
|
|
}
|
|
|
|
// IUnknown
|
|
HRESULT CEditSessionBase::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
if (ppvObj == NULL)
|
|
return E_INVALIDARG;
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfEditSession))
|
|
{
|
|
*ppvObj = SAFECAST(this, CEditSessionBase *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CEditSessionBase::AddRef(void)
|
|
{
|
|
return ++_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CEditSessionBase::Release(void)
|
|
{
|
|
LONG cr = --_cRef;
|
|
|
|
Assert(_cRef >= 0);
|
|
|
|
if (_cRef == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cr;
|
|
}
|
|
|
|
//
|
|
// Set input data memeber and m_idEditSession.
|
|
//
|
|
HRESULT CEditSessionBase::_SetEditSessionData(UINT idEditSession, void *pData, UINT uByte, LONG_PTR lData1, LONG_PTR lData2, BOOL fBool)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( uByte )
|
|
{
|
|
m_pData = cicMemAlloc(uByte);
|
|
|
|
if ( m_pData )
|
|
{
|
|
if ( pData )
|
|
memcpy(m_pData, pData, uByte);
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
if ( hr == S_OK )
|
|
{
|
|
m_idEditSession = idEditSession;
|
|
m_lData1 = lData1;
|
|
m_lData2 = lData2;
|
|
m_fBool = fBool;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//
|
|
// CSapiEditSession
|
|
//
|
|
//
|
|
CSapiEditSession::CSapiEditSession(CSapiIMX *pimx, ITfContext *pContext) : CEditSessionBase(pContext)
|
|
{
|
|
m_pimx = pimx;
|
|
pimx->AddRef( );
|
|
}
|
|
|
|
CSapiEditSession::~CSapiEditSession( )
|
|
{
|
|
m_pimx->Release( );
|
|
}
|
|
|
|
//
|
|
// Do the real Edit Session handling for CSapiIMX
|
|
//
|
|
HRESULT CSapiEditSession::DoEditSession(TfEditCookie ec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(m_pimx);
|
|
|
|
switch(m_idEditSession)
|
|
{
|
|
case ESCB_FINALIZECOMP:
|
|
hr = m_pimx->_KillFocusRange(ec, m_cpic, NULL, m_pimx->_GetId( ) );
|
|
break;
|
|
|
|
case ESCB_FINALIZE_ALL_COMPS :
|
|
hr = m_pimx->_FinalizeAllCompositions(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_FEEDBACKUI:
|
|
|
|
hr = m_pimx->_AddFeedbackUI(ec, m_pimx->IsFocusFullAware(m_pimx->_tim)
|
|
? DA_COLOR_AWARE : DA_COLOR_UNAWARE,
|
|
(LONG)_GetData1( ));
|
|
|
|
break;
|
|
|
|
case ESCB_KILLFEEDBACKUI:
|
|
hr = m_pimx->_KillFeedbackUI(ec, m_cpic, _GetRange( ));
|
|
break;
|
|
|
|
case ESCB_DETECTFEEDBACKUI:
|
|
hr = m_pimx->_DetectFeedbackUI(ec, m_cpic, _GetRange( ));
|
|
break;
|
|
|
|
case ESCB_KILLLASTPHRASE:
|
|
hr = m_pimx->_KillLastPhrase(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_FEEDCURRENTIP:
|
|
hr = m_pimx->_InternalFeedCurrentIPtoSR(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_PROCESSCONTROLKEY:
|
|
hr = m_pimx->_ProcessControlKeys(ec, m_cpic, (WCHAR *)_GetPtrData( ), (ULONG)_GetData1( ), (LANGID)_GetData2( ));
|
|
break;
|
|
case ESCB_PROCESS_EDIT_COMMAND :
|
|
hr = m_pimx->_ProcessEditCommands(ec, m_cpic, (ULONG)_GetData1( ));
|
|
break;
|
|
|
|
case ESCB_PROCESS_SPELL_THAT :
|
|
hr = m_pimx->_ProcessSpellThat(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_PROCESS_SPELL_IT :
|
|
hr = m_pimx->_ProcessSpellIt(ec, m_cpic, (WCHAR *)_GetPtrData( ), (LANGID)_GetData1( ));
|
|
break;
|
|
|
|
case ESCB_TTS_PLAY :
|
|
hr = m_pimx->_TtsPlay(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_PROCESS_CAP_COMMANDS :
|
|
if ( m_pimx->GetCapCmdHandler( ))
|
|
{
|
|
CCapCmdHandler *pCapCmdHandler;
|
|
|
|
pCapCmdHandler = m_pimx->GetCapCmdHandler( );
|
|
|
|
hr = pCapCmdHandler->_ProcessCapCommands(ec,
|
|
m_cpic,
|
|
(CAPCOMMAND_ID)_GetData1( ),
|
|
(WCHAR *)_GetPtrData( ),
|
|
(ULONG)_GetData2( )
|
|
);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
case ESCB_SETREPSELECTION:
|
|
// Set the selection which covers the parent phrase range to be replaced by an alternate.
|
|
if (m_cpic && _GetRange( ))
|
|
{
|
|
// adjust selection based on the length of the alternates and the start position in the parent phrase.
|
|
hr = m_pimx->_SetReplaceSelection(ec, m_cpic, _GetRange( ), (ULONG)_GetData1( ), (ULONG)_GetData2( ));
|
|
}
|
|
break;
|
|
|
|
case ESCB_PROCESS_ALTERNATE_TEXT:
|
|
// We have already set the right selection before this function is called.
|
|
hr = m_pimx->_ProcessAlternateText(ec,(WCHAR *)_GetPtrData( ),(LANGID)_GetData1( ), m_cpic, _GetBool( ));
|
|
break;
|
|
|
|
case ESCB_RESTORE_CORRECT_ORGIP :
|
|
hr = m_pimx->_RestoreCorrectOrgIP(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_PROCESSTEXT:
|
|
hr = m_pimx->_ProcessText(ec, (WCHAR *)_GetPtrData( ), (LANGID)_GetData1( ), m_cpic);
|
|
|
|
break;
|
|
|
|
/* we don't use this editsession, it is replaced by ESCB_INJECT_SPELL_TEXT
|
|
case ESCB_PROCESSTEXT_NO_OWNERID:
|
|
if (m_cpic)
|
|
{
|
|
hr = m_pimx->_ProcessTextInternal(ec,
|
|
(WCHAR *)_GetPtrData( ), GUID_ATTR_SAPI_INPUT,
|
|
(LANGID)_GetData1( ), m_cpic,
|
|
FALSE, TRUE);
|
|
}
|
|
break;
|
|
*/
|
|
|
|
case ESCB_INJECT_SPELL_TEXT :
|
|
hr = m_pimx->_ProcessSpelledText(ec, m_cpic, (WCHAR *)_GetPtrData( ), (LANGID)_GetData1( ), _GetBool());
|
|
break;
|
|
|
|
case ESCB_PROCESS_MODEBIAS_TEXT :
|
|
hr = m_pimx->_ProcessModebiasText(ec, (WCHAR *)_GetPtrData( ), (LANGID)_GetData1( ), m_cpic);
|
|
break;
|
|
|
|
case ESCB_ATTACHRECORESULTOBJ:
|
|
|
|
// m_cpunk contains the pointer to ISpRecoResult object
|
|
hr = m_pimx->_ProcessRecoObject(ec, (ISpRecoResult *)_GetUnk( ), (ULONG)_GetData1( ), (ULONG)_GetData2( ));
|
|
break;
|
|
|
|
case ESCB_HANDLESPACES:
|
|
if (_GetRange( ) && m_cpic)
|
|
hr = m_pimx->_ProcessSpaces( ec,
|
|
m_cpic,
|
|
_GetRange( ),
|
|
_GetBool( ),
|
|
(ULONG)_GetData2( ),
|
|
(LANGID)_GetData1( ));
|
|
break;
|
|
|
|
case ESCB_COMPLETE:
|
|
hr = m_pimx->MakeResultString(ec, m_cpic, _GetRange( ), m_pimx->_tid, m_pimx->m_pCSpTask);
|
|
break;
|
|
|
|
case ESCB_ABORT:
|
|
hr = m_pimx->AbortString(ec, m_cpic, m_pimx->m_pCSpTask);
|
|
break;
|
|
|
|
case ESCB_RECONV_ONIP:
|
|
hr = m_pimx->_CorrectThat(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_UPDATEFILTERSTR:
|
|
hr = m_pimx->_SetFilteringString(ec, (ITfCandidateUI *)_GetUnk( ), m_cpic);
|
|
break;
|
|
|
|
case ESCB_SYNCMBWITHSEL:
|
|
hr = m_pimx->_SyncModeBiasWithSelectionCallback(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_GETRANGETEXT:
|
|
|
|
WCHAR *pText;
|
|
ULONG ulSize;
|
|
|
|
pText = (WCHAR *)_GetPtrData( );
|
|
ulSize = (ULONG)_GetData2( );
|
|
|
|
hr = _GetRange( )->GetText(ec, (ULONG)_GetData1( ), pText, ulSize, (ULONG *)&m_lRetData);
|
|
break;
|
|
|
|
case ESCB_ISRANGEEMPTY:
|
|
hr = _GetRange( )->IsEmpty(ec, (BOOL *)&m_lRetData);
|
|
break;
|
|
|
|
case ESCB_HANDLE_ADDDELETE_WORD:
|
|
hr = m_pimx->_HandleAddDeleteWord(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_HANDLE_LEARNFROMDOC:
|
|
hr = m_pimx->_HandleLearnFromDoc(ec, m_cpic, (ITfDocumentMgr *)_GetUnk( ));
|
|
break;
|
|
|
|
case ESCB_LEARNDOC_NEXTRANGE:
|
|
hr = m_pimx->_HandleNextRange(ec, (ULONG)_GetData1( ));
|
|
break;
|
|
|
|
case ESCB_HANDLERECOGNITION:
|
|
m_pimx->_HandleRecognition((ISpRecoResult *)_GetUnk( ), m_cpic, ec);
|
|
break;
|
|
|
|
case ESCB_HANDLEHYPOTHESIS:
|
|
m_pimx->_HandleHypothesis((ISpRecoResult *)_GetUnk( ), m_cpic, ec);
|
|
break;
|
|
|
|
case ESCB_SAVECURIP_ADDDELETEUI:
|
|
hr = m_pimx->_SaveCurIPAndHandleAddDeleteUI(ec, m_cpic);
|
|
break;
|
|
|
|
case ESCB_HANDLE_MOUSESINK:
|
|
|
|
hr = m_pimx->_HandleMouseSink(ec, (ULONG)_GetData1(), (ULONG)_GetData2(), _GetBool());
|
|
break;
|
|
|
|
default:
|
|
Assert(0);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//
|
|
// CSelWordEditSession
|
|
//
|
|
CSelWordEditSession::CSelWordEditSession(CSapiIMX *pimx, CSelectWord *pSelWord, ITfContext *pContext) : CSapiEditSession(pimx, pContext)
|
|
{
|
|
m_pSelWord = pSelWord;
|
|
}
|
|
|
|
CSelWordEditSession::~CSelWordEditSession( )
|
|
{
|
|
}
|
|
|
|
//
|
|
// Real Edit Session handling for Selection related commands.
|
|
//
|
|
HRESULT CSelWordEditSession::DoEditSession(TfEditCookie ec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(m_pSelWord);
|
|
|
|
switch(m_idEditSession)
|
|
{
|
|
case ESCB_UPDATE_TEXT_BUFFER :
|
|
hr = m_pSelWord->_UpdateTextBuffer(ec, m_cpic, (ISpRecoContext *)_GetUnk(), (ISpRecoGrammar *)_GetUnk2() );
|
|
break;
|
|
|
|
case ESCB_PROCESSSELECTWORD :
|
|
hr = m_pSelWord->_HandleSelectWord(ec, m_cpic, (WCHAR *)_GetPtrData( ),(ULONG)_GetData1( ),(SELECTWORD_OPERATION)_GetData2( ), (ULONG)_GetLenXXX( ) );
|
|
break;
|
|
|
|
default:
|
|
Assert(0);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// CPlayBackEditSession
|
|
//
|
|
//
|
|
CPlayBackEditSession::CPlayBackEditSession(CSapiPlayBack *pPlayBack, ITfContext *pContext) : CEditSessionBase(pContext)
|
|
{
|
|
m_pPlayBack = pPlayBack;
|
|
m_pPlayBack->AddRef( );
|
|
}
|
|
|
|
CPlayBackEditSession::~CPlayBackEditSession( )
|
|
{
|
|
m_pPlayBack->Release( );
|
|
}
|
|
|
|
//
|
|
// Real Edit Session handling for PlayBack.
|
|
//
|
|
HRESULT CPlayBackEditSession::DoEditSession(TfEditCookie ec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(m_pPlayBack);
|
|
|
|
switch(m_idEditSession)
|
|
{
|
|
case ESCB_PLAYBK_PLAYSND:
|
|
return m_pPlayBack->_PlaySound(ec, _GetRange( ) );
|
|
|
|
case ESCB_PLAYBK_PLAYSNDSELECTION:
|
|
return m_pPlayBack->_PlaySoundSelection(ec, m_cpic);
|
|
|
|
default:
|
|
Assert(0);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// CFnRecvEditSession
|
|
//
|
|
CFnRecvEditSession::CFnRecvEditSession(CFnReconversion *pFnRecv, ITfRange *pRange, ITfContext *pContext) : CEditSessionBase(pContext)
|
|
{
|
|
m_pFnRecv = pFnRecv;
|
|
m_pFnRecv->AddRef( );
|
|
_SetRange(pRange);
|
|
}
|
|
|
|
CFnRecvEditSession::~CFnRecvEditSession( )
|
|
{
|
|
m_pFnRecv->Release( );
|
|
}
|
|
|
|
//
|
|
// Real Edit Session for Reconvertion.
|
|
//
|
|
HRESULT CFnRecvEditSession::DoEditSession(TfEditCookie ec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(m_pFnRecv);
|
|
|
|
switch(m_idEditSession)
|
|
{
|
|
case ESCB_RECONV_QUERYRECONV:
|
|
return m_pFnRecv->_QueryReconversion(ec, m_cpic, _GetRange( ), (ITfRange **)&m_cpRetUnk);
|
|
|
|
case ESCB_RECONV_GETRECONV:
|
|
return m_pFnRecv->_GetReconversion(ec, m_cpic, _GetRange( ), (ITfCandidateList **)&m_cpRetUnk, TRUE);
|
|
|
|
case ESCB_RECONV_RECONV:
|
|
return m_pFnRecv->_Reconvert(ec, m_cpic, _GetRange( ), (BOOL *)&m_lRetData);
|
|
|
|
default:
|
|
Assert(0);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// CPSRecoEditSession
|
|
//
|
|
CPSRecoEditSession::CPSRecoEditSession(CPropStoreRecoResultObject *pPropStoreReco, ITfRange *pRange, ITfContext *pContext) : CEditSessionBase(pContext)
|
|
{
|
|
m_pPropStoreReco = pPropStoreReco;
|
|
m_pPropStoreReco->AddRef( );
|
|
_SetRange(pRange);
|
|
}
|
|
|
|
CPSRecoEditSession::~CPSRecoEditSession( )
|
|
{
|
|
m_pPropStoreReco->Release( );
|
|
}
|
|
|
|
//
|
|
// Real Edit Session handling for RecoResult Property Store
|
|
//
|
|
HRESULT CPSRecoEditSession::DoEditSession(TfEditCookie ec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(m_pPropStoreReco);
|
|
|
|
switch(m_idEditSession)
|
|
{
|
|
case ESCB_PROP_DIVIDE:
|
|
hr = m_pPropStoreReco->_Divide(ec,_GetRange( ),(ITfRange *)_GetUnk( ),(ITfPropertyStore **)&m_cpRetUnk);
|
|
break;
|
|
|
|
case ESCB_PROP_SHRINK:
|
|
hr = m_pPropStoreReco->_Shrink(ec,_GetRange( ), (BOOL *)&m_lRetData);
|
|
break;
|
|
|
|
case ESCB_PROP_TEXTUPDATE:
|
|
hr = m_pPropStoreReco->_OnTextUpdated(ec, (DWORD)_GetData1( ), _GetRange( ), (BOOL *)&m_lRetData);
|
|
|
|
break;
|
|
|
|
default:
|
|
Assert(0);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// CPSLMEditSession
|
|
//
|
|
CPSLMEditSession::CPSLMEditSession(CPropStoreLMLattice *pPropStoreLM, ITfRange *pRange, ITfContext *pContext) : CEditSessionBase(pContext)
|
|
{
|
|
m_pPropStoreLM = pPropStoreLM;
|
|
m_pPropStoreLM->AddRef( );
|
|
_SetRange(pRange);
|
|
}
|
|
|
|
CPSLMEditSession::~CPSLMEditSession( )
|
|
{
|
|
m_pPropStoreLM->Release( );
|
|
}
|
|
|
|
//
|
|
// Real edit session for Language Model Property Store.
|
|
//
|
|
HRESULT CPSLMEditSession::DoEditSession(TfEditCookie ec)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Assert(m_pPropStoreLM);
|
|
|
|
switch(m_idEditSession)
|
|
{
|
|
case ESCB_PROP_DIVIDE:
|
|
hr = m_pPropStoreLM->_Divide(ec,_GetRange( ),(ITfRange *)_GetUnk( ), (ITfPropertyStore **)&m_cpRetUnk);
|
|
break;
|
|
|
|
default:
|
|
Assert(0);
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|