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
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 /***********************************************************************
44 INT
DIALOG_New(INT nDefault
)
46 DLGPROC lpfnDlg
= MakeProcInstance(DIALOG_NEW_DlgProc
, Globals
.hInstance
);
49 New
.nDefault
= nDefault
;
51 ret
= DialogBox(Globals
.hInstance
, STRING_NEW_Xx
,
52 Globals
.hMainWnd
, lpfnDlg
);
53 FreeProcInstance(lpfnDlg
);
57 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
62 static BOOL CALLBACK
DIALOG_NEW_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
67 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, New
.nDefault
);
75 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, wParam
);
79 EndDialog(hDlg
, IsDlgButtonChecked(hDlg
, PM_NEW_GROUP
) ?
80 PM_NEW_GROUP
: PM_NEW_PROGRAM
);
84 EndDialog(hDlg
, IDCANCEL
);
91 /***********************************************************************
98 LPCSTR lpszProgramName
, lpszFromGroupName
;
102 HLOCAL
DIALOG_CopyMove(LPCSTR lpszProgramName
, LPCSTR lpszFromGroupName
,
105 DLGPROC lpfnDlg
= MakeProcInstance(DIALOG_COPY_MOVE_DlgProc
, Globals
.hInstance
);
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
)
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
);
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;
157 CopyMove
.hToGroup
= hGroup
;
158 EndDialog(hDlg
, IDOK
);
163 EndDialog(hDlg
, IDCANCEL
);
170 /***********************************************************************
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
189 LPSTR lpszTitle
, lpszGrpFile
;
193 BOOL
DIALOG_GroupAttributes(LPSTR lpszTitle
, LPSTR lpszGrpFile
, INT nSize
)
195 DLGPROC lpfnDlg
= MakeProcInstance(DIALOG_GROUP_DlgProc
, Globals
.hInstance
);
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
);
208 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
210 * DIALOG_GROUP_DlgProc
213 static BOOL CALLBACK
DIALOG_GROUP_DlgProc(HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
218 SetDlgItemText(hDlg
, PM_DESCRIPTION
, GroupAttributes
.lpszTitle
);
219 SetDlgItemText(hDlg
, PM_FILE
, GroupAttributes
.lpszGrpFile
);
226 GetDlgItemText(hDlg
, PM_DESCRIPTION
, GroupAttributes
.lpszTitle
,
227 GroupAttributes
.nSize
);
228 GetDlgItemText(hDlg
, PM_FILE
, GroupAttributes
.lpszGrpFile
,
229 GroupAttributes
.nSize
);
230 EndDialog(hDlg
, IDOK
);
234 EndDialog(hDlg
, IDCANCEL
);
241 /***********************************************************************
243 * DIALOG_ProgramAttributes
248 LPSTR lpszTitle
, lpszCmdLine
, lpszWorkDir
, lpszIconFile
, lpszTmpIconFile
;
253 HICON
*lphIcon
, hTmpIcon
;
254 INT
*lpnIconIndex
, nTmpIconIndex
;
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
);
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
;
277 ProgramAttributes
.hTmpIcon
= 0;
279 ProgramAttributes
.hTmpIcon
= *lphIcon
;
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
);
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
];
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);
322 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
327 CHAR filename
[MAX_PATHNAME_LEN
];
328 if (DIALOG_BrowsePrograms(hDlg
, filename
, sizeof(filename
)))
329 SetDlgItemText(hDlg
, PM_COMMAND_LINE
, filename
);
333 case PM_OTHER_SYMBOL
:
335 DIALOG_Symbol(&ProgramAttributes
.hTmpIcon
,
336 ProgramAttributes
.lpszTmpIconFile
,
337 &ProgramAttributes
.nTmpIconIndex
,
340 SendDlgItemMessage(hDlg
, PM_ICON
, STM_SETICON
,
341 (WPARAM
) ProgramAttributes
.hTmpIcon
, 0);
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
)
359 if (*ProgramAttributes
.lphIcon
)
360 DestroyIcon(*ProgramAttributes
.lphIcon
);
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
);
376 EndDialog(hDlg
, IDCANCEL
);
384 /***********************************************************************
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
)
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);
431 PMEASUREITEMSTRUCT measure
= (PMEASUREITEMSTRUCT
) lParam
;
432 measure
->itemWidth
= 32;
433 measure
->itemHeight
= 32;
439 PDRAWITEMSTRUCT dis
= (PDRAWITEMSTRUCT
) lParam
;
440 DrawIcon(dis
->hDC
, dis
->rcItem
.left
, dis
->rcItem
.top
, (HICON
)dis
->itemData
);
449 CHAR filename
[MAX_PATHNAME_LEN
];
450 if (DIALOG_BrowseSymbols(hDlg
, filename
, sizeof(filename
)))
451 SetDlgItemText(hDlg
, PM_ICON_FILE
, filename
);
456 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
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
,
467 (WPARAM
) nCurSel
, 0);
469 *Symbol
.lphIcon
= CopyIcon(*Symbol
.lphIcon
);
472 EndDialog(hDlg
, IDOK
);
477 EndDialog(hDlg
, IDCANCEL
);
484 /***********************************************************************
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
)
511 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
516 CHAR filename
[MAX_PATHNAME_LEN
];
517 if (DIALOG_BrowsePrograms(hDlg
, filename
, sizeof(filename
)))
518 SetDlgItemText(hDlg
, PM_COMMAND
, filename
);
523 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
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
);
540 EndDialog(hDlg
, IDCANCEL
);
547 /***********************************************************************
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
);
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;
603 *p
+= strlen(*p
) + 1;
607 /***********************************************************************
609 * DIALOG_BrowsePrograms
612 static BOOL
DIALOG_BrowsePrograms(HWND hDlg
, LPSTR lpszFile
, INT nMaxFile
)
614 CHAR szzFilter
[2 * MAX_STRING_LEN
+ 100];
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];
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" */