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