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