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)
39 /***********************************************************************
41 * DIALOG_AddFilterItem and DIALOG_BrowseXXX
46 DIALOG_AddFilterItem(LPWSTR
* p
, UINT ids
, LPCWSTR filter
)
48 LoadStringW(Globals
.hInstance
, ids
, *p
, MAX_STRING_LEN
);
57 DIALOG_Browse(HWND hWnd
, LPCWSTR lpszzFilter
, LPWSTR lpstrFile
, INT nMaxFile
)
59 OPENFILENAMEW openfilename
;
60 WCHAR szDir
[MAX_PATH
];
62 ZeroMemory(&openfilename
, sizeof(openfilename
));
64 GetCurrentDirectoryW(ARRAYSIZE(szDir
), szDir
);
66 openfilename
.lStructSize
= sizeof(openfilename
);
67 openfilename
.hwndOwner
= hWnd
;
68 openfilename
.hInstance
= Globals
.hInstance
;
69 openfilename
.lpstrFilter
= lpszzFilter
;
70 openfilename
.lpstrFile
= lpstrFile
;
71 openfilename
.nMaxFile
= nMaxFile
;
72 openfilename
.lpstrInitialDir
= szDir
;
73 openfilename
.Flags
= 0;
74 openfilename
.lpstrDefExt
= L
"exe";
75 openfilename
.lpstrCustomFilter
= NULL
;
76 openfilename
.nMaxCustFilter
= 0;
77 openfilename
.nFilterIndex
= 0;
78 openfilename
.lpstrFileTitle
= NULL
;
79 openfilename
.nMaxFileTitle
= 0;
80 openfilename
.lpstrTitle
= NULL
;
81 openfilename
.nFileOffset
= 0;
82 openfilename
.nFileExtension
= 0;
83 openfilename
.lCustData
= 0;
84 openfilename
.lpfnHook
= NULL
;
85 openfilename
.lpTemplateName
= NULL
;
87 return GetOpenFileNameW(&openfilename
);
92 DIALOG_BrowsePrograms(HWND hWnd
, LPWSTR lpszFile
, INT nMaxFile
)
94 WCHAR szzFilter
[2 * MAX_STRING_LEN
+ 100];
97 DIALOG_AddFilterItem(&p
, IDS_PROGRAMS
, L
"*.exe;*.pif;*.com;*.bat;*.cmd");
98 DIALOG_AddFilterItem(&p
, IDS_ALL_FILES
, L
"*.*");
100 return DIALOG_Browse(hWnd
, szzFilter
, lpszFile
, nMaxFile
);
105 DIALOG_BrowseSymbols(HWND hWnd
, LPWSTR lpszFile
, INT nMaxFile
)
107 WCHAR szzFilter
[5 * MAX_STRING_LEN
+ 100];
108 LPWSTR p
= szzFilter
;
110 DIALOG_AddFilterItem(&p
, IDS_SYMBOL_FILES
, L
"*.ico;*.exe;*.dll");
111 DIALOG_AddFilterItem(&p
, IDS_PROGRAMS
, L
"*.exe");
112 DIALOG_AddFilterItem(&p
, IDS_LIBRARIES_DLL
, L
"*.dll");
113 DIALOG_AddFilterItem(&p
, IDS_SYMBOLS_ICO
, L
"*.ico");
114 DIALOG_AddFilterItem(&p
, IDS_ALL_FILES
, L
"*.*");
116 return DIALOG_Browse(hWnd
, szzFilter
, lpszFile
, nMaxFile
);
121 /***********************************************************************
126 LPCWSTR
GroupFormatToFormatName(GROUPFORMAT Format
)
128 static const LPCWSTR FormatNames
[] =
135 if (Format
> NT_Unicode
)
138 return FormatNames
[Format
];
141 typedef struct _NEW_ITEM_CONTEXT
145 } NEW_ITEM_CONTEXT
, *PNEW_ITEM_CONTEXT
;
150 DIALOG_NEW_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
152 PNEW_ITEM_CONTEXT pNewItem
;
156 pNewItem
= (PNEW_ITEM_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
162 pNewItem
= (PNEW_ITEM_CONTEXT
)lParam
;
163 SetWindowLongPtrW(hDlg
, 8, lParam
);
165 for (format
= Win_311
; format
<= NT_Unicode
; ++format
)
167 iItem
= SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_INSERTSTRING
, 0, (LPARAM
)GroupFormatToFormatName(format
));
168 if (iItem
!= CB_ERR
&& iItem
!= CB_ERRSPACE
)
169 SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_SETITEMDATA
, iItem
, format
);
172 SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_SETCURSEL
, 0, 0);
173 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, pNewItem
->nDefault
);
174 CheckRadioButton(hDlg
, PM_PERSONAL_GROUP
, PM_COMMON_GROUP
, PM_PERSONAL_GROUP
);
176 EnableDlgItem(hDlg
, PM_NEW_PROGRAM
, GROUP_ActiveGroup() != NULL
);
178 SendMessageW(hDlg
, WM_COMMAND
, pNewItem
->nDefault
, 0);
183 switch (LOWORD(wParam
))
187 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, wParam
);
188 EnableDlgItem(hDlg
, PM_COMMON_GROUP
, TRUE
);
189 EnableDlgItem(hDlg
, PM_PERSONAL_GROUP
, TRUE
);
190 EnableDlgItem(hDlg
, PM_FORMAT_TXT
, TRUE
);
191 EnableDlgItem(hDlg
, PM_FORMAT
, TRUE
);
197 CheckRadioButton(hDlg
, PM_NEW_GROUP
, PM_NEW_PROGRAM
, wParam
);
198 EnableDlgItem(hDlg
, PM_COMMON_GROUP
, FALSE
);
199 EnableDlgItem(hDlg
, PM_PERSONAL_GROUP
, FALSE
);
200 EnableDlgItem(hDlg
, PM_FORMAT_TXT
, FALSE
);
201 EnableDlgItem(hDlg
, PM_FORMAT
, FALSE
);
206 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
211 iItem
= SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_GETCURSEL
, 0, 0);
213 format
= SendDlgItemMessageW(hDlg
, PM_FORMAT
, CB_GETITEMDATA
, iItem
, 0);
214 format
= min(max(format
, Win_311
), NT_Unicode
);
216 pNewItem
->nResult
= !!IsDlgButtonChecked(hDlg
, PM_NEW_GROUP
);
217 pNewItem
->nResult
|= (!!IsDlgButtonChecked(hDlg
, PM_COMMON_GROUP
) << 1);
218 pNewItem
->nResult
|= (format
<< 2);
220 EndDialog(hDlg
, IDOK
);
225 EndDialog(hDlg
, IDCANCEL
);
234 BOOL
DIALOG_New(INT nDefault
, PINT pnResult
)
237 NEW_ITEM_CONTEXT NewItem
;
241 NewItem
.nDefault
= nDefault
;
243 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_NEW
), Globals
.hMainWnd
, DIALOG_NEW_DlgProc
, (LPARAM
)&NewItem
);
245 *pnResult
= NewItem
.nResult
;
247 return (ret
== IDOK
);
251 /***********************************************************************
256 typedef struct _COPY_MOVE_CONTEXT
261 } COPY_MOVE_CONTEXT
, *PCOPY_MOVE_CONTEXT
;
266 DIALOG_COPY_MOVE_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
271 PCOPY_MOVE_CONTEXT pCopyMove
;
274 WCHAR text
[MAX_STRING_LEN
];
276 pCopyMove
= (PCOPY_MOVE_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
282 pCopyMove
= (PCOPY_MOVE_CONTEXT
)lParam
;
283 SetWindowLongPtrW(hDlg
, 8, lParam
);
285 if (pCopyMove
->bMove
)
287 LoadStringW(Globals
.hInstance
, IDS_MOVE_PROGRAM_1
, text
, ARRAYSIZE(text
));
288 SetWindowTextW(hDlg
, text
);
289 LoadStringW(Globals
.hInstance
, IDS_MOVE_PROGRAM_2
, text
, ARRAYSIZE(text
));
290 SetDlgItemTextW(hDlg
, PM_COPY_MOVE_TXT
, text
);
293 /* List all the group names but the source group, in case we are doing a move */
294 for (hGroup
= Globals
.hGroups
; hGroup
; hGroup
= hGroup
->hNext
)
296 if (!pCopyMove
->bMove
|| hGroup
!= pCopyMove
->Program
->hGroup
)
298 iItem
= SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_ADDSTRING
, 0, (LPARAM
)hGroup
->hName
);
299 if (iItem
!= CB_ERR
&& iItem
!= CB_ERRSPACE
)
300 SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_SETITEMDATA
, iItem
, (LPARAM
)hGroup
);
303 SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_SETCURSEL
, 0, 0);
304 SetDlgItemTextW(hDlg
, PM_PROGRAM
, pCopyMove
->Program
->hName
);
305 SetDlgItemTextW(hDlg
, PM_FROM_GROUP
, pCopyMove
->Program
->hGroup
->hName
);
310 switch (LOWORD(wParam
))
313 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
318 /* Get the selected group */
319 iItem
= SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_GETCURSEL
, 0, 0);
320 hGrpItem
= (PROGGROUP
*)SendDlgItemMessageW(hDlg
, PM_TO_GROUP
, CB_GETITEMDATA
, iItem
, 0);
321 /* Check that it is indeed in the group list */
322 for (hGroup
= Globals
.hGroups
; hGroup
&& hGroup
!= hGrpItem
; hGroup
= hGroup
->hNext
)
324 if (pCopyMove
->bMove
)
326 if (hGrpItem
== pCopyMove
->Program
->hGroup
)
329 pCopyMove
->hToGroup
= hGrpItem
;
330 EndDialog(hDlg
, IDOK
);
335 EndDialog(hDlg
, IDCANCEL
);
344 PROGGROUP
* DIALOG_CopyMove(PROGRAM
* hProgram
, BOOL bMove
)
346 COPY_MOVE_CONTEXT CopyMove
;
349 CopyMove
.bMove
= bMove
;
350 CopyMove
.Program
= hProgram
;
351 CopyMove
.hToGroup
= NULL
;
352 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_COPY_MOVE
), Globals
.hMainWnd
, DIALOG_COPY_MOVE_DlgProc
, (LPARAM
)&CopyMove
);
354 return (ret
== IDOK
? CopyMove
.hToGroup
: NULL
);
357 /***********************************************************************
362 BOOL
DIALOG_Delete(UINT ids_text_s
, LPCWSTR lpszName
)
364 return (MAIN_MessageBoxIDS_s(ids_text_s
, lpszName
, IDS_DELETE
, MB_YESNO
| MB_DEFBUTTON2
) == IDYES
);
368 /* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnableOkButtonFromEditContents */
369 BOOL
ValidateEditContents(HWND hDlg
, INT nIDEditItem
)
376 Edit
= GetDlgItem(hDlg
, nIDEditItem
);
377 Length
= GetWindowTextLengthW(Edit
);
382 psz
= Alloc(0, (Length
+ 1) * sizeof(WCHAR
));
385 GetWindowTextW(Edit
, psz
, Length
+ 1);
386 for (n
= 0; n
< Length
&& !Enable
; ++n
)
387 Enable
= (psz
[n
] != ' ');
399 /***********************************************************************
401 * DIALOG_GroupAttributes
404 typedef struct _GROUP_ATTRIBUTES_CONTEXT
410 } GROUP_ATTRIBUTES_CONTEXT
, *PGROUP_ATTRIBUTES_CONTEXT
;
415 DIALOG_GROUP_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
417 PGROUP_ATTRIBUTES_CONTEXT pGroupAttributes
;
419 pGroupAttributes
= (PGROUP_ATTRIBUTES_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
427 pGroupAttributes
= (PGROUP_ATTRIBUTES_CONTEXT
)lParam
;
428 SetWindowLongPtrW(hDlg
, 8, lParam
);
430 /* Configure Richedit control for sending notification changes */
431 evMask
= SendDlgItemMessageW(hDlg
, PM_DESCRIPTION
, EM_GETEVENTMASK
, 0, 0) | ENM_CHANGE
;
432 SendDlgItemMessageW(hDlg
, PM_DESCRIPTION
, EM_SETEVENTMASK
, 0, (LPARAM
)evMask
);
434 SetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pGroupAttributes
->lpszTitle
);
436 if (pGroupAttributes
->format
!= Win_311
)
438 EnableDlgItem(hDlg
, PM_FILE
, FALSE
);
442 EnableDlgItem(hDlg
, PM_FILE
, TRUE
);
443 SetDlgItemTextW(hDlg
, PM_FILE
, pGroupAttributes
->lpszGrpFile
);
446 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_DESCRIPTION
));
451 switch (LOWORD(wParam
))
454 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
459 if (HIWORD(wParam
) == EN_CHANGE
)
460 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_DESCRIPTION
));
466 GetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pGroupAttributes
->lpszTitle
, pGroupAttributes
->nSize
);
467 if (pGroupAttributes
->format
)
468 *pGroupAttributes
->lpszGrpFile
= '\0';
470 GetDlgItemTextW(hDlg
, PM_FILE
, pGroupAttributes
->lpszGrpFile
, pGroupAttributes
->nSize
);
471 EndDialog(hDlg
, IDOK
);
476 EndDialog(hDlg
, IDCANCEL
);
485 BOOL
DIALOG_GroupAttributes(GROUPFORMAT format
, LPWSTR lpszTitle
, LPWSTR lpszGrpFile
, INT nSize
)
488 GROUP_ATTRIBUTES_CONTEXT GroupAttributes
;
490 GroupAttributes
.format
= format
;
491 GroupAttributes
.nSize
= nSize
;
492 GroupAttributes
.lpszTitle
= lpszTitle
;
493 GroupAttributes
.lpszGrpFile
= lpszGrpFile
;
495 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_GROUP
), Globals
.hMainWnd
, DIALOG_GROUP_DlgProc
, (LPARAM
)&GroupAttributes
);
497 return (ret
== IDOK
);
501 /***********************************************************************
506 /* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnumPickIconResourceProc */
510 EnumPickIconResourceProc(HMODULE hModule
, LPCWSTR lpszType
, LPWSTR lpszName
, LONG_PTR lParam
)
513 HWND hDlgCtrl
= (HWND
)lParam
;
516 if (IS_INTRESOURCE(lpszName
))
517 swprintf(szName
, L
"%u", lpszName
);
519 StringCbCopyW(szName
, sizeof(szName
), lpszName
);
521 hIcon
= (HICON
)LoadImageW(hModule
, lpszName
, IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
525 SendMessageW(hDlgCtrl
, LB_ADDSTRING
, 0, (LPARAM
)hIcon
);
531 DestroyIconList(HWND hDlgCtrl
)
536 count
= SendMessageA(hDlgCtrl
, LB_GETCOUNT
, 0, 0);
537 if (count
== LB_ERR
|| count
== 0)
542 hIcon
= (HICON
)SendMessageA(hDlgCtrl
, LB_GETITEMDATA
, 0, 0);
544 SendMessageA(hDlgCtrl
, LB_DELETESTRING
, 0, 0);
548 typedef struct _PICK_ICON_CONTEXT
552 WCHAR szName
[MAX_PATH
]; // LPWSTR lpszIconFile; // INT nSize;
555 } PICK_ICON_CONTEXT
, *PPICK_ICON_CONTEXT
;
572 DIALOG_SYMBOL_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
574 WCHAR filename
[MAX_PATHNAME_LEN
];
575 PPICK_ICON_CONTEXT pIconContext
;
577 pIconContext
= (PPICK_ICON_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
583 pIconContext
= (PPICK_ICON_CONTEXT
)lParam
;
584 SetWindowLongPtrW(hDlg
, 8, lParam
);
586 pIconContext
->hDlgCtrl
= GetDlgItem(hDlg
, PM_SYMBOL_LIST
);
587 SetDlgItemTextW(hDlg
, PM_ICON_FILE
, pIconContext
->szName
);
588 SendMessageA(pIconContext
->hDlgCtrl
, LB_SETITEMHEIGHT
, 0, 32);
590 pIconContext
->hLibrary
= LoadLibraryExW(pIconContext
->szName
, NULL
, LOAD_LIBRARY_AS_IMAGE_RESOURCE
| LOAD_LIBRARY_AS_DATAFILE
);
591 if (pIconContext
->hLibrary
)
593 EnumResourceNamesW(pIconContext
->hLibrary
,
594 (LPCWSTR
)RT_GROUP_ICON
,
595 EnumPickIconResourceProc
,
596 (LONG_PTR
)pIconContext
->hDlgCtrl
);
597 FreeLibrary(pIconContext
->hLibrary
);
598 pIconContext
->hLibrary
= NULL
;
600 SendMessageA(pIconContext
->hDlgCtrl
, LB_SETCURSEL
, pIconContext
->Index
, 0);
606 PMEASUREITEMSTRUCT measure
= (PMEASUREITEMSTRUCT
)lParam
;
607 measure
->itemWidth
= 32;
608 measure
->itemHeight
= 32;
614 PDRAWITEMSTRUCT dis
= (PDRAWITEMSTRUCT
)lParam
;
616 if (dis
->itemState
& ODS_SELECTED
)
617 FillRect(dis
->hDC
, &dis
->rcItem
, (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
619 FillRect(dis
->hDC
, &dis
->rcItem
, (HBRUSH
)(COLOR_WINDOW
+ 1));
621 DrawIcon(dis
->hDC
, dis
->rcItem
.left
, dis
->rcItem
.top
, (HICON
)dis
->itemData
);
626 switch (LOWORD(wParam
))
631 if (!DIALOG_BrowseSymbols(hDlg
, filename
, ARRAYSIZE(filename
)))
634 if (_wcsnicmp(pIconContext
->szName
, filename
, ARRAYSIZE(pIconContext
->szName
)) == 0)
637 SetDlgItemTextW(hDlg
, PM_ICON_FILE
, filename
);
638 DestroyIconList(pIconContext
->hDlgCtrl
);
639 pIconContext
->hLibrary
= LoadLibraryExW(filename
, NULL
, LOAD_LIBRARY_AS_IMAGE_RESOURCE
| LOAD_LIBRARY_AS_DATAFILE
);
640 if (pIconContext
->hLibrary
)
642 EnumResourceNamesW(pIconContext
->hLibrary
,
643 (LPCWSTR
)RT_GROUP_ICON
,
644 EnumPickIconResourceProc
,
645 (LONG_PTR
)pIconContext
->hDlgCtrl
);
646 FreeLibrary(pIconContext
->hLibrary
);
647 pIconContext
->hLibrary
= NULL
;
649 SendMessageA(pIconContext
->hDlgCtrl
, LB_SETCURSEL
, 0, 0);
654 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
659 INT nCurSel
= SendMessageW(pIconContext
->hDlgCtrl
, LB_GETCURSEL
, 0, 0);
660 GetDlgItemTextW(hDlg
, PM_ICON_FILE
, pIconContext
->szName
, ARRAYSIZE(pIconContext
->szName
));
661 pIconContext
->hIcon
= (HICON
)SendMessageA(pIconContext
->hDlgCtrl
, LB_GETITEMDATA
, nCurSel
, 0);
662 pIconContext
->hIcon
= CopyIcon(pIconContext
->hIcon
);
663 DestroyIconList(pIconContext
->hDlgCtrl
);
664 EndDialog(hDlg
, IDOK
);
669 DestroyIconList(pIconContext
->hDlgCtrl
);
670 EndDialog(hDlg
, IDCANCEL
);
681 DIALOG_Symbol(HWND hWnd
, HICON
*lphIcon
, LPWSTR lpszIconFile
, INT
*lpnIconIndex
, INT nSize
)
683 PICK_ICON_CONTEXT IconContext
;
685 IconContext
.Index
= *lpnIconIndex
;
686 StringCchCopyNW(IconContext
.szName
, ARRAYSIZE(IconContext
.szName
), lpszIconFile
, nSize
);
688 if (DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_SYMBOL
), hWnd
, DIALOG_SYMBOL_DlgProc
, (LPARAM
)&IconContext
) != IDOK
)
691 StringCchCopyNW(lpszIconFile
, nSize
, IconContext
.szName
, ARRAYSIZE(IconContext
.szName
));
692 *lpnIconIndex
= IconContext
.Index
;
693 *lphIcon
= IconContext
.hIcon
;
697 /***********************************************************************
699 * DIALOG_ProgramAttributes
702 typedef struct _PROGRAM_ATTRIBUTES_CONTEXT
708 LPWSTR lpszTmpIconFile
;
712 // HWND hSelGroupWnd;
713 BOOL
* lpbNewVDM
; // unused!
718 BOOL bCheckBinaryType
;
719 } PROGRAM_ATTRIBUTES_CONTEXT
, *PPROGRAM_ATTRIBUTES_CONTEXT
;
724 DIALOG_PROGRAM_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
727 WCHAR filename
[MAX_PATHNAME_LEN
];
730 PPROGRAM_ATTRIBUTES_CONTEXT pProgramAttributes
;
732 pProgramAttributes
= (PPROGRAM_ATTRIBUTES_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
738 pProgramAttributes
= (PPROGRAM_ATTRIBUTES_CONTEXT
)lParam
;
739 SetWindowLongPtrW(hDlg
, 8, lParam
);
741 evMask
= SendDlgItemMessageW(hDlg
, PM_COMMAND_LINE
, EM_GETEVENTMASK
, 0, 0) | ENM_CHANGE
;
742 SendDlgItemMessageW(hDlg
, PM_COMMAND_LINE
, EM_SETEVENTMASK
, 0, evMask
);
744 SetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pProgramAttributes
->lpszTitle
);
745 SetDlgItemTextW(hDlg
, PM_COMMAND_LINE
, pProgramAttributes
->lpszCmdLine
);
746 SetDlgItemTextW(hDlg
, PM_DIRECTORY
, pProgramAttributes
->lpszWorkDir
);
749 SendDlgItemMessageW(hDlg
, PM_HOT_KEY
, HKM_SETRULES
, HKCOMB_C
| HKCOMB_A
| HKCOMB_S
| HKCOMB_NONE
, HOTKEYF_CONTROL
| HOTKEYF_ALT
);
750 SendDlgItemMessageW(hDlg
, PM_HOT_KEY
, HKM_SETHOTKEY
, *pProgramAttributes
->lpnHotKey
, 0);
752 bEnable
= ValidateEditContents(hDlg
, PM_COMMAND_LINE
);
753 EnableWindow(GetDlgItem(hDlg
, IDOK
), bEnable
);
754 EnableWindow(GetDlgItem(hDlg
, PM_OTHER_SYMBOL
), bEnable
);
756 CheckDlgButton(hDlg
, PM_SYMBOL
, *pProgramAttributes
->lpnCmdShow
== SW_SHOWMINNOACTIVE
);
758 if (pProgramAttributes
->bCheckBinaryType
&&
759 (!GetBinaryTypeW(pProgramAttributes
->lpszCmdLine
, &dwBinaryType
) || dwBinaryType
!= SCS_WOW_BINARY
) )
761 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), FALSE
);
762 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
766 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), TRUE
);
767 CheckDlgButton(hDlg
, PM_NEW_VDM
, *pProgramAttributes
->lpbNewVDM
);
769 SendDlgItemMessageW(hDlg
, PM_ICON
, STM_SETICON
, (WPARAM
)pProgramAttributes
->hTmpIcon
, 0);
774 switch (LOWORD(wParam
))
777 CheckDlgButton(hDlg
, PM_NEW_VDM
, !IsDlgButtonChecked(hDlg
, PM_NEW_VDM
));
783 if (DIALOG_BrowsePrograms(hDlg
, filename
, ARRAYSIZE(filename
)))
785 SetDlgItemTextW(hDlg
, PM_COMMAND_LINE
, filename
);
786 if (pProgramAttributes
->bCheckBinaryType
&&
787 (!GetBinaryTypeW(filename
, &dwBinaryType
) || dwBinaryType
!= SCS_WOW_BINARY
))
789 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), FALSE
);
790 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
794 EnableWindow(GetDlgItem(hDlg
, PM_NEW_VDM
), TRUE
);
795 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_UNCHECKED
);
802 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
806 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
809 case PM_OTHER_SYMBOL
:
812 &pProgramAttributes
->hTmpIcon
,
813 pProgramAttributes
->lpszTmpIconFile
,
814 &pProgramAttributes
->nTmpIconIndex
,
817 SendDlgItemMessageW(hDlg
, PM_ICON
, STM_SETICON
, (WPARAM
)pProgramAttributes
->hTmpIcon
, 0);
821 case PM_COMMAND_LINE
:
823 if (HIWORD(wParam
) == EN_CHANGE
)
825 bEnable
= ValidateEditContents(hDlg
, PM_COMMAND_LINE
);
826 EnableWindow(GetDlgItem(hDlg
, IDOK
), bEnable
);
827 EnableWindow(GetDlgItem(hDlg
, PM_OTHER_SYMBOL
), bEnable
);
834 GetDlgItemTextW(hDlg
, PM_DESCRIPTION
, pProgramAttributes
->lpszTitle
, pProgramAttributes
->nSize
);
835 GetDlgItemTextW(hDlg
, PM_COMMAND_LINE
, pProgramAttributes
->lpszCmdLine
, pProgramAttributes
->nSize
);
836 GetDlgItemTextW(hDlg
, PM_DIRECTORY
, pProgramAttributes
->lpszWorkDir
, pProgramAttributes
->nSize
);
837 if (pProgramAttributes
->hTmpIcon
)
840 if (*pProgramAttributes
->lphIcon
)
841 DestroyIcon(*pProgramAttributes
->lphIcon
);
843 *pProgramAttributes
->lphIcon
= pProgramAttributes
->hTmpIcon
;
844 *pProgramAttributes
->lpnIconIndex
= pProgramAttributes
->nTmpIconIndex
;
845 lstrcpynW(pProgramAttributes
->lpszIconFile
, pProgramAttributes
->lpszTmpIconFile
, pProgramAttributes
->nSize
);
847 *pProgramAttributes
->lpnHotKey
= SendDlgItemMessageW(hDlg
, PM_HOT_KEY
, HKM_GETHOTKEY
, 0, 0);
848 *pProgramAttributes
->lpnCmdShow
= IsDlgButtonChecked(hDlg
, PM_SYMBOL
) ? SW_SHOWMINNOACTIVE
: SW_SHOWNORMAL
;
849 *pProgramAttributes
->lpbNewVDM
= IsDlgButtonChecked(hDlg
, PM_NEW_VDM
);
850 EndDialog(hDlg
, IDOK
);
855 EndDialog(hDlg
, IDCANCEL
);
865 DIALOG_ProgramAttributes(LPWSTR lpszTitle
, LPWSTR lpszCmdLine
, LPWSTR lpszWorkDir
, LPWSTR lpszIconFile
,
866 HICON
* lphIcon
, INT
* lpnIconIndex
, INT
* lpnHotKey
, INT
* lpnCmdShow
, BOOL
* lpbNewVDM
, INT nSize
)
869 WCHAR szTmpIconFile
[MAX_PATHNAME_LEN
];
870 PROGRAM_ATTRIBUTES_CONTEXT ProgramAttributes
;
874 ProgramAttributes
.nSize
= nSize
;
875 ProgramAttributes
.lpszTitle
= lpszTitle
;
876 ProgramAttributes
.lpszCmdLine
= lpszCmdLine
;
877 ProgramAttributes
.lpszWorkDir
= lpszWorkDir
;
878 ProgramAttributes
.lpszIconFile
= lpszIconFile
;
879 ProgramAttributes
.lpnCmdShow
= lpnCmdShow
;
880 ProgramAttributes
.lpnHotKey
= lpnHotKey
;
881 ProgramAttributes
.lpbNewVDM
= lpbNewVDM
;
882 ProgramAttributes
.lphIcon
= lphIcon
;
883 ProgramAttributes
.lpnIconIndex
= lpnIconIndex
;
885 dwSize
= sizeof(ProgramAttributes
.bCheckBinaryType
);
886 if (RegQueryValueExW(Globals
.hKeyPMSettings
,
890 (LPBYTE
)&ProgramAttributes
.bCheckBinaryType
,
891 &dwSize
) != ERROR_SUCCESS
892 || dwType
!= REG_DWORD
)
894 ProgramAttributes
.bCheckBinaryType
= TRUE
;
898 ProgramAttributes
.hTmpIcon
= NULL
;
900 ProgramAttributes
.hTmpIcon
= *lphIcon
;
902 ProgramAttributes
.nTmpIconIndex
= *lpnIconIndex
;
903 ProgramAttributes
.lpszTmpIconFile
= szTmpIconFile
;
904 wcsncpy(szTmpIconFile
, lpszIconFile
, ARRAYSIZE(szTmpIconFile
));
906 ret
= DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_PROGRAM
), Globals
.hMainWnd
, DIALOG_PROGRAM_DlgProc
, (LPARAM
)&ProgramAttributes
);
907 return (ret
== IDOK
);
911 /***********************************************************************
916 typedef struct _EXECUTE_CONTEXT
918 HKEY hKeyPMRecentFilesList
;
920 BOOL bCheckBinaryType
;
921 } EXECUTE_CONTEXT
, *PEXECUTE_CONTEXT
;
926 DIALOG_EXECUTE_DlgProc(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
928 WCHAR szFile
[MAX_PATHNAME_LEN
]; // filename
930 PEXECUTE_CONTEXT pExecuteContext
;
932 pExecuteContext
= (PEXECUTE_CONTEXT
)GetWindowLongPtrW(hDlg
, 8);
938 pExecuteContext
= (PEXECUTE_CONTEXT
)lParam
;
939 SetWindowLongPtrW(hDlg
, 8, lParam
);
941 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_COMMAND
));
943 if (pExecuteContext
->bCheckBinaryType
)
945 EnableDlgItem(hDlg
, PM_NEW_VDM
, FALSE
);
946 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
950 EnableDlgItem(hDlg
, PM_NEW_VDM
, TRUE
);
957 switch (LOWORD(wParam
))
960 CheckDlgButton(hDlg
, PM_SYMBOL
, !IsDlgButtonChecked(hDlg
, PM_SYMBOL
));
964 CheckDlgButton(hDlg
, PM_NEW_VDM
, !IsDlgButtonChecked(hDlg
, PM_NEW_VDM
));
970 if (DIALOG_BrowsePrograms(hDlg
, szFile
, ARRAYSIZE(szFile
)))
972 SetWindowTextW(GetDlgItem(hDlg
, PM_COMMAND
), szFile
);
973 SetFocus(GetDlgItem(hDlg
, IDOK
));
974 if (pExecuteContext
->bCheckBinaryType
&&
975 (!GetBinaryTypeW(szFile
, &BinaryType
) || BinaryType
!= SCS_WOW_BINARY
) )
977 EnableDlgItem(hDlg
, PM_NEW_VDM
, FALSE
);
978 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_CHECKED
);
982 EnableDlgItem(hDlg
, PM_NEW_VDM
, TRUE
);
983 CheckDlgButton(hDlg
, PM_NEW_VDM
, BST_UNCHECKED
);
991 if (HIWORD(wParam
) == CBN_EDITCHANGE
)
993 EnableDlgItem(hDlg
, IDOK
, ValidateEditContents(hDlg
, PM_COMMAND
));
999 MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED
, IDS_ERROR
, MB_OK
);
1004 GetDlgItemTextW(hDlg
, PM_COMMAND
, szFile
, ARRAYSIZE(szFile
));
1005 ShellExecuteW(NULL
, NULL
, szFile
, NULL
, NULL
, IsDlgButtonChecked(hDlg
, PM_SYMBOL
) ? SW_SHOWMINNOACTIVE
: SW_SHOWNORMAL
);
1006 if (Globals
.bMinOnRun
)
1007 CloseWindow(Globals
.hMainWnd
);
1008 EndDialog(hDlg
, IDOK
);
1013 EndDialog(hDlg
, IDCANCEL
);
1022 VOID
DIALOG_Execute(VOID
)
1024 EXECUTE_CONTEXT ExecuteContext
;
1029 ExecuteContext
.hKeyPMRecentFilesList
= NULL
;
1030 ExecuteContext
.bCheckBinaryType
= TRUE
;
1032 lRet
= RegCreateKeyExW(Globals
.hKeyProgMan
,
1033 L
"Recent File List",
1037 KEY_READ
| KEY_WRITE
,
1039 &ExecuteContext
.hKeyPMRecentFilesList
,
1041 if (lRet
== ERROR_SUCCESS
)
1043 dwSize
= sizeof(ExecuteContext
.dwMaxFiles
);
1044 lRet
= RegQueryValueExW(ExecuteContext
.hKeyPMRecentFilesList
,
1048 (LPBYTE
)&ExecuteContext
.dwMaxFiles
,
1050 if (lRet
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
)
1052 ExecuteContext
.dwMaxFiles
= 4;
1053 dwSize
= sizeof(ExecuteContext
.dwMaxFiles
);
1054 lRet
= RegSetValueExW(ExecuteContext
.hKeyPMRecentFilesList
,
1058 (LPBYTE
)&ExecuteContext
.dwMaxFiles
,
1059 sizeof(ExecuteContext
.dwMaxFiles
));
1062 dwSize
= sizeof(ExecuteContext
.bCheckBinaryType
);
1063 lRet
= RegQueryValueExW(Globals
.hKeyPMSettings
,
1067 (LPBYTE
)&ExecuteContext
.bCheckBinaryType
,
1069 if (lRet
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
)
1071 ExecuteContext
.bCheckBinaryType
= TRUE
;
1075 DialogBoxParamW(Globals
.hInstance
, MAKEINTRESOURCEW(IDD_EXECUTE
), Globals
.hMainWnd
, DIALOG_EXECUTE_DlgProc
, (LPARAM
)&ExecuteContext
);
1077 if (ExecuteContext
.hKeyPMRecentFilesList
)
1078 RegCloseKey(ExecuteContext
.hKeyPMRecentFilesList
);