Module: wine Branch: master Commit: 584175bedf655b3cb719c294f9198d7ab34b9777 URL: http://source.winehq.org/git/wine.git/?a=commit;h=584175bedf655b3cb719c294f9...
Author: Aric Stewart aric@codeweavers.com Date: Wed Jun 3 11:27:31 2009 -0500
msctf: Implement ITfContext::SetSelection.
---
dlls/msctf/context.c | 34 ++++++++++++++++++++++++++++++++-- dlls/msctf/msctf_internal.h | 1 + dlls/msctf/range.c | 16 ++++++++++++++++ dlls/msctf/tests/inputprocessor.c | 18 +++++++++++++++++- 4 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c index d8322e6..be1ee2d 100644 --- a/dlls/msctf/context.c +++ b/dlls/msctf/context.c @@ -349,9 +349,39 @@ 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); - return E_NOTIMPL; + 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, diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h index 9181b8c..f88516b 100644 --- a/dlls/msctf/msctf_internal.h +++ b/dlls/msctf/msctf_internal.h @@ -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); diff --git a/dlls/msctf/range.c b/dlls/msctf/range.c index dd92551..8b1f482 100644 --- a/dlls/msctf/range.c +++ b/dlls/msctf/range.c @@ -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; +} diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c index 284980e..c4be695 100644 --- a/dlls/msctf/tests/inputprocessor.c +++ b/dlls/msctf/tests/inputprocessor.c @@ -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;