blob: e9cc5e1c5b762fc8fbd5da9a7ea36e59a046776e [file] [log] [blame]
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +01001/*
2 * RichEdit - functions and interfaces around CreateTextServices
3 *
4 * Copyright 2005, 2006, Maarten Lankhorst
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
Jonathan Ernst360a3f92006-05-18 14:49:52 +020018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010019 */
20
21#include "config.h"
22#include "wine/port.h"
23
24#define NONAMELESSSTRUCT
25#define NONAMELESSUNION
26#define COBJMACROS
27
28#include "editor.h"
29#include "ole2.h"
Dylan Smith20d6bc82009-01-20 01:41:44 -050030#include "oleauto.h"
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010031#include "richole.h"
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010032#include "imm.h"
33#include "textserv.h"
34#include "wine/debug.h"
35#include "editstr.h"
36
37#ifdef __i386__ /* thiscall functions are i386-specific */
38
39#define THISCALL(func) __thiscall_ ## func
Alexandre Julliardeb08df32009-06-14 15:34:20 +020040#define DEFINE_THISCALL_WRAPPER(func,args) \
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010041 extern typeof(func) THISCALL(func); \
Alexandre Julliardeb08df32009-06-14 15:34:20 +020042 __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010043 "popl %eax\n\t" \
44 "pushl %ecx\n\t" \
45 "pushl %eax\n\t" \
Alexandre Julliardeb08df32009-06-14 15:34:20 +020046 "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010047#else /* __i386__ */
48
49#define THISCALL(func) func
Alexandre Julliardeb08df32009-06-14 15:34:20 +020050#define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010051
52#endif /* __i386__ */
53
54WINE_DEFAULT_DEBUG_CHANNEL(richedit);
55
56typedef struct ITextServicesImpl {
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020057 IUnknown IUnknown_inner;
Michael Stefaniucc52c15e2011-04-10 21:44:44 +020058 ITextServices ITextServices_iface;
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020059 IUnknown *outer_unk;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010060 LONG ref;
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020061 ITextHost *pMyHost;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010062 CRITICAL_SECTION csTxtSrv;
Dylan Smithe7b68a22009-01-20 01:41:40 -050063 ME_TextEditor *editor;
Andrey Turkin8d18cb82008-10-10 01:14:39 +040064 char spare[256];
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010065} ITextServicesImpl;
66
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020067static inline ITextServicesImpl *impl_from_IUnknown(IUnknown *iface)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010068{
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020069 return CONTAINING_RECORD(iface, ITextServicesImpl, IUnknown_inner);
Michael Stefaniucc52c15e2011-04-10 21:44:44 +020070}
71
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020072static HRESULT WINAPI ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Michael Stefaniucc52c15e2011-04-10 21:44:44 +020073{
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020074 ITextServicesImpl *This = impl_from_IUnknown(iface);
Michael Stefaniucc52c15e2011-04-10 21:44:44 +020075
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020076 TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010077
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020078 if (IsEqualIID(riid, &IID_IUnknown))
79 *ppv = &This->IUnknown_inner;
80 else if IsEqualIID(riid, &IID_ITextServices)
81 *ppv = &This->ITextServices_iface;
82 else {
83 *ppv = NULL;
84 FIXME("Unknown interface: %s\n", debugstr_guid(riid));
85 return E_NOINTERFACE;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010086 }
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020087
88 IUnknown_AddRef((IUnknown*)*ppv);
89 return S_OK;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010090}
91
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020092static ULONG WINAPI ITextServicesImpl_AddRef(IUnknown *iface)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010093{
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020094 ITextServicesImpl *This = impl_from_IUnknown(iface);
95 LONG ref = InterlockedIncrement(&This->ref);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010096
Michael Stefaniuc74c5d202012-03-28 00:33:10 +020097 TRACE("(%p) ref=%d\n", This, ref);
98
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +010099 return ref;
100}
101
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200102static ULONG WINAPI ITextServicesImpl_Release(IUnknown *iface)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100103{
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200104 ITextServicesImpl *This = impl_from_IUnknown(iface);
105 LONG ref = InterlockedDecrement(&This->ref);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100106
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200107 TRACE("(%p) ref=%d\n", This, ref);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100108
109 if (!ref)
110 {
111 ITextHost_Release(This->pMyHost);
Jan Zerebecki58f37a12007-03-10 22:10:28 +0100112 This->csTxtSrv.DebugInfo->Spare[0] = 0;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100113 DeleteCriticalSection(&This->csTxtSrv);
114 CoTaskMemFree(This);
115 }
116 return ref;
117}
118
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200119static const IUnknownVtbl textservices_inner_vtbl =
120{
121 ITextServicesImpl_QueryInterface,
122 ITextServicesImpl_AddRef,
123 ITextServicesImpl_Release
124};
125
126static inline ITextServicesImpl *impl_from_ITextServices(ITextServices *iface)
127{
128 return CONTAINING_RECORD(iface, ITextServicesImpl, ITextServices_iface);
129}
130
131static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices *iface, REFIID riid, void **ppv)
132{
133 ITextServicesImpl *This = impl_from_ITextServices(iface);
134 return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
135}
136
137static ULONG WINAPI fnTextSrv_AddRef(ITextServices *iface)
138{
139 ITextServicesImpl *This = impl_from_ITextServices(iface);
140 return IUnknown_AddRef(This->outer_unk);
141}
142
143static ULONG WINAPI fnTextSrv_Release(ITextServices *iface)
144{
145 ITextServicesImpl *This = impl_from_ITextServices(iface);
146 return IUnknown_Release(This->outer_unk);
147}
148
Marcus Meissner598a7f62011-05-13 18:04:03 +0200149DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSendMessage(ITextServices *iface, UINT msg, WPARAM wparam,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200150 LPARAM lparam, LRESULT *plresult)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100151{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200152 ITextServicesImpl *This = impl_from_ITextServices(iface);
Dylan Smithe7b68a22009-01-20 01:41:40 -0500153 HRESULT hresult;
Dylan Smithb441bb22009-02-26 03:43:14 -0500154 LRESULT lresult;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100155
Dylan Smithb441bb22009-02-26 03:43:14 -0500156 lresult = ME_HandleMessage(This->editor, msg, wparam, lparam, TRUE, &hresult);
157 if (plresult) *plresult = lresult;
Dylan Smithe7b68a22009-01-20 01:41:40 -0500158 return hresult;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100159}
160
Marcus Meissner598a7f62011-05-13 18:04:03 +0200161DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxDraw(ITextServices *iface, DWORD dwDrawAspect, LONG lindex,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200162 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, HDC hdcTargetDev,
163 LPCRECTL lprcBounds, LPCRECTL lprcWBounds, LPRECT lprcUpdate,
164 BOOL (CALLBACK * pfnContinue)(DWORD), DWORD dwContinue,
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100165 LONG lViewId)
166{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200167 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100168
169 FIXME("%p: STUB\n", This);
170 return E_NOTIMPL;
171}
172
Marcus Meissner598a7f62011-05-13 18:04:03 +0200173DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetHScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200174 LONG *plPage, BOOL *pfEnabled)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100175{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200176 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100177
Dylan Smith8f7a99f2009-01-21 10:13:56 -0500178 *plMin = This->editor->horz_si.nMin;
179 *plMax = This->editor->horz_si.nMax;
180 *plPos = This->editor->horz_si.nPos;
181 *plPage = This->editor->horz_si.nPage;
182 *pfEnabled = (This->editor->styleFlags & WS_HSCROLL) != 0;
183 return S_OK;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100184}
185
Marcus Meissner598a7f62011-05-13 18:04:03 +0200186DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetVScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200187 LONG *plPage, BOOL *pfEnabled)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100188{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200189 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100190
Dylan Smith8f7a99f2009-01-21 10:13:56 -0500191 *plMin = This->editor->vert_si.nMin;
192 *plMax = This->editor->vert_si.nMax;
193 *plPos = This->editor->vert_si.nPos;
194 *plPage = This->editor->vert_si.nPage;
195 *pfEnabled = (This->editor->styleFlags & WS_VSCROLL) != 0;
196 return S_OK;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100197}
198
Marcus Meissner598a7f62011-05-13 18:04:03 +0200199DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxSetCursor(ITextServices *iface, DWORD dwDrawAspect, LONG lindex,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200200 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw,
201 HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100202{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200203 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100204
205 FIXME("%p: STUB\n", This);
206 return E_NOTIMPL;
207}
208
Marcus Meissner598a7f62011-05-13 18:04:03 +0200209DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxQueryHitPoint(ITextServices *iface, DWORD dwDrawAspect, LONG lindex,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200210 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw,
211 HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y,
212 DWORD *pHitResult)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100213{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200214 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100215
216 FIXME("%p: STUB\n", This);
217 return E_NOTIMPL;
218}
219
Marcus Meissner598a7f62011-05-13 18:04:03 +0200220DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceActivate(ITextServices *iface, LPCRECT prcClient)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100221{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200222 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100223
224 FIXME("%p: STUB\n", This);
225 return E_NOTIMPL;
226}
227
Marcus Meissner598a7f62011-05-13 18:04:03 +0200228DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceDeactivate(ITextServices *iface)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100229{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200230 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100231
232 FIXME("%p: STUB\n", This);
233 return E_NOTIMPL;
234}
235
Marcus Meissner598a7f62011-05-13 18:04:03 +0200236DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIActivate(ITextServices *iface)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100237{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200238 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100239
240 FIXME("%p: STUB\n", This);
241 return E_NOTIMPL;
242}
243
Marcus Meissner598a7f62011-05-13 18:04:03 +0200244DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIDeactivate(ITextServices *iface)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100245{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200246 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100247
248 FIXME("%p: STUB\n", This);
249 return E_NOTIMPL;
250}
251
Marcus Meissner598a7f62011-05-13 18:04:03 +0200252DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, BSTR *pbstrText)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100253{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200254 ITextServicesImpl *This = impl_from_ITextServices(iface);
Dylan Smith20d6bc82009-01-20 01:41:44 -0500255 int length;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100256
Dylan Smith20d6bc82009-01-20 01:41:44 -0500257 length = ME_GetTextLength(This->editor);
258 if (length)
259 {
Dylan Smith82e10212009-08-12 09:05:51 -0400260 ME_Cursor start;
Dylan Smith20d6bc82009-01-20 01:41:44 -0500261 BSTR bstr;
262 bstr = SysAllocStringByteLen(NULL, length * sizeof(WCHAR));
263 if (bstr == NULL)
264 return E_OUTOFMEMORY;
265
Dylan Smith82e10212009-08-12 09:05:51 -0400266 ME_CursorFromCharOfs(This->editor, 0, &start);
267 ME_GetTextW(This->editor, bstr, length, &start, INT_MAX, FALSE);
Dylan Smith20d6bc82009-01-20 01:41:44 -0500268 *pbstrText = bstr;
269 } else {
270 *pbstrText = NULL;
271 }
272
273 return S_OK;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100274}
275
Marcus Meissner598a7f62011-05-13 18:04:03 +0200276DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface, LPCWSTR pszText)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100277{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200278 ITextServicesImpl *This = impl_from_ITextServices(iface);
Dylan Smithbd470422009-08-13 08:44:18 -0400279 ME_Cursor cursor;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100280
Dylan Smithbd470422009-08-13 08:44:18 -0400281 ME_SetCursorToStart(This->editor, &cursor);
282 ME_InternalDeleteText(This->editor, &cursor,
283 ME_GetTextLength(This->editor), FALSE);
Dylan Smith20d6bc82009-01-20 01:41:44 -0500284 ME_InsertTextFromCursor(This->editor, 0, pszText, -1,
285 This->editor->pBuffer->pDefaultStyle);
286 ME_SetSelection(This->editor, 0, 0);
287 This->editor->nModifyStep = 0;
288 OleFlushClipboard();
289 ME_EmptyUndoStack(This->editor);
Dylan Smithdfa80b32010-07-28 21:17:40 -0400290 ME_UpdateRepaint(This->editor, FALSE);
Dylan Smith20d6bc82009-01-20 01:41:44 -0500291
292 return S_OK;
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100293}
294
Marcus Meissner598a7f62011-05-13 18:04:03 +0200295DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCurrentTargetX(ITextServices *iface, LONG *x)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100296{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200297 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100298
299 FIXME("%p: STUB\n", This);
300 return E_NOTIMPL;
301}
302
Marcus Meissner598a7f62011-05-13 18:04:03 +0200303DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetBaseLinePos(ITextServices *iface, LONG *x)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100304{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200305 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100306
307 FIXME("%p: STUB\n", This);
308 return E_NOTIMPL;
309}
310
Marcus Meissner598a7f62011-05-13 18:04:03 +0200311DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetNaturalSize(ITextServices *iface, DWORD dwAspect, HDC hdcDraw,
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200312 HDC hicTargetDev, DVTARGETDEVICE *ptd, DWORD dwMode,
313 const SIZEL *psizelExtent, LONG *pwidth, LONG *pheight)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100314{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200315 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100316
317 FIXME("%p: STUB\n", This);
318 return E_NOTIMPL;
319}
320
Marcus Meissner598a7f62011-05-13 18:04:03 +0200321DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetDropTarget(ITextServices *iface, IDropTarget **ppDropTarget)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100322{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200323 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100324
325 FIXME("%p: STUB\n", This);
326 return E_NOTIMPL;
327}
328
Marcus Meissner598a7f62011-05-13 18:04:03 +0200329DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxPropertyBitsChange(ITextServices *iface, DWORD dwMask, DWORD dwBits)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100330{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200331 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100332
333 FIXME("%p: STUB\n", This);
334 return E_NOTIMPL;
335}
336
Marcus Meissner598a7f62011-05-13 18:04:03 +0200337DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface, DWORD *pdwWidth, DWORD *pdwHeight)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100338{
Michael Stefaniucc52c15e2011-04-10 21:44:44 +0200339 ITextServicesImpl *This = impl_from_ITextServices(iface);
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100340
341 FIXME("%p: STUB\n", This);
342 return E_NOTIMPL;
343}
344
Alexandre Julliardeb08df32009-06-14 15:34:20 +0200345DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage,20)
346DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw,52)
347DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll,24)
348DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll,24)
349DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor,40)
350DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint,44)
351DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate,8)
352DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate,4)
353DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate,4)
354DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate,4)
355DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText,8)
356DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText,8)
357DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX,8)
358DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos,8)
359DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize,36)
360DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget,8)
361DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange,12)
362DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize,12)
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100363
Michael Stefaniuc6f299c52012-03-28 00:31:45 +0200364static const ITextServicesVtbl textservices_vtbl =
Maarten Lankhorst460e2ad2006-02-01 12:31:40 +0100365{
366 fnTextSrv_QueryInterface,
367 fnTextSrv_AddRef,
368 fnTextSrv_Release,
369 THISCALL(fnTextSrv_TxSendMessage),
370 THISCALL(fnTextSrv_TxDraw),
371 THISCALL(fnTextSrv_TxGetHScroll),
372 THISCALL(fnTextSrv_TxGetVScroll),
373 THISCALL(fnTextSrv_OnTxSetCursor),
374 THISCALL(fnTextSrv_TxQueryHitPoint),
375 THISCALL(fnTextSrv_OnTxInplaceActivate),
376 THISCALL(fnTextSrv_OnTxInplaceDeactivate),
377 THISCALL(fnTextSrv_OnTxUIActivate),
378 THISCALL(fnTextSrv_OnTxUIDeactivate),
379 THISCALL(fnTextSrv_TxGetText),
380 THISCALL(fnTextSrv_TxSetText),
381 THISCALL(fnTextSrv_TxGetCurrentTargetX),
382 THISCALL(fnTextSrv_TxGetBaseLinePos),
383 THISCALL(fnTextSrv_TxGetNaturalSize),
384 THISCALL(fnTextSrv_TxGetDropTarget),
385 THISCALL(fnTextSrv_OnTxPropertyBitsChange),
386 THISCALL(fnTextSrv_TxGetCachedSize)
387};
Michael Stefaniuc6f299c52012-03-28 00:31:45 +0200388
389/******************************************************************
390 * CreateTextServices (RICHED20.4)
391 */
392HRESULT WINAPI CreateTextServices(IUnknown *pUnkOuter, ITextHost *pITextHost, IUnknown **ppUnk)
393{
394 ITextServicesImpl *ITextImpl;
395 HRESULT hres;
396 TRACE("%p %p --> %p\n", pUnkOuter, pITextHost, ppUnk);
397 if (pITextHost == NULL)
398 return E_POINTER;
399
400 ITextImpl = CoTaskMemAlloc(sizeof(*ITextImpl));
401 if (ITextImpl == NULL)
402 return E_OUTOFMEMORY;
403 InitializeCriticalSection(&ITextImpl->csTxtSrv);
404 ITextImpl->csTxtSrv.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ITextServicesImpl.csTxtSrv");
405 ITextImpl->ref = 1;
406 ITextHost_AddRef(pITextHost);
407 ITextImpl->pMyHost = pITextHost;
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200408 ITextImpl->IUnknown_inner.lpVtbl = &textservices_inner_vtbl;
Michael Stefaniuc6f299c52012-03-28 00:31:45 +0200409 ITextImpl->ITextServices_iface.lpVtbl = &textservices_vtbl;
410 ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE);
411 ITextImpl->editor->exStyleFlags = 0;
412 ITextImpl->editor->rcFormat.left = 0;
413 ITextImpl->editor->rcFormat.top = 0;
414 ITextImpl->editor->rcFormat.right = 0;
415 ITextImpl->editor->rcFormat.bottom = 0;
416
417 ME_HandleMessage(ITextImpl->editor, WM_CREATE, 0, 0, TRUE, &hres);
418
419 if (pUnkOuter)
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200420 ITextImpl->outer_unk = pUnkOuter;
421 else
422 ITextImpl->outer_unk = &ITextImpl->IUnknown_inner;
Michael Stefaniuc6f299c52012-03-28 00:31:45 +0200423
Michael Stefaniuc74c5d202012-03-28 00:33:10 +0200424 *ppUnk = &ITextImpl->IUnknown_inner;
Michael Stefaniuc6f299c52012-03-28 00:31:45 +0200425 return S_OK;
426}