diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index 1fbbc0ad59ce1c0723487c72b728c8f788e8fabb..c9c75b834cf488ddfa9cc35f42c15afb8869e7da 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -49,6 +49,9 @@ DEFINE_GUID(IID_ITextSelection, 0x8cc497c1, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0x DEFINE_GUID(IID_ITextFont, 0x8cc497c3, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d); DEFINE_GUID(IID_ITextPara, 0x8cc497c4, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d); +/* private IID used to get back IRichEditOleImpl pointer */ +DEFINE_GUID(IID_Igetrichole, 0xe3ce5c7a, 0x8247, 0x4622, 0x81, 0xad, 0x11, 0x81, 0x02, 0xaa, 0x01, 0x30); + typedef struct ITextSelectionImpl ITextSelectionImpl; typedef struct IOleClientSiteImpl IOleClientSiteImpl; typedef struct ITextRangeImpl ITextRangeImpl; @@ -313,25 +316,29 @@ static HRESULT get_textfont_prop_for_pos(const IRichEditOleImpl *reole, int pos, static HRESULT get_textfont_prop(ITextRange *range, enum textfont_prop_id propid, textfont_prop_val *value) { - ITextRangeImpl *rng = impl_from_ITextRange(range); + IRichEditOleImpl *reole; textfont_prop_val v; + LONG start, end, i; HRESULT hr; - int i; - if (!rng->reOle) + ITextRange_QueryInterface(range, &IID_Igetrichole, (void**)&reole); + if (!reole) return CO_E_RELEASED; init_textfont_prop_value(propid, value); + ITextRange_GetStart(range, &start); + ITextRange_GetEnd(range, &end); + /* iterate trough a range to see if property value is consistent */ - hr = get_textfont_prop_for_pos(rng->reOle, rng->start, propid, &v); + hr = get_textfont_prop_for_pos(reole, start, propid, &v); if (FAILED(hr)) return hr; - for (i = rng->start + 1; i < rng->end; i++) { + for (i = start + 1; i < end; i++) { textfont_prop_val cur; - hr = get_textfont_prop_for_pos(rng->reOle, i, propid, &cur); + hr = get_textfont_prop_for_pos(reole, i, propid, &cur); if (FAILED(hr)) return hr; @@ -937,6 +944,8 @@ static const IRichEditOleVtbl revt = { /* ITextRange interface */ static HRESULT WINAPI ITextRange_fnQueryInterface(ITextRange *me, REFIID riid, void **ppvObj) { + ITextRangeImpl *This = impl_from_ITextRange(me); + *ppvObj = NULL; if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) @@ -946,6 +955,11 @@ static HRESULT WINAPI ITextRange_fnQueryInterface(ITextRange *me, REFIID riid, v ITextRange_AddRef(me); return S_OK; } + else if (IsEqualGUID(riid, &IID_Igetrichole)) + { + *ppvObj = This->reOle; + return S_OK; + } return E_NOINTERFACE; } @@ -3023,6 +3037,8 @@ static HRESULT WINAPI ITextSelection_fnQueryInterface( REFIID riid, void **ppvObj) { + ITextSelectionImpl *This = impl_from_ITextSelection(me); + *ppvObj = NULL; if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) @@ -3033,6 +3049,11 @@ static HRESULT WINAPI ITextSelection_fnQueryInterface( ITextSelection_AddRef(me); return S_OK; } + else if (IsEqualGUID(riid, &IID_Igetrichole)) + { + *ppvObj = This->reOle; + return S_OK; + } return E_NOINTERFACE; } @@ -3246,14 +3267,19 @@ static HRESULT WINAPI ITextSelection_fnSetEnd(ITextSelection *me, LONG cpLim) return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetFont(ITextSelection *me, ITextFont **pFont) +static HRESULT WINAPI ITextSelection_fnGetFont(ITextSelection *me, ITextFont **font) { ITextSelectionImpl *This = impl_from_ITextSelection(me); + + TRACE("(%p)->(%p)\n", This, font); + if (!This->reOle) return CO_E_RELEASED; - FIXME("not implemented\n"); - return E_NOTIMPL; + if (!font) + return E_INVALIDARG; + + return create_textfont((ITextRange*)me, font); } static HRESULT WINAPI ITextSelection_fnSetFont(ITextSelection *me, ITextFont *pFont) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 6ff2fe33c7f147256f01fbd75fac6fbf1efb114c..a47d31fb42a58a8f492cff9a6e1c0ac5e1fe5f23 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -114,7 +114,7 @@ static void test_Interfaces(void) { IRichEditOle *reOle = NULL, *reOle1 = NULL; ITextDocument *txtDoc = NULL; - ITextSelection *txtSel = NULL; + ITextSelection *txtSel = NULL, *txtSel2; IUnknown *punk; HRESULT hres; LRESULT res; @@ -147,7 +147,13 @@ static void test_Interfaces(void) hres = ITextDocument_GetSelection(txtDoc, NULL); ok(hres == E_INVALIDARG, "ITextDocument_GetSelection: 0x%x\n", hres); - ITextDocument_GetSelection(txtDoc, &txtSel); + hres = ITextDocument_GetSelection(txtDoc, &txtSel); + ok(hres == S_OK, "got 0x%08x\n", hres); + + hres = ITextDocument_GetSelection(txtDoc, &txtSel2); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(txtSel2 == txtSel, "got %p, %p\n", txtSel, txtSel2); + ITextSelection_Release(txtSel2); punk = NULL; hres = ITextSelection_QueryInterface(txtSel, &IID_ITextSelection, (void **) &punk); @@ -1216,6 +1222,7 @@ static void test_GetFont(void) IRichEditOle *reOle = NULL; ITextDocument *doc = NULL; ITextRange *range = NULL; + ITextSelection *selection; ITextFont *font, *font2; CHARFORMAT2A cf; LONG value; @@ -1227,6 +1234,17 @@ static void test_GetFont(void) create_interfaces(&hwnd, &reOle, &doc, NULL); SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)test_text1); + hr = ITextDocument_GetSelection(doc, &selection); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = ITextSelection_GetFont(selection, &font); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = ITextSelection_GetFont(selection, &font2); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(font != font2, "got %p, %p\n", font, font2); + ITextFont_Release(font2); + ITextFont_Release(font); + ITextSelection_Release(selection); + EXPECT_REF(reOle, 3); EXPECT_REF(doc, 3);