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
24 * PROJECT: ReactOS Program Manager
25 * COPYRIGHT: GPL - See COPYING in the top level directory
26 * FILE: base/shell/progman/dialog.c
27 * PURPOSE: ProgMan dialog boxes
28 * PROGRAMMERS: Ulrich Schmid
31 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
38 /***********************************************************************
40 * DIALOG_AddFilterItem and DIALOG_BrowseXXX
45 DIALOG_AddFilterItem(LPWSTR
* p
, UINT ids
, LPCWSTR filter
)
47 LoadStringW(Globals
.hInstance
, ids
, *p
, MAX_STRING_LEN
);
56 DIALOG_Browse(HWND hWnd
, LPCWSTR lpszzFilter
, LPWSTR lpstrFile
, INT nMaxFile
)
58 OPENFILENAMEW openfilename
;
59 WCHAR szDir
[MAX_PATH
];
61 ZeroMemory(&openfilename
, sizeof(openfilename
));
63 GetCurrentDirectoryW(ARRAYSIZE(szDir
), szDir
);
65 openfilename
.lStructSize
= sizeof(openfilename
);
66 openfilename
.hwndOwner
= hWnd
;
67 openfilename
.hInstance
= Globals
.hInstance
;
68 openfilename
.lpstrFilter
= lpszzFilter
;
69 openfilename
.lpstrFile
= lpstrFile
;
70 openfilename
.nMaxFile
= nMaxFile
;
71 openfilename
.lpstrInitialDir
= szDir
;
72 openfilename
.Flags
= 0;
73 openfilename
.lpstrDefExt
= L
"exe";
74 openfilename
.lpstrCustomFilter
= NULL
;
75 openfilename
.nMaxCustFilter
= 0;
76 openfilename
.nFilterIndex
= 0;
77 openfilename
.lpstrFileTitle
= NULL
;
78 openfilename
.nMaxFileTitle
= 0;
79 openfilename
.lpstrTitle
= NULL
;
80 openfilename
.nFileOffset
= 0;
81 openfilename
.nFileExtension
= 0;
82 openfilename
.lCustData
= 0;
83 openfilename
.lpfnHook
= NULL
;
84 openfilename
.lpTemplateName
= NULL
;
86 return GetOpenFileNameW(&openfilename
);
91 DIALOG_BrowsePrograms(HWND hWnd
, LPWSTR lpszFile
, INT nMaxFile
)
93 WCHAR szzFilter
[2 * MAX_STRING_LEN
+ 100];
96 DIALOG_AddFilterItem(&p
, IDS_PROGRAMS
, L
"*.exe;*.pif;*.com;*.bat;*.cmd");
97 DIALOG_AddFilterItem(&p
, IDS_ALL_FILES
, L
"*.*");
99 return DIALOG_Browse(hWnd
, szzFilter
, lpszFile
, nMaxFile
);
104 DIALOG_BrowseSymbols(HWND hWnd
, LPWSTR lpszFile
, INT nMaxFile
)
106 WCHAR szzFilter
[5 * MAX_STRING_LEN
+ 100];
107 LPWSTR p
= szzFilter
;
109 DIALOG_AddFilterItem(&p
, IDS_SYMBOL_FILES
, L
"*.ico;*.exe;*.dll");
110 DIALOG_AddFilterItem(&p
, IDS_PROGRAMS
, L
"*.exe");
111 DIALOG_AddFilterItem(&p
, IDS_LIBRARIES_DLL
, L
"*.dll");
112 DIALOG_AddFilterItem(&p
, IDS_SYMBOLS_ICO
, L
"*.ico");
113 DIALOG_AddFilterItem(&p
, IDS_ALL_FILES
, L
"*.*");
115 return DIALOG_Browse(hWnd
, szzFilter
, lpszFile
, nMaxFile
);
120 /***********************************************************************
125 LPCWSTR
GroupFormatToFormatName(GROUPFORMAT Format
)
127 static const LPCWSTR FormatNames
[] =
134 if (Format
> NT_Unicode
)
137 return FormatNames
[Format
];
140 typedef struct _NEW_ITEM_CONTEXT
144 } NEW_ITEM_CONTEXT
, *PNEW_ITEM_CONTEXT
;
149 DIALOG_NEW_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
151 PNEW_ITEM_CONTEXT pNewItem
;
155 pNewItem
= (PNEW_ITEM_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
161 pNewItem
= (PNEW_ITEM_CONTEXT
)lParam
;
162 SetWindowLongPtrW(hDlg
, 8, lParam
);
164 for (format
= Win_311
; format
<= NT_Unicode
; ++format
)
166 iItem
= SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_INSERTSTRING
, 0, (LPARAM
)GroupFormatToFormatName(format
));
167 if (iItem
!= CB_ERR
&& iItem
!= CB_ERRSPACE
)
168 SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_SETITEMDATA
, iItem
, format
);
171 SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_SETCURSEL
, 0, 0);
172 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, pNewItem
->nDefault
);
173 CheckRadioButton(hDlg
, PM_PERSONAL_GROUP
, PM_COMMON_GROUP
, PM_PERSONAL_GROUP
);
175 EnableDlgItem(hDlg
, PM_NEW_PROGRAM
, GROUP_ActiveGroup() != NULL
);
177 SendMessageW(hDlg
, WM_COMMAND
, pNewItem
->nDefault
, 0);
182 switch (LOWORD(wParam
))
186 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, wParam
);
187 EnableDlgItem(hDlg
, PM_COMMON_GROUP
, TRUE
);
188 EnableDlgItem(hDlg
, PM_PERSONAL_GROUP
, TRUE
);
189 EnableDlgItem(hDlg
, PM_FORMAT_TXT
, TRUE
);
190 EnableDlgItem(hDlg
, PM_FORMAT
, TRUE
);
196 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, wParam
);
197 EnableDlgItem(hDlg
, PM_COMMON_GROUP
, FALSE
);
198 EnableDlgItem(hDlg
, PM_PERSONAL_GROUP
, FALSE
);
199 EnableDlgItem(hDlg
, PM_FORMAT_TXT
, FALSE
);
200 EnableDlgItem(hDlg
, PM_FORMAT
, FALSE
);
205 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
210 iItem
= SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_GETCURSEL
, 0, 0);
212 format
= SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_GETITEMDATA
, iItem
, 0);
213 format
= min(max(format
, Win_311
), NT_Unicode
);
215 pNewItem
->nResult
= !!IsDlgButtonChecked(hDlg
, PM_NEW_GROUP
);
216 pNewItem
->nResult
|= (!!IsDlgButtonChecked(hDlg
, PM_COMMON_GROUP
) << 1);
217 pNewItem
->nResult
|= (format
<< 2);
219 EndDialog(hDlg
, IDOK
);
224 EndDialog(hDlg
, IDCANCEL
);
233 BOOL
DIALOG_New(INT nDefault
, PINT pnResult
)
236 NEW_ITEM_CONTEXT NewItem
;
240 NewItem
.nDefault
= nDefault
;
242 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_NEW
), Globals
.hMainWnd
, DIALOG_NEW_DlgProc
, (LPARAM
)&NewItem
);
244 *pnResult
= NewItem
.nResult
;
246 return (ret
== IDOK
);
250 /***********************************************************************
255 typedef struct _COPY_MOVE_CONTEXT
260 } COPY_MOVE_CONTEXT
, *PCOPY_MOVE_CONTEXT
;
265 DIALOG_COPY_MOVE_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
270 PCOPY_MOVE_CONTEXT pCopyMove
;
273 WCHAR text
[MAX_STRING_LEN
];
275 pCopyMove
= (PCOPY_MOVE_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
281 pCopyMove
= (PCOPY_MOVE_CONTEXT
)lParam
;
282 SetWindowLongPtrW(hDlg
, 8, lParam
);
284 if (pCopyMove
->bMove
)
286 LoadStringW(Globals
.hInstance
, IDS_MOVE_PROGRAM_1
, text
, ARRAYSIZE(text
));
287 SetWindowTextW(hDlg
, text
);
288 LoadStringW(Globals
.hInstance
, IDS_MOVE_PROGRAM_2
, text
, ARRAYSIZE(text
));
289 SetDlgItemTextW(hDlg
, PM_COPY_MOVE_TXT
, text
);
292 /* List all the group names but the source group, in case we are doing a move */
293 for (hGroup
= Globals
.hGroups
; hGroup
; hGroup
= hGroup
->hNext
)
295 if (!pCopyMove
->bMove
|| hGroup
!= pCopyMove
->Program
->hGroup
)
297 iItem
= SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_ADDSTRING
, 0, (LPARAM
)hGroup
->hName
);
298 if (iItem
!= CB_ERR
&& iItem
!= CB_ERRSPACE
)
299 SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_SETITEMDATA
, iItem
, (LPARAM
)hGroup
);
302 SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_SETCURSEL
, 0, 0);
303 SetDlgItemTextW(hDlg
, PM_PROGRAM
, pCopyMove
->Program
->hName
);
304 SetDlgItemTextW(hDlg
, PM_FROM_GROUP
, pCopyMove
->Program
->hGroup
->hName
);
309 switch (LOWORD(wParam
))
312 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
317 /* Get the selected group */
318 iItem
= SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_GETCURSEL
, 0, 0);
319 hGrpItem
= (PROGGROUP
*)SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_GETITEMDATA
, iItem
, 0);
320 /* Check that it is indeed in the group list */
321 for (hGroup
= Globals
.hGroups
; hGroup
&& hGroup
!= hGrpItem
; hGroup
= hGroup
->hNext
)
323 if (pCopyMove
->bMove
)
325 if (hGrpItem
== pCopyMove
->Program
->hGroup
)
328 pCopyMove
->hToGroup
= hGrpItem
;
329 EndDialog(hDlg
, IDOK
);
334 EndDialog(hDlg
, IDCANCEL
);
343 PROGGROUP
* DIALOG_CopyMove(PROGRAM
* hProgram
, BOOL bMove
)
345 COPY_MOVE_CONTEXT CopyMove
;
348 CopyMove
.bMove
= bMove
;
349 CopyMove
.Program
= hProgram
;
350 CopyMove
.hToGroup
= NULL
;
351 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_COPY_MOVE
), Globals
.hMainWnd
, DIALOG_COPY_MOVE_DlgProc
, (LPARAM
)&CopyMove
);
353 return (ret
== IDOK
? CopyMove
.hToGroup
: NULL
);
356 /***********************************************************************
361 BOOL
DIALOG_Delete(UINT ids_text_s
, LPCWSTR lpszName
)
363 return (MAIN_MessageBoxIDS_s(ids_text_s
, lpszName
, IDS_DELETE
, MB_YESNO
| MB_DEFBUTTON2
) == IDYES
);
367 /* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnableOkButtonFromEditContents */
368 BOOL
ValidateEditContents(HWND hDlg
, INT nIDEditItem
)
375 Edit
= GetDlgItem(hDlg
, nIDEditItem
);
376 Length
= GetWindowTextLengthW(Edit
);
381 psz
= Alloc(0, (Length
+ 1) * sizeof(WCHAR
));
384 GetWindowTextW(Edit
, psz
, Length
+ 1);
385 for (n
= 0; n
< Length
&& !Enable
; ++n
)
386 Enable
= (psz
[n
] != ' ');
398 /***********************************************************************
400 * DIALOG_GroupAttributes
403 typedef struct _GROUP_ATTRIBUTES_CONTEXT
409 } GROUP_ATTRIBUTES_CONTEXT
, *PGROUP_ATTRIBUTES_CONTEXT
;
414 DIALOG_GROUP_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
416 PGROUP_ATTRIBUTES_CONTEXT pGroupAttributes
;
418 pGroupAttributes
= (PGROUP_ATTRIBUTES_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
426 pGroupAttributes
= (PGROUP_ATTRIBUTES_CONTEXT
)lParam
;
427 SetWindowLongPtrW(hDlg
, 8, lParam
);
429 /* Configure Richedit control for sending notification changes */
430 evMask
= SendDlgItemMessageW(hDlg
, PM_DESCRIPTION
, EM_GETEVENTMASK
, 0, 0) | ENM_CHANGE
;
431 SendDlgItemMessageW(hDlg
, PM_DESCRIPTION
, EM_SETEVENTMASK
, 0, (LPARAM
)evMask
);
433 SetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pGroupAttributes
->lpszTitle
);
435 if (pGroupAttributes
->format
!= Win_311
)
437 EnableDlgItem(hDlg
, PM_FILE
, FALSE
);
441 EnableDlgItem(hDlg
, PM_FILE
, TRUE
);
442 SetDlgItemTextW(hDlg
, PM_FILE
, pGroupAttributes
->lpszGrpFile
);
445 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_DESCRIPTION
));
450 switch (LOWORD(wParam
))
453 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
458 if (HIWORD(wParam
) == EN_CHANGE
)
459 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_DESCRIPTION
));
465 GetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pGroupAttributes
->lpszTitle
, pGroupAttributes
->nSize
);
466 if (pGroupAttributes
->format
)
467 *pGroupAttributes
->lpszGrpFile
= '\0';
469 GetDlgItemTextW(hDlg
, PM_FILE
, pGroupAttributes
->lpszGrpFile
, pGroupAttributes
->nSize
);
470 EndDialog(hDlg
, IDOK
);
475 EndDialog(hDlg
, IDCANCEL
);
484 BOOL
DIALOG_GroupAttributes(GROUPFORMAT format
, LPWSTR lpszTitle
, LPWSTR lpszGrpFile
, INT nSize
)
487 GROUP_ATTRIBUTES_CONTEXT GroupAttributes
;
489 GroupAttributes
.format
= format
;
490 GroupAttributes
.nSize
= nSize
;
491 GroupAttributes
.lpszTitle
= lpszTitle
;
492 GroupAttributes
.lpszGrpFile
= lpszGrpFile
;
494 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_GROUP
), Globals
.hMainWnd
, DIALOG_GROUP_DlgProc
, (LPARAM
)&GroupAttributes
);
496 return (ret
== IDOK
);
500 /***********************************************************************
505 /* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnumPickIconResourceProc */
509 EnumPickIconResourceProc(HMODULE hModule
, LPCWSTR lpszType
, LPWSTR lpszName
, LONG_PTR lParam
)
512 HWND hDlgCtrl
= (HWND
)lParam
;
515 if (IS_INTRESOURCE(lpszName
))
516 StringCbPrintfW(szName
, sizeof(szName
), L
"%u", (unsigned)(UINT_PTR
)lpszName
);
518 StringCbCopyW(szName
, sizeof(szName
), lpszName
);
520 hIcon
= (HICON
)LoadImageW(hModule
, lpszName
, IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
524 SendMessageW(hDlgCtrl
, LB_ADDSTRING
, 0, (LPARAM
)hIcon
);
530 DestroyIconList(HWND hDlgCtrl
)
535 count
= SendMessageA(hDlgCtrl
, LB_GETCOUNT
, 0, 0);
536 if (count
== LB_ERR
|| count
== 0)
541 hIcon
= (HICON
)SendMessageA(hDlgCtrl
, LB_GETITEMDATA
, 0, 0);
543 SendMessageA(hDlgCtrl
, LB_DELETESTRING
, 0, 0);
547 typedef struct _PICK_ICON_CONTEXT
551 WCHAR szName
[MAX_PATH
]; // LPWSTR lpszIconFile; // INT nSize;
554 } PICK_ICON_CONTEXT
, *PPICK_ICON_CONTEXT
;
571 DIALOG_SYMBOL_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
573 WCHAR filename
[MAX_PATHNAME_LEN
];
574 PPICK_ICON_CONTEXT pIconContext
;
576 pIconContext
= (PPICK_ICON_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
582 pIconContext
= (PPICK_ICON_CONTEXT
)lParam
;
583 SetWindowLongPtrW(hDlg
, 8, lParam
);
585 pIconContext
->hDlgCtrl
= GetDlgItem(hDlg
, PM_SYMBOL_LIST
);
586 SetDlgItemTextW(hDlg
, PM_ICON_FILE
, pIconContext
->szName
);
587 SendMessageA(pIconContext
->hDlgCtrl
, LB_SETITEMHEIGHT
, 0, 32);
589 pIconContext
->hLibrary
= LoadLibraryExW(pIconContext
->szName
, NULL
, LOAD_LIBRARY_AS_IMAGE_RESOURCE
| LOAD_LIBRARY_AS_DATAFILE
);
590 if (pIconContext
->hLibrary
)
592 EnumResourceNamesW(pIconContext
->hLibrary
,
593 (LPCWSTR
)RT_GROUP_ICON
,
594 EnumPickIconResourceProc
,
595 (LONG_PTR
)pIconContext
->hDlgCtrl
);
596 FreeLibrary(pIconContext
->hLibrary
);
597 pIconContext
->hLibrary
= NULL
;
599 SendMessageA(pIconContext
->hDlgCtrl
, LB_SETCURSEL
, pIconContext
->Index
, 0);
605 PMEASUREITEMSTRUCT measure
= (PMEASUREITEMSTRUCT
)lParam
;
606 measure
->itemWidth
= 32;
607 measure
->itemHeight
= 32;
613 PDRAWITEMSTRUCT dis
= (PDRAWITEMSTRUCT
)lParam
;
615 if (dis
->itemState
& ODS_SELECTED
)
616 FillRect(dis
->hDC
, &dis
->rcItem
, (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
618 FillRect(dis
->hDC
, &dis
->rcItem
, (HBRUSH
)(COLOR_WINDOW
+ 1));
620 DrawIcon(dis
->hDC
, dis
->rcItem
.left
, dis
->rcItem
.top
, (HICON
)dis
->itemData
);
625 switch (LOWORD(wParam
))
630 if (!DIALOG_BrowseSymbols(hDlg
, filename
, ARRAYSIZE(filename
)))
633 if (_wcsnicmp(pIconContext
->szName
, filename
, ARRAYSIZE(pIconContext
->szName
)) == 0)
636 SetDlgItemTextW(hDlg
, PM_ICON_FILE
, filename
);
637 DestroyIconList(pIconContext
->hDlgCtrl
);
638 pIconContext
->hLibrary
= LoadLibraryExW(filename
, NULL
, LOAD_LIBRARY_AS_IMAGE_RESOURCE
| LOAD_LIBRARY_AS_DATAFILE
);
639 if (pIconContext
->hLibrary
)
641 EnumResourceNamesW(pIconContext
->hLibrary
,
642 (LPCWSTR
)RT_GROUP_ICON
,
643 EnumPickIconResourceProc
,
644 (LONG_PTR
)pIconContext
->hDlgCtrl
);
645 FreeLibrary(pIconContext
->hLibrary
);
646 pIconContext
->hLibrary
= NULL
;
648 SendMessageA(pIconContext
->hDlgCtrl
, LB_SETCURSEL
, 0, 0);
653 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
658 INT nCurSel
= SendMessageW(pIconContext
->hDlgCtrl
, LB_GETCURSEL
, 0, 0);
659 GetDlgItemTextW(hDlg
, PM_ICON_FILE
, pIconContext
->szName
, ARRAYSIZE(pIconContext
->szName
));
660 pIconContext
->hIcon
= (HICON
)SendMessageA(pIconContext
->hDlgCtrl
, LB_GETITEMDATA
, nCurSel
, 0);
661 pIconContext
->hIcon
= CopyIcon(pIconContext
->hIcon
);
662 DestroyIconList(pIconContext
->hDlgCtrl
);
663 EndDialog(hDlg
, IDOK
);
668 DestroyIconList(pIconContext
->hDlgCtrl
);
669 EndDialog(hDlg
, IDCANCEL
);
680 DIALOG_Symbol(HWND hWnd
, HICON
*lphIcon
, LPWSTR lpszIconFile
, INT
*lpnIconIndex
, INT nSize
)
682 PICK_ICON_CONTEXT IconContext
;
684 IconContext
.Index
= *lpnIconIndex
;
685 StringCchCopyNW(IconContext
.szName
, ARRAYSIZE(IconContext
.szName
), lpszIconFile
, nSize
);
687 if (DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_SYMBOL
), hWnd
, DIALOG_SYMBOL_DlgProc
, (LPARAM
)&IconContext
) != IDOK
)
690 StringCchCopyNW(lpszIconFile
, nSize
, IconContext
.szName
, ARRAYSIZE(IconContext
.szName
));
691 *lpnIconIndex
= IconContext
.Index
;
692 *lphIcon
= IconContext
.hIcon
;
696 /***********************************************************************
698 * DIALOG_ProgramAttributes
701 typedef struct _PROGRAM_ATTRIBUTES_CONTEXT
707 LPWSTR lpszTmpIconFile
;
711 // HWND hSelGroupWnd;
712 BOOL
* lpbNewVDM
; // unused!
717 BOOL bCheckBinaryType
;
718 } PROGRAM_ATTRIBUTES_CONTEXT
, *PPROGRAM_ATTRIBUTES_CONTEXT
;
723 DIALOG_PROGRAM_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
726 WCHAR filename
[MAX_PATHNAME_LEN
];
729 PPROGRAM_ATTRIBUTES_CONTEXT pProgramAttributes
;
731 pProgramAttributes
= (PPROGRAM_ATTRIBUTES_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
737 pProgramAttributes
= (PPROGRAM_ATTRIBUTES_CONTEXT
)lParam
;
738 SetWindowLongPtrW(hDlg
, 8, lParam
);
740 evMask
= SendDlgItemMessageW(hDlg
, PM_COMMAND_LINE
, EM_GETEVENTMASK
, 0, 0) | ENM_CHANGE
;
741 SendDlgItemMessageW(hDlg
, PM_COMMAND_LINE
, EM_SETEVENTMASK
, 0, evMask
);
743 SetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pProgramAttributes
->lpszTitle
);
744 SetDlgItemTextW(hDlg
, PM_COMMAND_LINE
, pProgramAttributes
->lpszCmdLine
);
745 SetDlgItemTextW(hDlg
, PM_DIRECTORY
, pProgramAttributes
->lpszWorkDir
);
748 SendDlgItemMessageW(hDlg
, PM_HOT_KEY
, HKM_SETRULES
, HKCOMB_C
| HKCOMB_A
| HKCOMB_S
| HKCOMB_NONE
, HOTKEYF_CONTROL
| HOTKEYF_ALT
);
749 SendDlgItemMessageW(hDlg
, PM_HOT_KEY
, HKM_SETHOTKEY
, *pProgramAttributes
->lpnHotKey
, 0);
751 bEnable
= ValidateEditContents(hDlg
, PM_COMMAND_LINE
);
752 EnableWindow(GetDlgItem(hDlg
, IDOK
), bEnable
);
753 EnableWindow(GetDlgItem(hDlg
, PM_OTHER_SYMBOL
), bEnable
);
755 CheckDlgButton(hDlg
, PM_SYMBOL
, *pProgramAttributes
->lpnCmdShow
== SW_SHOWMINNOACTIVE
);
757 if (pProgramAttributes
->bCheckBinaryType
&&
758 (!GetBinaryTypeW(pProgramAttributes
->lpszCmdLine
, &dwBinaryType
) || dwBinaryType
!= SCS_WOW_BINARY
) )
760 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), FALSE
);
761 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
765 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), TRUE
);
766 CheckDlgButton(hDlg
, PM_NEW_VDM
, *pProgramAttributes
->lpbNewVDM
);
768 SendDlgItemMessageW(hDlg
, PM_ICON
, STM_SETICON
, (WPARAM
)pProgramAttributes
->hTmpIcon
, 0);
773 switch (LOWORD(wParam
))
776 CheckDlgButton(hDlg
, PM_NEW_VDM
, !IsDlgButtonChecked(hDlg
, PM_NEW_VDM
));
782 if (DIALOG_BrowsePrograms(hDlg
, filename
, ARRAYSIZE(filename
)))
784 SetDlgItemTextW(hDlg
, PM_COMMAND_LINE
, filename
);
785 if (pProgramAttributes
->bCheckBinaryType
&&
786 (!GetBinaryTypeW(filename
, &dwBinaryType
) || dwBinaryType
!= SCS_WOW_BINARY
))
788 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), FALSE
);
789 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
793 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), TRUE
);
794 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_UNCHECKED
);
801 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
805 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
808 case PM_OTHER_SYMBOL
:
811 &pProgramAttributes
->hTmpIcon
,
812 pProgramAttributes
->lpszTmpIconFile
,
813 &pProgramAttributes
->nTmpIconIndex
,
816 SendDlgItemMessageW(hDlg
, PM_ICON
, STM_SETICON
, (WPARAM
)pProgramAttributes
->hTmpIcon
, 0);
820 case PM_COMMAND_LINE
:
822 if (HIWORD(wParam
) == EN_CHANGE
)
824 bEnable
= ValidateEditContents(hDlg
, PM_COMMAND_LINE
);
825 EnableWindow(GetDlgItem(hDlg
, IDOK
), bEnable
);
826 EnableWindow(GetDlgItem(hDlg
, PM_OTHER_SYMBOL
), bEnable
);
833 GetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pProgramAttributes
->lpszTitle
, pProgramAttributes
->nSize
);
834 GetDlgItemTextW(hDlg
, PM_COMMAND_LINE
, pProgramAttributes
->lpszCmdLine
, pProgramAttributes
->nSize
);
835 GetDlgItemTextW(hDlg
, PM_DIRECTORY
, pProgramAttributes
->lpszWorkDir
, pProgramAttributes
->nSize
);
836 if (pProgramAttributes
->hTmpIcon
)
839 if (*pProgramAttributes
->lphIcon
)
840 DestroyIcon(*pProgramAttributes
->lphIcon
);
842 *pProgramAttributes
->lphIcon
= pProgramAttributes
->hTmpIcon
;
843 *pProgramAttributes
->lpnIconIndex
= pProgramAttributes
->nTmpIconIndex
;
844 lstrcpynW(pProgramAttributes
->lpszIconFile
, pProgramAttributes
->lpszTmpIconFile
, pProgramAttributes
->nSize
);
846 *pProgramAttributes
->lpnHotKey
= SendDlgItemMessageW(hDlg
, PM_HOT_KEY
, HKM_GETHOTKEY
, 0, 0);
847 *pProgramAttributes
->lpnCmdShow
= IsDlgButtonChecked(hDlg
, PM_SYMBOL
) ? SW_SHOWMINNOACTIVE
: SW_SHOWNORMAL
;
848 *pProgramAttributes
->lpbNewVDM
= IsDlgButtonChecked(hDlg
, PM_NEW_VDM
);
849 EndDialog(hDlg
, IDOK
);
854 EndDialog(hDlg
, IDCANCEL
);
864 DIALOG_ProgramAttributes(LPWSTR lpszTitle
, LPWSTR lpszCmdLine
, LPWSTR lpszWorkDir
, LPWSTR lpszIconFile
,
865 HICON
* lphIcon
, INT
* lpnIconIndex
, INT
* lpnHotKey
, INT
* lpnCmdShow
, BOOL
* lpbNewVDM
, INT nSize
)
868 WCHAR szTmpIconFile
[MAX_PATHNAME_LEN
];
869 PROGRAM_ATTRIBUTES_CONTEXT ProgramAttributes
;
873 ProgramAttributes
.nSize
= nSize
;
874 ProgramAttributes
.lpszTitle
= lpszTitle
;
875 ProgramAttributes
.lpszCmdLine
= lpszCmdLine
;
876 ProgramAttributes
.lpszWorkDir
= lpszWorkDir
;
877 ProgramAttributes
.lpszIconFile
= lpszIconFile
;
878 ProgramAttributes
.lpnCmdShow
= lpnCmdShow
;
879 ProgramAttributes
.lpnHotKey
= lpnHotKey
;
880 ProgramAttributes
.lpbNewVDM
= lpbNewVDM
;
881 ProgramAttributes
.lphIcon
= lphIcon
;
882 ProgramAttributes
.lpnIconIndex
= lpnIconIndex
;
884 dwSize
= sizeof(ProgramAttributes
.bCheckBinaryType
);
885 if (RegQueryValueExW(Globals
.hKeyPMSettings
,
889 (LPBYTE
)&ProgramAttributes
.bCheckBinaryType
,
890 &dwSize
) != ERROR_SUCCESS
891 || dwType
!= REG_DWORD
)
893 ProgramAttributes
.bCheckBinaryType
= TRUE
;
897 ProgramAttributes
.hTmpIcon
= NULL
;
899 ProgramAttributes
.hTmpIcon
= *lphIcon
;
901 ProgramAttributes
.nTmpIconIndex
= *lpnIconIndex
;
902 ProgramAttributes
.lpszTmpIconFile
= szTmpIconFile
;
903 wcsncpy(szTmpIconFile
, lpszIconFile
, ARRAYSIZE(szTmpIconFile
));
905 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_PROGRAM
), Globals
.hMainWnd
, DIALOG_PROGRAM_DlgProc
, (LPARAM
)&ProgramAttributes
);
906 return (ret
== IDOK
);
910 /***********************************************************************
915 typedef struct _EXECUTE_CONTEXT
917 HKEY hKeyPMRecentFilesList
;
919 BOOL bCheckBinaryType
;
920 } EXECUTE_CONTEXT
, *PEXECUTE_CONTEXT
;
925 DIALOG_EXECUTE_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
927 WCHAR szFile
[MAX_PATHNAME_LEN
]; // filename
929 PEXECUTE_CONTEXT pExecuteContext
;
931 pExecuteContext
= (PEXECUTE_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
937 pExecuteContext
= (PEXECUTE_CONTEXT
)lParam
;
938 SetWindowLongPtrW(hDlg
, 8, lParam
);
940 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_COMMAND
));
942 if (pExecuteContext
->bCheckBinaryType
)
944 EnableDlgItem(hDlg
, PM_NEW_VDM
, FALSE
);
945 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
949 EnableDlgItem(hDlg
, PM_NEW_VDM
, TRUE
);
956 switch (LOWORD(wParam
))
959 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
963 CheckDlgButton(hDlg
, PM_NEW_VDM
, !IsDlgButtonChecked(hDlg
, PM_NEW_VDM
));
969 if (DIALOG_BrowsePrograms(hDlg
, szFile
, ARRAYSIZE(szFile
)))
971 SetWindowTextW(GetDlgItem(hDlg
, PM_COMMAND
), szFile
);
972 SetFocus(GetDlgItem(hDlg
, IDOK
));
973 if (pExecuteContext
->bCheckBinaryType
&&
974 (!GetBinaryTypeW(szFile
, &BinaryType
) || BinaryType
!= SCS_WOW_BINARY
) )
976 EnableDlgItem(hDlg
, PM_NEW_VDM
, FALSE
);
977 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
981 EnableDlgItem(hDlg
, PM_NEW_VDM
, TRUE
);
982 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_UNCHECKED
);
990 if (HIWORD(wParam
) == CBN_EDITCHANGE
)
992 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_COMMAND
));
998 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
1003 GetDlgItemTextW(hDlg
, PM_COMMAND
, szFile
, ARRAYSIZE(szFile
));
1004 ShellExecuteW(NULL
, NULL
, szFile
, NULL
, NULL
, IsDlgButtonChecked(hDlg
, PM_SYMBOL
) ? SW_SHOWMINNOACTIVE
: SW_SHOWNORMAL
);
1005 if (Globals
.bMinOnRun
)
1006 CloseWindow(Globals
.hMainWnd
);
1007 EndDialog(hDlg
, IDOK
);
1012 EndDialog(hDlg
, IDCANCEL
);
1021 VOID
DIALOG_Execute(VOID
)
1023 EXECUTE_CONTEXT ExecuteContext
;
1028 ExecuteContext
.hKeyPMRecentFilesList
= NULL
;
1029 ExecuteContext
.bCheckBinaryType
= TRUE
;
1031 lRet
= RegCreateKeyExW(Globals
.hKeyProgMan
,
1032 L
"Recent File List",
1036 KEY_READ
| KEY_WRITE
,
1038 &ExecuteContext
.hKeyPMRecentFilesList
,
1040 if (lRet
== ERROR_SUCCESS
)
1042 dwSize
= sizeof(ExecuteContext
.dwMaxFiles
);
1043 lRet
= RegQueryValueExW(ExecuteContext
.hKeyPMRecentFilesList
,
1047 (LPBYTE
)&ExecuteContext
.dwMaxFiles
,
1049 if (lRet
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
)
1051 ExecuteContext
.dwMaxFiles
= 4;
1052 dwSize
= sizeof(ExecuteContext
.dwMaxFiles
);
1053 lRet
= RegSetValueExW(ExecuteContext
.hKeyPMRecentFilesList
,
1057 (LPBYTE
)&ExecuteContext
.dwMaxFiles
,
1058 sizeof(ExecuteContext
.dwMaxFiles
));
1061 dwSize
= sizeof(ExecuteContext
.bCheckBinaryType
);
1062 lRet
= RegQueryValueExW(Globals
.hKeyPMSettings
,
1066 (LPBYTE
)&ExecuteContext
.bCheckBinaryType
,
1068 if (lRet
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
)
1070 ExecuteContext
.bCheckBinaryType
= TRUE
;
1074 DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_EXECUTE
), Globals
.hMainWnd
, DIALOG_EXECUTE_DlgProc
, (LPARAM
)&ExecuteContext
);
1076 if (ExecuteContext
.hKeyPMRecentFilesList
)
1077 RegCloseKey(ExecuteContext
.hKeyPMRecentFilesList
);