4 * Copyright 2003 Ulrich Czekalla for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/debug.h"
32 #include "wine/unicode.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(oledlg);
42 BOOL bObjListInit; /* Object list has been initialized */
43 LPOLEUIINSERTOBJECTA lpOleUIInsertObject;
49 HWND hwndCreateCtrlCB;
51 HWND hwndCreateFromFileCB;
52 HWND hwndDisplayIconCB;
57 } InsertObjectDlgInfo;
59 static INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
60 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
61 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo);
62 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo);
63 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo);
64 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo);
65 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo);
66 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo);
67 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo);
68 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo);
69 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo);
70 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo);
72 typedef HRESULT (*DLLREGISTER) (void);
74 extern HINSTANCE OLEDLG_hInstance;
75 static const char OleUIInsertObjectInfoStr[] = "OleUIInsertObjectInfoStr";
77 /***********************************************************************
78 * OleUIInsertObjectA (OLEDLG.3)
80 UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
85 InsertObjectDlgInfo dlgInfo;
88 if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource)
89 FIXME("Customized template not supported\n");
91 /* Create the dialog from a template */
92 if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT),
95 return OLEUI_ERR_FINDTEMPLATEFAILURE;
98 if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) ||
99 !(template = LockResource( hDlgTmpl )))
101 return OLEUI_ERR_LOADTEMPLATEFAILURE;
104 /* Initialize InsertObjectDlgInfo structure */
105 dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject;
106 dlgInfo.bObjListInit = FALSE;
108 lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (const DLGTEMPLATE*) template,
109 lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc,
112 /* Unable to create the dialog */
114 return OLEUI_ERR_DIALOGFAILURE;
120 /***********************************************************************
121 * UIInsertObjectDlgProc
123 * OLE UI Insert Object dialog procedure
125 INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
127 InsertObjectDlgInfo* pdlgInfo = GetPropA(hwnd,OleUIInsertObjectInfoStr);
133 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam;
135 pdlgInfo->hwndSelf = hwnd;
137 SetPropA(hwnd, OleUIInsertObjectInfoStr, pdlgInfo);
139 UIINSERTOBJECTDLG_InitDialog(pdlgInfo);
145 return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam);
149 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
150 RemovePropA(hwnd, OleUIInsertObjectInfoStr);
159 /***********************************************************************
160 * UIINSOBJDLG_OnWMCommand
162 * WM_COMMAND message handler
164 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
166 WORD wNotifyCode = HIWORD(wParam);
167 WORD wID = LOWORD(wParam);
168 InsertObjectDlgInfo* pdlgInfo = GetPropA(hwnd,OleUIInsertObjectInfoStr);
173 EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo));
177 EndDialog(hwnd, FALSE);
180 case IDC_CREATECONTROL:
181 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
185 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
188 case IDC_CREATEFROMFILE:
189 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
193 UIINSERTOBJECTDLG_BrowseFile(pdlgInfo);
197 UIINSERTOBJECTDLG_AddControl(pdlgInfo);
199 case IDC_OBJTYPELIST:
200 if (wNotifyCode == LBN_SELCHANGE)
201 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
208 /***********************************************************************
209 * UIINSERTOBJECTDLG_InitDialog
211 * Initialize dialog display
213 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
215 /* Initialize InsertObjectDlgInfo data structure */
216 pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
217 pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
218 pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
219 pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
220 pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
221 pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
222 pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
223 pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
224 pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
225 pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
226 pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
228 /* Setup dialog controls based on flags */
229 if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
230 SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
232 ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
233 IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
234 ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
235 IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
236 EnableWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
237 IOF_DISABLEDISPLAYASICON) ? FALSE : TRUE);
239 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
240 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
241 else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
242 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
243 else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
244 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
248 /***********************************************************************
249 * UIINSERTOBJECTDLG_SelectCreateCtrl
251 * Select Create Control Radio Button
253 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
255 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
256 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
257 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
258 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
260 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
261 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
262 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
264 SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
266 /* Populate object type listbox */
267 if (!pdlgInfo->bObjListInit)
268 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
272 /***********************************************************************
273 * UIINSERTOBJECTDLG_SelectCreateNew
275 * Select Create New Radio Button
277 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
279 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
280 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
281 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
282 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
284 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
285 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
287 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
288 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
290 SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
292 if (!pdlgInfo->bObjListInit)
293 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
295 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
299 /***********************************************************************
300 * UIINSERTOBJECTDLG_SelectCreateFromFile
302 * Select Create From File Radio Button
304 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
306 WCHAR resstr[MAX_PATH];
308 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
309 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
310 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
312 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
313 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
315 ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW);
316 ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW);
317 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW);
319 SendMessageW(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0);
321 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH))
322 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr);
326 /***********************************************************************
327 * UIINSERTOBJECTDLG_PopulateObjectTypes
329 * Populate Object Type listbox
331 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo)
333 static const WCHAR szClsid[] = {'C','L','S','I','D',0};
334 static const WCHAR szInsertable[] = {'I','n','s','e','r','t','a','b','l','e',0};
335 static const WCHAR szNotInsertable[] = {'N','o','t','I','n','s','e','r','t','a','b','l','e',0};
342 WCHAR keydesc[MAX_PATH];
343 WCHAR keyname[MAX_PATH];
347 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
349 RegOpenKeyExW(HKEY_CLASSES_ROOT, szClsid, 0, KEY_READ, &hkclsids);
351 while (ERROR_SUCCESS == (ret = RegEnumKeyW(hkclsids, index, szclsid, sizeof(szclsid)/sizeof(szclsid[0]))))
355 RegOpenKeyExW(hkclsids, szclsid, 0, KEY_READ, &hkey);
357 len = sizeof(keyname);
358 if (ERROR_SUCCESS != RegQueryValueW(hkey, szInsertable, keyname, &len))
361 len = sizeof(keyname);
362 if (ERROR_SUCCESS == RegQueryValueW(hkey, szNotInsertable, keyname, &len))
365 CLSIDFromString(szclsid, &clsid);
367 for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++)
368 if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid))
371 if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude)
374 len = sizeof(keydesc);
375 if (ERROR_SUCCESS == RegQueryValueW(hkey, NULL, keydesc, &len))
377 CLSID* lpclsid = HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID));
380 len = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc);
381 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, len, (LPARAM)lpclsid);
385 pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS);
387 return pdlgInfo->bObjListInit;
391 /***********************************************************************
392 * UIINSERTOBJECTDLG_FreeObjectTypes
394 * Free Object Types listbox
396 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo)
400 count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, 0, 0);
402 for (i = 0; i < count; i++)
404 CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
405 LB_GETITEMDATA, i, 0);
406 HeapFree(GetProcessHeap(), 0, lpclsid);
411 /***********************************************************************
412 * UIINSERTOBJECTDLG_SelChange
414 * Handle object type selection change
416 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo)
419 WCHAR objname[MAX_PATH];
420 WCHAR objdesc[MAX_PATH];
421 WCHAR resstr[MAX_PATH];
425 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) &&
426 ((index = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) &&
427 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, index, (LPARAM)objname))
428 wsprintfW(objdesc, resstr, objname);
432 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc);
436 /***********************************************************************
437 * UIINSERTOBJECTDLG_SelChange
441 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo)
445 if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) ||
446 BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0))
448 INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0);
452 CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
453 LB_GETITEMDATA, index, 0);
454 pdlgInfo->lpOleUIInsertObject->clsid = *clsid;
456 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT)
458 pdlgInfo->lpOleUIInsertObject->sc= OleCreate(
459 &pdlgInfo->lpOleUIInsertObject->clsid,
460 &pdlgInfo->lpOleUIInsertObject->iid,
461 pdlgInfo->lpOleUIInsertObject->oleRender,
462 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
463 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
464 pdlgInfo->lpOleUIInsertObject->lpIStorage,
465 pdlgInfo->lpOleUIInsertObject->ppvObj);
471 else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0))
473 if (pdlgInfo->lpOleUIInsertObject->lpszFile)
476 WCHAR wcsFile[MAX_PATH];
478 if (SendMessageW(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)wcsFile))
479 WideCharToMultiByte(CP_ACP, 0, wcsFile, -1,
480 pdlgInfo->lpOleUIInsertObject->lpszFile, pdlgInfo->lpOleUIInsertObject->cchFile, NULL, NULL);
482 if (ERROR_SUCCESS == (hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid)))
484 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT)
486 hres = OleCreateFromFile(
487 &pdlgInfo->lpOleUIInsertObject->clsid,
489 &pdlgInfo->lpOleUIInsertObject->iid,
490 pdlgInfo->lpOleUIInsertObject->oleRender,
491 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
492 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
493 pdlgInfo->lpOleUIInsertObject->lpIStorage,
494 pdlgInfo->lpOleUIInsertObject->ppvObj);
499 pdlgInfo->lpOleUIInsertObject->sc = hres;
507 /***********************************************************************
508 * UIINSERTOBJECTDLG_BrowseFile
510 * Browse for the file
512 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo)
515 char fname[MAX_PATH];
518 fn.lStructSize = sizeof(OPENFILENAMEA);
519 fn.hwndOwner = pdlgInfo->hwndSelf;
521 fn.lpstrFilter = "All Files\0*.*\0\0";
522 fn.lpstrCustomFilter = NULL;
523 fn.nMaxCustFilter = 0;
526 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)fname);
527 fn.lpstrFile = fname;
528 fn.nMaxFile = MAX_PATH;
530 fn.lpstrFileTitle = NULL;
531 fn.nMaxFileTitle = 0;
532 fn.lpstrInitialDir = NULL;
534 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
535 fn.lpstrTitle = title;
537 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
538 OFN_HIDEREADONLY | OFN_LONGNAMES;
540 fn.nFileExtension = 0;
541 fn.lpstrDefExt = NULL;
544 fn.lpTemplateName = NULL;
546 if (GetOpenFileNameA(&fn))
547 SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, 0, (LPARAM)fn.lpstrFile);
551 /***********************************************************************
552 * UIINSERTOBJECTDLG_AddControl
554 * Add control to Object Type
556 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo)
559 char fname[MAX_PATH];
562 fn.lStructSize = sizeof(OPENFILENAMEA);
563 fn.hwndOwner = pdlgInfo->hwndSelf;
565 fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0";
566 fn.lpstrCustomFilter = NULL;
567 fn.nMaxCustFilter = 0;
571 fn.lpstrFile = fname;
572 fn.nMaxFile = MAX_PATH;
574 fn.lpstrFileTitle = NULL;
575 fn.nMaxFileTitle = 0;
576 fn.lpstrInitialDir = NULL;
578 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
579 fn.lpstrTitle = title;
581 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
582 OFN_HIDEREADONLY | OFN_LONGNAMES;
584 fn.nFileExtension = 0;
585 fn.lpstrDefExt = NULL;
588 fn.lpTemplateName = NULL;
590 if (GetOpenFileNameA(&fn))
595 hMod = LoadLibraryA(fn.lpstrFile);
601 regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer");
604 if (S_OK == regproc())
606 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
619 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32);
620 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256);
622 MessageBoxW(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION);