Release 960302
[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
11 static BOOL DIALOG_Browse(HWND, LPCSTR, LPSTR, INT);
12 static LRESULT DIALOG_NEW_DlgProc(HWND, UINT, WPARAM, LPARAM);
13 static LRESULT DIALOG_COPY_MOVE_DlgProc(HWND, UINT, WPARAM, LPARAM);
14 static LRESULT DIALOG_GROUP_DlgProc(HWND, UINT, WPARAM, LPARAM);
15 static LRESULT DIALOG_PROGRAM_DlgProc(HWND, UINT, WPARAM, LPARAM);
16 static LRESULT DIALOG_SYMBOL_DlgProc(HWND, UINT, WPARAM, LPARAM);
17 static LRESULT 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   WNDPROC 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 LRESULT 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   WNDPROC 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 LRESULT 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(LPCSTR lpszFormat_s, LPCSTR lpszName)
161 {
162   CHAR msg[1000];
163   if (sizeof(msg) <= lstrlen(lpszFormat_s) + lstrlen(lpszName)) return FALSE;
164   wsprintf(msg, (LPSTR)lpszFormat_s, lpszName);
165   return (IDYES == MessageBox(Globals.hMainWnd, msg, STRING_DELETE,
166                               MB_YESNO | MB_DEFBUTTON2));
167 }
168
169
170 /***********************************************************************
171  *
172  *           DIALOG_GroupAttributes
173  */
174
175 static struct
176 {
177   LPSTR lpszTitle, lpszGrpFile;
178   INT   nSize;
179 } GroupAttributes;
180
181 BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize)
182 {
183   WNDPROC lpfnDlg = MakeProcInstance(DIALOG_GROUP_DlgProc, Globals.hInstance);
184   INT ret;
185
186   GroupAttributes.nSize       = nSize;
187   GroupAttributes.lpszTitle   = lpszTitle;
188   GroupAttributes.lpszGrpFile = lpszGrpFile;
189
190   ret = DialogBox(Globals.hInstance,  STRING_GROUP_Xx,
191                   Globals.hMainWnd, lpfnDlg);
192   FreeProcInstance(lpfnDlg);
193   return(ret == IDOK);
194 }
195
196 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
197  *
198  *           DIALOG_GROUP_DlgProc
199  */
200
201 static LRESULT DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
202 {
203   switch (msg)
204     {
205     case WM_INITDIALOG:
206       SetDlgItemText(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle);
207       SetDlgItemText(hDlg, PM_FILE, GroupAttributes.lpszGrpFile);
208       break;
209
210     case WM_COMMAND:
211       switch (wParam)
212         {
213         case IDOK:
214           GetDlgItemText(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle,
215                          GroupAttributes.nSize);
216           GetDlgItemText(hDlg, PM_FILE, GroupAttributes.lpszGrpFile,
217                          GroupAttributes.nSize);
218           EndDialog(hDlg, IDOK);
219           return TRUE;
220
221         case IDCANCEL:
222           EndDialog(hDlg, IDCANCEL);
223           return TRUE;
224         }
225     }
226   return FALSE;
227 }
228
229 /***********************************************************************
230  *
231  *           DIALOG_ProgramAttributes
232  */
233
234 static struct
235 {
236   LPSTR lpszTitle, lpszCmdLine, lpszWorkDir, lpszIconFile, lpszTmpIconFile;
237   INT   nSize;
238   INT   *lpnCmdShow;
239   INT   *lpnHotKey;
240   HWND  hSelGroupWnd;
241   HICON *lphIcon, hTmpIcon;
242   INT   *lpnIconIndex, nTmpIconIndex;
243 } ProgramAttributes;
244
245 BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine,
246                               LPSTR lpszWorkDir, LPSTR lpszIconFile,
247                               HICON *lphIcon, INT *lpnIconIndex,
248                               INT *lpnHotKey, INT *lpnCmdShow, INT nSize)
249 {
250   CHAR szTmpIconFile[MAX_PATHNAME_LEN];
251   WNDPROC lpfnDlg = MakeProcInstance(DIALOG_PROGRAM_DlgProc, Globals.hInstance);
252   INT ret;
253
254   ProgramAttributes.nSize = nSize;
255   ProgramAttributes.lpszTitle = lpszTitle;
256   ProgramAttributes.lpszCmdLine = lpszCmdLine;
257   ProgramAttributes.lpszWorkDir = lpszWorkDir;
258   ProgramAttributes.lpszIconFile = lpszIconFile;
259   ProgramAttributes.lpnCmdShow = lpnCmdShow;
260   ProgramAttributes.lpnHotKey = lpnHotKey;
261   ProgramAttributes.lphIcon = lphIcon;
262   ProgramAttributes.lpnIconIndex = lpnIconIndex;
263
264 #if 0
265   ProgramAttributes.hTmpIcon = 0;
266 #else
267   ProgramAttributes.hTmpIcon = *lphIcon;
268 #endif
269   ProgramAttributes.nTmpIconIndex = *lpnIconIndex;
270   ProgramAttributes.lpszTmpIconFile = szTmpIconFile;
271   lstrcpyn(ProgramAttributes.lpszTmpIconFile, lpszIconFile, MAX_PATHNAME_LEN);
272
273   ret = DialogBox(Globals.hInstance,  STRING_PROGRAM_Xx,
274                   Globals.hMainWnd, lpfnDlg);
275   FreeProcInstance(lpfnDlg);
276
277   return(ret == IDOK);
278 }
279
280 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
281  *
282  *           DIALOG_PROGRAM_DlgProc
283  */
284
285 static LRESULT DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
286 {
287   switch (msg)
288     {
289     case WM_INITDIALOG:
290       SetDlgItemText(hDlg, PM_DESCRIPTION, ProgramAttributes.lpszTitle);
291       SetDlgItemText(hDlg, PM_COMMAND_LINE, ProgramAttributes.lpszCmdLine);
292       SetDlgItemText(hDlg, PM_DIRECTORY, ProgramAttributes.lpszWorkDir);
293       if (!*ProgramAttributes.lpnHotKey)
294         SetDlgItemText(hDlg, PM_HOT_KEY, (LPSTR)STRING_NO_HOT_KEY);
295
296       CheckDlgButton(hDlg, PM_SYMBOL,
297                      (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED));
298       SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
299                          (WPARAM) ProgramAttributes.hTmpIcon, 0);
300       break;
301
302     case WM_COMMAND:
303       switch (wParam)
304         {
305         case PM_SYMBOL:
306           CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
307           return TRUE;
308
309         case PM_BROWSE:
310           {
311             CHAR filename[MAX_PATHNAME_LEN];
312             if (DIALOG_Browse(hDlg, STRING_BROWSE_EXE_FILTER,
313                               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   WNDPROC 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 LRESULT 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_Browse(hDlg, STRING_BROWSE_ICO_FILTER,
436                               filename, sizeof(filename)))
437               SetDlgItemText(hDlg, PM_ICON_FILE, filename);
438             return TRUE;
439           }
440
441         case PM_HELP:
442           MAIN_NotImplementedError();
443           return TRUE;
444
445         case IDOK:
446           {
447             INT nCurSel = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0);
448
449             GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize);
450
451             *Symbol.lphIcon = (HICON)SendDlgItemMessage(hDlg, PM_SYMBOL_LIST,
452                                                         CB_GETITEMDATA,
453                                                         (WPARAM) nCurSel, 0);
454 #if 0
455             *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon);
456 #endif
457
458             EndDialog(hDlg, IDOK);
459             return TRUE;
460           }
461
462         case IDCANCEL:
463           EndDialog(hDlg, IDCANCEL);
464           return TRUE;
465         }
466     }
467   return FALSE;
468 }
469
470 /***********************************************************************
471  *
472  *           DIALOG_Execute
473  */
474
475 VOID DIALOG_Execute()
476 {
477   WNDPROC lpfnDlg = MakeProcInstance(DIALOG_EXECUTE_DlgProc, Globals.hInstance);
478   DialogBox(Globals.hInstance, STRING_EXECUTE_Xx,
479             Globals.hMainWnd, lpfnDlg);
480   FreeProcInstance(lpfnDlg);
481 }
482
483 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
484  *
485  *           DIALOG_EXECUTE_DlgProc
486  */
487
488 static LRESULT DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg,
489                                       WPARAM wParam, LPARAM lParam)
490 {
491   switch (msg)
492     {
493     case WM_COMMAND:
494       switch (wParam)
495         {
496         case PM_SYMBOL:
497           CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
498           return TRUE;
499
500         case PM_BROWSE:
501           {
502             CHAR filename[MAX_PATHNAME_LEN];
503             if (DIALOG_Browse(hDlg, STRING_BROWSE_EXE_FILTER,
504                               filename, sizeof(filename)))
505               SetDlgItemText(hDlg, PM_COMMAND, filename);
506             return TRUE;
507           }
508
509         case PM_HELP:
510           MAIN_NotImplementedError();
511           return TRUE;
512
513         case IDOK:
514           {
515             CHAR cmdline[MAX_PATHNAME_LEN];
516             GetDlgItemText(hDlg, PM_COMMAND, cmdline, sizeof(cmdline));
517
518             WinExec(cmdline, IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
519                     SW_SHOWMINIMIZED : SW_SHOWNORMAL);
520             if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
521
522             EndDialog(hDlg, IDOK);
523             return TRUE;
524           }
525
526         case IDCANCEL:
527           EndDialog(hDlg, IDCANCEL);
528           return TRUE;
529         }
530     }
531   return FALSE;
532 }
533
534 /***********************************************************************
535  *
536  *           DIALOG_Browse
537  */
538
539 /* FIXME is this correct ? */
540 static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpcstrFilter,
541                           LPSTR lpstrFile, INT nMaxFile)
542 {
543   OPENFILENAME openfilename;
544   openfilename.lStructSize       = 0;
545   openfilename.hwndOwner         = hDlg;
546   openfilename.hInstance         = Globals.hInstance;
547   openfilename.lpstrFilter       = (LPSTR)lpcstrFilter;
548   openfilename.lpstrCustomFilter = 0;
549   openfilename.nMaxCustFilter    = 0;
550   openfilename.nFilterIndex      = 0;
551   openfilename.lpstrFile         = lpstrFile;
552   openfilename.nMaxFile          = sizeof(lpstrFile);
553   openfilename.lpstrFileTitle    = 0;
554   openfilename.nMaxFileTitle     = 0;
555   openfilename.lpstrInitialDir   = 0;
556   openfilename.lpstrTitle        = 0;
557   openfilename.Flags             = 0;
558   openfilename.nFileOffset       = 0;
559   openfilename.nFileExtension    = 0;
560   openfilename.lpstrDefExt       = 0;
561   openfilename.lCustData         = 0;
562   openfilename.lpfnHook          = 0;
563   openfilename.lpTemplateName    = 0;
564   return GetOpenFileName(&openfilename);
565 }
566
567 /* Local Variables:    */
568 /* c-file-style: "GNU" */
569 /* End:                */