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