[RICHED20] Implement some methods of ITextInterfaces

Maarten Lankhorst m.b.lankhorst at gmail.com
Thu Feb 2 08:12:15 CST 2006


This was the easy part... hard part still has to come. But my sample 
Windowless exe wants to start now, just doesn't display anything yet, it 
would require a lot more work.
-------------- next part --------------
Subject: [PATCH] Implement some methods in the ITextServices interface

---

 dlls/riched20/txtsrv.c |  161 ++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 141 insertions(+), 20 deletions(-)

99456922ed65cf9b30f48e36df83e9273c3c64c0
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index 6bb0b9d..4cb56b4 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -32,7 +32,45 @@
 #include "imm.h"
 #include "textserv.h"
 #include "wine/debug.h"
-#include "editstr.h"
+#include "wine/unicode.h"
+
+/* Read more about windowless rich text services controls in:
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/windowlessricheditcontrols.asp
+ * Specifically the ITextHost and ITextServices
+ *
+ * This is still just a stub.
+ *
+ * CreateTextServices initialises ITextServices
+ *
+ * Fully implemented in ITextServices:
+ * QueryInterface
+ * AddRef
+ * Release
+ *
+ * Less full implemented:
+ * OnTxInplaceActivate
+ * OnTxInplaceDeactivate
+ * OnTxUIActivate
+ * OnTxUiDeactivate
+ *
+ * Partially implemented:
+ * TxSetText
+ * TxGetText
+ * TxPropertyBitsChange
+ *
+ * Not implemented
+ * TxSendMessage
+ * TxDraw
+ * TxGetHScroll
+ * TxGetVScroll
+ * OnTxSetCursor
+ * TxQueryHitPoint
+ * TxGetCurrentTargetX
+ * TxGetBaseLinePos
+ * TxGetNaturalSize
+ * TxGetDropTarget -- Requires implementation of IDropTarget
+ * TxGetCachedSize
+ */
 
 #ifdef __i386__  /* thiscall functions are i386-specific */
 
@@ -58,6 +96,11 @@ typedef struct ITextServicesImpl {
    ITextHost *pMyHost;
    LONG ref;
    CRITICAL_SECTION csTxtSrv;
+   ME_TextEditor *pTextEdit;
+   LPCWSTR pText;
+   BOOL bInPlaceActive, bUIActive;
+   DWORD dwProperty;
+   RECT rTarget;
 } ITextServicesImpl;
 
 static const ITextServicesVtbl textservices_Vtbl;
@@ -71,24 +114,37 @@ HRESULT WINAPI CreateTextServices(IUnkno
 {
    ITextServicesImpl *ITextImpl;
    TRACE("%p %p --> %p\n", pUnkOuter, pITextHost, ppUnk);
-   if (pITextHost == NULL)
+
+   if (pITextHost == NULL || ppUnk == NULL)
       return E_POINTER;
 
+   if (pUnkOuter)
+   {
+      FIXME("Support aggregation\n");
+      return CLASS_E_NOAGGREGATION;
+   }
+
    ITextImpl = CoTaskMemAlloc(sizeof(*ITextImpl));
    if (ITextImpl == NULL)
       return E_OUTOFMEMORY;
-   InitializeCriticalSection(&ITextImpl->csTxtSrv);
+
    ITextImpl->ref = 1;
    ITextImpl->pMyHost = pITextHost;
    ITextImpl->lpVtbl = &textservices_Vtbl;
-
-   if (pUnkOuter)
+   ITextImpl->pTextEdit = NULL;
+   ITextImpl->pText = CoTaskMemAlloc(sizeof(WCHAR));
+   if (ITextImpl->pText == NULL)
    {
-      FIXME("Support aggregation\n");
-      return CLASS_E_NOAGGREGATION;
+      CoTaskMemFree(ITextImpl);
+      return E_OUTOFMEMORY;
    }
-
+   InitializeCriticalSection(&ITextImpl->csTxtSrv);
+   memset((void *)ITextImpl->pText, 0, sizeof(WCHAR));
+   IUnknown_AddRef(ITextImpl->pMyHost);
+   ITextImpl->bInPlaceActive = ITextImpl->bUIActive = FALSE;
+   ITextImpl->dwProperty = 0;
    *ppUnk = (IUnknown *)ITextImpl;
+   memset((void*)&ITextImpl->rTarget, 0, sizeof(RECT));
    return S_OK;
 }
 
@@ -133,7 +189,9 @@ static ULONG WINAPI fnTextSrv_Release(IT
 
    if (!ref)
    {
+      TRACE("No references left, cleaning up\n");
       ITextHost_Release(This->pMyHost);
+      CoTaskMemFree((LPVOID)This->pText);
       DeleteCriticalSection(&This->csTxtSrv);
       CoTaskMemFree(This);
    }
@@ -236,32 +294,39 @@ HRESULT WINAPI fnTextSrv_OnTxInplaceActi
 {
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
 
-   FIXME("%p: STUB\n", This);
-   return E_NOTIMPL;
+   FIXME("%p: (%p) partial stub\n", This, prcClient);
+   This->bInPlaceActive = TRUE;
+   if (prcClient != NULL)
+      memcpy((void*)&This->rTarget, prcClient, sizeof(RECT));
+   return S_OK;
 }
 
 HRESULT WINAPI fnTextSrv_OnTxInplaceDeactivate(ITextServices *iface)
 {
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
 
-   FIXME("%p: STUB\n", This);
-   return E_NOTIMPL;
+   FIXME("%p: partial stub\n", This);
+   This->bInPlaceActive = FALSE;
+   memset((void*)&This->rTarget, 0, sizeof(RECT));
+   return S_OK;
 }
 
 HRESULT WINAPI fnTextSrv_OnTxUIActivate(ITextServices *iface)
 {
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
 
-   FIXME("%p: STUB\n", This);
-   return E_NOTIMPL;
+   FIXME("%p: partial stub\n", This);
+   This->bUIActive = TRUE;
+   return S_OK;
 }
 
 HRESULT WINAPI fnTextSrv_OnTxUIDeactivate(ITextServices *iface)
 {
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
 
-   FIXME("%p: STUB\n", This);
-   return E_NOTIMPL;
+   FIXME("%p: partial stub\n", This);
+   This->bUIActive = FALSE;
+   return S_OK;
 }
 
 HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface,
@@ -269,16 +334,46 @@ HRESULT WINAPI fnTextSrv_TxGetText(IText
 {
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
 
-   FIXME("%p: STUB\n", This);
+   FIXME("%p: partial stub\n", This);
+
+   if (pbstrText == NULL)
+      return E_INVALIDARG;
+
+   if (This->pTextEdit == NULL)
+   {
+      *pbstrText = SysAllocString(strlenW(This->pText) ? (OLECHAR*) This->pText : (OLECHAR*) 0x000D);
+      return (*pbstrText == NULL ? E_OUTOFMEMORY : S_OK);
+   }
+   FIXME("Implement ME!!!");
    return E_NOTIMPL;
 }
 
 HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface,
                                    LPCWSTR pszText)
 {
+   INT Len;
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
 
-   FIXME("%p: STUB\n", This);
+   FIXME("%p: partial stub (%s)\n", This, debugstr_w(pszText));
+
+   if (pszText == NULL)
+      return E_INVALIDARG;
+
+   Len = (1+strlenW(pszText)) * sizeof(WCHAR);
+   if (This->pTextEdit == NULL)
+   {
+      WCHAR *pText;
+      pText = CoTaskMemAlloc(Len);
+
+      if (pText == NULL)
+         return E_OUTOFMEMORY;
+
+      CoTaskMemFree((void*)This->pText);
+      This->pText = pText;
+      memcpy((void*)This->pText, (void *)pszText, Len);
+      return S_OK;
+   }
+   FIXME("Implement me!!\n");
    return E_NOTIMPL;
 }
 
@@ -330,9 +425,35 @@ HRESULT WINAPI fnTextSrv_OnTxPropertyBit
                                                 DWORD dwBits)
 {
    ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface);
+   int x;
 
-   FIXME("%p: STUB\n", This);
-   return E_NOTIMPL;
+   /* Evil, yes, but this way I can use a switch statement */
+   const DWORD dwProp[] = {
+      TXTBIT_RICHTEXT,         TXTBIT_MULTILINE,       TXTBIT_READONLY,
+      TXTBIT_SHOWACCELERATOR,  TXTBIT_USEPASSWORD,     TXTBIT_HIDESELECTION,
+      TXTBIT_SAVESELECTION,    TXTBIT_AUTOWORDSEL,     TXTBIT_VERTICAL,
+      TXTBIT_SELBARCHANGE,     TXTBIT_WORDWRAP,        TXTBIT_ALLOWBEEP,
+      TXTBIT_DISABLEDRAG,      TXTBIT_VIEWINSETCHANGE, TXTBIT_BACKSTYLECHANGE,
+      TXTBIT_MAXLENGTHCHANGE,  TXTBIT_SCROLLBARCHANGE, TXTBIT_CHARFORMATCHANGE,
+      TXTBIT_PARAFORMATCHANGE, TXTBIT_EXTENTCHANGE,    TXTBIT_CLIENTRECTCHANGE,
+      TXTBIT_USECURRENTBKG };
+
+   FIXME("%p: STUB: dwMask: 0x%8lx 0x%8lx\n", This, dwMask, dwBits);
+
+   for (x = 0; x < sizeof(dwProp) / sizeof(DWORD); x++)
+   {
+      switch (dwMask & dwProp[x])
+      {
+         case 0: break;
+         default:
+            FIXME("Unimplemented property: 0x%8lx\n", dwProp[x]);
+         normalchange:
+            This->dwProperty ^= dwProp[x];
+            This->dwProperty += dwProp[x] & dwBits;
+            break;
+      }
+   }
+   return S_OK;
 }
 
 HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface,
-- 
1.1.3


More information about the wine-patches mailing list