Moved DCX_* constants to winuser.h.
[wine/multimedia.git] / programs / progman / dialog.c
blob565b451f8ef2bcc6eb1f3967f85a8052538dc437
1 /*
2 * Program Manager
4 * Copyright 1996 Ulrich Schmid
5 */
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);
19 /***********************************************************************
21 * DIALOG_New
24 static struct
26 INT nDefault;
27 } New;
29 INT DIALOG_New(INT nDefault)
31 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_NEW_DlgProc, Globals.hInstance);
32 INT ret;
34 New.nDefault = nDefault;
36 ret = DialogBox(Globals.hInstance, STRING_NEW_Xx,
37 Globals.hMainWnd, lpfnDlg);
38 FreeProcInstance(lpfnDlg);
39 return ret;
42 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
44 * DIALOG_NEW_DlgProc
47 static BOOL CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
49 switch (msg)
51 case WM_INITDIALOG:
52 CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, New.nDefault);
53 break;
55 case WM_COMMAND:
56 switch (wParam)
58 case PM_NEW_GROUP:
59 case PM_NEW_PROGRAM:
60 CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam);
61 return TRUE;
63 case IDOK:
64 EndDialog(hDlg, IsDlgButtonChecked(hDlg, PM_NEW_GROUP) ?
65 PM_NEW_GROUP : PM_NEW_PROGRAM);
66 return TRUE;
68 case IDCANCEL:
69 EndDialog(hDlg, IDCANCEL);
70 return TRUE;
73 return FALSE;
76 /***********************************************************************
78 * DIALOG_CopyMove
81 static struct
83 LPCSTR lpszProgramName, lpszFromGroupName;
84 HLOCAL hToGroup;
85 } CopyMove;
87 HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName,
88 BOOL bMove)
90 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_COPY_MOVE_DlgProc, Globals.hInstance);
91 INT ret;
93 CopyMove.lpszProgramName = lpszProgramName;
94 CopyMove.lpszFromGroupName = lpszFromGroupName;
95 CopyMove.hToGroup = 0;
97 ret = DialogBox(Globals.hInstance,
98 bMove ? STRING_MOVE_Xx : STRING_COPY_Xx,
99 Globals.hMainWnd, lpfnDlg);
100 FreeProcInstance(lpfnDlg);
102 return((ret == IDOK) ? CopyMove.hToGroup : 0);
105 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
107 * DIALOG_COPY_MOVE_DlgProc
110 static BOOL CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
112 HLOCAL hGroup;
114 switch (msg)
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));
122 SetDlgItemText(hDlg, PM_PROGRAM, (LPSTR)CopyMove.lpszProgramName);
123 SetDlgItemText(hDlg, PM_FROM_GROUP, (LPSTR)CopyMove.lpszFromGroupName);
124 break;
126 case WM_COMMAND:
127 switch (wParam)
129 case IDOK:
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);
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);
142 CopyMove.hToGroup = hGroup;
143 EndDialog(hDlg, IDOK);
144 return TRUE;
147 case IDCANCEL:
148 EndDialog(hDlg, IDCANCEL);
149 return TRUE;
152 return FALSE;
155 /***********************************************************************
157 * DIALOG_Delete
160 BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName)
162 return (IDYES == MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE,
163 MB_YESNO | MB_DEFBUTTON2));
167 /***********************************************************************
169 * DIALOG_GroupAttributes
172 static struct
174 LPSTR lpszTitle, lpszGrpFile;
175 INT nSize;
176 } GroupAttributes;
178 BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize)
180 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_GROUP_DlgProc, Globals.hInstance);
181 INT ret;
183 GroupAttributes.nSize = nSize;
184 GroupAttributes.lpszTitle = lpszTitle;
185 GroupAttributes.lpszGrpFile = lpszGrpFile;
187 ret = DialogBox(Globals.hInstance, STRING_GROUP_Xx,
188 Globals.hMainWnd, lpfnDlg);
189 FreeProcInstance(lpfnDlg);
190 return(ret == IDOK);
193 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
195 * DIALOG_GROUP_DlgProc
198 static BOOL CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
200 switch (msg)
202 case WM_INITDIALOG:
203 SetDlgItemText(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle);
204 SetDlgItemText(hDlg, PM_FILE, GroupAttributes.lpszGrpFile);
205 break;
207 case WM_COMMAND:
208 switch (wParam)
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;
218 case IDCANCEL:
219 EndDialog(hDlg, IDCANCEL);
220 return TRUE;
223 return FALSE;
226 /***********************************************************************
228 * DIALOG_ProgramAttributes
231 static struct
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;
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)
247 CHAR szTmpIconFile[MAX_PATHNAME_LEN];
248 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_PROGRAM_DlgProc, Globals.hInstance);
249 INT ret;
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;
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);
270 ret = DialogBox(Globals.hInstance, STRING_PROGRAM_Xx,
271 Globals.hMainWnd, lpfnDlg);
272 FreeProcInstance(lpfnDlg);
274 return(ret == IDOK);
277 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
279 * DIALOG_PROGRAM_DlgProc
282 static BOOL CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
284 CHAR buffer[MAX_STRING_LEN];
285 switch (msg)
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)
293 LoadString(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer));
294 SetDlgItemText(hDlg, PM_HOT_KEY, buffer);
297 CheckDlgButton(hDlg, PM_SYMBOL,
298 (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED));
299 SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
300 (WPARAM) ProgramAttributes.hTmpIcon, 0);
301 break;
303 case WM_COMMAND:
304 switch (wParam)
306 case PM_SYMBOL:
307 CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
308 return TRUE;
310 case PM_BROWSE:
312 CHAR filename[MAX_PATHNAME_LEN];
313 if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
314 SetDlgItemText(hDlg, PM_COMMAND_LINE, filename);
315 return TRUE;
318 case PM_OTHER_SYMBOL:
320 DIALOG_Symbol(&ProgramAttributes.hTmpIcon,
321 ProgramAttributes.lpszTmpIconFile,
322 &ProgramAttributes.nTmpIconIndex,
323 MAX_PATHNAME_LEN);
325 SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
326 (WPARAM) ProgramAttributes.hTmpIcon, 0);
327 return TRUE;
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);
341 if (ProgramAttributes.hTmpIcon)
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);
354 *ProgramAttributes.lpnCmdShow =
355 IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
356 SW_SHOWMINIMIZED : SW_SHOWNORMAL;
357 EndDialog(hDlg, IDOK);
358 return TRUE;
360 case IDCANCEL:
361 EndDialog(hDlg, IDCANCEL);
362 return TRUE;
364 return FALSE;
366 return FALSE;
369 /***********************************************************************
371 * DIALOG_Symbol
374 static struct
376 LPSTR lpszIconFile;
377 INT nSize;
378 HICON *lphIcon;
379 INT *lpnIconIndex;
380 } Symbol;
382 VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile,
383 INT *lpnIconIndex, INT nSize)
385 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_SYMBOL_DlgProc, Globals.hInstance);
387 Symbol.nSize = nSize;
388 Symbol.lpszIconFile = lpszIconFile;
389 Symbol.lphIcon = lphIcon;
390 Symbol.lpnIconIndex = lpnIconIndex;
392 DialogBox(Globals.hInstance, STRING_SYMBOL_Xx,
393 Globals.hMainWnd, lpfnDlg);
394 FreeProcInstance(lpfnDlg);
397 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
399 * DIALOG_SYMBOL_DlgProc
402 static BOOL CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
404 switch (msg)
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;
414 case WM_MEASUREITEM:
416 PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam;
417 measure->itemWidth = 32;
418 measure->itemHeight = 32;
419 return TRUE;
422 case WM_DRAWITEM:
424 PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam;
425 DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData);
426 return TRUE;
429 case WM_COMMAND:
430 switch (wParam)
432 case PM_BROWSE:
434 CHAR filename[MAX_PATHNAME_LEN];
435 if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename)))
436 SetDlgItemText(hDlg, PM_ICON_FILE, filename);
437 return TRUE;
440 case PM_HELP:
441 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
442 return TRUE;
444 case IDOK:
446 INT nCurSel = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0);
448 GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize);
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
457 EndDialog(hDlg, IDOK);
458 return TRUE;
461 case IDCANCEL:
462 EndDialog(hDlg, IDCANCEL);
463 return TRUE;
466 return FALSE;
469 /***********************************************************************
471 * DIALOG_Execute
474 VOID DIALOG_Execute()
476 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_EXECUTE_DlgProc, Globals.hInstance);
477 DialogBox(Globals.hInstance, STRING_EXECUTE_Xx,
478 Globals.hMainWnd, lpfnDlg);
479 FreeProcInstance(lpfnDlg);
482 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
484 * DIALOG_EXECUTE_DlgProc
487 static BOOL CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg,
488 WPARAM wParam, LPARAM lParam)
490 switch (msg)
492 case WM_COMMAND:
493 switch (wParam)
495 case PM_SYMBOL:
496 CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
497 return TRUE;
499 case PM_BROWSE:
501 CHAR filename[MAX_PATHNAME_LEN];
502 if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
503 SetDlgItemText(hDlg, PM_COMMAND, filename);
504 return TRUE;
507 case PM_HELP:
508 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
509 return TRUE;
511 case IDOK:
513 CHAR cmdline[MAX_PATHNAME_LEN];
514 GetDlgItemText(hDlg, PM_COMMAND, cmdline, sizeof(cmdline));
516 WinExec(cmdline, IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
517 SW_SHOWMINIMIZED : SW_SHOWNORMAL);
518 if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
520 EndDialog(hDlg, IDOK);
521 return TRUE;
524 case IDCANCEL:
525 EndDialog(hDlg, IDCANCEL);
526 return TRUE;
529 return FALSE;
532 /***********************************************************************
534 * DIALOG_Browse
537 static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter,
538 LPSTR lpstrFile, INT nMaxFile)
540 OPENFILENAME openfilename;
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);
566 /***********************************************************************
568 * DIALOG_AddFilterItem
571 static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter)
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';
580 /***********************************************************************
582 * DIALOG_BrowsePrograms
585 static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
587 CHAR szzFilter[2 * MAX_STRING_LEN + 100];
588 LPSTR p = szzFilter;
590 DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe;*.pif;*.com;*.bat");
591 DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*");
593 return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
596 /***********************************************************************
598 * DIALOG_BrowseSymbols
601 static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
603 CHAR szzFilter[5 * MAX_STRING_LEN + 100];
604 LPSTR p = szzFilter;
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, "*.*");
612 return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
615 /* Local Variables: */
616 /* c-file-style: "GNU" */
617 /* End: */