Added configuration on per application basis.
[wine/hacks.git] / programs / progman / dialog.c
blob1a4a9410c3eafa1219db16fbe904c4527014ab70
1 /*
2 * Program Manager
4 * Copyright 1996 Ulrich Schmid
5 * Copyright 2002 Andriy Palamarchuk
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.
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.
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
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);
34 /***********************************************************************
36 * DIALOG_New
39 static struct
41 INT nDefault;
42 } New;
44 INT DIALOG_New(INT nDefault)
46 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_NEW_DlgProc, Globals.hInstance);
47 INT ret;
49 New.nDefault = nDefault;
51 ret = DialogBox(Globals.hInstance, STRING_NEW_Xx,
52 Globals.hMainWnd, lpfnDlg);
53 FreeProcInstance(lpfnDlg);
54 return ret;
57 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
59 * DIALOG_NEW_DlgProc
62 static BOOL CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
64 switch (msg)
66 case WM_INITDIALOG:
67 CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, New.nDefault);
68 break;
70 case WM_COMMAND:
71 switch (wParam)
73 case PM_NEW_GROUP:
74 case PM_NEW_PROGRAM:
75 CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam);
76 return TRUE;
78 case IDOK:
79 EndDialog(hDlg, IsDlgButtonChecked(hDlg, PM_NEW_GROUP) ?
80 PM_NEW_GROUP : PM_NEW_PROGRAM);
81 return TRUE;
83 case IDCANCEL:
84 EndDialog(hDlg, IDCANCEL);
85 return TRUE;
88 return FALSE;
91 /***********************************************************************
93 * DIALOG_CopyMove
96 static struct
98 LPCSTR lpszProgramName, lpszFromGroupName;
99 HLOCAL hToGroup;
100 } CopyMove;
102 HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName,
103 BOOL bMove)
105 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_COPY_MOVE_DlgProc, Globals.hInstance);
106 INT ret;
108 CopyMove.lpszProgramName = lpszProgramName;
109 CopyMove.lpszFromGroupName = lpszFromGroupName;
110 CopyMove.hToGroup = 0;
112 ret = DialogBox(Globals.hInstance,
113 bMove ? STRING_MOVE_Xx : STRING_COPY_Xx,
114 Globals.hMainWnd, lpfnDlg);
115 FreeProcInstance(lpfnDlg);
117 return((ret == IDOK) ? CopyMove.hToGroup : 0);
120 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
122 * DIALOG_COPY_MOVE_DlgProc
125 static BOOL CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
127 HLOCAL hGroup;
129 switch (msg)
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));
137 SetDlgItemText(hDlg, PM_PROGRAM, (LPSTR)CopyMove.lpszProgramName);
138 SetDlgItemText(hDlg, PM_FROM_GROUP, (LPSTR)CopyMove.lpszFromGroupName);
139 break;
141 case WM_COMMAND:
142 switch (wParam)
144 case IDOK:
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);
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);
157 CopyMove.hToGroup = hGroup;
158 EndDialog(hDlg, IDOK);
159 return TRUE;
162 case IDCANCEL:
163 EndDialog(hDlg, IDCANCEL);
164 return TRUE;
167 return FALSE;
170 /***********************************************************************
172 * DIALOG_Delete
175 BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName)
177 return (IDYES == MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE,
178 MB_YESNO | MB_DEFBUTTON2));
182 /***********************************************************************
184 * DIALOG_GroupAttributes
187 static struct
189 LPSTR lpszTitle, lpszGrpFile;
190 INT nSize;
191 } GroupAttributes;
193 BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize)
195 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_GROUP_DlgProc, Globals.hInstance);
196 INT ret;
198 GroupAttributes.nSize = nSize;
199 GroupAttributes.lpszTitle = lpszTitle;
200 GroupAttributes.lpszGrpFile = lpszGrpFile;
202 ret = DialogBox(Globals.hInstance, STRING_GROUP_Xx,
203 Globals.hMainWnd, lpfnDlg);
204 FreeProcInstance(lpfnDlg);
205 return(ret == IDOK);
208 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
210 * DIALOG_GROUP_DlgProc
213 static BOOL CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
215 switch (msg)
217 case WM_INITDIALOG:
218 SetDlgItemText(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle);
219 SetDlgItemText(hDlg, PM_FILE, GroupAttributes.lpszGrpFile);
220 break;
222 case WM_COMMAND:
223 switch (wParam)
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;
233 case IDCANCEL:
234 EndDialog(hDlg, IDCANCEL);
235 return TRUE;
238 return FALSE;
241 /***********************************************************************
243 * DIALOG_ProgramAttributes
246 static struct
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;
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)
262 CHAR szTmpIconFile[MAX_PATHNAME_LEN];
263 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_PROGRAM_DlgProc, Globals.hInstance);
264 INT ret;
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;
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);
285 ret = DialogBox(Globals.hInstance, STRING_PROGRAM_Xx,
286 Globals.hMainWnd, lpfnDlg);
287 FreeProcInstance(lpfnDlg);
289 return(ret == IDOK);
292 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
294 * DIALOG_PROGRAM_DlgProc
297 static BOOL CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
299 CHAR buffer[MAX_STRING_LEN];
300 switch (msg)
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)
308 LoadString(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer));
309 SetDlgItemText(hDlg, PM_HOT_KEY, buffer);
312 CheckDlgButton(hDlg, PM_SYMBOL,
313 (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED));
314 SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
315 (WPARAM) ProgramAttributes.hTmpIcon, 0);
316 break;
318 case WM_COMMAND:
319 switch (wParam)
321 case PM_SYMBOL:
322 CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
323 return TRUE;
325 case PM_BROWSE:
327 CHAR filename[MAX_PATHNAME_LEN];
328 if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
329 SetDlgItemText(hDlg, PM_COMMAND_LINE, filename);
330 return TRUE;
333 case PM_OTHER_SYMBOL:
335 DIALOG_Symbol(&ProgramAttributes.hTmpIcon,
336 ProgramAttributes.lpszTmpIconFile,
337 &ProgramAttributes.nTmpIconIndex,
338 MAX_PATHNAME_LEN);
340 SendDlgItemMessage(hDlg, PM_ICON, STM_SETICON,
341 (WPARAM) ProgramAttributes.hTmpIcon, 0);
342 return TRUE;
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);
356 if (ProgramAttributes.hTmpIcon)
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);
369 *ProgramAttributes.lpnCmdShow =
370 IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
371 SW_SHOWMINIMIZED : SW_SHOWNORMAL;
372 EndDialog(hDlg, IDOK);
373 return TRUE;
375 case IDCANCEL:
376 EndDialog(hDlg, IDCANCEL);
377 return TRUE;
379 return FALSE;
381 return FALSE;
384 /***********************************************************************
386 * DIALOG_Symbol
389 static struct
391 LPSTR lpszIconFile;
392 INT nSize;
393 HICON *lphIcon;
394 INT *lpnIconIndex;
395 } Symbol;
397 VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile,
398 INT *lpnIconIndex, INT nSize)
400 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_SYMBOL_DlgProc, Globals.hInstance);
402 Symbol.nSize = nSize;
403 Symbol.lpszIconFile = lpszIconFile;
404 Symbol.lphIcon = lphIcon;
405 Symbol.lpnIconIndex = lpnIconIndex;
407 DialogBox(Globals.hInstance, STRING_SYMBOL_Xx,
408 Globals.hMainWnd, lpfnDlg);
409 FreeProcInstance(lpfnDlg);
412 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
414 * DIALOG_SYMBOL_DlgProc
417 static BOOL CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
419 switch (msg)
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;
429 case WM_MEASUREITEM:
431 PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam;
432 measure->itemWidth = 32;
433 measure->itemHeight = 32;
434 return TRUE;
437 case WM_DRAWITEM:
439 PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam;
440 DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData);
441 return TRUE;
444 case WM_COMMAND:
445 switch (wParam)
447 case PM_BROWSE:
449 CHAR filename[MAX_PATHNAME_LEN];
450 if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename)))
451 SetDlgItemText(hDlg, PM_ICON_FILE, filename);
452 return TRUE;
455 case PM_HELP:
456 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
457 return TRUE;
459 case IDOK:
461 INT nCurSel = SendDlgItemMessage(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0);
463 GetDlgItemText(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize);
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
472 EndDialog(hDlg, IDOK);
473 return TRUE;
476 case IDCANCEL:
477 EndDialog(hDlg, IDCANCEL);
478 return TRUE;
481 return FALSE;
484 /***********************************************************************
486 * DIALOG_Execute
489 VOID DIALOG_Execute()
491 DLGPROC lpfnDlg = MakeProcInstance(DIALOG_EXECUTE_DlgProc, Globals.hInstance);
492 DialogBox(Globals.hInstance, STRING_EXECUTE_Xx,
493 Globals.hMainWnd, lpfnDlg);
494 FreeProcInstance(lpfnDlg);
497 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
499 * DIALOG_EXECUTE_DlgProc
502 static BOOL CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg,
503 WPARAM wParam, LPARAM lParam)
505 switch (msg)
507 case WM_COMMAND:
508 switch (wParam)
510 case PM_SYMBOL:
511 CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL));
512 return TRUE;
514 case PM_BROWSE:
516 CHAR filename[MAX_PATHNAME_LEN];
517 if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename)))
518 SetDlgItemText(hDlg, PM_COMMAND, filename);
519 return TRUE;
522 case PM_HELP:
523 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK);
524 return TRUE;
526 case IDOK:
528 CHAR cmdline[MAX_PATHNAME_LEN];
529 GetDlgItemText(hDlg, PM_COMMAND, cmdline, sizeof(cmdline));
531 WinExec(cmdline, IsDlgButtonChecked(hDlg, PM_SYMBOL) ?
532 SW_SHOWMINIMIZED : SW_SHOWNORMAL);
533 if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd);
535 EndDialog(hDlg, IDOK);
536 return TRUE;
539 case IDCANCEL:
540 EndDialog(hDlg, IDCANCEL);
541 return TRUE;
544 return FALSE;
547 /***********************************************************************
549 * DIALOG_Browse
552 static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter,
553 LPSTR lpstrFile, INT nMaxFile)
556 OPENFILENAME openfilename;
558 CHAR szPath[MAX_PATH];
559 CHAR szDir[MAX_PATH];
560 CHAR szDefaultExt[] = "exe";
562 ZeroMemory(&openfilename, sizeof(openfilename));
564 GetCurrentDirectory(sizeof(szDir), szDir);
565 lstrcpy(szPath,"*.exe");
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;
589 return GetOpenFileName(&openfilename);
590 /* FIXME */
593 /***********************************************************************
595 * DIALOG_AddFilterItem
598 static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter)
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';
607 /***********************************************************************
609 * DIALOG_BrowsePrograms
612 static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
614 CHAR szzFilter[2 * MAX_STRING_LEN + 100];
615 LPSTR p = szzFilter;
617 DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe;*.pif;*.com;*.bat");
618 DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*");
620 return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
623 /***********************************************************************
625 * DIALOG_BrowseSymbols
628 static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile)
630 CHAR szzFilter[5 * MAX_STRING_LEN + 100];
631 LPSTR p = szzFilter;
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, "*.*");
639 return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile));
642 /* Local Variables: */
643 /* c-file-style: "GNU" */
644 /* End: */