Added an unknown VxD error code.
[wine] / programs / progman / dialog.c
1 /*
2  * Program Manager
3  *
4  * Copyright 1996 Ulrich Schmid
5  */
6
7 #include "windows.h"
8 #include "commdlg.h"
9 #include "progman.h"
10 static BOOL    DIALOG_BrowsePrograms(HWND, LPSTR, INT);
11 static BOOL    DIALOG_BrowseSymbols(HWND, LPSTR, INT);
12 static BOOL CALLBACK DIALOG_NEW_DlgProc(HWND, UINT, WPARAM, LPARAM);
13 static BOOL CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND, UINT, WPARAM, LPARAM);
14 static BOOL CALLBACK DIALOG_GROUP_DlgProc(HWND, UINT, WPARAM, LPARAM);
15 static BOOL CALLBACK DIALOG_PROGRAM_DlgProc(HWND, UINT, WPARAM, LPARAM);
16 static BOOL CALLBACK DIALOG_SYMBOL_DlgProc(HWND, UINT, WPARAM, LPARAM);
17 static BOOL CALLBACK DIALOG_EXECUTE_DlgProc(HWND, UINT, WPARAM, LPARAM);
18
19 /***********************************************************************
20  *
21  *           DIALOG_New
22  */
23
24 static struct
25 {
26   INT nDefault;
27 } New;
28
29 INT DIALOG_New(INT nDefault)
30 {
31   DLGPROC lpfnDlg = MakeProcInstance(DIALOG_NEW_DlgProc, Globals.hInstance);
32   INT ret;
33
34   New.nDefault = nDefault;
35
36   ret = DialogBox(Globals.hInstance,  STRING_NEW_Xx,
37                   Globals.hMainWnd, lpfnDlg);
38   FreeProcInstance(lpfnDlg);
39   return ret;
40 }
41
42 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
43  *
44  *           DIALOG_NEW_DlgProc
45  */
46
47 static BOOL CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
48 {
49   switch (msg)
50     {
51     case WM_INITDIALOG:
52       CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, New.nDefault);
53       break;
54
55     case WM_COMMAND:
56       switch (wParam)
57         {
58         case PM_NEW_GROUP:
59         case PM_NEW_PROGRAM:
60           CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam);
61           return TRUE;
62
63         case IDOK:
64           EndDialog(hDlg, IsDlgButtonChecked(hDlg, PM_NEW_GROUP) ?
65                     PM_NEW_GROUP : PM_NEW_PROGRAM);
66           return TRUE;
67
68         case IDCANCEL:
69           EndDialog(hDlg, IDCANCEL);
70           return TRUE;
71         }
72     }
73   return FALSE;
74 }
75
76 /***********************************************************************
77  *
78  *           DIALOG_CopyMove
79  */
80
81 static struct
82 {
83   LPCSTR lpszProgramName, lpszFromGroupName;
84   HLOCAL hToGroup;
85 } CopyMove;
86
87 HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName,
88                      BOOL bMove)
89 {
90   DLGPROC lpfnDlg = MakeProcInstance(DIALOG_COPY_MOVE_DlgProc, Globals.hInstance);
91   INT ret;
92
93   CopyMove.lpszProgramName   = lpszProgramName;
94   CopyMove.lpszFromGroupName = lpszFromGroupName;
95   CopyMove.hToGroup          = 0;
96
97   ret = DialogBox(Globals.hInstance,
98                   bMove ? STRING_MOVE_Xx : STRING_COPY_Xx,
99                   Globals.hMainWnd, lpfnDlg);
100   FreeProcInstance(lpfnDlg);
101
102   return((ret == IDOK) ? CopyMove.hToGroup : 0);
103 }
104
105 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
106  *
107  *           DIALOG_COPY_MOVE_DlgProc
108  */
109
110 static BOOL CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
111 {
112   HLOCAL hGroup;
113
114   switch (msg)
115     {
116     case WM_INITDIALOG:
117       /* List all group names */
118       for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
119         SendDlgItemMessage(hDlg, PM_TO_GROUP, CB_ADDSTRING, 0,
120                            (LPARAM) GROUP_GroupName(hGroup));
121
122       SetDlgItemText(hDlg, PM_PROGRAM,    (LPSTR)CopyMove.lpszProgramName);
123       SetDlgItemText(hDlg, PM_FROM_GROUP, (LPSTR)CopyMove.lpszFromGroupName);
124       break;
125
126     case WM_COMMAND:
127       switch (wParam)
128         {
129         case IDOK:
130         {
131           /* Get selected group */
132           INT nCurSel    = SendDlgItemMessage(hDlg, PM_TO_GROUP, CB_GETCURSEL, 0, 0);
133           INT nLen       = SendDlgItemMessage(hDlg, PM_TO_GROUP, CB_GETLBTEXTLEN, nCurSel, 0);
134           HLOCAL hBuffer = LocalAlloc(LMEM_FIXED, nLen + 1);
135           LPSTR   buffer = LocalLock(hBuffer);
136
137           SendDlgItemMessage(hDlg, PM_TO_GROUP, CB_GETLBTEXT, nCurSel, (LPARAM)buffer);
138           for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup))
139             if (!lstrcmp(buffer, GROUP_GroupName(hGroup))) break;
140           LocalFree(hBuffer);
141
142           CopyMove.hToGroup = hGroup;
143           EndDialog(hDlg, IDOK);
144           return TRUE;
145         }
146
147         case IDCANCEL:
148           EndDialog(hDlg, IDCANCEL);
149           return TRUE;
150         }
151     }
152   return FALSE;
153 }
154
155 /***********************************************************************
156  *
157  *           DIALOG_Delete
158  */
159
160 BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName)
161 {
162   return (IDYES == MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE,
163                                         MB_YESNO | MB_DEFBUTTON2));
164 }
165
166
167 /***********************************************************************
168  *
169  *           DIALOG_GroupAttributes
170  */
171
172 static struct
173 {
174   LPSTR lpszTitle, lpszGrpFile;
175   INT   nSize;
176 } GroupAttributes;
177
178 BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize)
179 {
180   DLGPROC lpfnDlg = MakeProcInstance(DIALOG_GROUP_DlgProc, Globals.hInstance);
181   INT ret;
182
183   GroupAttributes.nSize       = nSize;
184   GroupAttributes.lpszTitle   = lpszTitle;
185   GroupAttributes.lpszGrpFile = lpszGrpFile;
186
187   ret = DialogBox(Globals.hInstance,  STRING_GROUP_Xx,
188                   Globals.hMainWnd, lpfnDlg);
189   FreeProcInstance(lpfnDlg);
190   return(ret == IDOK);
191 }
192
193 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
194  *
195  *           DIALOG_GROUP_DlgProc
196  */
197
198 static BOOL CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
199 {
200   switch (msg)
201     {
202     case WM_INITDIALOG:
203       SetDlgItemText(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle);
204       SetDlgItemText(hDlg, PM_FILE, GroupAttributes.lpszGrpFile);
205       break;
206
207     case WM_COMMAND:
208       switch (wParam)
209         {
210         case IDOK:
211           GetDlgItemText(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle,
212                          GroupAttributes.nSize);
213           GetDlgItemText(hDlg, PM_FILE, GroupAttributes.lpszGrpFile,
214                          GroupAttributes.nSize);
215           EndDialog(hDlg, IDOK);
216           return TRUE;
217
218         case IDCANCEL:
219           EndDialog(hDlg, IDCANCEL);
220           return TRUE;
221         }
222     }
223   return FALSE;
224 }
225
226 /***********************************************************************
227  *
228  *           DIALOG_ProgramAttributes
229  */
230
231 static struct
232 {
233   LPSTR lpszTitle, lpszCmdLine, lpszWorkDir, lpszIconFile, lpszTmpIconFile;
234   INT   nSize;
235   INT   *lpnCmdShow;
236   INT   *lpnHotKey;
237   HWND  hSelGroupWnd;
238   HICON *lphIcon, hTmpIcon;
239   INT   *lpnIconIndex, nTmpIconIndex;
240 } ProgramAttributes;
241
242 BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine,
243                               LPSTR lpszWorkDir, LPSTR lpszIconFile,
244                               HICON *lphIcon, INT *lpnIconIndex,
245                               INT *lpnHotKey, INT *lpnCmdShow, INT nSize)
246 {
247   CHAR szTmpIconFile[MAX_PATHNAME_LEN];
248   DLGPROC lpfnDlg = MakeProcInstance(DIALOG_PROGRAM_DlgProc, Globals.hInstance);
249   INT ret;
250
251   ProgramAttributes.nSize = nSize;
252   ProgramAttributes.lpszTitle = lpszTitle;
253   ProgramAttributes.lpszCmdLine = lpszCmdLine;
254   ProgramAttributes.lpszWorkDir = lpszWorkDir;
255   ProgramAttributes.lpszIconFile = lpszIconFile;
256   ProgramAttributes.lpnCmdShow = lpnCmdShow;
257   ProgramAttributes.lpnHotKey = lpnHotKey;
258   ProgramAttributes.lphIcon = lphIcon;
259   ProgramAttributes.lpnIconIndex = lpnIconIndex;
260
261 #if 0
262   ProgramAttributes.hTmpIcon = 0;
263 #else
264   ProgramAttributes.hTmpIcon = *lphIcon;
265 #endif
266   ProgramAttributes.nTmpIconIndex = *lpnIconIndex;
267   ProgramAttributes.lpszTmpIconFile = szTmpIconFile;
268   lstrcpyn(ProgramAttributes.lpszTmpIconFile, lpszIconFile, MAX_PATHNAME_LEN);
269
270   ret = DialogBox(Globals.hInstance,  STRING_PROGRAM_Xx,
271                   Globals.hMainWnd, lpfnDlg);
272   FreeProcInstance(lpfnDlg);
273
274   return(ret == IDOK);
275 }
276
277 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
278  *
279  *           DIALOG_PROGRAM_DlgProc
280  */
281
282 static BOOL CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
283 {
284   CHAR buffer[MAX_STRING_LEN];
285   switch (msg)
286     {
287     case WM_INITDIALOG:
288       SetDlgItemText(hDlg, PM_DESCRIPTION, ProgramAttributes.lpszTitle);
289       SetDlgItemText(hDlg, PM_COMMAND_LINE, ProgramAttributes.lpszCmdLine);
290       SetDlgItemText(hDlg, PM_DIRECTORY, ProgramAttributes.lpszWorkDir);
291       if (!*ProgramAttributes.lpnHotKey)
292         {
293           LoadString(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer));
294           SetDlgItemText(hDlg, PM_HOT_KEY, buffer);
295         }
296
297       CheckDlgButton(hDlg, PM_SYMBOL,
298                      (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED));
299       SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
300                          (WPARAM) ProgramAttributes.hTmpIcon, 0);
301       break;
302
303     case WM_COMMAND:
304       switch (wParam)
305         {
306         case PM_SYMBOL:
307           CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
308           return TRUE;
309
310         case PM_BROWSE:
311           {
312             CHAR filename[MAX_PATHNAME_LEN];
313             if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
314               SetDlgItemText(hDlg, PM_COMMAND_LINE, filename);
315             return TRUE;
316           }
317
318         case PM_OTHER_SYMBOL:
319           {
320             DIALOG_Symbol(&ProgramAttributes.hTmpIcon,
321                           ProgramAttributes.lpszTmpIconFile,
322                           &ProgramAttributes.nTmpIconIndex,
323                           MAX_PATHNAME_LEN);
324
325             SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
326                                (WPARAM) ProgramAttributes.hTmpIcon, 0);
327             return TRUE;
328           }
329
330         case IDOK:
331           GetDlgItemText(hDlg, PM_DESCRIPTION,
332                          ProgramAttributes.lpszTitle,
333                          ProgramAttributes.nSize);
334           GetDlgItemText(hDlg, PM_COMMAND_LINE,
335                          ProgramAttributes.lpszCmdLine,
336                          ProgramAttributes.nSize);
337           GetDlgItemText(hDlg, PM_DIRECTORY,
338                          ProgramAttributes.lpszWorkDir,
339                          ProgramAttributes.nSize);
340
341           if (ProgramAttributes.hTmpIcon)
342             {
343 #if 0
344               if (*ProgramAttributes.lphIcon)
345                 DestroyIcon(*ProgramAttributes.lphIcon);
346 #endif
347               *ProgramAttributes.lphIcon = ProgramAttributes.hTmpIcon;
348               *ProgramAttributes.lpnIconIndex = ProgramAttributes.nTmpIconIndex;
349               lstrcpyn(ProgramAttributes.lpszIconFile,
350                        ProgramAttributes.lpszTmpIconFile,
351                        ProgramAttributes.nSize);
352             }
353
354           *ProgramAttributes.lpnCmdShow =
355             IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
356             SW_SHOWMINIMIZED : SW_SHOWNORMAL;
357           EndDialog(hDlg, IDOK);
358           return TRUE;
359
360         case IDCANCEL:
361           EndDialog(hDlg, IDCANCEL);
362           return TRUE;
363         }
364       return FALSE;
365     }
366   return FALSE;
367 }
368
369 /***********************************************************************
370  *
371  *           DIALOG_Symbol
372  */
373
374 static struct
375 {
376   LPSTR  lpszIconFile;
377   INT    nSize;
378   HICON  *lphIcon;
379   INT    *lpnIconIndex;
380 } Symbol;
381
382 VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile,
383                    INT *lpnIconIndex, INT nSize)
384 {
385   DLGPROC lpfnDlg = MakeProcInstance(DIALOG_SYMBOL_DlgProc, Globals.hInstance);
386
387   Symbol.nSize = nSize;
388   Symbol.lpszIconFile = lpszIconFile;
389   Symbol.lphIcon = lphIcon;
390   Symbol.lpnIconIndex = lpnIconIndex;
391
392   DialogBox(Globals.hInstance, STRING_SYMBOL_Xx,
393             Globals.hMainWnd, lpfnDlg);
394   FreeProcInstance(lpfnDlg);
395 }
396
397 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
398  *
399  *           DIALOG_SYMBOL_DlgProc
400  */
401
402 static BOOL CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
403 {
404   switch (msg)
405     {
406     case WM_INITDIALOG:
407       SetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile);
408       SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETITEMHEIGHT, 0, (LPARAM) 32);
409       SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)*Symbol.lphIcon);
410       SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)Globals.hDefaultIcon);
411       SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_SETCURSEL, 0, 0);
412       return TRUE;
413
414     case WM_MEASUREITEM:
415       {
416         PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam;
417         measure->itemWidth = 32;
418         measure->itemHeight = 32;
419         return TRUE;
420       }
421
422     case WM_DRAWITEM:
423       {
424         PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam;
425         DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData);
426         return TRUE;
427       }
428
429     case WM_COMMAND:
430       switch (wParam)
431         {
432         case PM_BROWSE:
433           {
434             CHAR filename[MAX_PATHNAME_LEN];
435             if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename)))
436               SetDlgItemText(hDlg, PM_ICON_FILE, filename);
437             return TRUE;
438           }
439
440         case PM_HELP:
441           MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
442           return TRUE;
443
444         case IDOK:
445           {
446             INT nCurSel = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0);
447
448             GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize);
449
450             *Symbol.lphIcon = (HICON)SendDlgItemMessage(hDlg, PM_SYMBOL_LIST,
451                                                         CB_GETITEMDATA,
452                                                         (WPARAM) nCurSel, 0);
453 #if 0
454             *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon);
455 #endif
456
457             EndDialog(hDlg, IDOK);
458             return TRUE;
459           }
460
461         case IDCANCEL:
462           EndDialog(hDlg, IDCANCEL);
463           return TRUE;
464         }
465     }
466   return FALSE;
467 }
468
469 /***********************************************************************
470  *
471  *           DIALOG_Execute
472  */
473
474 VOID DIALOG_Execute()
475 {
476   DLGPROC lpfnDlg = MakeProcInstance(DIALOG_EXECUTE_DlgProc, Globals.hInstance);
477   DialogBox(Globals.hInstance, STRING_EXECUTE_Xx,
478             Globals.hMainWnd, lpfnDlg);
479   FreeProcInstance(lpfnDlg);
480 }
481
482 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
483  *
484  *           DIALOG_EXECUTE_DlgProc
485  */
486
487 static BOOL CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg,
488                                       WPARAM wParam, LPARAM lParam)
489 {
490   switch (msg)
491     {
492     case WM_COMMAND:
493       switch (wParam)
494         {
495         case PM_SYMBOL:
496           CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
497           return TRUE;
498
499         case PM_BROWSE:
500           {
501             CHAR filename[MAX_PATHNAME_LEN];
502             if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
503               SetDlgItemText(hDlg, PM_COMMAND, filename);
504             return TRUE;
505           }
506
507         case PM_HELP:
508           MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
509           return TRUE;
510
511         case IDOK:
512           {
513             CHAR cmdline[MAX_PATHNAME_LEN];
514             GetDlgItemText(hDlg, PM_COMMAND, cmdline, sizeof(cmdline));
515
516             WinExec(cmdline, IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
517                     SW_SHOWMINIMIZED : SW_SHOWNORMAL);
518             if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
519
520             EndDialog(hDlg, IDOK);
521             return TRUE;
522           }
523
524         case IDCANCEL:
525           EndDialog(hDlg, IDCANCEL);
526           return TRUE;
527         }
528     }
529   return FALSE;
530 }
531
532 /***********************************************************************
533  *
534  *           DIALOG_Browse
535  */
536
537 static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter,
538                           LPSTR lpstrFile, INT nMaxFile)
539 {
540   OPENFILENAME openfilename;
541
542   /* FIXME is this correct ? */
543   openfilename.lStructSize       = 0;
544   openfilename.hwndOwner         = hDlg;
545   openfilename.hInstance         = Globals.hInstance;
546   openfilename.lpstrFilter       = (LPSTR)lpszzFilter;
547   openfilename.lpstrCustomFilter = 0;
548   openfilename.nMaxCustFilter    = 0;
549   openfilename.nFilterIndex      = 0;
550   openfilename.lpstrFile         = lpstrFile;
551   openfilename.nMaxFile          = nMaxFile;
552   openfilename.lpstrFileTitle    = 0;
553   openfilename.nMaxFileTitle     = 0;
554   openfilename.lpstrInitialDir   = 0;
555   openfilename.lpstrTitle        = 0;
556   openfilename.Flags             = 0;
557   openfilename.nFileOffset       = 0;
558   openfilename.nFileExtension    = 0;
559   openfilename.lpstrDefExt       = 0;
560   openfilename.lCustData         = 0;
561   openfilename.lpfnHook          = 0;
562   openfilename.lpTemplateName    = 0;
563   return GetOpenFileName(&openfilename);
564 }
565
566 /***********************************************************************
567  *
568  *           DIALOG_AddFilterItem
569  */
570
571 static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter)
572 {
573   LoadString(Globals.hInstance, ids, *p, MAX_STRING_LEN);
574   *p += strlen(*p) + 1;
575   lstrcpy(*p, filter);
576   *p += strlen(*p) + 1;
577   **p = '\0';
578 }
579
580 /***********************************************************************
581  *
582  *           DIALOG_BrowsePrograms
583  */
584
585 static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
586 {
587   CHAR  szzFilter[2 * MAX_STRING_LEN + 100];
588   LPSTR p = szzFilter;
589
590   DIALOG_AddFilterItem(&p, IDS_PROGRAMS,  "*.exe;*.pif;*.com;*.bat");
591   DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*");
592
593   return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
594 }
595
596 /***********************************************************************
597  *
598  *           DIALOG_BrowseSymbols
599  */
600
601 static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
602 {
603   CHAR  szzFilter[5 * MAX_STRING_LEN + 100];
604   LPSTR p = szzFilter;
605
606   DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES,  "*.ico;*.exe;*.dll");
607   DIALOG_AddFilterItem(&p, IDS_PROGRAMS,      "*.exe");
608   DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, "*.dll");
609   DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO,   "*.ico");
610   DIALOG_AddFilterItem(&p, IDS_ALL_FILES,     "*.*");
611
612   return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
613 }
614
615 /* Local Variables:    */
616 /* c-file-style: "GNU" */
617 /* End:                */