4 * Copyright 1996 Ulrich Schmid
5 * Copyright 2002 Sylvain Petreolle
6 * Copyright 2002 Andriy Palamarchuk
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 /***********************************************************************
32 static BOOL
DIALOG_Browse(HWND hDlg
, LPCSTR lpszzFilter
,
33 LPSTR lpstrFile
, INT nMaxFile
)
36 OPENFILENAMEA openfilename
;
39 CHAR szDefaultExt
[] = "exe";
41 ZeroMemory(&openfilename
, sizeof(openfilename
));
43 GetCurrentDirectoryA(sizeof(szDir
), szDir
);
45 openfilename
.lStructSize
= sizeof(openfilename
);
46 openfilename
.hwndOwner
= Globals
.hMainWnd
;
47 openfilename
.hInstance
= Globals
.hInstance
;
48 openfilename
.lpstrFilter
= lpszzFilter
;
49 openfilename
.lpstrFile
= lpstrFile
;
50 openfilename
.nMaxFile
= nMaxFile
;
51 openfilename
.lpstrInitialDir
= szDir
;
52 openfilename
.Flags
= 0;
53 openfilename
.lpstrDefExt
= szDefaultExt
;
54 openfilename
.lpstrCustomFilter
= 0;
55 openfilename
.nMaxCustFilter
= 0;
56 openfilename
.nFilterIndex
= 0;
57 openfilename
.lpstrFileTitle
= 0;
58 openfilename
.nMaxFileTitle
= 0;
59 openfilename
.lpstrInitialDir
= 0;
60 openfilename
.lpstrTitle
= 0;
61 openfilename
.nFileOffset
= 0;
62 openfilename
.nFileExtension
= 0;
63 openfilename
.lCustData
= 0;
64 openfilename
.lpfnHook
= 0;
65 openfilename
.lpTemplateName
= 0;
67 return GetOpenFileNameA(&openfilename
);
70 /***********************************************************************
72 * DIALOG_AddFilterItem
75 static VOID
DIALOG_AddFilterItem(LPSTR
*p
, UINT ids
, LPCSTR filter
)
77 LoadStringA(Globals
.hInstance
, ids
, *p
, MAX_STRING_LEN
);
84 /***********************************************************************
86 * DIALOG_BrowsePrograms
89 static BOOL
DIALOG_BrowsePrograms(HWND hDlg
, LPSTR lpszFile
, INT nMaxFile
)
91 CHAR szzFilter
[2 * MAX_STRING_LEN
+ 100];
94 DIALOG_AddFilterItem(&p
, IDS_PROGRAMS
, "*.exe;*.pif;*.com;*.bat");
95 DIALOG_AddFilterItem(&p
, IDS_ALL_FILES
, "*.*");
97 return(DIALOG_Browse(hDlg
, szzFilter
, lpszFile
, nMaxFile
));
100 /***********************************************************************
102 * DIALOG_BrowseSymbols
105 static BOOL
DIALOG_BrowseSymbols(HWND hDlg
, LPSTR lpszFile
, INT nMaxFile
)
107 CHAR szzFilter
[5 * MAX_STRING_LEN
+ 100];
110 DIALOG_AddFilterItem(&p
, IDS_SYMBOL_FILES
, "*.ico;*.exe;*.dll");
111 DIALOG_AddFilterItem(&p
, IDS_PROGRAMS
, "*.exe");
112 DIALOG_AddFilterItem(&p
, IDS_LIBRARIES_DLL
, "*.dll");
113 DIALOG_AddFilterItem(&p
, IDS_SYMBOLS_ICO
, "*.ico");
114 DIALOG_AddFilterItem(&p
, IDS_ALL_FILES
, "*.*");
116 return(DIALOG_Browse(hDlg
, szzFilter
, lpszFile
, nMaxFile
));
124 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
128 static INT_PTR CALLBACK
DIALOG_NEW_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
133 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, New
.nDefault
);
141 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, wParam
);
145 EndDialog(hDlg
, IsDlgButtonChecked(hDlg
, PM_NEW_GROUP
) ?
146 PM_NEW_GROUP
: PM_NEW_PROGRAM
);
150 EndDialog(hDlg
, IDCANCEL
);
157 /***********************************************************************
161 INT
DIALOG_New(INT nDefault
)
163 New
.nDefault
= nDefault
;
164 return DialogBoxW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_NEW
), Globals
.hMainWnd
, DIALOG_NEW_DlgProc
);
170 LPCSTR lpszProgramName
, lpszFromGroupName
;
174 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
176 * DIALOG_COPY_MOVE_DlgProc
178 static INT_PTR CALLBACK
DIALOG_COPY_MOVE_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
185 /* List all group names */
186 for (hGroup
= GROUP_FirstGroup(); hGroup
; hGroup
= GROUP_NextGroup(hGroup
))
187 SendDlgItemMessageA(hDlg
, PM_TO_GROUP
, CB_ADDSTRING
, 0, (LPARAM
)GROUP_GroupName(hGroup
));
189 SetDlgItemTextA(hDlg
, PM_PROGRAM
, CopyMove
.lpszProgramName
);
190 SetDlgItemTextA(hDlg
, PM_FROM_GROUP
, CopyMove
.lpszFromGroupName
);
198 /* Get selected group */
199 INT nCurSel
= SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_GETCURSEL
, 0, 0);
200 INT nLen
= SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_GETLBTEXTLEN
, nCurSel
, 0);
201 HLOCAL hBuffer
= LocalAlloc(LMEM_FIXED
, nLen
+ 1);
202 LPSTR buffer
= LocalLock(hBuffer
);
204 SendDlgItemMessageA(hDlg
, PM_TO_GROUP
, CB_GETLBTEXT
, nCurSel
, (LPARAM
)buffer
);
205 for (hGroup
= GROUP_FirstGroup(); hGroup
; hGroup
= GROUP_NextGroup(hGroup
))
206 if (!lstrcmpA(buffer
, GROUP_GroupName(hGroup
))) break;
209 CopyMove
.hToGroup
= hGroup
;
210 EndDialog(hDlg
, IDOK
);
215 EndDialog(hDlg
, IDCANCEL
);
222 /***********************************************************************
226 HLOCAL
DIALOG_CopyMove(LPCSTR lpszProgramName
, LPCSTR lpszFromGroupName
,
231 CopyMove
.lpszProgramName
= lpszProgramName
;
232 CopyMove
.lpszFromGroupName
= lpszFromGroupName
;
233 CopyMove
.hToGroup
= 0;
235 ret
= DialogBoxW(Globals
.hInstance
,
236 bMove
? MAKEINTRESOURCEW(IDD_MOVE
) : MAKEINTRESOURCEW(IDD_COPY
),
237 Globals
.hMainWnd
, DIALOG_COPY_MOVE_DlgProc
);
238 return((ret
== IDOK
) ? CopyMove
.hToGroup
: 0);
241 /***********************************************************************
246 BOOL
DIALOG_Delete(UINT ids_text_s
, LPCSTR lpszName
)
248 return (IDYES
== MAIN_MessageBoxIDS_s(ids_text_s
, lpszName
, IDS_DELETE
,
249 MB_YESNO
| MB_DEFBUTTON2
));
255 LPSTR lpszTitle
, lpszGrpFile
;
259 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
261 * DIALOG_GROUP_DlgProc
263 static INT_PTR CALLBACK
DIALOG_GROUP_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
268 SetDlgItemTextA(hDlg
, PM_DESCRIPTION
, GroupAttributes
.lpszTitle
);
269 SetDlgItemTextA(hDlg
, PM_FILE
, GroupAttributes
.lpszGrpFile
);
276 GetDlgItemTextA(hDlg
, PM_DESCRIPTION
, GroupAttributes
.lpszTitle
, GroupAttributes
.nSize
);
277 GetDlgItemTextA(hDlg
, PM_FILE
, GroupAttributes
.lpszGrpFile
, GroupAttributes
.nSize
);
278 EndDialog(hDlg
, IDOK
);
282 EndDialog(hDlg
, IDCANCEL
);
289 /***********************************************************************
291 * DIALOG_GroupAttributes
293 BOOL
DIALOG_GroupAttributes(LPSTR lpszTitle
, LPSTR lpszGrpFile
, INT nSize
)
297 GroupAttributes
.nSize
= nSize
;
298 GroupAttributes
.lpszTitle
= lpszTitle
;
299 GroupAttributes
.lpszGrpFile
= lpszGrpFile
;
301 ret
= DialogBoxW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_GROUP
), Globals
.hMainWnd
, DIALOG_GROUP_DlgProc
);
314 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
316 * DIALOG_SYMBOL_DlgProc
318 static INT_PTR CALLBACK
DIALOG_SYMBOL_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
323 SetDlgItemTextA(hDlg
, PM_ICON_FILE
, Symbol
.lpszIconFile
);
324 SendDlgItemMessageA(hDlg
, PM_SYMBOL_LIST
, CB_SETITEMHEIGHT
, 0, (LPARAM
) 32);
325 SendDlgItemMessageA(hDlg
, PM_SYMBOL_LIST
, CB_ADDSTRING
, 0, (LPARAM
)*Symbol
.lphIcon
);
326 SendDlgItemMessageA(hDlg
, PM_SYMBOL_LIST
, CB_ADDSTRING
, 0, (LPARAM
)Globals
.hDefaultIcon
);
327 SendDlgItemMessageA(hDlg
, PM_SYMBOL_LIST
, CB_SETCURSEL
, 0, 0);
332 PMEASUREITEMSTRUCT measure
= (PMEASUREITEMSTRUCT
) lParam
;
333 measure
->itemWidth
= 32;
334 measure
->itemHeight
= 32;
340 PDRAWITEMSTRUCT dis
= (PDRAWITEMSTRUCT
) lParam
;
341 DrawIcon(dis
->hDC
, dis
->rcItem
.left
, dis
->rcItem
.top
, (HICON
)dis
->itemData
);
350 CHAR filename
[MAX_PATHNAME_LEN
];
352 if (DIALOG_BrowseSymbols(hDlg
, filename
, sizeof(filename
)))
353 SetDlgItemTextA(hDlg
, PM_ICON_FILE
, filename
);
358 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
363 INT nCurSel
= SendDlgItemMessageA(hDlg
, PM_SYMBOL_LIST
, CB_GETCURSEL
, 0, 0);
365 GetDlgItemTextA(hDlg
, PM_ICON_FILE
, Symbol
.lpszIconFile
, Symbol
.nSize
);
367 *Symbol
.lphIcon
= (HICON
)SendDlgItemMessageA(hDlg
, PM_SYMBOL_LIST
,
369 (WPARAM
) nCurSel
, 0);
371 *Symbol
.lphIcon
= CopyIcon(*Symbol
.lphIcon
);
374 EndDialog(hDlg
, IDOK
);
379 EndDialog(hDlg
, IDCANCEL
);
386 /***********************************************************************
390 static VOID
DIALOG_Symbol(HICON
*lphIcon
, LPSTR lpszIconFile
,
391 INT
*lpnIconIndex
, INT nSize
)
393 Symbol
.nSize
= nSize
;
394 Symbol
.lpszIconFile
= lpszIconFile
;
395 Symbol
.lphIcon
= lphIcon
;
396 Symbol
.lpnIconIndex
= lpnIconIndex
;
398 DialogBoxW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_SYMBOL
), Globals
.hMainWnd
, DIALOG_SYMBOL_DlgProc
);
404 LPSTR lpszTitle
, lpszCmdLine
, lpszWorkDir
, lpszIconFile
, lpszTmpIconFile
;
409 HICON
*lphIcon
, hTmpIcon
;
410 INT
*lpnIconIndex
, nTmpIconIndex
;
413 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
415 * DIALOG_PROGRAM_DlgProc
417 static INT_PTR CALLBACK
DIALOG_PROGRAM_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
419 CHAR buffer
[MAX_STRING_LEN
];
423 SetDlgItemTextA(hDlg
, PM_DESCRIPTION
, ProgramAttributes
.lpszTitle
);
424 SetDlgItemTextA(hDlg
, PM_COMMAND_LINE
, ProgramAttributes
.lpszCmdLine
);
425 SetDlgItemTextA(hDlg
, PM_DIRECTORY
, ProgramAttributes
.lpszWorkDir
);
426 if (!*ProgramAttributes
.lpnHotKey
)
428 LoadStringA(Globals
.hInstance
, IDS_NO_HOT_KEY
, buffer
, sizeof(buffer
));
429 SetDlgItemTextA(hDlg
, PM_HOT_KEY
, buffer
);
432 CheckDlgButton(hDlg
, PM_SYMBOL
,
433 (*ProgramAttributes
.lpnCmdShow
== SW_SHOWMINIMIZED
));
434 SendDlgItemMessageA(hDlg
, PM_ICON
, STM_SETICON
, (WPARAM
)ProgramAttributes
.hTmpIcon
, 0);
441 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
446 CHAR filename
[MAX_PATHNAME_LEN
];
448 if (DIALOG_BrowsePrograms(hDlg
, filename
, sizeof(filename
)))
449 SetDlgItemTextA(hDlg
, PM_COMMAND_LINE
, filename
);
453 case PM_OTHER_SYMBOL
:
455 DIALOG_Symbol(&ProgramAttributes
.hTmpIcon
,
456 ProgramAttributes
.lpszTmpIconFile
,
457 &ProgramAttributes
.nTmpIconIndex
,
460 SendDlgItemMessageA(hDlg
, PM_ICON
, STM_SETICON
, (WPARAM
)ProgramAttributes
.hTmpIcon
, 0);
465 GetDlgItemTextA(hDlg
, PM_DESCRIPTION
,
466 ProgramAttributes
.lpszTitle
,
467 ProgramAttributes
.nSize
);
468 GetDlgItemTextA(hDlg
, PM_COMMAND_LINE
,
469 ProgramAttributes
.lpszCmdLine
,
470 ProgramAttributes
.nSize
);
471 GetDlgItemTextA(hDlg
, PM_DIRECTORY
,
472 ProgramAttributes
.lpszWorkDir
,
473 ProgramAttributes
.nSize
);
475 if (ProgramAttributes
.hTmpIcon
)
478 if (*ProgramAttributes
.lphIcon
)
479 DestroyIcon(*ProgramAttributes
.lphIcon
);
481 *ProgramAttributes
.lphIcon
= ProgramAttributes
.hTmpIcon
;
482 *ProgramAttributes
.lpnIconIndex
= ProgramAttributes
.nTmpIconIndex
;
483 lstrcpynA(ProgramAttributes
.lpszIconFile
,
484 ProgramAttributes
.lpszTmpIconFile
,
485 ProgramAttributes
.nSize
);
488 *ProgramAttributes
.lpnCmdShow
=
489 IsDlgButtonChecked(hDlg
, PM_SYMBOL
) ?
490 SW_SHOWMINIMIZED
: SW_SHOWNORMAL
;
491 EndDialog(hDlg
, IDOK
);
495 EndDialog(hDlg
, IDCANCEL
);
503 /***********************************************************************
505 * DIALOG_ProgramAttributes
507 BOOL
DIALOG_ProgramAttributes(LPSTR lpszTitle
, LPSTR lpszCmdLine
,
508 LPSTR lpszWorkDir
, LPSTR lpszIconFile
,
509 HICON
*lphIcon
, INT
*lpnIconIndex
,
510 INT
*lpnHotKey
, INT
*lpnCmdShow
, INT nSize
)
512 CHAR szTmpIconFile
[MAX_PATHNAME_LEN
];
515 ProgramAttributes
.nSize
= nSize
;
516 ProgramAttributes
.lpszTitle
= lpszTitle
;
517 ProgramAttributes
.lpszCmdLine
= lpszCmdLine
;
518 ProgramAttributes
.lpszWorkDir
= lpszWorkDir
;
519 ProgramAttributes
.lpszIconFile
= lpszIconFile
;
520 ProgramAttributes
.lpnCmdShow
= lpnCmdShow
;
521 ProgramAttributes
.lpnHotKey
= lpnHotKey
;
522 ProgramAttributes
.lphIcon
= lphIcon
;
523 ProgramAttributes
.lpnIconIndex
= lpnIconIndex
;
526 ProgramAttributes
.hTmpIcon
= 0;
528 ProgramAttributes
.hTmpIcon
= *lphIcon
;
530 ProgramAttributes
.nTmpIconIndex
= *lpnIconIndex
;
531 ProgramAttributes
.lpszTmpIconFile
= szTmpIconFile
;
532 lstrcpynA(ProgramAttributes
.lpszTmpIconFile
, lpszIconFile
, MAX_PATHNAME_LEN
);
534 ret
= DialogBoxW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_PROGRAM
), Globals
.hMainWnd
, DIALOG_PROGRAM_DlgProc
);
539 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
541 * DIALOG_EXECUTE_DlgProc
543 static INT_PTR CALLBACK
DIALOG_EXECUTE_DlgProc(HWND hDlg
, UINT msg
,
544 WPARAM wParam
, LPARAM lParam
)
552 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
557 CHAR filename
[MAX_PATHNAME_LEN
];
559 if (DIALOG_BrowsePrograms(hDlg
, filename
, sizeof(filename
)))
560 SetDlgItemTextA(hDlg
, PM_COMMAND
, filename
);
565 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
570 CHAR cmdline
[MAX_PATHNAME_LEN
];
571 GetDlgItemTextA(hDlg
, PM_COMMAND
, cmdline
, sizeof(cmdline
));
573 WinExec(cmdline
, IsDlgButtonChecked(hDlg
, PM_SYMBOL
) ?
574 SW_SHOWMINIMIZED
: SW_SHOWNORMAL
);
575 if (Globals
.bMinOnRun
) CloseWindow(Globals
.hMainWnd
);
577 EndDialog(hDlg
, IDOK
);
582 EndDialog(hDlg
, IDCANCEL
);
589 /***********************************************************************
594 VOID
DIALOG_Execute(void)
596 DialogBoxW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_EXECUTE
), Globals
.hMainWnd
, DIALOG_EXECUTE_DlgProc
);