From 10667b39aad6710668f60c1ba8f10e50aeb87242 Mon Sep 17 00:00:00 2001 From: Jinoh Kang Date: Fri, 8 Apr 2022 01:09:07 +0900 Subject: [PATCH] riched20: Implement callback to IRichEditOleCallback_QueryInsertObject. Signed-off-by: Jinoh Kang Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/riched20/caret.c | 11 ++++++++++- dlls/riched20/editor.c | 3 +-- dlls/riched20/editor.h | 2 +- dlls/riched20/richole.c | 6 +++++- dlls/riched20/tests/richole.c | 6 ++---- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index c8658098e18..09ec0ffc735 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -456,13 +456,21 @@ static struct re_object* create_re_object(const REOBJECT *reo, ME_Run *run) return reobj; } -void editor_insert_oleobj(ME_TextEditor *editor, const REOBJECT *reo) +HRESULT editor_insert_oleobj(ME_TextEditor *editor, const REOBJECT *reo) { ME_Run *run, *prev; const WCHAR space = ' '; struct re_object *reobj_prev = NULL; ME_Cursor *cursor, cursor_from_ofs; ME_Style *style; + HRESULT hr; + + if (editor->lpOleCallback) + { + hr = IRichEditOleCallback_QueryInsertObject(editor->lpOleCallback, (LPCLSID)&reo->clsid, reo->pstg, REO_CP_SELECTION); + if (hr != S_OK) + return hr; + } if (reo->cp == REO_CP_SELECTION) cursor = editor->pCursors; @@ -495,6 +503,7 @@ void editor_insert_oleobj(ME_TextEditor *editor, const REOBJECT *reo) list_add_head(&editor->reobj_list, &run->reobj->entry); ME_ReleaseStyle( style ); + return S_OK; } diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index a8cf3175591..3628e51ac9b 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -1171,8 +1171,7 @@ static HRESULT insert_static_object(ME_TextEditor *editor, HENHMETAFILE hemf, HB reobject.dwFlags = 0; /* FIXME */ reobject.dwUser = 0; - editor_insert_oleobj(editor, &reobject); - hr = S_OK; + hr = editor_insert_oleobj(editor, &reobject); } if (lpObject) IOleObject_Release(lpObject); diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index e0df63ae92d..3028d9bdbd5 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -187,7 +187,7 @@ int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to) DEC BOOL ME_IsSelection(ME_TextEditor *editor) DECLSPEC_HIDDEN; void ME_DeleteSelection(ME_TextEditor *editor) DECLSPEC_HIDDEN; void ME_SendSelChange(ME_TextEditor *editor) DECLSPEC_HIDDEN; -void editor_insert_oleobj( ME_TextEditor *editor, const REOBJECT *reo ) DECLSPEC_HIDDEN; +HRESULT editor_insert_oleobj( ME_TextEditor *editor, const REOBJECT *reo ) DECLSPEC_HIDDEN; BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, int nChars, BOOL bForce) DECLSPEC_HIDDEN; int ME_GetTextLength(ME_TextEditor *editor) DECLSPEC_HIDDEN; int ME_GetTextLengthEx(ME_TextEditor *editor, const GETTEXTLENGTHEX *how) DECLSPEC_HIDDEN; diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index a23f4c82730..936f1c928b3 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -1361,6 +1361,7 @@ static HRESULT WINAPI IRichEditOle_fnInsertObject(IRichEditOle *iface, REOBJECT *reo) { struct text_services *services = impl_from_IRichEditOle( iface ); + HRESULT hr; TRACE("(%p,%p)\n", services, reo); @@ -1369,7 +1370,10 @@ IRichEditOle_fnInsertObject(IRichEditOle *iface, REOBJECT *reo) if (reo->cbStruct < sizeof(*reo)) return STG_E_INVALIDPARAMETER; - editor_insert_oleobj(services->editor, reo); + hr = editor_insert_oleobj(services->editor, reo); + if (hr != S_OK) + return hr; + ME_CommitUndo(services->editor); ME_UpdateRepaint(services->editor, FALSE); return S_OK; diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 65c07162421..c85a621b80b 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -3420,7 +3420,7 @@ static void _insert_reobject(struct reolecb_obj *callback, IRichEditOle *reole, IOleClientSite *clientsite; HRESULT hr; - olecb_expect_QueryInsertObject(callback, line, EXPECT_TODO_WINE | 1, + olecb_expect_QueryInsertObject(callback, line, 1, &CLSID_NULL, NULL, REO_CP_SELECTION /* cp overriden */, S_OK); hr = IRichEditOle_GetClientSite(reole, &clientsite); ok_(__FILE__,line)(hr == S_OK, "IRichEditOle_GetClientSite got hr %#lx.\n", hr); @@ -3495,18 +3495,16 @@ static void subtest_InsertObject(struct reolecb_obj *callback) hr = IRichEditOle_GetClientSite(reole, &clientsite); ok(hr == S_OK, "IRichEditOle_GetClientSite got hr %#lx.\n", hr); - olecb_expect_QueryInsertObject(callback, __LINE__, EXPECT_TODO_WINE | 1, + olecb_expect_QueryInsertObject(callback, __LINE__, 1, &CLSID_NULL, NULL, REO_CP_SELECTION, S_FALSE); fill_reobject_struct(&reobj, REO_CP_SELECTION, NULL, NULL, clientsite, 10, 10, DVASPECT_CONTENT, 0, 0); hr = IRichEditOle_InsertObject(reole, &reobj); - todo_wine ok(hr == S_FALSE, "IRichEditOle_InsertObject got hr %#lx.\n", hr); olecb_check_QueryInsertObject(callback, __LINE__); IOleClientSite_Release(clientsite); count = IRichEditOle_GetObjectCount(reole); - todo_wine ok(count == 3, "got wrong object count: %ld\n", count); }