2fa4ec3f2ae7c5143e39772759afc99a2a54da28
[reactos.git] / reactos / 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 break;
203
204 case IDC_OBJTYPELIST:
205 if (wNotifyCode == LBN_SELCHANGE)
206 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
207 break;
208 }
209 return 0;
210 }
211
212
213 /***********************************************************************
214 * UIINSERTOBJECTDLG_InitDialog
215 *
216 * Initialize dialog display
217 */
218 static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
219 {
220 /* Initialize InsertObjectDlgInfo data structure */
221 pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
222 pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
223 pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
224 pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
225 pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
226 pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
227 pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
228 pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
229 pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
230 pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
231 pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
232
233 /* Setup dialog controls based on flags */
234 if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
235 SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
236
237 ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
238 IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
239 ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
240 IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
241 EnableWindow(pdlgInfo->hwndDisplayIconCB, !(pdlgInfo->lpOleUIInsertObject->dwFlags &
242 IOF_DISABLEDISPLAYASICON));
243
244 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
245 UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
246 else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
247 UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
248 else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
249 UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
250 }
251
252
253 /***********************************************************************
254 * UIINSERTOBJECTDLG_SelectCreateCtrl
255 *
256 * Select Create Control Radio Button
257 */
258 static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
259 {
260 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
261 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
262 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
263 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
264
265 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
266 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
267 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
268
269 SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
270
271 /* Populate object type listbox */
272 if (!pdlgInfo->bObjListInit)
273 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
274 }
275
276
277 /***********************************************************************
278 * UIINSERTOBJECTDLG_SelectCreateNew
279 *
280 * Select Create New Radio Button
281 */
282 static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
283 {
284 ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
285 ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
286 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
287 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
288
289 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
290 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
291
292 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
293 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
294
295 SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
296
297 if (!pdlgInfo->bObjListInit)
298 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
299
300 UIINSERTOBJECTDLG_SelChange(pdlgInfo);
301 }
302
303
304 /***********************************************************************
305 * UIINSERTOBJECTDLG_SelectCreateFromFile
306 *
307 * Select Create From File Radio Button
308 */
309 static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
310 {
311 WCHAR resstr[MAX_PATH];
312
313 ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
314 ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
315 ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
316
317 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
318 ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
319
320 ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW);
321 ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW);
322 ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW);
323
324 SendMessageW(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0);
325
326 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH))
327 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr);
328 }
329
330
331 /***********************************************************************
332 * UIINSERTOBJECTDLG_PopulateObjectTypes
333 *
334 * Populate Object Type listbox
335 */
336 static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo)
337 {
338 static const WCHAR szClsid[] = {'C','L','S','I','D',0};
339 static const WCHAR szInsertable[] = {'I','n','s','e','r','t','a','b','l','e',0};
340 static const WCHAR szNotInsertable[] = {'N','o','t','I','n','s','e','r','t','a','b','l','e',0};
341 DWORD i;
342 LONG len;
343 HKEY hkclsids;
344 HKEY hkey;
345 CLSID clsid;
346 LSTATUS ret;
347 WCHAR keydesc[MAX_PATH];
348 WCHAR keyname[MAX_PATH];
349 WCHAR szclsid[128];
350 DWORD index = 0;
351
352 UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
353
354 RegOpenKeyExW(HKEY_CLASSES_ROOT, szClsid, 0, KEY_READ, &hkclsids);
355
356 while (ERROR_SUCCESS == (ret = RegEnumKeyW(hkclsids, index, szclsid, sizeof(szclsid)/sizeof(szclsid[0]))))
357 {
358 index++;
359
360 RegOpenKeyExW(hkclsids, szclsid, 0, KEY_READ, &hkey);
361
362 len = sizeof(keyname);
363 if (ERROR_SUCCESS != RegQueryValueW(hkey, szInsertable, keyname, &len))
364 continue;
365
366 len = sizeof(keyname);
367 if (ERROR_SUCCESS == RegQueryValueW(hkey, szNotInsertable, keyname, &len))
368 continue;
369
370 CLSIDFromString(szclsid, &clsid);
371
372 for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++)
373 if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid))
374 break;
375
376 if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude)
377 continue;
378
379 len = sizeof(keydesc);
380 if (ERROR_SUCCESS == RegQueryValueW(hkey, NULL, keydesc, &len))
381 {
382 CLSID* lpclsid = HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID));
383 *lpclsid = clsid;
384
385 len = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc);
386 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, len, (LPARAM)lpclsid);
387 }
388 }
389
390 pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS);
391
392 return pdlgInfo->bObjListInit;
393 }
394
395
396 /***********************************************************************
397 * UIINSERTOBJECTDLG_FreeObjectTypes
398 *
399 * Free Object Types listbox
400 */
401 static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo)
402 {
403 UINT i, count;
404
405 count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, 0, 0);
406
407 for (i = 0; i < count; i++)
408 {
409 CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
410 LB_GETITEMDATA, i, 0);
411 HeapFree(GetProcessHeap(), 0, lpclsid);
412 }
413 }
414
415
416 /***********************************************************************
417 * UIINSERTOBJECTDLG_SelChange
418 *
419 * Handle object type selection change
420 */
421 static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo)
422 {
423 INT index;
424 WCHAR objname[MAX_PATH];
425 WCHAR objdesc[MAX_PATH];
426 WCHAR resstr[MAX_PATH];
427
428 TRACE("\n");
429
430 if (LoadStringW(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) &&
431 ((index = SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) &&
432 SendMessageW(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, index, (LPARAM)objname))
433 wsprintfW(objdesc, resstr, objname);
434 else
435 objdesc[0] = 0;
436
437 SendMessageW(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc);
438 }
439
440
441 /***********************************************************************
442 * UIINSERTOBJECTDLG_SelChange
443 *
444 * Handle OK Button
445 */
446 static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo)
447 {
448 BOOL bret = FALSE;
449
450 if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) ||
451 BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0))
452 {
453 INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0);
454
455 if (index >= 0)
456 {
457 CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB,
458 LB_GETITEMDATA, index, 0);
459 pdlgInfo->lpOleUIInsertObject->clsid = *clsid;
460
461 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT)
462 {
463 pdlgInfo->lpOleUIInsertObject->sc= OleCreate(
464 &pdlgInfo->lpOleUIInsertObject->clsid,
465 &pdlgInfo->lpOleUIInsertObject->iid,
466 pdlgInfo->lpOleUIInsertObject->oleRender,
467 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
468 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
469 pdlgInfo->lpOleUIInsertObject->lpIStorage,
470 pdlgInfo->lpOleUIInsertObject->ppvObj);
471 }
472
473 bret = TRUE;
474 }
475 }
476 else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0))
477 {
478 if (pdlgInfo->lpOleUIInsertObject->lpszFile)
479 {
480 HRESULT hres;
481 WCHAR wcsFile[MAX_PATH];
482
483 if (SendMessageW(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)wcsFile))
484 WideCharToMultiByte(CP_ACP, 0, wcsFile, -1,
485 pdlgInfo->lpOleUIInsertObject->lpszFile, pdlgInfo->lpOleUIInsertObject->cchFile, NULL, NULL);
486
487 if (ERROR_SUCCESS == (hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid)))
488 {
489 if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT)
490 {
491 hres = OleCreateFromFile(
492 &pdlgInfo->lpOleUIInsertObject->clsid,
493 wcsFile,
494 &pdlgInfo->lpOleUIInsertObject->iid,
495 pdlgInfo->lpOleUIInsertObject->oleRender,
496 pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
497 pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
498 pdlgInfo->lpOleUIInsertObject->lpIStorage,
499 pdlgInfo->lpOleUIInsertObject->ppvObj);
500 }
501
502 bret = TRUE;
503 }
504 pdlgInfo->lpOleUIInsertObject->sc = hres;
505 }
506 }
507
508 return bret;
509 }
510
511
512 /***********************************************************************
513 * UIINSERTOBJECTDLG_BrowseFile
514 *
515 * Browse for the file
516 */
517 static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo)
518 {
519 OPENFILENAMEA fn;
520 char fname[MAX_PATH];
521 char title[32];
522
523 fn.lStructSize = sizeof(OPENFILENAMEA);
524 fn.hwndOwner = pdlgInfo->hwndSelf;
525 fn.hInstance = 0;
526 fn.lpstrFilter = "All Files\0*.*\0\0";
527 fn.lpstrCustomFilter = NULL;
528 fn.nMaxCustFilter = 0;
529 fn.nFilterIndex = 0;
530
531 SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, MAX_PATH, (LPARAM)fname);
532 fn.lpstrFile = fname;
533 fn.nMaxFile = MAX_PATH;
534
535 fn.lpstrFileTitle = NULL;
536 fn.nMaxFileTitle = 0;
537 fn.lpstrInitialDir = NULL;
538
539 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
540 fn.lpstrTitle = title;
541
542 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
543 OFN_HIDEREADONLY | OFN_LONGNAMES;
544 fn.nFileOffset = 0;
545 fn.nFileExtension = 0;
546 fn.lpstrDefExt = NULL;
547 fn.lCustData = 0;
548 fn.lpfnHook = NULL;
549 fn.lpTemplateName = NULL;
550
551 if (GetOpenFileNameA(&fn))
552 SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, 0, (LPARAM)fn.lpstrFile);
553 }
554
555
556 /***********************************************************************
557 * UIINSERTOBJECTDLG_AddControl
558 *
559 * Add control to Object Type
560 */
561 static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo)
562 {
563 OPENFILENAMEA fn;
564 char fname[MAX_PATH];
565 char title[32];
566
567 fn.lStructSize = sizeof(OPENFILENAMEA);
568 fn.hwndOwner = pdlgInfo->hwndSelf;
569 fn.hInstance = 0;
570 fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0";
571 fn.lpstrCustomFilter = NULL;
572 fn.nMaxCustFilter = 0;
573 fn.nFilterIndex = 0;
574
575 fname[0] = 0;
576 fn.lpstrFile = fname;
577 fn.nMaxFile = MAX_PATH;
578
579 fn.lpstrFileTitle = NULL;
580 fn.nMaxFileTitle = 0;
581 fn.lpstrInitialDir = NULL;
582
583 LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
584 fn.lpstrTitle = title;
585
586 fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
587 OFN_HIDEREADONLY | OFN_LONGNAMES;
588 fn.nFileOffset = 0;
589 fn.nFileExtension = 0;
590 fn.lpstrDefExt = NULL;
591 fn.lCustData = 0;
592 fn.lpfnHook = NULL;
593 fn.lpTemplateName = NULL;
594
595 if (GetOpenFileNameA(&fn))
596 {
597 HMODULE hMod;
598 BOOL bValid = FALSE;
599
600 hMod = LoadLibraryA(fn.lpstrFile);
601
602 if (hMod)
603 {
604 DLLREGISTER regproc;
605
606 regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer");
607 if (regproc)
608 {
609 if (S_OK == regproc())
610 {
611 UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
612 bValid = TRUE;
613 }
614 }
615
616 FreeLibrary(hMod);
617 }
618
619 if (!bValid)
620 {
621 WCHAR title[32];
622 WCHAR msg[256];
623
624 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32);
625 LoadStringW(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256);
626
627 MessageBoxW(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION);
628 }
629 }
630 }