msctf: Implement ITfContext::SetSelection.

This commit is contained in:
Aric Stewart 2009-06-03 11:27:31 -05:00 committed by Alexandre Julliard
parent 432db51ac3
commit 584175bedf
4 changed files with 66 additions and 3 deletions

View File

@ -349,11 +349,41 @@ static HRESULT WINAPI Context_GetSelection (ITfContext *iface,
static HRESULT WINAPI Context_SetSelection (ITfContext *iface,
TfEditCookie ec, ULONG ulCount, const TF_SELECTION *pSelection)
{
TS_SELECTION_ACP *acp;
Context *This = (Context *)iface;
FIXME("STUB:(%p)\n",This);
INT i;
HRESULT hr;
TRACE("(%p) %i %i %p\n",This,ec,ulCount,pSelection);
if (!This->pITextStoreACP)
{
FIXME("Context does not have a ITextStoreACP\n");
return E_NOTIMPL;
}
if (get_Cookie_magic(ec)!=COOKIE_MAGIC_EDITCOOKIE)
return TF_E_NOLOCK;
acp = HeapAlloc(GetProcessHeap(), 0, sizeof(TS_SELECTION_ACP) * ulCount);
if (!acp)
return E_OUTOFMEMORY;
for (i = 0; i < ulCount; i++)
if (FAILED(TF_SELECTION_to_TS_SELECTION_ACP(&pSelection[i], &acp[i])))
{
TRACE("Selection Conversion Failed\n");
HeapFree(GetProcessHeap(), 0 , acp);
return E_FAIL;
}
hr = ITextStoreACP_SetSelection(This->pITextStoreACP, ulCount, acp);
HeapFree(GetProcessHeap(), 0, acp);
return hr;
}
static HRESULT WINAPI Context_GetStart (ITfContext *iface,
TfEditCookie ec, ITfRange **ppStart)
{

View File

@ -39,6 +39,7 @@ extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore,
extern HRESULT Context_Initialize(ITfContext *cxt);
extern HRESULT Context_Uninitialize(ITfContext *cxt);
extern HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp);
/* cookie function */
extern DWORD generate_Cookie(DWORD magic, LPVOID data);

View File

@ -344,3 +344,19 @@ HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD l
return S_OK;
}
/* Internal conversion functions */
HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp)
{
Range *This = (Range *)tf->range;
if (!tf || !tsAcp || !tf->range)
return E_INVALIDARG;
tsAcp->acpStart = This->anchorStart;
tsAcp->acpEnd = This->anchorEnd;
tsAcp->style.ase = tf->style.ase;
tsAcp->style.fInterimChar = tf->style.fInterimChar;
return S_OK;
}

View File

@ -64,6 +64,7 @@ static INT test_ACP_GetEndACP = SINK_UNEXPECTED;
static INT test_ACP_GetSelection = SINK_UNEXPECTED;
static INT test_DoEditSession = SINK_UNEXPECTED;
static INT test_ACP_InsertTextAtSelection = SINK_UNEXPECTED;
static INT test_ACP_SetSelection = SINK_UNEXPECTED;
/**********************************************************************
@ -177,7 +178,8 @@ static HRESULT WINAPI TextStoreACP_GetSelection(ITextStoreACP *iface,
static HRESULT WINAPI TextStoreACP_SetSelection(ITextStoreACP *iface,
ULONG ulCount, const TS_SELECTION_ACP *pSelection)
{
trace("\n");
ok(test_ACP_SetSelection == SINK_EXPECTED,"Unexpected TextStoreACP_SetSelection\n");
test_ACP_SetSelection = SINK_FIRED;
return S_OK;
}
static HRESULT WINAPI TextStoreACP_GetText(ITextStoreACP *iface,
@ -1449,6 +1451,20 @@ TfEditCookie ec)
test_InsertAtSelection(ec, cxt);
test_ACP_GetEndACP = SINK_EXPECTED;
hr = ITfContext_GetEnd(cxt,ec,&range);
ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr);
ok(range != NULL,"Range set to NULL\n");
ok(test_ACP_GetEndACP == SINK_FIRED, "GetEndACP not fired as expected\n");
selection.range = range;
selection.style.ase = TF_AE_NONE;
selection.style.fInterimChar = FALSE;
test_ACP_SetSelection = SINK_EXPECTED;
hr = ITfContext_SetSelection(cxt, ec, 1, &selection);
ok(test_ACP_SetSelection == SINK_FIRED, "SetSelection not fired as expected\n");
ITfRange_Release(range);
ITfContext_Release(cxt);
ITfDocumentMgr_Release(dm);
return 0xdeadcafe;