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