Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / win32 / oledlg / insobjdlg.c
1 /*
2 * OLEDLG library
3 *
4 * Copyright 2003 Ulrich Czekalla for CodeWeavers
5 *
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.
10 *
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.
15 *
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
19 */
20
21 #include "oledlg_private.h"
22
23 #include <winreg.h>
24
25 WINE_DEFAULT_DEBUG_CHANNEL(oledlg);
26
27 typedef struct
28 {
29 HWND hwndSelf;
30 BOOL bObjListInit; /* Object list has been initialized */
31 LPOLEUIINSERTOBJECTA lpOleUIInsertObject;
32
33 HWND hwndObjTypeLBL;
34 HWND hwndObjTypeLB;
35 HWND hwndFileLBL;
36 HWND hwndFileTB;
37 HWND hwndCreateCtrlCB;
38 HWND hwndCreateNewCB;
39 HWND hwndCreateFromFileCB;
40 HWND hwndDisplayIconCB;
41 HWND hwndAddCtrlBTN;
42 HWND hwndBrowseBTN;
43 HWND hwndResultDesc;
44
45 } InsertObjectDlgInfo;
46
47 static INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
48 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
49 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo);
50 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo);
51 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo);
52 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo);
53 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo);
54 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo);
55 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo);
56 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo);
57 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo);
58 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo);
59
60 typedef HRESULT (*DLLREGISTER) (void);
61
62 extern HINSTANCE OLEDLG_hInstance;
63 static const WCHAR OleUIInsertObjectInfoStr[] = {'O','l','e','U','I','I','n','s','e','r','t','O','b','j','e','c','t',
64 'I','n','f','o','S','t','r',0};
65
66 /***********************************************************************
67 * OleUIInsertObjectA (OLEDLG.3)
68 */
69 UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
70 {
71 LRESULT lRes;
72 LPCVOID template;
73 HRSRC hRes;
74 InsertObjectDlgInfo dlgInfo;
75 HANDLE hDlgTmpl = 0;
76
77 if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource)
78 FIXME("Customized template not supported\n");
79
80 /* Create the dialog from a template */
81 if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT),
82 (LPSTR)RT_DIALOG)))
83 {
84 return OLEUI_ERR_FINDTEMPLATEFAILURE;
85 }
86
87 if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) ||
88 !(template = LockResource( hDlgTmpl )))
89 {
90 return OLEUI_ERR_LOADTEMPLATEFAILURE;
91 }
92
93 /* Initialize InsertObjectDlgInfo structure */
94 dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject;
95 dlgInfo.bObjListInit = FALSE;
96
97 lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (const DLGTEMPLATE*) template,
98 lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc,
99 (LPARAM) &dlgInfo);
100
101 /* Unable to create the dialog */
102 if( lRes == -1)
103 return OLEUI_ERR_DIALOGFAILURE;
104
105 return lRes;
106 }
107
108
109 /***********************************************************************
110 * UIInsertObjectDlgProc
111 *
112 * OLE UI Insert Object dialog procedure
113 */
114 INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
115 {
116 InsertObjectDlgInfo* pdlgInfo = GetPropW(hwnd, OleUIInsertObjectInfoStr);
117
118 switch(uMsg)
119 {
120 case WM_INITDIALOG:
121 {
122 InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam;
123
124 pdlgInfo->hwndSelf = hwnd;
125
126 SetPropW(hwnd, OleUIInsertObjectInfoStr, pdlgInfo);
127
128 UIINSERTOBJECTDLG_InitDialog(pdlgInfo);
129
130 return 0;
131 }
132
133 case WM_COMMAND:
134 return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam);
135
136 case WM_DESTROY:
137 if (pdlgInfo)
138 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
139 RemovePropW(hwnd, OleUIInsertObjectInfoStr);
140 return FALSE;
141
142 default :
143 return FALSE;
144 }
145 }
146
147
148 /***********************************************************************
149 * UIINSOBJDLG_OnWMCommand
150 *
151 * WM_COMMAND message handler
152 */
153 static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
154 {
155 InsertObjectDlgInfo* pdlgInfo = GetPropW(hwnd, OleUIInsertObjectInfoStr);
156 WORD wNotifyCode = HIWORD(wParam);
157 WORD wID = LOWORD(wParam);
158
159 switch(wID)
160 {
161 case IDOK:
162 EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo));
163 break;
164
165 case IDCANCEL:
166 EndDialog(hwnd, FALSE);
167 break;
168
169 case IDC_CREATECONTROL:
170 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
171 break;
172
173 case IDC_CREATENEW:
174 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
175 break;
176
177 case IDC_CREATEFROMFILE:
178 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
179 break;
180
181 case IDC_BROWSE:
182 UIINSERTOBJECTDLG_BrowseFile(pdlgInfo);
183 break;
184
185 case IDC_ADDCONTROL:
186 UIINSERTOBJECTDLG_AddControl(pdlgInfo);
187 break;
188
189 case IDC_OBJTYPELIST:
190 if (wNotifyCode == LBN_SELCHANGE)
191 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
192 break;
193 }
194 return 0;
195 }
196
197
198 /***********************************************************************
199 * UIINSERTOBJECTDLG_InitDialog
200 *
201 * Initialize dialog display
202 */
203 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
204 {
205 /* Initialize InsertObjectDlgInfo data structure */
206 pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
207 pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
208 pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
209 pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
210 pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
211 pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
212 pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
213 pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
214 pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
215 pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
216 pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
217
218 /* Setup dialog controls based on flags */
219 if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
220 SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
221
222 ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
223 IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
224 ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
225 IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
226 EnableWindow(pdlgInfo->hwndDisplayIconCB, !(pdlgInfo->lpOleUIInsertObject->dwFlags &
227 IOF_DISABLEDISPLAYASICON));
228
229 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
230 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
231 else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
232 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
233 else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
234 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
235 }
236
237
238 /***********************************************************************
239 * UIINSERTOBJECTDLG_SelectCreateCtrl
240 *
241 * Select Create Control Radio Button
242 */
243 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
244 {
245 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
246 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
247 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
248 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
249
250 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
251 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
252 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
253
254 SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
255
256 /* Populate object type listbox */
257 if (!pdlgInfo->bObjListInit)
258 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
259 }
260
261
262 /***********************************************************************
263 * UIINSERTOBJECTDLG_SelectCreateNew
264 *
265 * Select Create New Radio Button
266 */
267 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
268 {
269 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
270 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
271 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
272 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
273
274 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
275 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
276
277 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
278 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
279
280 SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
281
282 if (!pdlgInfo->bObjListInit)
283 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
284
285 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
286 }
287
288
289 /***********************************************************************
290 * UIINSERTOBJECTDLG_SelectCreateFromFile
291 *
292 * Select Create From File Radio Button
293 */
294 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
295 {
296 WCHAR resstr[MAX_PATH];
297
298 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
299 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
300 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
301
302 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
303 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
304
305 ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW);
306 ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW);
307 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW);
308
309 SendMessageW(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0);
310
311 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH))
312 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr);
313 }
314
315
316 /***********************************************************************
317 * UIINSERTOBJECTDLG_PopulateObjectTypes
318 *
319 * Populate Object Type listbox
320 */
321 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo)
322 {
323 static const WCHAR szClsid[] = {'C','L','S','I','D',0};
324 static const WCHAR szInsertable[] = {'I','n','s','e','r','t','a','b','l','e',0};
325 static const WCHAR szNotInsertable[] = {'N','o','t','I','n','s','e','r','t','a','b','l','e',0};
326 DWORD i;
327 LONG len;
328 HKEY hkclsids;
329 HKEY hkey;
330 CLSID clsid;
331 LSTATUS ret;
332 WCHAR keydesc[MAX_PATH];
333 WCHAR keyname[MAX_PATH];
334 WCHAR szclsid[128];
335 DWORD index = 0;
336
337 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
338
339 RegOpenKeyExW(HKEY_CLASSES_ROOT, szClsid, 0, KEY_READ, &hkclsids);
340
341 while (ERROR_SUCCESS == (ret = RegEnumKeyW(hkclsids, index, szclsid, sizeof(szclsid)/sizeof(szclsid[0]))))
342 {
343 index++;
344
345 RegOpenKeyExW(hkclsids, szclsid, 0, KEY_READ, &hkey);
346
347 len = sizeof(keyname);
348 if (ERROR_SUCCESS != RegQueryValueW(hkey, szInsertable, keyname, &len))
349 continue;
350
351 len = sizeof(keyname);
352 if (ERROR_SUCCESS == RegQueryValueW(hkey, szNotInsertable, keyname, &len))
353 continue;
354
355 CLSIDFromString(szclsid, &clsid);
356
357 for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++)
358 if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid))
359 break;
360
361 if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude)
362 continue;
363
364 len = sizeof(keydesc);
365 if (ERROR_SUCCESS == RegQueryValueW(hkey, NULL, keydesc, &len))
366 {
367 CLSID* lpclsid = HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID));
368 *lpclsid = clsid;
369
370 len = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc);
371 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, len, (LPARAM)lpclsid);
372 }
373 }
374
375 pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS);
376
377 return pdlgInfo->bObjListInit;
378 }
379
380
381 /***********************************************************************
382 * UIINSERTOBJECTDLG_FreeObjectTypes
383 *
384 * Free Object Types listbox
385 */
386 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo)
387 {
388 UINT i, count;
389
390 count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, 0, 0);
391
392 for (i = 0; i < count; i++)
393 {
394 CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
395 LB_GETITEMDATA, i, 0);
396 HeapFree(GetProcessHeap(), 0, lpclsid);
397 }
398 }
399
400
401 /***********************************************************************
402 * UIINSERTOBJECTDLG_SelChange
403 *
404 * Handle object type selection change
405 */
406 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo)
407 {
408 INT index;
409 WCHAR objname[MAX_PATH];
410 WCHAR objdesc[MAX_PATH];
411 WCHAR resstr[MAX_PATH];
412
413 TRACE("\n");
414
415 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) &&
416 ((index = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) &&
417 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, index, (LPARAM)objname))
418 wsprintfW(objdesc, resstr, objname);
419 else
420 objdesc[0] = 0;
421
422 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc);
423 }
424
425
426 /***********************************************************************
427 * UIINSERTOBJECTDLG_SelChange
428 *
429 * Handle OK Button
430 */
431 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo)
432 {
433 BOOL bret = FALSE;
434
435 if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) ||
436 BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0))
437 {
438 INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0);
439
440 if (index >= 0)
441 {
442 CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
443 LB_GETITEMDATA, index, 0);
444 pdlgInfo->lpOleUIInsertObject->clsid = *clsid;
445
446 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT)
447 {
448 pdlgInfo->lpOleUIInsertObject->sc= OleCreate(
449 &pdlgInfo->lpOleUIInsertObject->clsid,
450 &pdlgInfo->lpOleUIInsertObject->iid,
451 pdlgInfo->lpOleUIInsertObject->oleRender,
452 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
453 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
454 pdlgInfo->lpOleUIInsertObject->lpIStorage,
455 pdlgInfo->lpOleUIInsertObject->ppvObj);
456 }
457
458 bret = TRUE;
459 }
460 }
461 else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0))
462 {
463 if (pdlgInfo->lpOleUIInsertObject->lpszFile)
464 {
465 HRESULT hres;
466 WCHAR wcsFile[MAX_PATH];
467
468 if (SendMessageW(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)wcsFile))
469 WideCharToMultiByte(CP_ACP, 0, wcsFile, -1,
470 pdlgInfo->lpOleUIInsertObject->lpszFile, pdlgInfo->lpOleUIInsertObject->cchFile, NULL, NULL);
471
472 if (SUCCEEDED(hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid)))
473 {
474 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT)
475 {
476 hres = OleCreateFromFile(
477 &pdlgInfo->lpOleUIInsertObject->clsid,
478 wcsFile,
479 &pdlgInfo->lpOleUIInsertObject->iid,
480 pdlgInfo->lpOleUIInsertObject->oleRender,
481 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
482 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
483 pdlgInfo->lpOleUIInsertObject->lpIStorage,
484 pdlgInfo->lpOleUIInsertObject->ppvObj);
485 }
486
487 bret = TRUE;
488 }
489 pdlgInfo->lpOleUIInsertObject->sc = hres;
490 }
491 }
492
493 return bret;
494 }
495
496
497 /***********************************************************************
498 * UIINSERTOBJECTDLG_BrowseFile
499 *
500 * Browse for the file
501 */
502 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo)
503 {
504 OPENFILENAMEA fn;
505 char fname[MAX_PATH];
506 char title[32];
507
508 fn.lStructSize = sizeof(OPENFILENAMEA);
509 fn.hwndOwner = pdlgInfo->hwndSelf;
510 fn.hInstance = 0;
511 fn.lpstrFilter = "All Files\0*.*\0\0";
512 fn.lpstrCustomFilter = NULL;
513 fn.nMaxCustFilter = 0;
514 fn.nFilterIndex = 0;
515
516 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)fname);
517 fn.lpstrFile = fname;
518 fn.nMaxFile = MAX_PATH;
519
520 fn.lpstrFileTitle = NULL;
521 fn.nMaxFileTitle = 0;
522 fn.lpstrInitialDir = NULL;
523
524 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
525 fn.lpstrTitle = title;
526
527 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
528 OFN_HIDEREADONLY | OFN_LONGNAMES;
529 fn.nFileOffset = 0;
530 fn.nFileExtension = 0;
531 fn.lpstrDefExt = NULL;
532 fn.lCustData = 0;
533 fn.lpfnHook = NULL;
534 fn.lpTemplateName = NULL;
535
536 if (GetOpenFileNameA(&fn))
537 SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, 0, (LPARAM)fn.lpstrFile);
538 }
539
540
541 /***********************************************************************
542 * UIINSERTOBJECTDLG_AddControl
543 *
544 * Add control to Object Type
545 */
546 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo)
547 {
548 OPENFILENAMEA fn;
549 char fname[MAX_PATH];
550 char title[32];
551
552 fn.lStructSize = sizeof(OPENFILENAMEA);
553 fn.hwndOwner = pdlgInfo->hwndSelf;
554 fn.hInstance = 0;
555 fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0";
556 fn.lpstrCustomFilter = NULL;
557 fn.nMaxCustFilter = 0;
558 fn.nFilterIndex = 0;
559
560 fname[0] = 0;
561 fn.lpstrFile = fname;
562 fn.nMaxFile = MAX_PATH;
563
564 fn.lpstrFileTitle = NULL;
565 fn.nMaxFileTitle = 0;
566 fn.lpstrInitialDir = NULL;
567
568 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
569 fn.lpstrTitle = title;
570
571 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
572 OFN_HIDEREADONLY | OFN_LONGNAMES;
573 fn.nFileOffset = 0;
574 fn.nFileExtension = 0;
575 fn.lpstrDefExt = NULL;
576 fn.lCustData = 0;
577 fn.lpfnHook = NULL;
578 fn.lpTemplateName = NULL;
579
580 if (GetOpenFileNameA(&fn))
581 {
582 HMODULE hMod;
583 BOOL bValid = FALSE;
584
585 hMod = LoadLibraryA(fn.lpstrFile);
586
587 if (hMod)
588 {
589 DLLREGISTER regproc;
590
591 regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer");
592 if (regproc)
593 {
594 if (S_OK == regproc())
595 {
596 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
597 bValid = TRUE;
598 }
599 }
600
601 FreeLibrary(hMod);
602 }
603
604 if (!bValid)
605 {
606 WCHAR title[32];
607 WCHAR msg[256];
608
609 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32);
610 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256);
611
612 MessageBoxW(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION);
613 }
614 }
615 }