[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