Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentxtsrv.c
Go to the documentation of this file.
00001 /* 00002 * RichEdit - functions and interfaces around CreateTextServices 00003 * 00004 * Copyright 2005, 2006, Maarten Lankhorst 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #include "config.h" 00022 #include "wine/port.h" 00023 00024 #define NONAMELESSSTRUCT 00025 #define NONAMELESSUNION 00026 #define COBJMACROS 00027 00028 #include "editor.h" 00029 #include "ole2.h" 00030 #include "oleauto.h" 00031 #include "richole.h" 00032 #include "imm.h" 00033 #include "textserv.h" 00034 #include "wine/debug.h" 00035 #include "editstr.h" 00036 00037 #ifdef __i386__ /* thiscall functions are i386-specific */ 00038 00039 #define THISCALL(func) __thiscall_ ## func 00040 #define DEFINE_THISCALL_WRAPPER(func,args) \ 00041 extern typeof(func) THISCALL(func); \ 00042 __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \ 00043 "popl %eax\n\t" \ 00044 "pushl %ecx\n\t" \ 00045 "pushl %eax\n\t" \ 00046 "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) ) 00047 #else /* __i386__ */ 00048 00049 #define THISCALL(func) func 00050 #define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */ 00051 00052 #endif /* __i386__ */ 00053 00054 WINE_DEFAULT_DEBUG_CHANNEL(richedit); 00055 00056 typedef struct ITextServicesImpl { 00057 IUnknown IUnknown_inner; 00058 ITextServices ITextServices_iface; 00059 IUnknown *outer_unk; 00060 LONG ref; 00061 ITextHost *pMyHost; 00062 CRITICAL_SECTION csTxtSrv; 00063 ME_TextEditor *editor; 00064 char spare[256]; 00065 } ITextServicesImpl; 00066 00067 static inline ITextServicesImpl *impl_from_IUnknown(IUnknown *iface) 00068 { 00069 return CONTAINING_RECORD(iface, ITextServicesImpl, IUnknown_inner); 00070 } 00071 00072 static HRESULT WINAPI ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) 00073 { 00074 ITextServicesImpl *This = impl_from_IUnknown(iface); 00075 00076 TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); 00077 00078 if (IsEqualIID(riid, &IID_IUnknown)) 00079 *ppv = &This->IUnknown_inner; 00080 else if IsEqualIID(riid, &IID_ITextServices) 00081 *ppv = &This->ITextServices_iface; 00082 else { 00083 *ppv = NULL; 00084 FIXME("Unknown interface: %s\n", debugstr_guid(riid)); 00085 return E_NOINTERFACE; 00086 } 00087 00088 IUnknown_AddRef((IUnknown*)*ppv); 00089 return S_OK; 00090 } 00091 00092 static ULONG WINAPI ITextServicesImpl_AddRef(IUnknown *iface) 00093 { 00094 ITextServicesImpl *This = impl_from_IUnknown(iface); 00095 LONG ref = InterlockedIncrement(&This->ref); 00096 00097 TRACE("(%p) ref=%d\n", This, ref); 00098 00099 return ref; 00100 } 00101 00102 static ULONG WINAPI ITextServicesImpl_Release(IUnknown *iface) 00103 { 00104 ITextServicesImpl *This = impl_from_IUnknown(iface); 00105 LONG ref = InterlockedDecrement(&This->ref); 00106 00107 TRACE("(%p) ref=%d\n", This, ref); 00108 00109 if (!ref) 00110 { 00111 ITextHost_Release(This->pMyHost); 00112 This->csTxtSrv.DebugInfo->Spare[0] = 0; 00113 DeleteCriticalSection(&This->csTxtSrv); 00114 CoTaskMemFree(This); 00115 } 00116 return ref; 00117 } 00118 00119 static const IUnknownVtbl textservices_inner_vtbl = 00120 { 00121 ITextServicesImpl_QueryInterface, 00122 ITextServicesImpl_AddRef, 00123 ITextServicesImpl_Release 00124 }; 00125 00126 static inline ITextServicesImpl *impl_from_ITextServices(ITextServices *iface) 00127 { 00128 return CONTAINING_RECORD(iface, ITextServicesImpl, ITextServices_iface); 00129 } 00130 00131 static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices *iface, REFIID riid, void **ppv) 00132 { 00133 ITextServicesImpl *This = impl_from_ITextServices(iface); 00134 return IUnknown_QueryInterface(This->outer_unk, riid, ppv); 00135 } 00136 00137 static ULONG WINAPI fnTextSrv_AddRef(ITextServices *iface) 00138 { 00139 ITextServicesImpl *This = impl_from_ITextServices(iface); 00140 return IUnknown_AddRef(This->outer_unk); 00141 } 00142 00143 static ULONG WINAPI fnTextSrv_Release(ITextServices *iface) 00144 { 00145 ITextServicesImpl *This = impl_from_ITextServices(iface); 00146 return IUnknown_Release(This->outer_unk); 00147 } 00148 00149 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSendMessage(ITextServices *iface, UINT msg, WPARAM wparam, 00150 LPARAM lparam, LRESULT *plresult) 00151 { 00152 ITextServicesImpl *This = impl_from_ITextServices(iface); 00153 HRESULT hresult; 00154 LRESULT lresult; 00155 00156 lresult = ME_HandleMessage(This->editor, msg, wparam, lparam, TRUE, &hresult); 00157 if (plresult) *plresult = lresult; 00158 return hresult; 00159 } 00160 00161 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxDraw(ITextServices *iface, DWORD dwDrawAspect, LONG lindex, 00162 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, HDC hdcTargetDev, 00163 LPCRECTL lprcBounds, LPCRECTL lprcWBounds, LPRECT lprcUpdate, 00164 BOOL (CALLBACK * pfnContinue)(DWORD), DWORD dwContinue, 00165 LONG lViewId) 00166 { 00167 ITextServicesImpl *This = impl_from_ITextServices(iface); 00168 00169 FIXME("%p: STUB\n", This); 00170 return E_NOTIMPL; 00171 } 00172 00173 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetHScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos, 00174 LONG *plPage, BOOL *pfEnabled) 00175 { 00176 ITextServicesImpl *This = impl_from_ITextServices(iface); 00177 00178 *plMin = This->editor->horz_si.nMin; 00179 *plMax = This->editor->horz_si.nMax; 00180 *plPos = This->editor->horz_si.nPos; 00181 *plPage = This->editor->horz_si.nPage; 00182 *pfEnabled = (This->editor->styleFlags & WS_HSCROLL) != 0; 00183 return S_OK; 00184 } 00185 00186 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetVScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos, 00187 LONG *plPage, BOOL *pfEnabled) 00188 { 00189 ITextServicesImpl *This = impl_from_ITextServices(iface); 00190 00191 *plMin = This->editor->vert_si.nMin; 00192 *plMax = This->editor->vert_si.nMax; 00193 *plPos = This->editor->vert_si.nPos; 00194 *plPage = This->editor->vert_si.nPage; 00195 *pfEnabled = (This->editor->styleFlags & WS_VSCROLL) != 0; 00196 return S_OK; 00197 } 00198 00199 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxSetCursor(ITextServices *iface, DWORD dwDrawAspect, LONG lindex, 00200 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, 00201 HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y) 00202 { 00203 ITextServicesImpl *This = impl_from_ITextServices(iface); 00204 00205 FIXME("%p: STUB\n", This); 00206 return E_NOTIMPL; 00207 } 00208 00209 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxQueryHitPoint(ITextServices *iface, DWORD dwDrawAspect, LONG lindex, 00210 void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, 00211 HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y, 00212 DWORD *pHitResult) 00213 { 00214 ITextServicesImpl *This = impl_from_ITextServices(iface); 00215 00216 FIXME("%p: STUB\n", This); 00217 return E_NOTIMPL; 00218 } 00219 00220 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceActivate(ITextServices *iface, LPCRECT prcClient) 00221 { 00222 ITextServicesImpl *This = impl_from_ITextServices(iface); 00223 00224 FIXME("%p: STUB\n", This); 00225 return E_NOTIMPL; 00226 } 00227 00228 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceDeactivate(ITextServices *iface) 00229 { 00230 ITextServicesImpl *This = impl_from_ITextServices(iface); 00231 00232 FIXME("%p: STUB\n", This); 00233 return E_NOTIMPL; 00234 } 00235 00236 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIActivate(ITextServices *iface) 00237 { 00238 ITextServicesImpl *This = impl_from_ITextServices(iface); 00239 00240 FIXME("%p: STUB\n", This); 00241 return E_NOTIMPL; 00242 } 00243 00244 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIDeactivate(ITextServices *iface) 00245 { 00246 ITextServicesImpl *This = impl_from_ITextServices(iface); 00247 00248 FIXME("%p: STUB\n", This); 00249 return E_NOTIMPL; 00250 } 00251 00252 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, BSTR *pbstrText) 00253 { 00254 ITextServicesImpl *This = impl_from_ITextServices(iface); 00255 int length; 00256 00257 length = ME_GetTextLength(This->editor); 00258 if (length) 00259 { 00260 ME_Cursor start; 00261 BSTR bstr; 00262 bstr = SysAllocStringByteLen(NULL, length * sizeof(WCHAR)); 00263 if (bstr == NULL) 00264 return E_OUTOFMEMORY; 00265 00266 ME_CursorFromCharOfs(This->editor, 0, &start); 00267 ME_GetTextW(This->editor, bstr, length, &start, INT_MAX, FALSE); 00268 *pbstrText = bstr; 00269 } else { 00270 *pbstrText = NULL; 00271 } 00272 00273 return S_OK; 00274 } 00275 00276 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface, LPCWSTR pszText) 00277 { 00278 ITextServicesImpl *This = impl_from_ITextServices(iface); 00279 ME_Cursor cursor; 00280 00281 ME_SetCursorToStart(This->editor, &cursor); 00282 ME_InternalDeleteText(This->editor, &cursor, 00283 ME_GetTextLength(This->editor), FALSE); 00284 ME_InsertTextFromCursor(This->editor, 0, pszText, -1, 00285 This->editor->pBuffer->pDefaultStyle); 00286 ME_SetSelection(This->editor, 0, 0); 00287 This->editor->nModifyStep = 0; 00288 OleFlushClipboard(); 00289 ME_EmptyUndoStack(This->editor); 00290 ME_UpdateRepaint(This->editor, FALSE); 00291 00292 return S_OK; 00293 } 00294 00295 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCurrentTargetX(ITextServices *iface, LONG *x) 00296 { 00297 ITextServicesImpl *This = impl_from_ITextServices(iface); 00298 00299 FIXME("%p: STUB\n", This); 00300 return E_NOTIMPL; 00301 } 00302 00303 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetBaseLinePos(ITextServices *iface, LONG *x) 00304 { 00305 ITextServicesImpl *This = impl_from_ITextServices(iface); 00306 00307 FIXME("%p: STUB\n", This); 00308 return E_NOTIMPL; 00309 } 00310 00311 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetNaturalSize(ITextServices *iface, DWORD dwAspect, HDC hdcDraw, 00312 HDC hicTargetDev, DVTARGETDEVICE *ptd, DWORD dwMode, 00313 const SIZEL *psizelExtent, LONG *pwidth, LONG *pheight) 00314 { 00315 ITextServicesImpl *This = impl_from_ITextServices(iface); 00316 00317 FIXME("%p: STUB\n", This); 00318 return E_NOTIMPL; 00319 } 00320 00321 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetDropTarget(ITextServices *iface, IDropTarget **ppDropTarget) 00322 { 00323 ITextServicesImpl *This = impl_from_ITextServices(iface); 00324 00325 FIXME("%p: STUB\n", This); 00326 return E_NOTIMPL; 00327 } 00328 00329 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxPropertyBitsChange(ITextServices *iface, DWORD dwMask, DWORD dwBits) 00330 { 00331 ITextServicesImpl *This = impl_from_ITextServices(iface); 00332 00333 FIXME("%p: STUB\n", This); 00334 return E_NOTIMPL; 00335 } 00336 00337 DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface, DWORD *pdwWidth, DWORD *pdwHeight) 00338 { 00339 ITextServicesImpl *This = impl_from_ITextServices(iface); 00340 00341 FIXME("%p: STUB\n", This); 00342 return E_NOTIMPL; 00343 } 00344 00345 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSendMessage,20) 00346 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxDraw,52) 00347 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetHScroll,24) 00348 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetVScroll,24) 00349 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxSetCursor,40) 00350 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxQueryHitPoint,44) 00351 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceActivate,8) 00352 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxInplaceDeactivate,4) 00353 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIActivate,4) 00354 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxUIDeactivate,4) 00355 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetText,8) 00356 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxSetText,8) 00357 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCurrentTargetX,8) 00358 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetBaseLinePos,8) 00359 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetNaturalSize,36) 00360 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetDropTarget,8) 00361 DEFINE_THISCALL_WRAPPER(fnTextSrv_OnTxPropertyBitsChange,12) 00362 DEFINE_THISCALL_WRAPPER(fnTextSrv_TxGetCachedSize,12) 00363 00364 static const ITextServicesVtbl textservices_vtbl = 00365 { 00366 fnTextSrv_QueryInterface, 00367 fnTextSrv_AddRef, 00368 fnTextSrv_Release, 00369 THISCALL(fnTextSrv_TxSendMessage), 00370 THISCALL(fnTextSrv_TxDraw), 00371 THISCALL(fnTextSrv_TxGetHScroll), 00372 THISCALL(fnTextSrv_TxGetVScroll), 00373 THISCALL(fnTextSrv_OnTxSetCursor), 00374 THISCALL(fnTextSrv_TxQueryHitPoint), 00375 THISCALL(fnTextSrv_OnTxInplaceActivate), 00376 THISCALL(fnTextSrv_OnTxInplaceDeactivate), 00377 THISCALL(fnTextSrv_OnTxUIActivate), 00378 THISCALL(fnTextSrv_OnTxUIDeactivate), 00379 THISCALL(fnTextSrv_TxGetText), 00380 THISCALL(fnTextSrv_TxSetText), 00381 THISCALL(fnTextSrv_TxGetCurrentTargetX), 00382 THISCALL(fnTextSrv_TxGetBaseLinePos), 00383 THISCALL(fnTextSrv_TxGetNaturalSize), 00384 THISCALL(fnTextSrv_TxGetDropTarget), 00385 THISCALL(fnTextSrv_OnTxPropertyBitsChange), 00386 THISCALL(fnTextSrv_TxGetCachedSize) 00387 }; 00388 00389 /****************************************************************** 00390 * CreateTextServices (RICHED20.4) 00391 */ 00392 HRESULT WINAPI CreateTextServices(IUnknown *pUnkOuter, ITextHost *pITextHost, IUnknown **ppUnk) 00393 { 00394 ITextServicesImpl *ITextImpl; 00395 HRESULT hres; 00396 TRACE("%p %p --> %p\n", pUnkOuter, pITextHost, ppUnk); 00397 if (pITextHost == NULL) 00398 return E_POINTER; 00399 00400 ITextImpl = CoTaskMemAlloc(sizeof(*ITextImpl)); 00401 if (ITextImpl == NULL) 00402 return E_OUTOFMEMORY; 00403 InitializeCriticalSection(&ITextImpl->csTxtSrv); 00404 ITextImpl->csTxtSrv.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ITextServicesImpl.csTxtSrv"); 00405 ITextImpl->ref = 1; 00406 ITextHost_AddRef(pITextHost); 00407 ITextImpl->pMyHost = pITextHost; 00408 ITextImpl->IUnknown_inner.lpVtbl = &textservices_inner_vtbl; 00409 ITextImpl->ITextServices_iface.lpVtbl = &textservices_vtbl; 00410 ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE); 00411 ITextImpl->editor->exStyleFlags = 0; 00412 ITextImpl->editor->rcFormat.left = 0; 00413 ITextImpl->editor->rcFormat.top = 0; 00414 ITextImpl->editor->rcFormat.right = 0; 00415 ITextImpl->editor->rcFormat.bottom = 0; 00416 00417 ME_HandleMessage(ITextImpl->editor, WM_CREATE, 0, 0, TRUE, &hres); 00418 00419 if (pUnkOuter) 00420 ITextImpl->outer_unk = pUnkOuter; 00421 else 00422 ITextImpl->outer_unk = &ITextImpl->IUnknown_inner; 00423 00424 *ppUnk = &ITextImpl->IUnknown_inner; 00425 return S_OK; 00426 } Generated on Sat May 26 2012 04:24:32 for ReactOS by
1.7.6.1
|