Module: wine Branch: master Commit: 9ccbadc9a84251a0e58fe8a51143f6ef89909fd0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ccbadc9a84251a0e58fe8a511...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Sep 27 12:02:58 2010 +0200
oleaut32: Added OleCreatePropertyFrameIndirect implementation.
Based on patch written by Geoffrey Hausheer.
---
dlls/oleaut32/olepropframe.c | 232 +++++++++++++++++++++++++++++++++++++++++- 1 files changed, 229 insertions(+), 3 deletions(-)
diff --git a/dlls/oleaut32/olepropframe.c b/dlls/oleaut32/olepropframe.c index 23bd9e0..1a82290 100644 --- a/dlls/oleaut32/olepropframe.c +++ b/dlls/oleaut32/olepropframe.c @@ -2,6 +2,7 @@ * Copyright 1999 Corel Corporation * Sean Langley * Copyright 2010 Geoffrey Hausheer + * Copyright 2010 Piotr Caban for Codeweavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,20 +21,245 @@
#include <stdarg.h>
+#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + #include "windef.h" #include "winbase.h" -#include "wine/debug.h" +#include "wingdi.h" #include "ole2.h" #include "olectl.h" +#include "oledlg.h" +#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);
+typedef struct { + const IPropertyPageSiteVtbl *lpVtbl; + LCID lcid; + LONG ref; +} PropertyPageSite; + +static INT_PTR CALLBACK property_sheet_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + IPropertyPage *property_page = (IPropertyPage*)GetWindowLongPtrW(hwnd, DWLP_USER); + + switch(msg) { + case WM_INITDIALOG: { + RECT rect; + + property_page = (IPropertyPage*)((LPPROPSHEETPAGEW)lparam)->lParam; + + GetClientRect(hwnd, &rect); + IPropertyPage_Activate(property_page, hwnd, &rect, TRUE); + IPropertyPage_Show(property_page, SW_SHOW); + + SetWindowLongPtrW(hwnd, DWLP_USER, (LONG)property_page); + return FALSE; + } + case WM_DESTROY: + IPropertyPage_Show(property_page, SW_HIDE); + IPropertyPage_Deactivate(property_page); + return FALSE; + default: + return FALSE; + } +} + +static HRESULT WINAPI PropertyPageSite_QueryInterface(IPropertyPageSite* iface, + REFIID riid, void** ppv) +{ + TRACE("(%p riid: %s)\n",iface, debugstr_guid(riid)); + + if(IsEqualGUID(&IID_IUnknown, riid) + || IsEqualGUID(&IID_IPropertyPageSite, riid)) + *ppv = iface; + else { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI PropertyPageSite_AddRef(IPropertyPageSite* iface) +{ + PropertyPageSite *this = (PropertyPageSite*)iface; + LONG ref = InterlockedIncrement(&this->ref); + + TRACE("(%p) ref=%d\n", this, ref); + return ref; +} + +static ULONG WINAPI PropertyPageSite_Release(IPropertyPageSite* iface) +{ + PropertyPageSite *this = (PropertyPageSite *)iface; + LONG ref = InterlockedDecrement(&this->ref); + + TRACE("(%p) ref=%d\n", this, ref); + if(!ref) + HeapFree(GetProcessHeap(), 0, this); + return ref; +} + +static HRESULT WINAPI PropertyPageSite_OnStatusChange( + IPropertyPageSite *iface, DWORD dwFlags) +{ + TRACE("(%p, %x)\n", iface, dwFlags); + return S_OK; +} + +static HRESULT WINAPI PropertyPageSite_GetLocaleID( + IPropertyPageSite *iface, LCID *pLocaleID) +{ + PropertyPageSite *this = (PropertyPageSite *)iface; + + TRACE("(%p, %p)\n", iface, pLocaleID); + *pLocaleID = this->lcid; + return S_OK; +} + +static HRESULT WINAPI PropertyPageSite_GetPageContainer( + IPropertyPageSite* iface, IUnknown** ppUnk) +{ + FIXME("(%p, %p)\n", iface, ppUnk); + return E_NOTIMPL; +} + +static HRESULT WINAPI PropertyPageSite_TranslateAccelerator( + IPropertyPageSite* iface, MSG *pMsg) +{ + FIXME("(%p, %p)\n", iface, pMsg); + return E_NOTIMPL; +} + +IPropertyPageSiteVtbl PropertyPageSiteVtbl = { + PropertyPageSite_QueryInterface, + PropertyPageSite_AddRef, + PropertyPageSite_Release, + PropertyPageSite_OnStatusChange, + PropertyPageSite_GetLocaleID, + PropertyPageSite_GetPageContainer, + PropertyPageSite_TranslateAccelerator +}; + /*********************************************************************** * OleCreatePropertyFrameIndirect (OLEAUT32.416) */ HRESULT WINAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams) { - FIXME("(%p), not implemented (olepro32.dll)\n", lpParams); + PROPSHEETHEADERW property_sheet; + PROPSHEETPAGEW property_sheet_page; + struct { + DLGTEMPLATE template; + WORD menu; + WORD class; + WORD title; + } *dialogs; + IPropertyPage **property_page; + IPropertyPageSite *property_page_site; + HRESULT res; + int i; + + if(!lpParams) + return E_POINTER; + + TRACE("(%d %p %d %d %s %d %p %d %p %d %d)\n", lpParams->cbStructSize, + lpParams->hWndOwner, lpParams->x, lpParams->y, + debugstr_w(lpParams->lpszCaption), lpParams->cObjects, + lpParams->lplpUnk, lpParams->cPages, lpParams->lpPages, + lpParams->lcid, lpParams->dispidInitialProperty); + + if(!lpParams->lplpUnk || !lpParams->lpPages) + return E_POINTER; + + if(lpParams->cbStructSize != sizeof(OCPFIPARAMS)) { + WARN("incorrect structure size\n"); + return E_INVALIDARG; + } + + if(lpParams->dispidInitialProperty) + FIXME("dispidInitialProperty not yet implemented\n"); + + memset(&property_sheet, 0, sizeof(property_sheet)); + property_sheet.dwSize = sizeof(property_sheet); + if(lpParams->lpszCaption) { + property_sheet.dwFlags = PSH_PROPTITLE; + property_sheet.pszCaption = lpParams->lpszCaption; + } + + property_sheet.u3.phpage = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + lpParams->cPages*sizeof(HPROPSHEETPAGE)); + property_page = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + lpParams->cPages*sizeof(IPropertyPage*)); + dialogs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + lpParams->cPages*sizeof(*dialogs)); + if(!property_sheet.u3.phpage || !property_page || !dialogs) { + HeapFree(GetProcessHeap(), 0, property_sheet.u3.phpage); + HeapFree(GetProcessHeap(), 0, property_page); + HeapFree(GetProcessHeap(), 0, dialogs); + return E_OUTOFMEMORY; + } + + memset(&property_sheet_page, 0, sizeof(PROPSHEETPAGEW)); + property_sheet_page.dwSize = sizeof(PROPSHEETPAGEW); + property_sheet_page.dwFlags = PSP_DLGINDIRECT|PSP_USETITLE; + property_sheet_page.pfnDlgProc = property_sheet_proc; + + for(i=0; i<lpParams->cPages; i++) { + PROPPAGEINFO page_info; + + res = CoCreateInstance(&lpParams->lpPages[i], NULL, CLSCTX_INPROC_SERVER, + &IID_IPropertyPage, (void**)&property_page[i]); + if(FAILED(res)) + continue; + + property_page_site = HeapAlloc(GetProcessHeap(), 0, sizeof(PropertyPageSite)); + if(!property_page_site) + continue; + ((PropertyPageSite*)property_page_site)->lpVtbl = &PropertyPageSiteVtbl; + ((PropertyPageSite*)property_page_site)->ref = 1; + ((PropertyPageSite*)property_page_site)->lcid = lpParams->lcid; + + res = IPropertyPage_SetPageSite(property_page[i], property_page_site); + IPropertyPageSite_Release(property_page_site); + if(FAILED(res)) + continue; + + res = IPropertyPage_SetObjects(property_page[i], + lpParams->cObjects, lpParams->lplpUnk); + if(FAILED(res)) + continue; + + res = IPropertyPage_GetPageInfo(property_page[i], &page_info); + if(FAILED(res)) + continue; + + dialogs[i].template.cx = page_info.size.cx; + dialogs[i].template.cy = page_info.size.cy; + + property_sheet_page.u.pResource = &dialogs[i].template; + property_sheet_page.lParam = (LPARAM)property_page[i]; + property_sheet_page.pszTitle = page_info.pszTitle; + + property_sheet.u3.phpage[property_sheet.nPages++] = + CreatePropertySheetPageW(&property_sheet_page); + } + + PropertySheetW(&property_sheet); + + for(i=0; i<lpParams->cPages; i++) { + if(property_page[i]) { + IPropertyPage_SetPageSite(property_page[i], NULL); + IPropertyPage_Release(property_page[i]); + } + } + + HeapFree(GetProcessHeap(), 0, dialogs); + HeapFree(GetProcessHeap(), 0, property_page); + HeapFree(GetProcessHeap(), 0, property_sheet.u3.phpage); return S_OK; }
@@ -41,7 +267,7 @@ HRESULT WINAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams) * OleCreatePropertyFrame (OLEAUT32.417) */ HRESULT WINAPI OleCreatePropertyFrame( - HWND hwndOwner, UINT x, UINT y, LPCOLESTR lpszCaption,ULONG cObjects, + HWND hwndOwner, UINT x, UINT y, LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN* ppUnk, ULONG cPages, LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved) {