| /* |
| * Wordpad implementation - Richedit OLE callback implementation |
| * |
| * Copyright 2010 by Dylan Smith <dylan.ah.smith@gmail.com> |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #define COBJMACROS |
| |
| #include <windows.h> |
| #include <richedit.h> |
| #include <ole2.h> |
| #include <richole.h> |
| |
| #include "wine/debug.h" |
| #include "wordpad.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(wordpad); |
| |
| struct IRichEditOleCallbackImpl { |
| const IRichEditOleCallbackVtbl *vtbl; |
| IStorage *stg; |
| int item_num; |
| }; |
| |
| struct IRichEditOleCallbackImpl olecallback; |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_QueryInterface( |
| IRichEditOleCallback* This, |
| REFIID riid, |
| void **ppvObject) |
| { |
| WINE_TRACE("(%p, %s, %p)\n", This, wine_dbgstr_guid(riid), ppvObject); |
| if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IRichEditOleCallback)) |
| { |
| *ppvObject = This; |
| return S_OK; |
| } |
| WINE_FIXME("Unknown interface: %s\n", wine_dbgstr_guid(riid)); |
| return E_NOINTERFACE; |
| } |
| |
| static ULONG STDMETHODCALLTYPE RichEditOleCallback_AddRef( |
| IRichEditOleCallback* This) |
| { |
| WINE_TRACE("(%p)\n", This); |
| /* singleton */ |
| return 1; |
| } |
| |
| static ULONG STDMETHODCALLTYPE RichEditOleCallback_Release( |
| IRichEditOleCallback* This) |
| { |
| WINE_TRACE("(%p)\n", This); |
| return 1; |
| } |
| |
| /*** IRichEditOleCallback methods ***/ |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetNewStorage( |
| IRichEditOleCallback* This, |
| LPSTORAGE *lplpstg) |
| { |
| WCHAR name[32]; |
| static const WCHAR template[] = {'R','E','O','L','E','_','%','u','\0'}; |
| |
| WINE_TRACE("(%p, %p)\n", This, lplpstg); |
| wsprintfW(name, template, olecallback.item_num++); |
| return IStorage_CreateStorage(olecallback.stg, name, |
| STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, |
| 0, 0, lplpstg); |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetInPlaceContext( |
| IRichEditOleCallback* This, |
| LPOLEINPLACEFRAME *lplpFrame, |
| LPOLEINPLACEUIWINDOW *lplpDoc, |
| LPOLEINPLACEFRAMEINFO lpFrameInfo) |
| { |
| WINE_FIXME("(%p, %p, %p, %p) stub\n", This, lplpFrame, lplpDoc, lpFrameInfo); |
| return E_INVALIDARG; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_ShowContainerUI( |
| IRichEditOleCallback* This, |
| BOOL fShow) |
| { |
| WINE_TRACE("(%p, %d)\n", This, fShow); |
| return S_OK; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_QueryInsertObject( |
| IRichEditOleCallback* This, |
| LPCLSID lpclsid, |
| LPSTORAGE lpstg, |
| LONG cp) |
| { |
| WINE_TRACE("(%p, %p, %p, %d)\n", This, lpclsid, lpstg, cp); |
| return S_OK; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_DeleteObject( |
| IRichEditOleCallback* This, |
| LPOLEOBJECT lpoleobj) |
| { |
| WINE_TRACE("(%p, %p)\n", This, lpoleobj); |
| return S_OK; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_QueryAcceptData( |
| IRichEditOleCallback* This, |
| LPDATAOBJECT lpdataobj, |
| CLIPFORMAT *lpcfFormat, |
| DWORD reco, |
| BOOL fReally, |
| HGLOBAL hMetaPict) |
| { |
| WINE_TRACE("(%p, %p, %p, %x, %d, %p)\n", |
| This, lpdataobj, lpcfFormat, reco, fReally, hMetaPict); |
| return S_OK; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_ContextSensitiveHelp( |
| IRichEditOleCallback* This, |
| BOOL fEnterMode) |
| { |
| WINE_TRACE("(%p, %d)\n", This, fEnterMode); |
| return S_OK; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetClipboardData( |
| IRichEditOleCallback* This, |
| CHARRANGE *lpchrg, |
| DWORD reco, |
| LPDATAOBJECT *lplpdataobj) |
| { |
| WINE_TRACE("(%p, %p, %x, %p)\n", This, lpchrg, reco, lplpdataobj); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetDragDropEffect( |
| IRichEditOleCallback* This, |
| BOOL fDrag, |
| DWORD grfKeyState, |
| LPDWORD pdwEffect) |
| { |
| WINE_TRACE("(%p, %d, %x, %p)\n", This, fDrag, grfKeyState, pdwEffect); |
| if (pdwEffect) |
| *pdwEffect = DROPEFFECT_COPY; |
| return S_OK; |
| } |
| |
| static HRESULT STDMETHODCALLTYPE RichEditOleCallback_GetContextMenu( |
| IRichEditOleCallback* This, |
| WORD seltype, |
| LPOLEOBJECT lpoleobj, |
| CHARRANGE *lpchrg, |
| HMENU *lphmenu) |
| { |
| HINSTANCE hInstance = GetModuleHandleW(0); |
| HMENU hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_POPUP)); |
| |
| WINE_TRACE("(%p, %x, %p, %p, %p)\n", |
| This, seltype, lpoleobj, lpchrg, lphmenu); |
| |
| *lphmenu = GetSubMenu(hPopupMenu, 0); |
| return S_OK; |
| } |
| |
| struct IRichEditOleCallbackVtbl olecallbackVtbl = { |
| RichEditOleCallback_QueryInterface, |
| RichEditOleCallback_AddRef, |
| RichEditOleCallback_Release, |
| RichEditOleCallback_GetNewStorage, |
| RichEditOleCallback_GetInPlaceContext, |
| RichEditOleCallback_ShowContainerUI, |
| RichEditOleCallback_QueryInsertObject, |
| RichEditOleCallback_DeleteObject, |
| RichEditOleCallback_QueryAcceptData, |
| RichEditOleCallback_ContextSensitiveHelp, |
| RichEditOleCallback_GetClipboardData, |
| RichEditOleCallback_GetDragDropEffect, |
| RichEditOleCallback_GetContextMenu |
| }; |
| |
| struct IRichEditOleCallbackImpl olecallback = { |
| &olecallbackVtbl, NULL, 0 |
| }; |
| |
| HRESULT setup_richedit_olecallback(HWND hEditorWnd) |
| { |
| HRESULT hr = StgCreateDocfile(NULL, |
| STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, |
| 0, &olecallback.stg); |
| |
| SendMessageW(hEditorWnd, EM_SETOLECALLBACK, 0, (LPARAM)&olecallback); |
| return hr; |
| } |