Changelog: Ulrich Czekalla ulrich@xxxxxxxxxxxxxxx Initial implementation of OleUIInsertObject -- Ulrich Czekalla ulrich@xxxxxxxxxxxxxxx
Index: dlls/oledlg/Makefile.in =================================================================== RCS file: /home/wine/wine/dlls/oledlg/Makefile.in,v retrieving revision 1.11 diff -u -w -r1.11 Makefile.in --- dlls/oledlg/Makefile.in 11 Oct 2003 01:09:18 -0000 1.11 +++ dlls/oledlg/Makefile.in 3 Nov 2003 17:30:51 -0000 @@ -3,10 +3,13 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = oledlg.dll -IMPORTS = kernel32 +IMPORTS = kernel32 user32 advapi32 ole32 comdlg32 ntdll C_SRCS = \ + insobjdlg.c \ oledlg_main.c + +RC_SRCS = rsrc.rc @MAKE_DLL_RULES@ Index: dlls/oledlg/oledlg_main.c =================================================================== RCS file: /home/wine/wine/dlls/oledlg/oledlg_main.c,v retrieving revision 1.8 diff -u -w -r1.8 oledlg_main.c --- dlls/oledlg/oledlg_main.c 5 Sep 2003 23:08:33 -0000 1.8 +++ dlls/oledlg/oledlg_main.c 3 Nov 2003 17:30:51 -0000 @@ -32,6 +32,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); +HINSTANCE OLEDLG_hInstance = 0; + +/*********************************************************************** + * DllMain + */ +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) +{ + TRACE("%p 0x%lx %p\n", hinstDLL, fdwReason, fImpLoad); + + switch(fdwReason) { + case DLL_PROCESS_ATTACH: + OLEDLG_hInstance = hinstDLL; + break; + + case DLL_PROCESS_DETACH: + OLEDLG_hInstance = 0; + break; + } + return TRUE; +} + + /*********************************************************************** * OleUIAddVerbMenuA (OLEDLG.1) */ @@ -77,16 +99,6 @@ ); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; -} - -/*********************************************************************** - * OleUIInsertObjectA (OLEDLG.3) - */ -UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject) -{ - FIXME("(%p): stub\n", lpOleUIInsertObject); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return OLEUI_FALSE; } /*********************************************************************** Index: include/oledlg.h =================================================================== RCS file: /home/wine/wine/include/oledlg.h,v retrieving revision 1.15 diff -u -w -r1.15 oledlg.h --- include/oledlg.h 5 Sep 2003 23:15:44 -0000 1.15 +++ include/oledlg.h 3 Nov 2003 17:30:57 -0000 @@ -104,6 +104,25 @@ #define OLEUI_OK 1 /* OK button pressed */ #define OLEUI_CANCEL 2 /* Cancel button pressed */ +#define OLEUI_ERR_STANDARDMIN 100 +#define OLEUI_ERR_OLEMEMALLOC 100 +#define OLEUI_ERR_STRUCTURENULL 101 +#define OLEUI_ERR_STRUCTUREINVALID 102 +#define OLEUI_ERR_CBSTRUCTINCORRECT 103 +#define OLEUI_ERR_HWNDOWNERINVALID 104 +#define OLEUI_ERR_LPSZCAPTIONINVALID 105 +#define OLEUI_ERR_LPFNHOOKINVALID 106 +#define OLEUI_ERR_HINSTANCEINVALID 107 +#define OLEUI_ERR_LPSZTEMPLATEINVALID 108 +#define OLEUI_ERR_HRESOURCEINVALID 109 +#define OLEUI_ERR_FINDTEMPLATEFAILURE 110 +#define OLEUI_ERR_LOADTEMPLATEFAILURE 111 +#define OLEUI_ERR_DIALOGFAILURE 112 +#define OLEUI_ERR_LOCALMEMALLOC 113 +#define OLEUI_ERR_GLOBALMEMALLOC 114 +#define OLEUI_ERR_LOADSTRING 115 +#define OLEUI_ERR_STANDARDMAX 116 + #define OPF_OBJECTISLINK 0x00000001L #define OPF_NOFILLDEFAULT 0x00000002L #define OPF_SHOWHELP 0x00000004L --- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ dlls/oledlg/rsrc.rc 2003-11-03 12:19:51.000000000 -0500 @@ -0,0 +1,34 @@ +/* + * Top level resource file for OLE Dialogs + * + * Copyright 2003 Ulrich Czekalla for CodeWeavers + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" +#include "resource.h" + +/* + * Everything specific to any language goes + * in one of the specific files. + * Note that you can and may override resources + * which also have a neutral version. This is to + * get localized bitmaps for example. + */ +#include "cdlg_En.rc" --- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ dlls/oledlg/insobjdlg.c 2003-11-03 12:19:51.000000000 -0500 @@ -0,0 +1,628 @@ +/* + * OLEDLG library + * + * Copyright 2003 Ulrich Czekalla for CodeWeavers + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winternl.h" +#include "winnls.h" +#include "winerror.h" +#include "wingdi.h" +#include "winuser.h" +#include "wine/debug.h" +#include "wine/unicode.h" + +#include "oledlg.h" +#include "resource.h" + +WINE_DEFAULT_DEBUG_CHANNEL(oledlg); + +typedef struct +{ + HWND hwndSelf; + BOOL bObjListInit; /* Object list has been initialized */ + LPOLEUIINSERTOBJECTA lpOleUIInsertObject; + + HWND hwndObjTypeLBL; + HWND hwndObjTypeLB; + HWND hwndFileLBL; + HWND hwndFileTB; + HWND hwndCreateCtrlCB; + HWND hwndCreateNewCB; + HWND hwndCreateFromFileCB; + HWND hwndDisplayIconCB; + HWND hwndAddCtrlBTN; + HWND hwndBrowseBTN; + HWND hwndResultDesc; + +} InsertObjectDlgInfo; + +INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam); +static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo); +static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo); +static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo); +static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo); + +typedef HRESULT (*DLLREGISTER) (void); + +extern HINSTANCE OLEDLG_hInstance; +const char *OleUIInsertObjectInfoStr = "OleUIInsertObjectInfoStr"; + +/*********************************************************************** + * OleUIInsertObjectA (OLEDLG.3) + */ +UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject) +{ + LRESULT lRes; + LPCVOID template; + HRSRC hRes; + InsertObjectDlgInfo dlgInfo; + HANDLE hDlgTmpl = 0; + + if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource) + FIXME("Customized template not supported\n"); + + /* Create the dialog from a template */ + if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT), + (LPSTR)RT_DIALOG))) + { + return OLEUI_ERR_FINDTEMPLATEFAILURE; + } + + if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) || + !(template = LockResource( hDlgTmpl ))) + { + return OLEUI_ERR_LOADTEMPLATEFAILURE; + } + + /* Initialize InsertObjectDlgInfo structure */ + dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject; + dlgInfo.bObjListInit = FALSE; + + lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (LPDLGTEMPLATEA) template, + lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc, + (LPARAM) &dlgInfo); + + /* Unable to create the dialog */ + if( lRes == -1) + return OLEUI_ERR_DIALOGFAILURE; + + return lRes; +} + + +/*********************************************************************** + * UIInsertObjectDlgProc + * + * OLE UI Insert Object dialog procedure + */ +INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr); + + switch(uMsg) + { + case WM_INITDIALOG: + { + InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam; + + pdlgInfo->hwndSelf = hwnd; + + SetPropA(hwnd, OleUIInsertObjectInfoStr, (HANDLE) pdlgInfo); + + UIINSERTOBJECTDLG_InitDialog(pdlgInfo); + + return 0; + } + + case WM_COMMAND: + return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam); + + case WM_DESTROY: + if (pdlgInfo) + UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo); + RemovePropA(hwnd, OleUIInsertObjectInfoStr); + return FALSE; + + default : + return FALSE; + } +} + + +/*********************************************************************** + * UIINSOBJDLG_OnWMCommand + * + * WM_COMMAND message handler + */ +static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) +{ + WORD wNotifyCode = HIWORD(wParam); + WORD wID = LOWORD(wParam); + InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr); + + switch(wID) + { + case IDOK: + EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo)); + break; + + case IDCANCEL: + EndDialog(hwnd, FALSE); + break; + + case IDC_CREATECONTROL: + UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo); + break; + + case IDC_CREATENEW: + UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo); + break; + + case IDC_CREATEFROMFILE: + UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo); + break; + + case IDC_BROWSE: + UIINSERTOBJECTDLG_BrowseFile(pdlgInfo); + break; + + case IDC_ADDCONTROL: + UIINSERTOBJECTDLG_AddControl(pdlgInfo); + + case IDC_OBJTYPELIST: + { + if (wNotifyCode == LBN_SELCHANGE) + UIINSERTOBJECTDLG_SelChange(pdlgInfo); + break; + } + } + return 0; +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_InitDialog + * + * Initialize dialog display + */ +static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo) +{ + /* Initialize InsertObjectDlgInfo data structure */ + pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST); + pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL); + pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL); + pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE); + pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL); + pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW); + pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE); + pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON); + pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL); + pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE); + pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC); + + /* Setup dialog controls based on flags */ + if (pdlgInfo->lpOleUIInsertObject->lpszCaption) + SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption); + + ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags & + IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE); + ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags & + IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE); + EnableWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags & + IOF_DISABLEDISPLAYASICON) ? FALSE : TRUE); + + if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL) + UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo); + else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE) + UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo); + else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */ + UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo); +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_SelectCreateCtrl + * + * Select Create Control Radio Button + */ +static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo) +{ + ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE); + ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE); + ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE); + ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE); + + ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW); + ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW); + ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW); + + SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0); + + /* Populate object type listbox */ + if (!pdlgInfo->bObjListInit) + UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo); +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_SelectCreateNew + * + * Select Create New Radio Button + */ +static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo) +{ + ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE); + ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE); + ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE); + ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE); + + if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON) + ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW); + + ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW); + ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW); + + SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0); + + if (!pdlgInfo->bObjListInit) + UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo); + + UIINSERTOBJECTDLG_SelChange(pdlgInfo); +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_SelectCreateFromFile + * + * Select Create From File Radio Button + */ +static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo) +{ + char resstr[MAX_PATH]; + + ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE); + ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE); + ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE); + + if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON) + ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW); + + ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW); + ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW); + ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW); + + SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0); + + if (LoadStringA(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH)) + SendMessageA(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr); +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_PopulateObjectTypes + * + * Populate Object Type listbox + */ +static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo) +{ + DWORD i, len; + HKEY hkclsids; + HKEY hkey; + CLSID clsid; + HRESULT ret; + CHAR szclsid[128]; + CHAR keydesc[MAX_PATH]; + CHAR keyname[MAX_PATH]; + WCHAR wszclsid[128]; + DWORD index = 0; + + UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo); + + RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ, &hkclsids); + + while (ERROR_SUCCESS == (ret = RegEnumKeyA(hkclsids, index, szclsid, MAX_PATH))) + { + index++; + + RegOpenKeyExA(hkclsids, szclsid, 0, KEY_READ, &hkey); + + len = MAX_PATH; + if (ERROR_SUCCESS != RegQueryValueA(hkey, "Insertable", keyname, &len)) + continue; + + len = MAX_PATH; + if (ERROR_SUCCESS == RegQueryValueA(hkey, "NotInsertable", keyname, &len)) + continue; + + RtlMultiByteToUnicodeN(wszclsid, MAX_PATH, NULL, szclsid, MAX_PATH); + CLSIDFromString(wszclsid, &clsid); + + for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++) + if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid)) + break; + + if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude) + continue; + + len = MAX_PATH; + if (ERROR_SUCCESS == RegQueryValueA(hkey, NULL, keydesc, &len)) + { + CLSID* lpclsid = (CLSID*) HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID)); + memcpy(lpclsid, &clsid, sizeof(CLSID)); + + len = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc); + SendMessageA(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, (WPARAM)len, (LPARAM)lpclsid); + } + } + + pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS); + + return pdlgInfo->bObjListInit; +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_FreeObjectTypes + * + * Free Object Types listbox + */ +static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo) +{ + UINT i, count; + + count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, (WPARAM)0, (LPARAM)0); + + for (i = 0; i < count; i++) + { + CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB, + LB_GETITEMDATA, (WPARAM)i, (LPARAM)0); + HeapFree(GetProcessHeap(), 0, lpclsid); + } +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_SelChange + * + * Handle object type selection change + */ +static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo) +{ + INT index; + CHAR objname[MAX_PATH]; + CHAR objdesc[MAX_PATH]; + CHAR resstr[MAX_PATH]; + + TRACE("\n"); + + if (LoadStringA(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) && + ((index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) && + SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, (WPARAM)index, (LPARAM)objname)) + sprintf(objdesc, resstr, objname); + else + objdesc[0] = 0; + + SendMessageA(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc); +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_SelChange + * + * Handle OK Button + */ +static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo) +{ + BOOL bret = FALSE; + + if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) || + BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0)) + { + INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0); + + if (index >= 0) + { + CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB, + LB_GETITEMDATA, (WPARAM)index, 0); + memcpy(&pdlgInfo->lpOleUIInsertObject->clsid, clsid, sizeof(CLSID)); + + if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT) + { + pdlgInfo->lpOleUIInsertObject->sc= OleCreate( + &pdlgInfo->lpOleUIInsertObject->clsid, + &pdlgInfo->lpOleUIInsertObject->iid, + pdlgInfo->lpOleUIInsertObject->oleRender, + pdlgInfo->lpOleUIInsertObject->lpFormatEtc, + pdlgInfo->lpOleUIInsertObject->lpIOleClientSite, + pdlgInfo->lpOleUIInsertObject->lpIStorage, + pdlgInfo->lpOleUIInsertObject->ppvObj); + } + + bret = TRUE; + } + } + else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0)) + { + char fname[MAX_PATH]; + + if (pdlgInfo->lpOleUIInsertObject->lpszFile) + { + HRESULT hres; + WCHAR wcsFile[MAX_PATH]; + + SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)fname); + strncpy(pdlgInfo->lpOleUIInsertObject->lpszFile, fname, pdlgInfo->lpOleUIInsertObject->cchFile); + + RtlMultiByteToUnicodeN(wcsFile, MAX_PATH, NULL, fname, MAX_PATH); + if (ERROR_SUCCESS == (hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid))) + { + if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT) + { + hres = OleCreateFromFile( + &pdlgInfo->lpOleUIInsertObject->clsid, + wcsFile, + &pdlgInfo->lpOleUIInsertObject->iid, + pdlgInfo->lpOleUIInsertObject->oleRender, + pdlgInfo->lpOleUIInsertObject->lpFormatEtc, + pdlgInfo->lpOleUIInsertObject->lpIOleClientSite, + pdlgInfo->lpOleUIInsertObject->lpIStorage, + pdlgInfo->lpOleUIInsertObject->ppvObj); + } + + bret = TRUE; + } + pdlgInfo->lpOleUIInsertObject->sc = hres; + } + } + + return bret; +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_BrowseFile + * + * Browse for the file + */ +static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo) +{ + OPENFILENAMEA fn; + char fname[MAX_PATH]; + char title[32]; + + fn.lStructSize = sizeof(OPENFILENAMEA); + fn.hwndOwner = pdlgInfo->hwndSelf; + fn.hInstance = 0; + fn.lpstrFilter = "All Files\0*.*\0\0"; + fn.lpstrCustomFilter = NULL; + fn.nMaxCustFilter = 0; + fn.nFilterIndex = 0; + + SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)fname); + fn.lpstrFile = fname; + fn.nMaxFile = MAX_PATH; + + fn.lpstrFileTitle = NULL; + fn.nMaxFileTitle = 0; + fn.lpstrInitialDir = NULL; + + LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32); + fn.lpstrTitle = title; + + fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | + OFN_HIDEREADONLY | OFN_LONGNAMES; + fn.nFileOffset = 0; + fn.nFileExtension = 0; + fn.lpstrDefExt = NULL; + fn.lCustData = 0; + fn.lpfnHook = NULL; + fn.lpTemplateName = NULL; + + if (GetOpenFileNameA(&fn)) + SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, (WPARAM)0, (LPARAM)fn.lpstrFile); +} + + +/*********************************************************************** + * UIINSERTOBJECTDLG_AddControl + * + * Add control to Object Type + */ +static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo) +{ + OPENFILENAMEA fn; + char fname[MAX_PATH]; + char title[32]; + + fn.lStructSize = sizeof(OPENFILENAMEA); + fn.hwndOwner = pdlgInfo->hwndSelf; + fn.hInstance = 0; + fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0"; + fn.lpstrCustomFilter = NULL; + fn.nMaxCustFilter = 0; + fn.nFilterIndex = 0; + + fname[0] = 0; + fn.lpstrFile = fname; + fn.nMaxFile = MAX_PATH; + + fn.lpstrFileTitle = NULL; + fn.nMaxFileTitle = 0; + fn.lpstrInitialDir = NULL; + + LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32); + fn.lpstrTitle = title; + + fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | + OFN_HIDEREADONLY | OFN_LONGNAMES; + fn.nFileOffset = 0; + fn.nFileExtension = 0; + fn.lpstrDefExt = NULL; + fn.lCustData = 0; + fn.lpfnHook = NULL; + fn.lpTemplateName = NULL; + + if (GetOpenFileNameA(&fn)) + { + HMODULE hMod; + BOOL bValid = FALSE; + + hMod = LoadLibraryA(fn.lpstrFile); + + if (hMod) + { + DLLREGISTER regproc; + + regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer"); + if (regproc) + { + if (S_OK == regproc()) + { + UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo); + bValid = TRUE; + } + } + + FreeLibrary(hMod); + } + + if (!bValid) + { + char title[32]; + char msg[256]; + + LoadStringA(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32); + LoadStringA(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256); + + MessageBoxA(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION); + } + } +} --- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ dlls/oledlg/resource.h 2003-11-03 12:19:51.000000000 -0500 @@ -0,0 +1,20 @@ +#define IDS_RESULTOBJDESC 101 +#define IDS_RESULTFILEOBJDESC 102 +#define IDS_BROWSE 103 +#define IDS_NOTOLEMOD 104 +#define IDS_NOTOLEMODCAPTION 105 + +#define UIINSERTOBJECT 129 + +#define IDC_OBJTYPELIST 1000 +#define IDC_RESULT 1001 +#define IDC_CREATENEW 1002 +#define IDC_CREATECONTROL 1003 +#define IDC_CREATEFROMFILE 1004 +#define IDC_OBJTYPELBL 1005 +#define IDC_RESULTDESC 1006 +#define IDC_ADDCONTROL 1007 +#define IDC_ASICON 1008 +#define IDC_BROWSE 1009 +#define IDC_FILELBL 1010 +#define IDC_FILE 1011 --- /dev/null 2003-01-30 05:24:37.000000000 -0500 +++ dlls/oledlg/cdlg_En.rc 2003-11-03 12:19:51.000000000 -0500 @@ -0,0 +1,61 @@ +/* + * Copyright 2003 Ulrich Czekalla for CodeWeavers + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Insert Object" +FONT 8, "MS Sans Serif" +BEGIN + LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL | + WS_TABSTOP + LTEXT "Object Type:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE + DEFPUSHBUTTON "OK",IDOK,221,7,66,14 + PUSHBUTTON "Cancel",IDCANCEL,221,24,66,14 + GROUPBOX "Result",IDC_RESULT,7,103,208,41 + CONTROL "Create New",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,7,20,62,10 + CONTROL "Create Control",IDC_CREATECONTROL,"Button", + BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10 + CONTROL "Create From File",IDC_CREATEFROMFILE,"Button", + BS_AUTORADIOBUTTON,7,37,67,10 + LTEXT "",IDC_RESULTDESC,49,112,159,23 + PUSHBUTTON "&Add Control...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE + CONTROL "Display As Icon",IDC_ASICON,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10 + PUSHBUTTON "Browse...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE + LTEXT "File:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE + EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_RESULTOBJDESC "Insert a new %s object into your document" + IDS_RESULTFILEOBJDESC "Insert the contents of the file as an object into your document so that you may activate it using the program which created it." + IDS_BROWSE "Browse" + IDS_NOTOLEMOD "File does not appear to be a valid OLE module. Unable to register OLE control." + IDS_NOTOLEMODCAPTION "Add Control" +} + +