Aric Stewart : msctf: Implement ITfContext::SetSelection.
Alexandre Julliard
julliard at winehq.org
Thu Jun 4 07:59:32 CDT 2009
Module: wine
Branch: master
Commit: 584175bedf655b3cb719c294f9198d7ab34b9777
URL: http://source.winehq.org/git/wine.git/?a=commit;h=584175bedf655b3cb719c294f9198d7ab34b9777
Author: Aric Stewart <aric at 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;
More information about the wine-cvs
mailing list