| /* | 
 |  * 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; | 
 | } |