From 13d6aa2bb72d9d90e239d6e3001948ed0e2f9be1 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Thu, 21 May 2009 13:45:57 -0500 Subject: [PATCH] msctf: Beginning implementation of ITfContext::GetSelection. --- dlls/msctf/context.c | 55 +++++++++++++++++++++++++++++-- dlls/msctf/tests/inputprocessor.c | 23 ++++++++++++- include/textstor.idl | 2 ++ 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c index 8c83798d244..8e14a722552 100644 --- a/dlls/msctf/context.c +++ b/dlls/msctf/context.c @@ -283,8 +283,59 @@ static HRESULT WINAPI Context_GetSelection (ITfContext *iface, TF_SELECTION *pSelection, ULONG *pcFetched) { Context *This = (Context *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + EditCookie *cookie; + ULONG count, i; + ULONG totalFetched = 0; + HRESULT hr = S_OK; + + if (!pSelection || !pcFetched) + return E_INVALIDARG; + + *pcFetched = 0; + + if (!This->connected) + return TF_E_DISCONNECTED; + + if (get_Cookie_magic(ec)!=COOKIE_MAGIC_EDITCOOKIE) + return TF_E_NOLOCK; + + if (!This->pITextStoreACP) + { + FIXME("Context does not have a ITextStoreACP\n"); + return E_NOTIMPL; + } + + cookie = get_Cookie_data(ec); + + if (ulIndex == TF_DEFAULT_SELECTION) + count = 1; + else + count = ulCount; + + for (i = 0; i < count; i++) + { + DWORD fetched; + TS_SELECTION_ACP acps; + + hr = ITextStoreACP_GetSelection(This->pITextStoreACP, ulIndex + i, + 1, &acps, &fetched); + + if (hr == TS_E_NOLOCK) + return TF_E_NOLOCK; + else if (SUCCEEDED(hr)) + { + pSelection[totalFetched].style.ase = acps.style.ase; + pSelection[totalFetched].style.fInterimChar = acps.style.fInterimChar; + Range_Constructor(iface, This->pITextStoreACP, cookie->lockType, acps.acpStart, acps.acpEnd, &pSelection[totalFetched].range); + totalFetched ++; + } + else + break; + } + + *pcFetched = totalFetched; + + return hr; } static HRESULT WINAPI Context_SetSelection (ITfContext *iface, diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c index f488e82af47..5884a30b728 100644 --- a/dlls/msctf/tests/inputprocessor.c +++ b/dlls/msctf/tests/inputprocessor.c @@ -58,6 +58,7 @@ static INT test_ACP_AdviseSink = SINK_UNEXPECTED; static INT test_ACP_GetStatus = SINK_UNEXPECTED; static INT test_ACP_RequestLock = SINK_UNEXPECTED; static INT test_ACP_GetEndACP = SINK_UNEXPECTED; +static INT test_ACP_GetSelection = SINK_UNEXPECTED; static INT test_DoEditSession = SINK_UNEXPECTED; @@ -171,7 +172,15 @@ static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, static HRESULT WINAPI TextStoreACP_GetSelection(ITextStoreACP *iface, ULONG ulIndex, ULONG ulCount, TS_SELECTION_ACP *pSelection, ULONG *pcFetched) { - trace("\n"); + ok(test_ACP_GetSelection == SINK_EXPECTED, "Unexpected TextStoreACP_GetSelection\n"); + test_ACP_GetSelection = SINK_FIRED; + + pSelection->acpStart = 10; + pSelection->acpEnd = 20; + pSelection->style.fInterimChar = 0; + pSelection->style.ase = TS_AE_NONE; + *pcFetched = 1; + return S_OK; } static HRESULT WINAPI TextStoreACP_SetSelection(ITextStoreACP *iface, @@ -1378,6 +1387,8 @@ TfEditCookie ec) ITfContext *cxt; ITfDocumentMgr *dm; ITfRange *range; + TF_SELECTION selection; + ULONG fetched; HRESULT hr; ok(test_DoEditSession == SINK_EXPECTED, "Unexpected DoEditSession\n"); @@ -1416,6 +1427,16 @@ TfEditCookie ec) ok(test_ACP_GetEndACP == SINK_FIRED, "GetEndACP not fired as expected\n"); ITfRange_Release(range); + + selection.range = NULL; + test_ACP_GetSelection = SINK_EXPECTED; + hr = ITfContext_GetSelection(cxt, ec, TF_DEFAULT_SELECTION, 1, &selection, &fetched); + ok(SUCCEEDED(hr),"ITfContext_GetSelection failed\n"); + ok(fetched == 1,"fetched incorrect\n"); + ok(selection.range != NULL,"NULL range\n"); + ok(test_ACP_GetSelection == SINK_FIRED," expected ACP_GetSepection not fired\n"); + ITfRange_Release(selection.range); + ITfContext_Release(cxt); ITfDocumentMgr_Release(dm); return 0xdeadcafe; diff --git a/include/textstor.idl b/include/textstor.idl index 262dc53464b..2e79e3c9bea 100644 --- a/include/textstor.idl +++ b/include/textstor.idl @@ -21,6 +21,8 @@ import "oaidl.idl"; #endif cpp_quote("#define TS_E_READONLY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0209)") +cpp_quote("#define TS_E_NOLOCK MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0201)") + const ULONG TS_DEFAULT_SELECTION = ~0u;