diff --git a/reactos/base/shell/progman/CMakeLists.txt b/reactos/base/shell/progman/CMakeLists.txt index e7345c3b903..5cf6839aba8 100644 --- a/reactos/base/shell/progman/CMakeLists.txt +++ b/reactos/base/shell/progman/CMakeLists.txt @@ -11,7 +11,7 @@ list(APPEND SOURCE progman.h) add_executable(progman ${SOURCE} progman.rc) -set_module_type(progman win32gui) -add_importlibs(progman advapi32 user32 gdi32 comdlg32 shell32 msvcrt kernel32) +set_module_type(progman win32gui UNICODE) +add_importlibs(progman advapi32 user32 gdi32 comctl32 comdlg32 shell32 msvcrt kernel32) add_pch(progman progman.h SOURCE) add_cd_file(TARGET progman DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/shell/progman/dialog.c b/reactos/base/shell/progman/dialog.c index 3a2f5cf3487..96b275b6359 100644 --- a/reactos/base/shell/progman/dialog.c +++ b/reactos/base/shell/progman/dialog.c @@ -20,222 +20,338 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/dialog.c + * PURPOSE: ProgMan dialog boxes + * PROGRAMMERS: Ulrich Schmid + * Sylvain Petreolle + * Andriy Palamarchuk + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #include "progman.h" +#include #include /*********************************************************************** * - * DIALOG_Browse + * DIALOG_AddFilterItem and DIALOG_BrowseXXX */ -static BOOL DIALOG_Browse(HWND hDlg, LPCSTR lpszzFilter, - LPSTR lpstrFile, INT nMaxFile) - +static +VOID +DIALOG_AddFilterItem(LPWSTR* p, UINT ids, LPCWSTR filter) { - OPENFILENAMEA openfilename; + LoadStringW(Globals.hInstance, ids, *p, MAX_STRING_LEN); + *p += wcslen(*p) + 1; + lstrcpyW(*p, filter); + *p += wcslen(*p) + 1; + **p = '\0'; +} - CHAR szDir[MAX_PATH]; - CHAR szDefaultExt[] = "exe"; +static +BOOL +DIALOG_Browse(HWND hWnd, LPCWSTR lpszzFilter, LPWSTR lpstrFile, INT nMaxFile) +{ + OPENFILENAMEW openfilename; + WCHAR szDir[MAX_PATH]; ZeroMemory(&openfilename, sizeof(openfilename)); - GetCurrentDirectoryA(sizeof(szDir), szDir); + GetCurrentDirectoryW(ARRAYSIZE(szDir), szDir); openfilename.lStructSize = sizeof(openfilename); - openfilename.hwndOwner = Globals.hMainWnd; + openfilename.hwndOwner = hWnd; openfilename.hInstance = Globals.hInstance; openfilename.lpstrFilter = lpszzFilter; openfilename.lpstrFile = lpstrFile; openfilename.nMaxFile = nMaxFile; openfilename.lpstrInitialDir = szDir; openfilename.Flags = 0; - openfilename.lpstrDefExt = szDefaultExt; - openfilename.lpstrCustomFilter = 0; + openfilename.lpstrDefExt = L"exe"; + openfilename.lpstrCustomFilter = NULL; openfilename.nMaxCustFilter = 0; openfilename.nFilterIndex = 0; - openfilename.lpstrFileTitle = 0; + openfilename.lpstrFileTitle = NULL; openfilename.nMaxFileTitle = 0; - openfilename.lpstrInitialDir = 0; - openfilename.lpstrTitle = 0; + openfilename.lpstrTitle = NULL; openfilename.nFileOffset = 0; openfilename.nFileExtension = 0; openfilename.lCustData = 0; - openfilename.lpfnHook = 0; - openfilename.lpTemplateName = 0; + openfilename.lpfnHook = NULL; + openfilename.lpTemplateName = NULL; - return GetOpenFileNameA(&openfilename); + return GetOpenFileNameW(&openfilename); } -/*********************************************************************** - * - * DIALOG_AddFilterItem - */ - -static VOID DIALOG_AddFilterItem(LPSTR *p, UINT ids, LPCSTR filter) +static +BOOL +DIALOG_BrowsePrograms(HWND hWnd, LPWSTR lpszFile, INT nMaxFile) { - LoadStringA(Globals.hInstance, ids, *p, MAX_STRING_LEN); - *p += strlen(*p) + 1; - lstrcpyA(*p, filter); - *p += strlen(*p) + 1; - **p = '\0'; + WCHAR szzFilter[2 * MAX_STRING_LEN + 100]; + LPWSTR p = szzFilter; + + DIALOG_AddFilterItem(&p, IDS_PROGRAMS , L"*.exe;*.pif;*.com;*.bat;*.cmd"); + DIALOG_AddFilterItem(&p, IDS_ALL_FILES, L"*.*"); + + return DIALOG_Browse(hWnd, szzFilter, lpszFile, nMaxFile); } -/*********************************************************************** - * - * DIALOG_BrowsePrograms - */ - -static BOOL DIALOG_BrowsePrograms(HWND hDlg, LPSTR lpszFile, INT nMaxFile) +static +BOOL +DIALOG_BrowseSymbols(HWND hWnd, LPWSTR lpszFile, INT nMaxFile) { - CHAR szzFilter[2 * MAX_STRING_LEN + 100]; - LPSTR p = szzFilter; + WCHAR szzFilter[5 * MAX_STRING_LEN + 100]; + LPWSTR p = szzFilter; - DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe;*.pif;*.com;*.bat"); - DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*"); + DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES, L"*.ico;*.exe;*.dll"); + DIALOG_AddFilterItem(&p, IDS_PROGRAMS, L"*.exe"); + DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, L"*.dll"); + DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO, L"*.ico"); + DIALOG_AddFilterItem(&p, IDS_ALL_FILES, L"*.*"); - return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile)); + return DIALOG_Browse(hWnd, szzFilter, lpszFile, nMaxFile); } -/*********************************************************************** - * - * DIALOG_BrowseSymbols - */ -static BOOL DIALOG_BrowseSymbols(HWND hDlg, LPSTR lpszFile, INT nMaxFile) -{ - CHAR szzFilter[5 * MAX_STRING_LEN + 100]; - LPSTR p = szzFilter; - - DIALOG_AddFilterItem(&p, IDS_SYMBOL_FILES, "*.ico;*.exe;*.dll"); - DIALOG_AddFilterItem(&p, IDS_PROGRAMS, "*.exe"); - DIALOG_AddFilterItem(&p, IDS_LIBRARIES_DLL, "*.dll"); - DIALOG_AddFilterItem(&p, IDS_SYMBOLS_ICO, "*.ico"); - DIALOG_AddFilterItem(&p, IDS_ALL_FILES, "*.*"); - - return(DIALOG_Browse(hDlg, szzFilter, lpszFile, nMaxFile)); -} - -static struct -{ - INT nDefault; -} New; - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_NEW_DlgProc - */ -static INT_PTR CALLBACK DIALOG_NEW_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_INITDIALOG: - CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, New.nDefault); - break; - - case WM_COMMAND: - switch (wParam) - { - case PM_NEW_GROUP: - case PM_NEW_PROGRAM: - CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam); - return TRUE; - - case IDOK: - EndDialog(hDlg, IsDlgButtonChecked(hDlg, PM_NEW_GROUP) ? - PM_NEW_GROUP : PM_NEW_PROGRAM); - return TRUE; - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - return TRUE; - } - } - return FALSE; -} /*********************************************************************** * * DIALOG_New */ -INT DIALOG_New(INT nDefault) + +LPCWSTR GroupFormatToFormatName(GROUPFORMAT Format) { - New.nDefault = nDefault; - return DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_NEW), Globals.hMainWnd, DIALOG_NEW_DlgProc); -} - - -static struct -{ - LPCSTR lpszProgramName, lpszFromGroupName; - HLOCAL hToGroup; -} CopyMove; - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_COPY_MOVE_DlgProc - */ -static INT_PTR CALLBACK DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - HLOCAL hGroup; - - switch (msg) + static const LPCWSTR FormatNames[] = { - case WM_INITDIALOG: - /* List all group names */ - for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup)) - SendDlgItemMessageA(hDlg, PM_TO_GROUP, CB_ADDSTRING, 0, (LPARAM)GROUP_GroupName(hGroup)); + L"Windows 3.1", + L"NT Ansi", + L"NT Unicode" + }; - SetDlgItemTextA(hDlg, PM_PROGRAM, CopyMove.lpszProgramName); - SetDlgItemTextA(hDlg, PM_FROM_GROUP, CopyMove.lpszFromGroupName); - break; - - case WM_COMMAND: - switch (wParam) - { - case IDOK: - { - /* Get selected group */ - INT nCurSel = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETCURSEL, 0, 0); - INT nLen = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETLBTEXTLEN, nCurSel, 0); - HLOCAL hBuffer = LocalAlloc(LMEM_FIXED, nLen + 1); - LPSTR buffer = LocalLock(hBuffer); - - SendDlgItemMessageA(hDlg, PM_TO_GROUP, CB_GETLBTEXT, nCurSel, (LPARAM)buffer); - for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup)) - if (!lstrcmpA(buffer, GROUP_GroupName(hGroup))) break; - LocalFree(hBuffer); - - CopyMove.hToGroup = hGroup; - EndDialog(hDlg, IDOK); - return TRUE; - } - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - return TRUE; - } - } - return FALSE; + if (Format > NT_Unicode) + return NULL; + else + return FormatNames[Format]; } +typedef struct _NEW_ITEM_CONTEXT +{ + INT nDefault; + INT nResult; +} NEW_ITEM_CONTEXT, *PNEW_ITEM_CONTEXT; + +static +INT_PTR +CALLBACK +DIALOG_NEW_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PNEW_ITEM_CONTEXT pNewItem; + GROUPFORMAT format; + INT iItem; + + pNewItem = (PNEW_ITEM_CONTEXT)GetWindowLongPtrW(hDlg, 8); + + switch (uMsg) + { + case WM_INITDIALOG: + { + pNewItem = (PNEW_ITEM_CONTEXT)lParam; + SetWindowLongPtrW(hDlg, 8, lParam); + + for (format = Win_311; format <= NT_Unicode; ++format) + { + iItem = SendDlgItemMessageW(hDlg, PM_FORMAT, CB_INSERTSTRING, 0, (LPARAM)GroupFormatToFormatName(format)); + if (iItem != CB_ERR && iItem != CB_ERRSPACE) + SendDlgItemMessageW(hDlg, PM_FORMAT, CB_SETITEMDATA, iItem, format); + } + + SendDlgItemMessageW(hDlg, PM_FORMAT, CB_SETCURSEL, 0, 0); + CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, pNewItem->nDefault); + CheckRadioButton(hDlg, PM_PERSONAL_GROUP, PM_COMMON_GROUP, PM_PERSONAL_GROUP); + + EnableDlgItem(hDlg, PM_NEW_PROGRAM, GROUP_ActiveGroup() != NULL); + + SendMessageW(hDlg, WM_COMMAND, pNewItem->nDefault, 0); + break; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case PM_NEW_GROUP: + { + CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam); + EnableDlgItem(hDlg, PM_COMMON_GROUP , TRUE); + EnableDlgItem(hDlg, PM_PERSONAL_GROUP, TRUE); + EnableDlgItem(hDlg, PM_FORMAT_TXT, TRUE); + EnableDlgItem(hDlg, PM_FORMAT , TRUE); + return TRUE; + } + + case PM_NEW_PROGRAM: + { + CheckRadioButton(hDlg, PM_NEW_GROUP, PM_NEW_PROGRAM, wParam); + EnableDlgItem(hDlg, PM_COMMON_GROUP , FALSE); + EnableDlgItem(hDlg, PM_PERSONAL_GROUP, FALSE); + EnableDlgItem(hDlg, PM_FORMAT_TXT, FALSE); + EnableDlgItem(hDlg, PM_FORMAT , FALSE); + return TRUE; + } + + case IDHELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; + + case IDOK: + { + iItem = SendDlgItemMessageW(hDlg, PM_FORMAT, CB_GETCURSEL, 0, 0); + + format = SendDlgItemMessageW(hDlg, PM_FORMAT, CB_GETITEMDATA, iItem, 0); + format = min(max(format, Win_311), NT_Unicode); + + pNewItem->nResult = !!IsDlgButtonChecked(hDlg, PM_NEW_GROUP); + pNewItem->nResult |= (!!IsDlgButtonChecked(hDlg, PM_COMMON_GROUP) << 1); + pNewItem->nResult |= (format << 2); + + EndDialog(hDlg, IDOK); + return TRUE; + } + + case IDCANCEL: + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + return FALSE; + } + + return FALSE; +} + +BOOL DIALOG_New(INT nDefault, PINT pnResult) +{ + INT_PTR ret; + NEW_ITEM_CONTEXT NewItem; + + *pnResult = 0; + + NewItem.nDefault = nDefault; + NewItem.nResult = 0; + ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_NEW), Globals.hMainWnd, DIALOG_NEW_DlgProc, (LPARAM)&NewItem); + if (ret == IDOK) + *pnResult = NewItem.nResult; + + return (ret == IDOK); +} + + /*********************************************************************** * * DIALOG_CopyMove */ -HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName, - BOOL bMove) + +typedef struct _COPY_MOVE_CONTEXT { - INT ret; + PROGRAM* Program; + PROGGROUP* hToGroup; + BOOL bMove; +} COPY_MOVE_CONTEXT, *PCOPY_MOVE_CONTEXT; - CopyMove.lpszProgramName = lpszProgramName; - CopyMove.lpszFromGroupName = lpszFromGroupName; - CopyMove.hToGroup = 0; +static +INT_PTR +CALLBACK +DIALOG_COPY_MOVE_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PROGGROUP* hGrpItem; + PROGGROUP* hGroup; - ret = DialogBoxW(Globals.hInstance, - bMove ? MAKEINTRESOURCEW(IDD_MOVE) : MAKEINTRESOURCEW(IDD_COPY), - Globals.hMainWnd, DIALOG_COPY_MOVE_DlgProc); - return((ret == IDOK) ? CopyMove.hToGroup : 0); + PCOPY_MOVE_CONTEXT pCopyMove; + INT iItem; + + WCHAR text[MAX_STRING_LEN]; + + pCopyMove = (PCOPY_MOVE_CONTEXT)GetWindowLongPtrW(hDlg, 8); + + switch (uMsg) + { + case WM_INITDIALOG: + { + pCopyMove = (PCOPY_MOVE_CONTEXT)lParam; + SetWindowLongPtrW(hDlg, 8, lParam); + + if (pCopyMove->bMove) + { + LoadStringW(Globals.hInstance, IDS_MOVE_PROGRAM_1, text, ARRAYSIZE(text)); + SetWindowTextW(hDlg, text); + LoadStringW(Globals.hInstance, IDS_MOVE_PROGRAM_2, text, ARRAYSIZE(text)); + SetDlgItemTextW(hDlg, PM_COPY_MOVE_TXT, text); + } + + /* List all the group names but the source group, in case we are doing a move */ + for (hGroup = Globals.hGroups; hGroup; hGroup = hGroup->hNext) + { + if (!pCopyMove->bMove || hGroup != pCopyMove->Program->hGroup) + { + iItem = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_ADDSTRING, 0, (LPARAM)hGroup->hName); + if (iItem != CB_ERR && iItem != CB_ERRSPACE) + SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_SETITEMDATA, iItem, (LPARAM)hGroup); + } + } + SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_SETCURSEL, 0, 0); + SetDlgItemTextW(hDlg, PM_PROGRAM , pCopyMove->Program->hName); + SetDlgItemTextW(hDlg, PM_FROM_GROUP, pCopyMove->Program->hGroup->hName); + break; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDHELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; + + case IDOK: + { + /* Get the selected group */ + iItem = SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETCURSEL, 0, 0); + hGrpItem = (PROGGROUP *)SendDlgItemMessageW(hDlg, PM_TO_GROUP, CB_GETITEMDATA, iItem, 0); + /* Check that it is indeed in the group list */ + for (hGroup = Globals.hGroups; hGroup && hGroup != hGrpItem; hGroup = hGroup->hNext) + ; + if (pCopyMove->bMove) + { + if (hGrpItem == pCopyMove->Program->hGroup) + hGrpItem = NULL; + } + pCopyMove->hToGroup = hGrpItem; + EndDialog(hDlg, IDOK); + return TRUE; + } + + case IDCANCEL: + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + return FALSE; + } + + return FALSE; +} + +PROGGROUP* DIALOG_CopyMove(PROGRAM* hProgram, BOOL bMove) +{ + COPY_MOVE_CONTEXT CopyMove; + INT_PTR ret; + + CopyMove.bMove = bMove; + CopyMove.Program = hProgram; + CopyMove.hToGroup = NULL; + ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_COPY_MOVE), Globals.hMainWnd, DIALOG_COPY_MOVE_DlgProc, (LPARAM)&CopyMove); + + return (ret == IDOK ? CopyMove.hToGroup : NULL); } /*********************************************************************** @@ -243,65 +359,202 @@ HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszFromGroupName, * DIALOG_Delete */ -BOOL DIALOG_Delete(UINT ids_text_s, LPCSTR lpszName) +BOOL DIALOG_Delete(UINT ids_text_s, LPCWSTR lpszName) { - return (IDYES == MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE, - MB_YESNO | MB_DEFBUTTON2)); + return (MAIN_MessageBoxIDS_s(ids_text_s, lpszName, IDS_DELETE, MB_YESNO | MB_DEFBUTTON2) == IDYES); } -static struct +/* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnableOkButtonFromEditContents */ +BOOL ValidateEditContents(HWND hDlg, INT nIDEditItem) { - LPSTR lpszTitle, lpszGrpFile; - INT nSize; -} GroupAttributes; + BOOL Enable = FALSE; + LPWSTR psz; + INT Length, n; + HWND Edit; -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_GROUP_DlgProc - */ -static INT_PTR CALLBACK DIALOG_GROUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) + Edit = GetDlgItem(hDlg, nIDEditItem); + Length = GetWindowTextLengthW(Edit); + + if (Length <= 0) + return FALSE; + + psz = Alloc(0, (Length + 1) * sizeof(WCHAR)); + if (psz) { - case WM_INITDIALOG: - SetDlgItemTextA(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle); - SetDlgItemTextA(hDlg, PM_FILE, GroupAttributes.lpszGrpFile); - break; - - case WM_COMMAND: - switch (wParam) - { - case IDOK: - GetDlgItemTextA(hDlg, PM_DESCRIPTION, GroupAttributes.lpszTitle, GroupAttributes.nSize); - GetDlgItemTextA(hDlg, PM_FILE, GroupAttributes.lpszGrpFile, GroupAttributes.nSize); - EndDialog(hDlg, IDOK); - return TRUE; - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - return TRUE; - } + GetWindowTextW(Edit, psz, Length + 1); + for (n = 0; n < Length && !Enable; ++n) + Enable = (psz[n] != ' '); + Free(psz); } - return FALSE; + else + { + Enable = TRUE; + } + + return Enable; } + /*********************************************************************** * * DIALOG_GroupAttributes */ -BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszGrpFile, INT nSize) + +typedef struct _GROUP_ATTRIBUTES_CONTEXT { - INT ret; + GROUPFORMAT format; + LPWSTR lpszTitle; + LPWSTR lpszGrpFile; + INT nSize; +} GROUP_ATTRIBUTES_CONTEXT, *PGROUP_ATTRIBUTES_CONTEXT; - GroupAttributes.nSize = nSize; - GroupAttributes.lpszTitle = lpszTitle; - GroupAttributes.lpszGrpFile = lpszGrpFile; +static +INT_PTR +CALLBACK +DIALOG_GROUP_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PGROUP_ATTRIBUTES_CONTEXT pGroupAttributes; - ret = DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_GROUP), Globals.hMainWnd, DIALOG_GROUP_DlgProc); - return(ret == IDOK); + pGroupAttributes = (PGROUP_ATTRIBUTES_CONTEXT)GetWindowLongPtrW(hDlg, 8); + + switch (uMsg) + { + case WM_INITDIALOG: + { + DWORD evMask; + + pGroupAttributes = (PGROUP_ATTRIBUTES_CONTEXT)lParam; + SetWindowLongPtrW(hDlg, 8, lParam); + + /* Configure Richedit control for sending notification changes */ + evMask = SendDlgItemMessageW(hDlg, PM_DESCRIPTION, EM_GETEVENTMASK, 0, 0) | ENM_CHANGE; + SendDlgItemMessageW(hDlg, PM_DESCRIPTION, EM_SETEVENTMASK, 0, (LPARAM)evMask); + + SetDlgItemTextW(hDlg, PM_DESCRIPTION, pGroupAttributes->lpszTitle); + + if (pGroupAttributes->format != Win_311) + { + EnableDlgItem(hDlg, PM_FILE, FALSE); + } + else + { + EnableDlgItem(hDlg, PM_FILE, TRUE); + SetDlgItemTextW(hDlg, PM_FILE, pGroupAttributes->lpszGrpFile); + } + + EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_DESCRIPTION)); + break; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDHELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; + + case PM_DESCRIPTION: + { + if (HIWORD(wParam) == EN_CHANGE) + EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_DESCRIPTION)); + return FALSE; + } + + case IDOK: + { + GetDlgItemTextW(hDlg, PM_DESCRIPTION, pGroupAttributes->lpszTitle, pGroupAttributes->nSize); + if (pGroupAttributes->format) + *pGroupAttributes->lpszGrpFile = '\0'; + else + GetDlgItemTextW(hDlg, PM_FILE, pGroupAttributes->lpszGrpFile, pGroupAttributes->nSize); + EndDialog(hDlg, IDOK); + return TRUE; + } + + case IDCANCEL: + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + return FALSE; + } + + return FALSE; } +BOOL DIALOG_GroupAttributes(GROUPFORMAT format, LPWSTR lpszTitle, LPWSTR lpszGrpFile, INT nSize) +{ + INT_PTR ret; + GROUP_ATTRIBUTES_CONTEXT GroupAttributes; + + GroupAttributes.format = format; + GroupAttributes.nSize = nSize; + GroupAttributes.lpszTitle = lpszTitle; + GroupAttributes.lpszGrpFile = lpszGrpFile; + + ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_GROUP), Globals.hMainWnd, DIALOG_GROUP_DlgProc, (LPARAM)&GroupAttributes); + + return (ret == IDOK); +} + + +/*********************************************************************** + * + * DIALOG_Symbol + */ + +/* Adapted from dll/win32/shell32/dialogs/dialogs.cpp!EnumPickIconResourceProc */ +static +BOOL +CALLBACK +EnumPickIconResourceProc(HMODULE hModule, LPCWSTR lpszType, LPWSTR lpszName, LONG_PTR lParam) +{ + HICON hIcon; + HWND hDlgCtrl = (HWND)lParam; + WCHAR szName[100]; + + if (IS_INTRESOURCE(lpszName)) + wcscpy(szName, lpszName); + else + swprintf(szName, L"%u", lpszName); + + hIcon = (HICON)LoadImageW(hModule, lpszName, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + if (hIcon == NULL) + return TRUE; + + SendMessageW(hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)hIcon); + return TRUE; +} + +static +VOID +DestroyIconList(HWND hDlgCtrl) +{ + HICON hIcon; + INT index; + INT count; + + count = SendMessageA(hDlgCtrl, LB_GETCOUNT, 0, 0); + if (count == LB_ERR) + return; + + for (index = 0; index < count; ++index) + { + hIcon = (HICON)SendMessageA(hDlgCtrl, LB_GETITEMDATA, index, 0); + DestroyIcon(hIcon); + } +} + +typedef struct _PICK_ICON_CONTEXT +{ + HMODULE hLibrary; + HWND hDlgCtrl; + WCHAR szName[MAX_PATH]; // LPWSTR lpszIconFile; // INT nSize; + INT Index; + HICON hIcon; +} PICK_ICON_CONTEXT, *PPICK_ICON_CONTEXT; + +#if 0 static struct { @@ -311,287 +564,510 @@ static struct INT *lpnIconIndex; } Symbol; -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_SYMBOL_DlgProc - */ -static INT_PTR CALLBACK DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_INITDIALOG: - SetDlgItemTextA(hDlg, PM_ICON_FILE, Symbol.lpszIconFile); - SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_SETITEMHEIGHT, 0, (LPARAM) 32); - SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)*Symbol.lphIcon); - SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_ADDSTRING, 0, (LPARAM)Globals.hDefaultIcon); - SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_SETCURSEL, 0, 0); - return TRUE; - - case WM_MEASUREITEM: - { - PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT) lParam; - measure->itemWidth = 32; - measure->itemHeight = 32; - return TRUE; - } - - case WM_DRAWITEM: - { - PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT) lParam; - DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData); - return TRUE; - } - - case WM_COMMAND: - switch (wParam) - { - case PM_BROWSE: - { - CHAR filename[MAX_PATHNAME_LEN]; - filename[0] = 0; - if (DIALOG_BrowseSymbols(hDlg, filename, sizeof(filename))) - SetDlgItemTextA(hDlg, PM_ICON_FILE, filename); - return TRUE; - } - - case PM_HELP: - MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); - return TRUE; - - case IDOK: - { - INT nCurSel = SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, CB_GETCURSEL, 0, 0); - - GetDlgItemTextA(hDlg, PM_ICON_FILE, Symbol.lpszIconFile, Symbol.nSize); - - *Symbol.lphIcon = (HICON)SendDlgItemMessageA(hDlg, PM_SYMBOL_LIST, - CB_GETITEMDATA, - (WPARAM) nCurSel, 0); -#if 0 - *Symbol.lphIcon = CopyIcon(*Symbol.lphIcon); #endif - EndDialog(hDlg, IDOK); - return TRUE; - } - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - return TRUE; - } - } - return FALSE; -} - -/*********************************************************************** - * - * DIALOG_Symbol - */ -static VOID DIALOG_Symbol(HICON *lphIcon, LPSTR lpszIconFile, - INT *lpnIconIndex, INT nSize) +static +INT_PTR +CALLBACK +DIALOG_SYMBOL_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - Symbol.nSize = nSize; - Symbol.lpszIconFile = lpszIconFile; - Symbol.lphIcon = lphIcon; - Symbol.lpnIconIndex = lpnIconIndex; + WCHAR filename[MAX_PATHNAME_LEN]; + PPICK_ICON_CONTEXT pIconContext; - DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_SYMBOL), Globals.hMainWnd, DIALOG_SYMBOL_DlgProc); -} + pIconContext = (PPICK_ICON_CONTEXT)GetWindowLongPtrW(hDlg, 8); - -static struct -{ - LPSTR lpszTitle, lpszCmdLine, lpszWorkDir, lpszIconFile, lpszTmpIconFile; - INT nSize; - INT *lpnCmdShow; - INT *lpnHotKey; - HWND hSelGroupWnd; - HICON *lphIcon, hTmpIcon; - INT *lpnIconIndex, nTmpIconIndex; -} ProgramAttributes; - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_PROGRAM_DlgProc - */ -static INT_PTR CALLBACK DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - CHAR buffer[MAX_STRING_LEN]; - switch (msg) + switch (uMsg) { - case WM_INITDIALOG: - SetDlgItemTextA(hDlg, PM_DESCRIPTION, ProgramAttributes.lpszTitle); - SetDlgItemTextA(hDlg, PM_COMMAND_LINE, ProgramAttributes.lpszCmdLine); - SetDlgItemTextA(hDlg, PM_DIRECTORY, ProgramAttributes.lpszWorkDir); - if (!*ProgramAttributes.lpnHotKey) - { - LoadStringA(Globals.hInstance, IDS_NO_HOT_KEY, buffer, sizeof(buffer)); - SetDlgItemTextA(hDlg, PM_HOT_KEY, buffer); - } + case WM_INITDIALOG: + { + pIconContext = (PPICK_ICON_CONTEXT)lParam; + SetWindowLongPtrW(hDlg, 8, lParam); - CheckDlgButton(hDlg, PM_SYMBOL, - (*ProgramAttributes.lpnCmdShow == SW_SHOWMINIMIZED)); - SendDlgItemMessageA(hDlg, PM_ICON, STM_SETICON, (WPARAM)ProgramAttributes.hTmpIcon, 0); - break; + pIconContext->hDlgCtrl = GetDlgItem(hDlg, PM_SYMBOL_LIST); + SetDlgItemTextW(hDlg, PM_ICON_FILE, pIconContext->szName); + SendMessageA(pIconContext->hDlgCtrl, LB_SETITEMHEIGHT, 0, 32); - case WM_COMMAND: - switch (wParam) - { - case PM_SYMBOL: - CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL)); - return TRUE; + pIconContext->hLibrary = LoadLibraryExW(pIconContext->szName, NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE); + if (pIconContext->hLibrary) + { + EnumResourceNamesW(pIconContext->hLibrary, + (LPCWSTR)RT_ICON, // RT_GROUP_ICON + EnumPickIconResourceProc, + (LONG_PTR)pIconContext->hDlgCtrl); + FreeLibrary(pIconContext->hLibrary); + pIconContext->hLibrary = NULL; + } + SendMessageA(pIconContext->hDlgCtrl, LB_SETCURSEL, pIconContext->Index, 0); + return TRUE; + } - case PM_BROWSE: - { - CHAR filename[MAX_PATHNAME_LEN]; - filename[0] = 0; - if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename))) - SetDlgItemTextA(hDlg, PM_COMMAND_LINE, filename); - return TRUE; - } + case WM_MEASUREITEM: + { + PMEASUREITEMSTRUCT measure = (PMEASUREITEMSTRUCT)lParam; + measure->itemWidth = 32; + measure->itemHeight = 32; + return TRUE; + } - case PM_OTHER_SYMBOL: - { - DIALOG_Symbol(&ProgramAttributes.hTmpIcon, - ProgramAttributes.lpszTmpIconFile, - &ProgramAttributes.nTmpIconIndex, - MAX_PATHNAME_LEN); + case WM_DRAWITEM: + { + PDRAWITEMSTRUCT dis = (PDRAWITEMSTRUCT)lParam; - SendDlgItemMessageA(hDlg, PM_ICON, STM_SETICON, (WPARAM)ProgramAttributes.hTmpIcon, 0); - return TRUE; - } + if (dis->itemState & ODS_SELECTED) + FillRect(dis->hDC, &dis->rcItem, (HBRUSH)(COLOR_HIGHLIGHT + 1)); + else + FillRect(dis->hDC, &dis->rcItem, (HBRUSH)(COLOR_WINDOW + 1)); - case IDOK: - GetDlgItemTextA(hDlg, PM_DESCRIPTION, - ProgramAttributes.lpszTitle, - ProgramAttributes.nSize); - GetDlgItemTextA(hDlg, PM_COMMAND_LINE, - ProgramAttributes.lpszCmdLine, - ProgramAttributes.nSize); - GetDlgItemTextA(hDlg, PM_DIRECTORY, - ProgramAttributes.lpszWorkDir, - ProgramAttributes.nSize); + DrawIcon(dis->hDC, dis->rcItem.left, dis->rcItem.top, (HICON)dis->itemData); + return TRUE; + } - if (ProgramAttributes.hTmpIcon) - { -#if 0 - if (*ProgramAttributes.lphIcon) - DestroyIcon(*ProgramAttributes.lphIcon); -#endif - *ProgramAttributes.lphIcon = ProgramAttributes.hTmpIcon; - *ProgramAttributes.lpnIconIndex = ProgramAttributes.nTmpIconIndex; - lstrcpynA(ProgramAttributes.lpszIconFile, - ProgramAttributes.lpszTmpIconFile, - ProgramAttributes.nSize); - } + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case PM_BROWSE: + { + filename[0] = '\0'; + if (!DIALOG_BrowseSymbols(hDlg, filename, ARRAYSIZE(filename))) + return TRUE; - *ProgramAttributes.lpnCmdShow = - IsDlgButtonChecked(hDlg, PM_SYMBOL) ? - SW_SHOWMINIMIZED : SW_SHOWNORMAL; - EndDialog(hDlg, IDOK); - return TRUE; + if (_wcsnicmp(pIconContext->szName, filename, ARRAYSIZE(pIconContext->szName)) == 0) + return TRUE; - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - return TRUE; - } - return FALSE; + SetDlgItemTextW(hDlg, PM_ICON_FILE, filename); + DestroyIconList(pIconContext->hDlgCtrl); + pIconContext->hLibrary = LoadLibraryExW(filename, NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE); + if (pIconContext->hLibrary) + { + EnumResourceNamesW(pIconContext->hLibrary, + (LPCWSTR)RT_ICON, // RT_GROUP_ICON + EnumPickIconResourceProc, + (LONG_PTR)pIconContext->hDlgCtrl); + FreeLibrary(pIconContext->hLibrary); + pIconContext->hLibrary = NULL; + } + SendMessageA(pIconContext->hDlgCtrl, LB_SETCURSEL, 0, 0); + return TRUE; + } + + case IDHELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; + + case IDOK: + { + INT nCurSel = SendMessageW(pIconContext->hDlgCtrl, LB_GETCURSEL, 0, 0); + GetDlgItemTextW(hDlg, PM_ICON_FILE, pIconContext->szName, ARRAYSIZE(pIconContext->szName)); + pIconContext->hIcon = (HICON)SendMessageA(pIconContext->hDlgCtrl, LB_GETITEMDATA, nCurSel, 0); + pIconContext->hIcon = CopyIcon(pIconContext->hIcon); + DestroyIconList(pIconContext->hDlgCtrl); + EndDialog(hDlg, IDOK); + return TRUE; + } + + case IDCANCEL: + DestroyIconList(pIconContext->hDlgCtrl); + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + return FALSE; } - return FALSE; + + return FALSE; } +static +VOID +DIALOG_Symbol(HWND hWnd, HICON *lphIcon, LPWSTR lpszIconFile, INT *lpnIconIndex, INT nSize) +{ + PICK_ICON_CONTEXT IconContext; + + IconContext.Index = *lpnIconIndex; + StringCchCopyNW(IconContext.szName, ARRAYSIZE(IconContext.szName), lpszIconFile, nSize); + + if (DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_SYMBOL), hWnd, DIALOG_SYMBOL_DlgProc, (LPARAM)&IconContext) != IDOK) + return; + + StringCchCopyNW(lpszIconFile, nSize, IconContext.szName, ARRAYSIZE(IconContext.szName)); + *lpnIconIndex = IconContext.Index; + *lphIcon = IconContext.hIcon; +} + + /*********************************************************************** * * DIALOG_ProgramAttributes */ -BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine, - LPSTR lpszWorkDir, LPSTR lpszIconFile, - HICON *lphIcon, INT *lpnIconIndex, - INT *lpnHotKey, INT *lpnCmdShow, INT nSize) -{ - CHAR szTmpIconFile[MAX_PATHNAME_LEN]; - INT ret; - ProgramAttributes.nSize = nSize; - ProgramAttributes.lpszTitle = lpszTitle; - ProgramAttributes.lpszCmdLine = lpszCmdLine; - ProgramAttributes.lpszWorkDir = lpszWorkDir; - ProgramAttributes.lpszIconFile = lpszIconFile; - ProgramAttributes.lpnCmdShow = lpnCmdShow; - ProgramAttributes.lpnHotKey = lpnHotKey; - ProgramAttributes.lphIcon = lphIcon; - ProgramAttributes.lpnIconIndex = lpnIconIndex; +typedef struct _PROGRAM_ATTRIBUTES_CONTEXT +{ + LPWSTR lpszTitle; + LPWSTR lpszCmdLine; + LPWSTR lpszWorkDir; + LPWSTR lpszIconFile; + LPWSTR lpszTmpIconFile; + INT nSize; + INT* lpnCmdShow; + INT* lpnHotKey; + // HWND hSelGroupWnd; + BOOL* lpbNewVDM; // unused! + HICON* lphIcon; + HICON hTmpIcon; + INT* lpnIconIndex; + INT nTmpIconIndex; + BOOL bCheckBinaryType; +} PROGRAM_ATTRIBUTES_CONTEXT, *PPROGRAM_ATTRIBUTES_CONTEXT; + +static +INT_PTR +CALLBACK +DIALOG_PROGRAM_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + BOOL bEnable; + WCHAR filename[MAX_PATHNAME_LEN]; + DWORD evMask; + DWORD dwBinaryType; + PPROGRAM_ATTRIBUTES_CONTEXT pProgramAttributes; + + pProgramAttributes = (PPROGRAM_ATTRIBUTES_CONTEXT)GetWindowLongPtrW(hDlg, 8); + + switch (uMsg) + { + case WM_INITDIALOG: + { + pProgramAttributes = (PPROGRAM_ATTRIBUTES_CONTEXT)lParam; + SetWindowLongPtrW(hDlg, 8, lParam); + + evMask = SendDlgItemMessageW(hDlg, PM_COMMAND_LINE, EM_GETEVENTMASK, 0, 0) | ENM_CHANGE; + SendDlgItemMessageW(hDlg, PM_COMMAND_LINE, EM_SETEVENTMASK, 0, evMask); + + SetDlgItemTextW(hDlg, PM_DESCRIPTION , pProgramAttributes->lpszTitle); + SetDlgItemTextW(hDlg, PM_COMMAND_LINE, pProgramAttributes->lpszCmdLine); + SetDlgItemTextW(hDlg, PM_DIRECTORY , pProgramAttributes->lpszWorkDir); + + /* 0x0F 0x06 */ + SendDlgItemMessageW(hDlg, PM_HOT_KEY, HKM_SETRULES, HKCOMB_C | HKCOMB_A | HKCOMB_S | HKCOMB_NONE, HOTKEYF_CONTROL | HOTKEYF_ALT); + SendDlgItemMessageW(hDlg, PM_HOT_KEY, HKM_SETHOTKEY, *pProgramAttributes->lpnHotKey, 0); + + bEnable = ValidateEditContents(hDlg, PM_COMMAND_LINE); + EnableWindow(GetDlgItem(hDlg, IDOK), bEnable); + EnableWindow(GetDlgItem(hDlg, PM_OTHER_SYMBOL), bEnable); + + CheckDlgButton(hDlg, PM_SYMBOL, *pProgramAttributes->lpnCmdShow == SW_SHOWMINNOACTIVE); + + if (pProgramAttributes->bCheckBinaryType && + (!GetBinaryTypeW(pProgramAttributes->lpszCmdLine, &dwBinaryType) || dwBinaryType != SCS_WOW_BINARY) ) + { + EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), FALSE); + CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED); + } + else + { + EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), TRUE); + CheckDlgButton(hDlg, PM_NEW_VDM, *pProgramAttributes->lpbNewVDM); + } + SendDlgItemMessageW(hDlg, PM_ICON, STM_SETICON, (WPARAM)pProgramAttributes->hTmpIcon, 0); + break; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case PM_NEW_VDM: + CheckDlgButton(hDlg, PM_NEW_VDM, !IsDlgButtonChecked(hDlg, PM_NEW_VDM)); + return TRUE; + + case PM_BROWSE: + { + filename[0] = '\0'; + if (DIALOG_BrowsePrograms(hDlg, filename, ARRAYSIZE(filename))) + { + SetDlgItemTextW(hDlg, PM_COMMAND_LINE, filename); + if (pProgramAttributes->bCheckBinaryType && + (!GetBinaryTypeW(filename, &dwBinaryType) || dwBinaryType != SCS_WOW_BINARY)) + { + EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), FALSE); + CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED); + } + else + { + EnableWindow(GetDlgItem(hDlg, PM_NEW_VDM), TRUE); + CheckDlgButton(hDlg, PM_NEW_VDM, BST_UNCHECKED); + } + } + return TRUE; + } + + case IDHELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; + + case PM_SYMBOL: + CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL)); + return TRUE; + + case PM_OTHER_SYMBOL: + { + DIALOG_Symbol(hDlg, + &pProgramAttributes->hTmpIcon, + pProgramAttributes->lpszTmpIconFile, + &pProgramAttributes->nTmpIconIndex, + MAX_PATHNAME_LEN); + + SendDlgItemMessageW(hDlg, PM_ICON, STM_SETICON, (WPARAM)pProgramAttributes->hTmpIcon, 0); + return TRUE; + } + + case PM_COMMAND_LINE: + { + if (HIWORD(wParam) == EN_CHANGE) + { + bEnable = ValidateEditContents(hDlg, PM_COMMAND_LINE); + EnableWindow(GetDlgItem(hDlg, IDOK), bEnable); + EnableWindow(GetDlgItem(hDlg, PM_OTHER_SYMBOL), bEnable); + } + return FALSE; + } + + case IDOK: + { + GetDlgItemTextW(hDlg, PM_DESCRIPTION , pProgramAttributes->lpszTitle , pProgramAttributes->nSize); + GetDlgItemTextW(hDlg, PM_COMMAND_LINE, pProgramAttributes->lpszCmdLine, pProgramAttributes->nSize); + GetDlgItemTextW(hDlg, PM_DIRECTORY , pProgramAttributes->lpszWorkDir, pProgramAttributes->nSize); + if (pProgramAttributes->hTmpIcon) + { +#if 0 + if (*pProgramAttributes->lphIcon) + DestroyIcon(*pProgramAttributes->lphIcon); +#endif + *pProgramAttributes->lphIcon = pProgramAttributes->hTmpIcon; + *pProgramAttributes->lpnIconIndex = pProgramAttributes->nTmpIconIndex; + lstrcpynW(pProgramAttributes->lpszIconFile, pProgramAttributes->lpszTmpIconFile, pProgramAttributes->nSize); + } + *pProgramAttributes->lpnHotKey = SendDlgItemMessageW(hDlg, PM_HOT_KEY, HKM_GETHOTKEY, 0, 0); + *pProgramAttributes->lpnCmdShow = IsDlgButtonChecked(hDlg, PM_SYMBOL) ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL; + *pProgramAttributes->lpbNewVDM = IsDlgButtonChecked(hDlg, PM_NEW_VDM); + EndDialog(hDlg, IDOK); + return TRUE; + } + + case IDCANCEL: + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + return FALSE; + } + + return FALSE; +} + +BOOL +DIALOG_ProgramAttributes(LPWSTR lpszTitle, LPWSTR lpszCmdLine, LPWSTR lpszWorkDir, LPWSTR lpszIconFile, + HICON* lphIcon, INT* lpnIconIndex, INT* lpnHotKey, INT* lpnCmdShow, BOOL* lpbNewVDM, INT nSize) +{ + INT_PTR ret; + WCHAR szTmpIconFile[MAX_PATHNAME_LEN]; + PROGRAM_ATTRIBUTES_CONTEXT ProgramAttributes; + DWORD dwSize; + DWORD dwType; + + ProgramAttributes.nSize = nSize; + ProgramAttributes.lpszTitle = lpszTitle; + ProgramAttributes.lpszCmdLine = lpszCmdLine; + ProgramAttributes.lpszWorkDir = lpszWorkDir; + ProgramAttributes.lpszIconFile = lpszIconFile; + ProgramAttributes.lpnCmdShow = lpnCmdShow; + ProgramAttributes.lpnHotKey = lpnHotKey; + ProgramAttributes.lpbNewVDM = lpbNewVDM; + ProgramAttributes.lphIcon = lphIcon; + ProgramAttributes.lpnIconIndex = lpnIconIndex; + + dwSize = sizeof(ProgramAttributes.bCheckBinaryType); + if (RegQueryValueExW(Globals.hKeyPMSettings, + L"CheckBinaryType", + 0, + &dwType, + (LPBYTE)&ProgramAttributes.bCheckBinaryType, + &dwSize) != ERROR_SUCCESS + || dwType != REG_DWORD) + { + ProgramAttributes.bCheckBinaryType = TRUE; + } #if 0 - ProgramAttributes.hTmpIcon = 0; + ProgramAttributes.hTmpIcon = NULL; #else - ProgramAttributes.hTmpIcon = *lphIcon; + ProgramAttributes.hTmpIcon = *lphIcon; #endif - ProgramAttributes.nTmpIconIndex = *lpnIconIndex; - ProgramAttributes.lpszTmpIconFile = szTmpIconFile; - lstrcpynA(ProgramAttributes.lpszTmpIconFile, lpszIconFile, MAX_PATHNAME_LEN); + ProgramAttributes.nTmpIconIndex = *lpnIconIndex; + ProgramAttributes.lpszTmpIconFile = szTmpIconFile; + wcsncpy(szTmpIconFile, lpszIconFile, ARRAYSIZE(szTmpIconFile)); - ret = DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_PROGRAM), Globals.hMainWnd, DIALOG_PROGRAM_DlgProc); - return(ret == IDOK); + ret = DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_PROGRAM), Globals.hMainWnd, DIALOG_PROGRAM_DlgProc, (LPARAM)&ProgramAttributes); + return (ret == IDOK); } -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * DIALOG_EXECUTE_DlgProc - */ -static INT_PTR CALLBACK DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_COMMAND: - switch (wParam) - { - case PM_SYMBOL: - CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL)); - return TRUE; - - case PM_BROWSE: - { - CHAR filename[MAX_PATHNAME_LEN]; - filename[0] = 0; - if (DIALOG_BrowsePrograms(hDlg, filename, sizeof(filename))) - SetDlgItemTextA(hDlg, PM_COMMAND, filename); - return TRUE; - } - - case PM_HELP: - MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); - return TRUE; - - case IDOK: - { - CHAR cmdline[MAX_PATHNAME_LEN]; - GetDlgItemTextA(hDlg, PM_COMMAND, cmdline, sizeof(cmdline)); - - WinExec(cmdline, IsDlgButtonChecked(hDlg, PM_SYMBOL) ? - SW_SHOWMINIMIZED : SW_SHOWNORMAL); - if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd); - - EndDialog(hDlg, IDOK); - return TRUE; - } - - case IDCANCEL: - EndDialog(hDlg, IDCANCEL); - return TRUE; - } - } - return FALSE; -} - /*********************************************************************** * * DIALOG_Execute */ -VOID DIALOG_Execute(void) +typedef struct _EXECUTE_CONTEXT { - DialogBoxW(Globals.hInstance, MAKEINTRESOURCEW(IDD_EXECUTE), Globals.hMainWnd, DIALOG_EXECUTE_DlgProc); + HKEY hKeyPMRecentFilesList; + DWORD dwMaxFiles; + BOOL bCheckBinaryType; +} EXECUTE_CONTEXT, *PEXECUTE_CONTEXT; + +static +INT_PTR +CALLBACK +DIALOG_EXECUTE_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + WCHAR szFile[MAX_PATHNAME_LEN]; // filename + DWORD BinaryType; + PEXECUTE_CONTEXT pExecuteContext; + + pExecuteContext = (PEXECUTE_CONTEXT)GetWindowLongPtrW(hDlg, 8); + + switch (uMsg) + { + case WM_INITDIALOG: + { + pExecuteContext = (PEXECUTE_CONTEXT)lParam; + SetWindowLongPtrW(hDlg, 8, lParam); + + EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_COMMAND)); + + if (pExecuteContext->bCheckBinaryType) + { + EnableDlgItem(hDlg, PM_NEW_VDM, FALSE); + CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED); + } + else + { + EnableDlgItem(hDlg, PM_NEW_VDM, TRUE); + } + + break; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case PM_SYMBOL: + CheckDlgButton(hDlg, PM_SYMBOL, !IsDlgButtonChecked(hDlg, PM_SYMBOL)); + return TRUE; + + case PM_NEW_VDM: + CheckDlgButton(hDlg, PM_NEW_VDM, !IsDlgButtonChecked(hDlg, PM_NEW_VDM)); + return TRUE; + + case PM_BROWSE: + { + szFile[0] = '\0'; + if (DIALOG_BrowsePrograms(hDlg, szFile, ARRAYSIZE(szFile))) + { + SetWindowTextW(GetDlgItem(hDlg, PM_COMMAND), szFile); + SetFocus(GetDlgItem(hDlg, IDOK)); + if (pExecuteContext->bCheckBinaryType && + (!GetBinaryTypeW(szFile, &BinaryType) || BinaryType != SCS_WOW_BINARY) ) + { + EnableDlgItem(hDlg, PM_NEW_VDM, FALSE); + CheckDlgButton(hDlg, PM_NEW_VDM, BST_CHECKED); + } + else + { + EnableDlgItem(hDlg, PM_NEW_VDM, TRUE); + CheckDlgButton(hDlg, PM_NEW_VDM, BST_UNCHECKED); + } + } + return TRUE; + } + + case PM_COMMAND: + { + if (HIWORD(wParam) == CBN_EDITCHANGE) + { + EnableDlgItem(hDlg, IDOK, ValidateEditContents(hDlg, PM_COMMAND)); + } + return FALSE; + } + + case IDHELP: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + return TRUE; + + case IDOK: + { + GetDlgItemTextW(hDlg, PM_COMMAND, szFile, ARRAYSIZE(szFile)); + ShellExecuteW(NULL, NULL, szFile, NULL, NULL, IsDlgButtonChecked(hDlg, PM_SYMBOL) ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL); + if (Globals.bMinOnRun) + CloseWindow(Globals.hMainWnd); + EndDialog(hDlg, IDOK); + return TRUE; + } + + case IDCANCEL: + EndDialog(hDlg, IDCANCEL); + return TRUE; + } + return FALSE; + } + + return FALSE; +} + +VOID DIALOG_Execute(VOID) +{ + EXECUTE_CONTEXT ExecuteContext; + LONG lRet; + DWORD dwSize; + DWORD dwType; + + lRet = RegCreateKeyExW(Globals.hKeyProgMan, + L"Recent File List", + 0, + NULL, + 0, + KEY_READ | KEY_WRITE, + NULL, + &ExecuteContext.hKeyPMRecentFilesList, + NULL); + + dwSize = sizeof(ExecuteContext.dwMaxFiles); + lRet = RegQueryValueExW(ExecuteContext.hKeyPMRecentFilesList, + L"Max Files", + NULL, + &dwType, + (LPBYTE)&ExecuteContext.dwMaxFiles, + &dwSize); + if (lRet != ERROR_SUCCESS || dwType != REG_DWORD) + { + ExecuteContext.dwMaxFiles = 4; + dwSize = sizeof(ExecuteContext.dwMaxFiles); + lRet = RegSetValueExW(ExecuteContext.hKeyPMRecentFilesList, + L"Max Files", + 0, + REG_DWORD, + (LPBYTE)&ExecuteContext.dwMaxFiles, + sizeof(ExecuteContext.dwMaxFiles)); + } + + dwSize = sizeof(ExecuteContext.bCheckBinaryType); + lRet = RegQueryValueExW(Globals.hKeyPMSettings, + L"CheckBinaryType", + NULL, + &dwType, + (LPBYTE)&ExecuteContext.bCheckBinaryType, + &dwSize); + if (lRet != ERROR_SUCCESS || dwType != REG_DWORD) + { + ExecuteContext.bCheckBinaryType = TRUE; + } + + DialogBoxParamW(Globals.hInstance, MAKEINTRESOURCEW(IDD_EXECUTE), Globals.hMainWnd, DIALOG_EXECUTE_DlgProc, (LPARAM)&ExecuteContext); + + RegCloseKey(ExecuteContext.hKeyPMRecentFilesList); } diff --git a/reactos/base/shell/progman/group.c b/reactos/base/shell/progman/group.c index 107da45263b..d5f29c8b7fc 100644 --- a/reactos/base/shell/progman/group.c +++ b/reactos/base/shell/progman/group.c @@ -18,6 +18,15 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/group.c + * PURPOSE: Program group files helper functions + * PROGRAMMERS: Ulrich Schmid + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #include "progman.h" /*********************************************************************** @@ -25,23 +34,77 @@ * GROUP_GroupWndProc */ -static LRESULT CALLBACK GROUP_GroupWndProc(HWND hWnd, UINT msg, - WPARAM wParam, LPARAM lParam) +static +LRESULT +CALLBACK +GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - switch (msg) - { - case WM_SYSCOMMAND: - if (wParam == SC_CLOSE) wParam = SC_MINIMIZE; - break; + PROGGROUP* group; - case WM_CHILDACTIVATE: - case WM_NCLBUTTONDOWN: - Globals.hActiveGroup = (HLOCAL)GetWindowLongPtrW(hWnd, 0); - EnableMenuItem(Globals.hFileMenu, PM_MOVE , MF_GRAYED); - EnableMenuItem(Globals.hFileMenu, PM_COPY , MF_GRAYED); - break; + group = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0); + + switch (uMsg) + { + case WM_NCCREATE: + { + LPCREATESTRUCTW pcs = (LPCREATESTRUCTW)lParam; + LPMDICREATESTRUCTW pMDIcs = (LPMDICREATESTRUCTW)pcs->lpCreateParams; + group = (PROGGROUP*)pMDIcs->lParam; + SetWindowLongPtrW(hWnd, 0, (LONG_PTR)group); + + if (group->bIsCommonGroup) + { + DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG, + (LPARAM)CopyImage(Globals.hCommonGroupIcon, + IMAGE_ICON, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), + LR_COPYFROMRESOURCE)); + DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL, + (LPARAM)CopyImage(Globals.hCommonGroupIcon, + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_COPYFROMRESOURCE)); + } + else + { + DefMDIChildProcW(hWnd, WM_SETICON, ICON_BIG, + (LPARAM)CopyImage(Globals.hPersonalGroupIcon, + IMAGE_ICON, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), + LR_COPYFROMRESOURCE)); + DefMDIChildProcW(hWnd, WM_SETICON, ICON_SMALL, + (LPARAM)CopyImage(Globals.hPersonalGroupIcon, + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_COPYFROMRESOURCE)); + } + break; + } + + case WM_NCDESTROY: + SetWindowLongPtrW(hWnd, 0, 0); + break; + + case WM_CLOSE: + SendMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); + break; + + case WM_SYSCOMMAND: + if (wParam == SC_CLOSE) wParam = SC_MINIMIZE; + break; + + case WM_CHILDACTIVATE: + case WM_NCLBUTTONDOWN: + Globals.hActiveGroup = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0); + Globals.hActiveGroup->hActiveProgram = NULL; + break; } - return DefMDIChildProcW(hWnd, msg, wParam, lParam); + + return DefMDIChildProcW(hWnd, uMsg, wParam, lParam); } /*********************************************************************** @@ -49,22 +112,22 @@ static LRESULT CALLBACK GROUP_GroupWndProc(HWND hWnd, UINT msg, * GROUP_RegisterGroupWinClass */ -ATOM GROUP_RegisterGroupWinClass(void) +ATOM GROUP_RegisterGroupWinClass(VOID) { - WNDCLASSW class; + WNDCLASSW wndClass; - class.style = CS_HREDRAW | CS_VREDRAW; - class.lpfnWndProc = GROUP_GroupWndProc; - class.cbClsExtra = 0; - class.cbWndExtra = sizeof(LONG_PTR); - class.hInstance = Globals.hInstance; - class.hIcon = LoadIconW (0, (LPWSTR)IDI_WINLOGO); - class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW); - class.hbrBackground = GetStockObject (WHITE_BRUSH); - class.lpszMenuName = 0; - class.lpszClassName = STRING_GROUP_WIN_CLASS_NAME; + wndClass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = GROUP_GroupWndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = sizeof(LONG_PTR); + wndClass.hInstance = Globals.hInstance; + wndClass.hIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_GROUP_ICON)); + wndClass.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_ARROW)); + wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = STRING_GROUP_WIN_CLASS_NAME; - return RegisterClassW(&class); + return RegisterClassW(&wndClass); } /*********************************************************************** @@ -72,29 +135,41 @@ ATOM GROUP_RegisterGroupWinClass(void) * GROUP_NewGroup */ -VOID GROUP_NewGroup(void) +VOID GROUP_NewGroup(GROUPFORMAT format, BOOL bIsCommonGroup) { - CHAR szName[MAX_PATHNAME_LEN] = ""; - CHAR szFile[MAX_PATHNAME_LEN] = ""; - OFSTRUCT dummy; + HANDLE hFile; + WCHAR szGrpFile[MAX_PATHNAME_LEN] = L""; + WCHAR szTitle[MAX_PATHNAME_LEN] = L""; - if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return; + // ZeroMemory(szTitle, sizeof(szTitle)); + // ZeroMemory(szGrpFile, sizeof(szGrpFile)); - if (OpenFile(szFile, &dummy, OF_EXIST) == HFILE_ERROR) + if (!DIALOG_GroupAttributes(format, szTitle, szGrpFile, MAX_PATHNAME_LEN)) + return; + + /* + * Just check whether the group file does exist. If it does, close the handle, because GRPFILE_ReadGroupFile will + * reopen the file for loading. If it doesn't exist, we create a new one. + */ + hFile = CreateFileW(szGrpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { - /* File doesn't exist */ - HLOCAL hGroup = - GROUP_AddGroup(szName, szFile, SW_SHOWNORMAL, - DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS, - DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_HEIGHT, 0, 0, - FALSE, FALSE, FALSE); - if (!hGroup) return; - GRPFILE_WriteGroupFile(hGroup); + /* File doesn't exist */ + PROGGROUP* hGroup = GROUP_AddGroup(format, bIsCommonGroup, szTitle, szGrpFile, + DEF_GROUP_WIN_XPOS, DEF_GROUP_WIN_YPOS, + DEF_GROUP_WIN_XPOS + DEF_GROUP_WIN_WIDTH, DEF_GROUP_WIN_YPOS + DEF_GROUP_WIN_HEIGHT, + 0, 0, SW_SHOWNORMAL, 0, 0, FALSE, FALSE); + if (hGroup) + GRPFILE_WriteGroupFile(hGroup); + } + else + { + /* File exist */ + CloseHandle(hFile); + GRPFILE_ReadGroupFile(szGrpFile, bIsCommonGroup); } - else /* File exist */ - GRPFILE_ReadGroupFile(szFile); - /* FIXME Update progman.ini */ + /* FIXME Update progman.ini */ } /*********************************************************************** @@ -102,121 +177,224 @@ VOID GROUP_NewGroup(void) * GROUP_AddGroup */ -HLOCAL GROUP_AddGroup(LPCSTR lpszName, LPCSTR lpszGrpFile, INT nCmdShow, - INT x, INT y, INT width, INT height, - INT iconx, INT icony, - BOOL bFileNameModified, BOOL bOverwriteFileOk, - /* FIXME shouldn't be necessary */ - BOOL bSuppressShowWindow) +PROGGROUP* +GROUP_AddGroup(GROUPFORMAT format, BOOL bIsCommonGroup, LPCWSTR lpszName, LPCWSTR lpszGrpFile, + INT left, INT top, INT right, INT bottom, INT xMin, INT yMin, INT nCmdShow, + WORD cxIcon, WORD cyIcon, BOOL bOverwriteFileOk, + /* FIXME shouldn't be necessary */ + BOOL bSuppressShowWindow) { - PROGGROUP *group, *prior; - MDICREATESTRUCTW cs; - INT seqnum; - HLOCAL hPrior, *p; - HLOCAL hGroup = LocalAlloc(LMEM_FIXED, sizeof(PROGGROUP)); - HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszName)); - HLOCAL hGrpFile = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszGrpFile)); - if (!hGroup || !hName || !hGrpFile) + PROGGROUP* hGroup; + PROGGROUP* hPrior; + PROGGROUP** p; + LPWSTR hName; + LPWSTR hGrpFile; + LPCWSTR GroupFileName; + INT skip; + INT width; + INT height; + INT seqnum; + MDICREATESTRUCTW mcs; + WINDOWPLACEMENT WndPl; + + WndPl.length = sizeof(WndPl); + + // FIXME: Use system default position in case we don't place the window at a given (x,y) coordinate. + + if (bIsCommonGroup) { - MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); - if (hGroup) LocalFree(hGroup); - if (hName) LocalFree(hName); - if (hGrpFile) LocalFree(hGrpFile); - return(0); - } - memcpy(LocalLock(hName), lpszName, 1 + strlen(lpszName)); - memcpy(LocalLock(hGrpFile), lpszGrpFile, 1 + strlen(lpszGrpFile)); - - Globals.hActiveGroup = hGroup; - - seqnum = 1; - hPrior = 0; - p = &Globals.hGroups; - while (*p) - { - hPrior = *p; - prior = LocalLock(hPrior); - p = &prior->hNext; - if (prior->seqnum >= seqnum) - seqnum = prior->seqnum + 1; - } - *p = hGroup; - - group = LocalLock(hGroup); - group->hPrior = hPrior; - group->hNext = 0; - group->hName = hName; - group->hGrpFile = hGrpFile; - group->bFileNameModified = bFileNameModified; - group->bOverwriteFileOk = bOverwriteFileOk; - group->seqnum = seqnum; - group->nCmdShow = nCmdShow; - group->x = x; - group->y = y; - group->width = width; - group->height = height; - group->iconx = iconx; - group->icony = icony; - group->hPrograms = 0; - group->hActiveProgram = 0; - - cs.szClass = STRING_GROUP_WIN_CLASS_NAME; - cs.szTitle = NULL; - cs.hOwner = 0; - cs.x = x; - cs.y = y; - cs.cx = width; - cs.cy = height; - cs.style = 0; - cs.lParam = 0; - -#ifdef __REACTOS__ - group->hWnd = (HWND)SendMessageW(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs); + if (swscanf(lpszGrpFile, + L"%d %d %d %d %d %d %d %n", + &WndPl.rcNormalPosition.left, + &WndPl.rcNormalPosition.top, + &WndPl.rcNormalPosition.right, + &WndPl.rcNormalPosition.bottom, + &WndPl.ptMinPosition, + &WndPl.ptMinPosition.y, + &WndPl.showCmd, + &skip) == 7) + { + WndPl.flags = WPF_SETMINPOSITION; + width = WndPl.rcNormalPosition.right - WndPl.rcNormalPosition.left; + height = WndPl.rcNormalPosition.bottom - WndPl.rcNormalPosition.top; + GroupFileName = &lpszGrpFile[skip]; + } + else + { +#if 0 // FIXME! + WndPl.rcNormalPosition.top = CW_USEDEFAULT; + WndPl.rcNormalPosition.left = CW_USEDEFAULT; + WndPl.rcNormalPosition.right = 0; + WndPl.rcNormalPosition.bottom = 0; + width = CW_USEDEFAULT; + height = CW_USEDEFAULT; + WndPl.showCmd = SW_SHOWNORMAL; + GroupFileName = lpszGrpFile; #else - group->hWnd = (HWND)SendMessageA(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&cs); + WndPl.flags = WPF_SETMINPOSITION; + WndPl.ptMinPosition.x = xMin; + WndPl.ptMinPosition.y = yMin; + WndPl.rcNormalPosition.left = left; + WndPl.rcNormalPosition.top = top; + WndPl.rcNormalPosition.right = right; + WndPl.rcNormalPosition.bottom = bottom; + width = right - left; + height = bottom - top; + WndPl.showCmd = nCmdShow; + GroupFileName = lpszGrpFile; #endif - SetWindowTextA( group->hWnd, lpszName ); - SetWindowLongPtrW(group->hWnd, 0, (LONG_PTR) hGroup); + } + } + else + { + WndPl.flags = WPF_SETMINPOSITION; + WndPl.ptMinPosition.x = xMin; + WndPl.ptMinPosition.y = yMin; + WndPl.rcNormalPosition.left = left; + WndPl.rcNormalPosition.top = top; + WndPl.rcNormalPosition.right = right; + WndPl.rcNormalPosition.bottom = bottom; + width = right - left; + height = bottom - top; + WndPl.showCmd = nCmdShow; + GroupFileName = lpszGrpFile; + } + + hGroup = Alloc(HEAP_ZERO_MEMORY, sizeof(*hGroup)); + hName = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszName) + 1) * sizeof(WCHAR)); + hGrpFile = Alloc(HEAP_ZERO_MEMORY, (wcslen(GroupFileName) + 1) * sizeof(WCHAR)); + if (!hGroup || !hName || !hGrpFile) + { + MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); + if (hGroup) Free(hGroup); + if (hName) Free(hName); + if (hGrpFile) Free(hGrpFile); + return NULL; + } + memcpy(hName , lpszName , (wcslen(lpszName) + 1) * sizeof(WCHAR)); + memcpy(hGrpFile, GroupFileName, (wcslen(GroupFileName) + 1) * sizeof(WCHAR)); + + Globals.hActiveGroup = hGroup; + + seqnum = 1; + hPrior = NULL; + for (p = &Globals.hGroups; *p; p = &hPrior->hNext) + { + hPrior = *p; + if (hPrior->seqnum >= seqnum) + seqnum = hPrior->seqnum + 1; + } + *p = hGroup; + + hGroup->hPrior = hPrior; + hGroup->hNext = NULL; + hGroup->format = format; + hGroup->bIsCommonGroup = bIsCommonGroup; + hGroup->hName = hName; + hGroup->hGrpFile = hGrpFile; + hGroup->bOverwriteFileOk = bOverwriteFileOk; + hGroup->seqnum = seqnum; + hGroup->nCmdShow = nCmdShow; +#if 0 + hGroup->x = x; + hGroup->y = y; + hGroup->width = width; + hGroup->height = height; +#endif + hGroup->iconx = cxIcon; + hGroup->icony = cyIcon; + hGroup->hPrograms = NULL; + hGroup->hActiveProgram = NULL; + hGroup->TagsSize = 0; + hGroup->Tags = NULL; + + mcs.szClass = STRING_GROUP_WIN_CLASS_NAME; + mcs.szTitle = lpszName; + mcs.hOwner = NULL; + mcs.x = WndPl.rcNormalPosition.left; + mcs.y = WndPl.rcNormalPosition.top; + mcs.cx = width; + mcs.cy = height; + mcs.style = 0; + mcs.lParam = (LPARAM)hGroup; + + hGroup->hWnd = (HWND)SendMessageW(Globals.hMDIWnd, WM_MDICREATE, 0, (LPARAM)&mcs); + + SetWindowPlacement(hGroup->hWnd, &WndPl); #if 1 - if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */ + if (!bSuppressShowWindow) /* FIXME shouldn't be necessary */ #endif - { - ShowWindow (group->hWnd, nCmdShow); - UpdateWindow (group->hWnd); - } + UpdateWindow(hGroup->hWnd); - return(hGroup); + return hGroup; } + + + + /*********************************************************************** * * GROUP_ModifyGroup */ -VOID GROUP_ModifyGroup(HLOCAL hGroup) +VOID GROUP_ModifyGroup(PROGGROUP* hGroup) { - PROGGROUP *group = LocalLock(hGroup); - CHAR szName[MAX_PATHNAME_LEN]; - CHAR szFile[MAX_PATHNAME_LEN]; - lstrcpynA(szName, LocalLock(group->hName), MAX_PATHNAME_LEN); - lstrcpynA(szFile, LocalLock(group->hGrpFile), MAX_PATHNAME_LEN); + WCHAR Dest[MAX_PATHNAME_LEN]; // szName + WCHAR szGrpFile[MAX_PATHNAME_LEN]; // szFile - if (!DIALOG_GroupAttributes(szName, szFile, MAX_PATHNAME_LEN)) return; + wcsncpy(Dest, hGroup->hName, ARRAYSIZE(Dest)); + wcsncpy(szGrpFile, hGroup->hGrpFile, ARRAYSIZE(szGrpFile)); - if (strcmp(szFile, LocalLock(group->hGrpFile))) - group->bOverwriteFileOk = FALSE; + if (!DIALOG_GroupAttributes(hGroup->format, Dest, szGrpFile, MAX_PATHNAME_LEN)) + return; - MAIN_ReplaceString(&group->hName, szName); - MAIN_ReplaceString(&group->hGrpFile, szFile); + if (wcscmp(szGrpFile, hGroup->hGrpFile)) + hGroup->bOverwriteFileOk = FALSE; - GRPFILE_WriteGroupFile(hGroup); + MAIN_ReplaceString(&hGroup->hName, Dest); + MAIN_ReplaceString(&hGroup->hGrpFile, szGrpFile); - /* FIXME Delete old GrpFile if GrpFile changed */ + GRPFILE_WriteGroupFile(hGroup); - /* FIXME Update progman.ini */ + /* FIXME Delete old GrpFile if GrpFile changed */ - SetWindowTextA(group->hWnd, szName); + /* FIXME Update progman.ini */ + + SetWindowTextW(hGroup->hWnd, Dest); +} + +/*********************************************************************** + * + * GROUP_DeleteGroup + */ + +VOID GROUP_DeleteGroup(PROGGROUP* hGroup) +{ + if (Globals.hActiveGroup == hGroup) + Globals.hActiveGroup = NULL; + + if (hGroup->hPrior) + hGroup->hPrior->hNext = hGroup->hNext; + else + Globals.hGroups = hGroup->hNext; + + if (hGroup->hNext) + hGroup->hNext->hPrior = hGroup->hPrior; + + while (hGroup->hPrograms) + PROGRAM_DeleteProgram(hGroup->hPrograms, FALSE); + + /* FIXME Update progman.ini */ + + SendMessageW(Globals.hMDIWnd, WM_MDIDESTROY, (WPARAM)hGroup->hWnd, 0); + + if (hGroup->Tags) + Free(hGroup->Tags); + Free(hGroup->hName); + Free(hGroup->hGrpFile); + Free(hGroup); } /*********************************************************************** @@ -225,64 +403,10 @@ VOID GROUP_ModifyGroup(HLOCAL hGroup) */ /* FIXME shouldn't be necessary */ -VOID GROUP_ShowGroupWindow(HLOCAL hGroup) +VOID GROUP_ShowGroupWindow(PROGGROUP* hGroup) { - PROGGROUP *group = LocalLock(hGroup); - ShowWindow (group->hWnd, group->nCmdShow); - UpdateWindow (group->hWnd); -} - -/*********************************************************************** - * - * GROUP_DeleteGroup - */ - -VOID GROUP_DeleteGroup(HLOCAL hGroup) -{ - PROGGROUP *group = LocalLock(hGroup); - - Globals.hActiveGroup = 0; - - if (group->hPrior) - ((PROGGROUP*)LocalLock(group->hPrior))->hNext = group->hNext; - else Globals.hGroups = group->hNext; - - if (group->hNext) - ((PROGGROUP*)LocalLock(group->hNext))->hPrior = group->hPrior; - - while (group->hPrograms) - PROGRAM_DeleteProgram(group->hPrograms, FALSE); - - /* FIXME Update progman.ini */ - - SendMessageW(Globals.hMDIWnd, WM_MDIDESTROY, (WPARAM)group->hWnd, 0); - - LocalFree(group->hName); - LocalFree(group->hGrpFile); - LocalFree(hGroup); -} - -/*********************************************************************** - * - * GROUP_FirstGroup - */ - -HLOCAL GROUP_FirstGroup(void) -{ - return(Globals.hGroups); -} - -/*********************************************************************** - * - * GROUP_NextGroup - */ - -HLOCAL GROUP_NextGroup(HLOCAL hGroup) -{ - PROGGROUP *group; - if (!hGroup) return(0); - group = LocalLock(hGroup); - return(group->hNext); + ShowWindow(hGroup->hWnd, hGroup->nCmdShow); + UpdateWindow(hGroup->hWnd); } /*********************************************************************** @@ -290,33 +414,7 @@ HLOCAL GROUP_NextGroup(HLOCAL hGroup) * GROUP_ActiveGroup */ -HLOCAL GROUP_ActiveGroup(void) +PROGGROUP* GROUP_ActiveGroup(VOID) { - return(Globals.hActiveGroup); -} - -/*********************************************************************** - * - * GROUP_GroupWnd - */ - -HWND GROUP_GroupWnd(HLOCAL hGroup) -{ - PROGGROUP *group; - if (!hGroup) return(0); - group = LocalLock(hGroup); - return(group->hWnd); -} - -/*********************************************************************** - * - * GROUP_GroupName - */ - -LPCSTR GROUP_GroupName(HLOCAL hGroup) -{ - PROGGROUP *group; - if (!hGroup) return(0); - group = LocalLock(hGroup); - return(LocalLock(group->hName)); + return Globals.hActiveGroup; } diff --git a/reactos/base/shell/progman/grpfile.c b/reactos/base/shell/progman/grpfile.c index ae91c2287e7..d2a1270a581 100644 --- a/reactos/base/shell/progman/grpfile.c +++ b/reactos/base/shell/progman/grpfile.c @@ -21,6 +21,7 @@ #include "progman.h" +#if 0 #define MALLOCHUNK 1000 #define GET_USHORT(buffer, i)\ @@ -35,6 +36,7 @@ static HLOCAL GRPFILE_ScanGroup(LPCSTR, INT, LPCSTR, BOOL); static HLOCAL GRPFILE_ScanProgram(LPCSTR, INT, LPCSTR, INT, LPCSTR, HLOCAL,LPCSTR); static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group); +#endif /*********************************************************************** * @@ -43,6 +45,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group); * Change extension `.grp' to `.gr' */ +#if 0 static VOID GRPFILE_ModifyFileName(LPSTR lpszNewName, LPCSTR lpszOrigName, INT nSize, BOOL bModify) { @@ -52,14 +55,16 @@ static VOID GRPFILE_ModifyFileName(LPSTR lpszNewName, LPCSTR lpszOrigName, if (!lstrcmpiA(lpszNewName + strlen(lpszNewName) - 4, ".grp")) lpszNewName[strlen(lpszNewName) - 1] = '\0'; } +#endif /*********************************************************************** * * GRPFILE_ReadGroupFile */ -HLOCAL GRPFILE_ReadGroupFile(LPCSTR lpszPath) +DWORD GRPFILE_ReadGroupFile(LPCWSTR lpszPath, BOOL bIsCommonGroup) { +#if 0 CHAR szPath_gr[MAX_PATHNAME_LEN]; BOOL bFileNameModified = FALSE; OFSTRUCT dummy; @@ -90,6 +95,10 @@ HLOCAL GRPFILE_ReadGroupFile(LPCSTR lpszPath) LocalFree(hBuffer); return(hGroup); + +#else + return ERROR_SUCCESS; +#endif } /*********************************************************************** @@ -97,6 +106,7 @@ HLOCAL GRPFILE_ReadGroupFile(LPCSTR lpszPath) * GRPFILE_ReadFileToBuffer */ +#if 0 static BOOL GRPFILE_ReadFileToBuffer(LPCSTR path, HLOCAL *phBuffer, INT *piSize) { @@ -143,11 +153,13 @@ static BOOL GRPFILE_ReadFileToBuffer(LPCSTR path, HLOCAL *phBuffer, *piSize = size; return TRUE; } +#endif /*********************************************************************** * GRPFILE_ScanGroup */ +#if 0 static HLOCAL GRPFILE_ScanGroup(LPCSTR buffer, INT size, LPCSTR lpszGrpFile, BOOL bModifiedFileName) @@ -221,11 +233,13 @@ static HLOCAL GRPFILE_ScanGroup(LPCSTR buffer, INT size, return hGroup; } +#endif /*********************************************************************** * GRPFILE_ScanProgram */ +#if 0 static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size, LPCSTR program_ptr, INT seqnum, LPCSTR extension, HLOCAL hGroup, @@ -276,11 +290,7 @@ static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size, if (iconANDbits_ptr + iconANDsize > buffer + size || iconXORbits_ptr + iconXORsize > buffer + size) return(0); -#ifdef __REACTOS__ hIcon = CreateIcon(Globals.hInstance, width, height, planes, bpp, (PBYTE)iconANDbits_ptr, (PBYTE)iconXORbits_ptr); -#else - hIcon = CreateIcon( Globals.hInstance, width, height, planes, bpp, iconANDbits_ptr, iconXORbits_ptr ); -#endif lpszName = buffer + GET_USHORT(program_ptr, 18); lpszCmdLine = buffer + GET_USHORT(program_ptr, 20); @@ -338,14 +348,16 @@ static HLOCAL GRPFILE_ScanProgram(LPCSTR buffer, INT size, nIconIndex, lpszWorkDir, nHotKey, nCmdShow)); } +#endif /*********************************************************************** * * GRPFILE_WriteGroupFile */ -BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup) +BOOL GRPFILE_WriteGroupFile(PROGGROUP* hGroup) { +#if 0 CHAR szPath[MAX_PATHNAME_LEN]; PROGGROUP *group = LocalLock(hGroup); OFSTRUCT dummy; @@ -403,8 +415,14 @@ BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup) MAIN_MessageBoxIDS_s(IDS_FILE_WRITE_ERROR_s, szPath, IDS_ERROR, MB_OK); return(ret); + +#else + return TRUE; +#endif } +#if 0 + /*********************************************************************** * * GRPFILE_CalculateSizes @@ -511,11 +529,9 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group) HLOCAL hProgram; INT NumProg, Title, Progs, Icons, Extension; INT CurrProg, CurrIcon, nCmdShow, ptr, seqnum; -#ifdef __REACTOS__ + UINT sizeAnd, sizeXor; -#else - DWORD sizeAnd, sizeXor; -#endif + BOOL need_extension; LPCSTR lpszTitle = LocalLock(group->hName); @@ -732,3 +748,5 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, PROGGROUP *group) return TRUE; } + +#endif diff --git a/reactos/base/shell/progman/main.c b/reactos/base/shell/progman/main.c index a918ea37632..71a1d2dfef9 100644 --- a/reactos/base/shell/progman/main.c +++ b/reactos/base/shell/progman/main.c @@ -19,96 +19,665 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/main.c + * PURPOSE: ProgMan entry point & MDI window + * PROGRAMMERS: Ulrich Schmid + * Sylvain Petreolle + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #include "progman.h" #include +#define WC_MDICLIENTA "MDICLIENT" +#define WC_MDICLIENTW L"MDICLIENT" + +#ifdef UNICODE +#define WC_MDICLIENT WC_MDICLIENTW +#else +#define WC_MDICLIENT WC_MDICLIENTA +#endif + GLOBALS Globals; -static VOID MAIN_CreateGroups(void); +static VOID MAIN_LoadGroups(VOID); static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam); -static ATOM MAIN_RegisterMainWinClass(void); -static VOID MAIN_CreateMainWindow(void); -static VOID MAIN_CreateMDIWindow(void); -static VOID MAIN_AutoStart(void); +static ATOM MAIN_RegisterMainWinClass(VOID); +static VOID MAIN_CreateMainWindow(VOID); +static VOID MAIN_CreateMDIWindow(VOID); +static VOID MAIN_AutoStart(VOID); + + +#define BUFFER_SIZE 1024 + + + +/* + * Memory management functions + */ +PVOID +Alloc(IN DWORD dwFlags, + IN SIZE_T dwBytes) +{ + return HeapAlloc(GetProcessHeap(), dwFlags, dwBytes); +} + +BOOL +Free(IN PVOID lpMem) +{ + return HeapFree(GetProcessHeap(), 0, lpMem); +} + +PVOID +ReAlloc(IN DWORD dwFlags, + IN PVOID lpMem, + IN SIZE_T dwBytes) +{ + return HeapReAlloc(GetProcessHeap(), dwFlags, lpMem, dwBytes); +} + +PVOID +AppendToBuffer(IN PVOID pBuffer, + IN PSIZE_T pdwBufferSize, + IN PVOID pData, + IN SIZE_T dwDataSize) +{ + PVOID pTmp; + SIZE_T dwBufferSize; + + dwBufferSize = dwDataSize + *pdwBufferSize; + + if (pBuffer) + pTmp = ReAlloc(0, pBuffer, dwBufferSize); + else + pTmp = Alloc(0, dwBufferSize); + + if (!pTmp) + return NULL; + + memcpy((PVOID)((ULONG_PTR)pTmp + *pdwBufferSize), pData, dwDataSize); + *pdwBufferSize = dwBufferSize; + + return pTmp; +} + + + +/* + * Debugging helpers + */ +VOID +PrintStringV(IN LPCWSTR szStr, + IN va_list args) +{ + WCHAR Buffer[4096]; + + _vsnwprintf(Buffer, ARRAYSIZE(Buffer), szStr, args); + MessageBoxW(Globals.hMainWnd, Buffer, L"Information", MB_OK); +} + +VOID +PrintString(IN LPCWSTR szStr, ...) +{ + va_list args; + + va_start(args, szStr); + PrintStringV(szStr, args); + va_end(args); +} + +VOID +PrintResourceString(IN UINT uID, ...) +{ + WCHAR Buffer[4096]; + va_list args; + + va_start(args, uID); + LoadStringW(Globals.hInstance, uID, Buffer, ARRAYSIZE(Buffer)); + PrintStringV(Buffer, args); + va_end(args); +} + +VOID +PrintWin32Error(IN LPWSTR Message, IN DWORD ErrorCode) +{ + LPWSTR lpMsgBuf; + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR)&lpMsgBuf, 0, NULL); + + PrintString(L"%s: %s\n", Message, lpMsgBuf); + LocalFree(lpMsgBuf); +} + +int ShowLastWin32Error(VOID) +{ + DWORD dwError; + LPWSTR lpMsgBuf = NULL; + WCHAR Buffer[4096]; + + dwError = GetLastError(); + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR)&lpMsgBuf, 0, NULL); + _snwprintf(Buffer, ARRAYSIZE(Buffer), L"Error %d: %s\n", dwError, lpMsgBuf); + LocalFree(lpMsgBuf); + return MessageBoxW(Globals.hMainWnd, Buffer, L"Error", MB_OK); +} + + + + + + + +/* Copied and adapted from dll/win32/userenv/environment.c!GetUserAndDomainName */ +static +BOOL +GetUserAndDomainName(OUT LPWSTR* UserName, + OUT LPWSTR* DomainName) +{ + BOOL bRet = TRUE; + HANDLE hToken; + DWORD cbTokenBuffer = 0; + PTOKEN_USER pUserToken; + + LPWSTR lpUserName = NULL; + LPWSTR lpDomainName = NULL; + DWORD cbUserName = 0; + DWORD cbDomainName = 0; + + SID_NAME_USE SidNameUse; + + /* Get the process token */ + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + return FALSE; + + /* Retrieve token's information */ + if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &cbTokenBuffer)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + CloseHandle(hToken); + return FALSE; + } + } + + pUserToken = Alloc(HEAP_ZERO_MEMORY, cbTokenBuffer); + if (!pUserToken) + { + CloseHandle(hToken); + return FALSE; + } + + if (!GetTokenInformation(hToken, TokenUser, pUserToken, cbTokenBuffer, &cbTokenBuffer)) + { + Free(pUserToken); + CloseHandle(hToken); + return FALSE; + } + + CloseHandle(hToken); + + /* Retrieve the domain and user name */ + if (!LookupAccountSidW(NULL, + pUserToken->User.Sid, + NULL, + &cbUserName, + NULL, + &cbDomainName, + &SidNameUse)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + bRet = FALSE; + goto done; + } + } + + lpUserName = Alloc(HEAP_ZERO_MEMORY, cbUserName * sizeof(WCHAR)); + if (lpUserName == NULL) + { + bRet = FALSE; + goto done; + } + + lpDomainName = Alloc(HEAP_ZERO_MEMORY, cbDomainName * sizeof(WCHAR)); + if (lpDomainName == NULL) + { + bRet = FALSE; + goto done; + } + + if (!LookupAccountSidW(NULL, + pUserToken->User.Sid, + lpUserName, + &cbUserName, + lpDomainName, + &cbDomainName, + &SidNameUse)) + { + bRet = FALSE; + goto done; + } + + *UserName = lpUserName; + *DomainName = lpDomainName; + +done: + if (bRet == FALSE) + { + if (lpUserName != NULL) + Free(lpUserName); + + if (lpDomainName != NULL) + Free(lpDomainName); + } + + Free(pUserToken); + + return bRet; +} + + + + + + +static +VOID +MAIN_SetMainWindowTitle(VOID) +{ + LPWSTR caption; + SIZE_T size; + + LPWSTR lpDomainName = NULL; + LPWSTR lpUserName = NULL; + + if (GetUserAndDomainName(&lpUserName, &lpDomainName) && lpUserName && lpDomainName) + { + size = (256 + 3 + wcslen(lpDomainName) + wcslen(lpUserName) + 1) * sizeof(WCHAR); + caption = Alloc(HEAP_ZERO_MEMORY, size); + if (caption) + { + swprintf(caption, L"%s - %s\\%s", szTitle, lpDomainName, lpUserName); + SetWindowTextW(Globals.hMainWnd, caption); + Free(caption); + } + else + { + SetWindowTextW(Globals.hMainWnd, szTitle); + } + } + else + { + SetWindowTextW(Globals.hMainWnd, szTitle); + } + + if (lpUserName) Free(lpUserName); + if (lpDomainName) Free(lpDomainName); +} + + + + +static +BOOL +MAIN_LoadSettings(VOID) +{ + LPWSTR lpszTmp; + LPWSTR lpszSection; + LONG lRet; + WCHAR dummy[2]; + LPWSTR lpszKeyValue; + const LPCWSTR lpszIniFile = L"progman.ini"; + WCHAR szWinDir[MAX_PATH]; + LPWSTR lpszKey; + DWORD Value; + HKEY hKey; + BOOL bIsIniMigrated; + DWORD dwSize; + LPWSTR lpszSections; + LPWSTR lpszData; + DWORD dwRet; + DWORD dwType; + LPWSTR lpszValue; + + bIsIniMigrated = FALSE; + lpszSections = NULL; + lpszData = NULL; + + /* Try to create/open the Program Manager user key */ + if (RegCreateKeyExW(HKEY_CURRENT_USER, + L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Program Manager", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyProgMan, + NULL) != ERROR_SUCCESS) + { + return FALSE; + } + + /* + * TODO: Add the explanation for the migration... + */ + dwSize = sizeof(Value); + lRet = RegQueryValueExW(Globals.hKeyProgMan, L"IniMigrated", NULL, &dwType, (LPBYTE)&Value, &dwSize); + if (lRet != ERROR_SUCCESS || dwType != REG_DWORD) + Value = 0; + bIsIniMigrated = !!Value; + + if (bIsIniMigrated) + { + /* The migration was already done, just load the settings */ + goto LoadSettings; + } + + /* Perform the migration */ + + bIsIniMigrated = TRUE; + dwSize = ARRAYSIZE(dummy); + SetLastError(0); + GetPrivateProfileSectionW(L"Settings", dummy, dwSize, lpszIniFile); + if (GetLastError() == ERROR_FILE_NOT_FOUND) + goto MigrationDone; + + SetLastError(0); + GetPrivateProfileSectionW(L"Groups", dummy, dwSize, lpszIniFile); + if (GetLastError() == ERROR_FILE_NOT_FOUND) + goto MigrationDone; + + GetWindowsDirectoryW(szWinDir, ARRAYSIZE(szWinDir)); + // NOTE: GCC complains we cannot use the "\u2022" (UNICODE Code Point) notation for specifying the bullet character, + // because it's only available in C++ or in C99. On the contrary MSVC is fine with it. + // Instead we use a hex specification for the character: "\x2022". + // Note also that the character "\x07" gives also a bullet, but a larger one. + PrintString( + L"The Program Manager has detected the presence of a legacy settings file PROGMAN.INI in the directory '%s' " + L"and is going to migrate its contents into the current-user Program Manager settings registry key:\n" + L"HKCU\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Program Manager" + L"\n\n" + L"\x2022 The migration operation will potentially overwrite all the existing current-user Program Manager settings in the registry by those stored in the PROGMAN.INI file.\n" + L"\n" + L"\x2022 The migration is done once, so that, at the next launch of the Program Manager, the new migrated settings are directly used.\n" + L"\n" + L"\x2022 It is possible to trigger later the migration by manually deleting the registry value \"IniMigrated\" under the current-user Program Manager settings registry key (specified above).\n" + L"\n" + L"Would you like to migrate its contents into the registry?", + szWinDir); + + for (dwSize = BUFFER_SIZE; ; dwSize += BUFFER_SIZE) + { + lpszSections = Alloc(0, dwSize * sizeof(WCHAR)); + dwRet = GetPrivateProfileSectionNamesW(lpszSections, dwSize, lpszIniFile); + if (dwRet < dwSize - 2) + break; + Free(lpszSections); + } + lpszSection = lpszSections; + while (*lpszSection) + { + lRet = RegCreateKeyExW(Globals.hKeyProgMan, + lpszSection, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE, + NULL, + &hKey, + NULL); + if (lRet == ERROR_SUCCESS) + { + for (dwSize = BUFFER_SIZE; ; dwSize += BUFFER_SIZE) + { + lpszData = Alloc(0, dwSize * sizeof(WCHAR)); + dwRet = GetPrivateProfileSectionW(lpszSection, lpszData, dwSize, lpszIniFile); + if (dwRet < dwSize - 2) + break; + Free(lpszData); + } + lpszKeyValue = lpszData; + while (*lpszKeyValue) + { + lpszKey = lpszKeyValue; + lpszValue = wcschr(lpszKeyValue, L'='); + lpszKeyValue += (wcslen(lpszKeyValue) + 1); + if (lpszValue) + { + *lpszValue = '\0'; + ++lpszValue; + Value = wcstoul(lpszValue, &lpszTmp, 0); + if (lpszTmp - lpszValue >= wcslen(lpszValue)) + { + lpszValue = (LPWSTR)&Value; + dwSize = sizeof(Value); + dwType = REG_DWORD; + } + else + { + dwSize = wcslen(lpszValue) * sizeof(WCHAR); + dwType = REG_SZ; + } + } + else + { + dwSize = 0; + dwType = REG_DWORD; + } + lRet = RegSetValueExW(hKey, lpszKey, 0, dwType, (LPBYTE)lpszValue, dwSize); + } + Free(lpszData); + RegCloseKey(hKey); + lpszSection += (wcslen(lpszSection) + 1); + } + } + Free(lpszSections); + +MigrationDone: + Value = TRUE; + RegSetValueExW(Globals.hKeyProgMan, L"IniMigrated", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value)); + + +LoadSettings: + /* Create the necessary registry keys for the Program Manager and load its settings from the registry */ + + lRet = RegCreateKeyExW(Globals.hKeyProgMan, + L"Settings", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyPMSettings, + NULL); + + lRet = RegCreateKeyExW(Globals.hKeyProgMan, + L"Common Groups", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyPMCommonGroups, + NULL); + + lRet = RegCreateKeyExW(Globals.hKeyProgMan, + L"Groups", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyPMAnsiGroups, + NULL); + + lRet = RegCreateKeyExW(Globals.hKeyProgMan, + L"UNICODE Groups", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyPMUnicodeGroups, + NULL); + + lRet = RegCreateKeyExW(HKEY_CURRENT_USER, + L"Program Groups", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyAnsiGroups, + NULL); + + lRet = RegCreateKeyExW(HKEY_CURRENT_USER, + L"UNICODE Program Groups", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyUnicodeGroups, + NULL); + + lRet = RegCreateKeyExW(HKEY_LOCAL_MACHINE, + L"SOFTWARE\\Program Groups", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &Globals.hKeyCommonGroups, + NULL); + + dwSize = sizeof(Globals.bAutoArrange); + RegQueryValueExW(Globals.hKeyPMSettings, L"AutoArrange", NULL, &dwType, (LPBYTE)&Globals.bAutoArrange, &dwSize); + + dwSize = sizeof(Globals.bMinOnRun); + RegQueryValueExW(Globals.hKeyPMSettings, L"MinOnRun", NULL, &dwType, (LPBYTE)&Globals.bMinOnRun, &dwSize); + + dwSize = sizeof(Globals.bSaveSettings); + RegQueryValueExW(Globals.hKeyPMSettings, L"SaveSettings", NULL, &dwType, (LPBYTE)&Globals.bSaveSettings, &dwSize); + + return TRUE; +} + +static +BOOL +MAIN_SaveSettings(VOID) +{ + WINDOWPLACEMENT WndPl; + DWORD dwSize; + WCHAR buffer[100]; + + WndPl.length = sizeof(WndPl); + GetWindowPlacement(Globals.hMainWnd, &WndPl); + swprintf(buffer, L"%d %d %d %d %d", + WndPl.rcNormalPosition.left, + WndPl.rcNormalPosition.top, + WndPl.rcNormalPosition.right, + WndPl.rcNormalPosition.bottom, + WndPl.showCmd); + + dwSize = wcslen(buffer) * sizeof(WCHAR); + RegSetValueExW(Globals.hKeyPMSettings, L"Window", 0, REG_SZ, (LPBYTE)buffer, dwSize); + + return TRUE; +} -#define BUFFER_SIZE 1000 /*********************************************************************** * * WinMain */ -#ifdef __REACTOS__ -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) -#else -int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show) -#endif +INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nCmdShow) { - MSG msg; + MSG msg; + INITCOMMONCONTROLSEX icex; - Globals.lpszIniFile = "progman.ini"; -#ifndef __REACTOS__ - Globals.lpszIcoFile = "progman.ico"; -#endif + /* + * Set our shutdown parameters: we want to shutdown the very last, + * but before any TaskMgr instance (which has a shutdown level of 1). + */ + SetProcessShutdownParameters(2, 0); - Globals.hInstance = hInstance; - Globals.hGroups = 0; - Globals.hActiveGroup = 0; + Globals.hInstance = hInstance; + Globals.hGroups = NULL; + Globals.hActiveGroup = NULL; - /* Read Options from `progman.ini' */ - Globals.bAutoArrange = - GetPrivateProfileIntA("Settings", "AutoArrange", 0, Globals.lpszIniFile); - Globals.bMinOnRun = - GetPrivateProfileIntA("Settings", "MinOnRun", 0, Globals.lpszIniFile); - Globals.bSaveSettings = - GetPrivateProfileIntA("Settings", "SaveSettings", 0, Globals.lpszIniFile); + /* Load Program Manager's settings */ + MAIN_LoadSettings(); - /* Load default icons */ -#ifdef __REACTOS__ - Globals.hMainIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_APPICON)); - Globals.hGroupIcon = Globals.hMainIcon; - Globals.hDefaultIcon = Globals.hMainIcon; -#else - Globals.hMainIcon = ExtractIconA(Globals.hInstance, Globals.lpszIcoFile, 0); - Globals.hGroupIcon = ExtractIconA(Globals.hInstance, Globals.lpszIcoFile, 0); - Globals.hDefaultIcon = ExtractIconA(Globals.hInstance, Globals.lpszIcoFile, 0); -#endif - if (!Globals.hMainIcon) Globals.hMainIcon = LoadIconW(0, (LPWSTR)DEFAULTICON); - if (!Globals.hGroupIcon) Globals.hGroupIcon = LoadIconW(0, (LPWSTR)DEFAULTICON); - if (!Globals.hDefaultIcon) Globals.hDefaultIcon = LoadIconW(0, (LPWSTR)DEFAULTICON); + /* Load the default icons */ + Globals.hPersonalGroupIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_GROUP_PERSONAL_ICON)); + Globals.hCommonGroupIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_GROUP_COMMON_ICON)); + Globals.hDefaultIcon = LoadIconW(NULL, MAKEINTRESOURCEW(IDI_WINLOGO)); - /* Register classes */ - if (!prev) + // Globals.hMainIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_APPICON)); + + /* Initialize the common controls */ + icex.dwSize = sizeof(icex); + icex.dwICC = ICC_HOTKEY_CLASS | ICC_LISTVIEW_CLASSES; // | ICC_STANDARD_CLASSES; + InitCommonControlsEx(&icex); + + /* Register the window classes */ + if (!hPrevInstance) // FIXME: Unused on Win32! { - if (!MAIN_RegisterMainWinClass()) return(FALSE); - if (!GROUP_RegisterGroupWinClass()) return(FALSE); - if (!PROGRAM_RegisterProgramWinClass()) return(FALSE); + if (!MAIN_RegisterMainWinClass()) goto Quit; + if (!GROUP_RegisterGroupWinClass()) goto Quit; } - /* Create main window */ - MAIN_CreateMainWindow(); - Globals.hAccel = LoadAcceleratorsW(Globals.hInstance, MAKEINTRESOURCEW(IDA_ACCEL)); + /* Set up the strings, the main window, the accelerators, the menu, and the MDI child window */ + STRING_LoadStrings(); + MAIN_CreateMainWindow(); + Globals.hAccel = LoadAcceleratorsW(Globals.hInstance, MAKEINTRESOURCEW(IDA_ACCEL)); + STRING_LoadMenus(); + MAIN_CreateMDIWindow(); - /* Setup menu, stringtable and resourcenames */ - STRING_LoadMenus(); + /* Load all the groups */ + // MAIN_CreateGroups(); + MAIN_LoadGroups(); - MAIN_CreateMDIWindow(); + /* Load the Startup group: start the initial applications */ + MAIN_AutoStart(); - /* Initialize groups */ - MAIN_CreateGroups(); + /* Message loop */ + while (GetMessageW(&msg, NULL, 0, 0)) + { + if (!TranslateMDISysAccel(Globals.hMDIWnd, &msg) && + !TranslateAcceleratorW(Globals.hMainWnd, Globals.hAccel, &msg)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + } - /* Start initial applications */ - MAIN_AutoStart(); +Quit: - /* Message loop */ - while (GetMessageW (&msg, 0, 0, 0)) - if (!TranslateAcceleratorW(Globals.hMainWnd, Globals.hAccel, &msg)) - { - TranslateMessage (&msg); - DispatchMessageW (&msg); - } - return 0; + /* Save the settings, close the registry keys and quit */ + + // MAIN_SaveSettings(); + RegCloseKey(Globals.hKeyCommonGroups); + RegCloseKey(Globals.hKeyUnicodeGroups); + RegCloseKey(Globals.hKeyAnsiGroups); + RegCloseKey(Globals.hKeyPMUnicodeGroups); + RegCloseKey(Globals.hKeyPMAnsiGroups); + RegCloseKey(Globals.hKeyPMCommonGroups); + RegCloseKey(Globals.hKeyPMSettings); + RegCloseKey(Globals.hKeyProgMan); + + return 0; } /*********************************************************************** @@ -116,7 +685,8 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show * MAIN_CreateGroups */ -static VOID MAIN_CreateGroups(void) +#if 0 +static VOID MAIN_CreateGroups(VOID) { CHAR buffer[BUFFER_SIZE]; CHAR szPath[MAX_PATHNAME_LEN]; @@ -144,25 +714,41 @@ static VOID MAIN_CreateGroups(void) } /* FIXME initialize other groups, not enumerated by `Order' */ } +#endif + +static VOID MAIN_LoadGroups(VOID) +{ +} /*********************************************************************** * * MAIN_AutoStart */ -VOID MAIN_AutoStart(void) +static VOID MAIN_AutoStart(VOID) { - CHAR buffer[BUFFER_SIZE]; - HLOCAL hGroup, hProgram; + LONG lRet; + DWORD dwSize; + DWORD dwType; - GetPrivateProfileStringA("Settings", "AutoStart", "Autostart", buffer, - sizeof(buffer), Globals.lpszIniFile); + PROGGROUP* hGroup; + PROGRAM* hProgram; - for (hGroup = GROUP_FirstGroup(); hGroup; hGroup = GROUP_NextGroup(hGroup)) - if (!lstrcmpA(buffer, GROUP_GroupName(hGroup))) - for (hProgram = PROGRAM_FirstProgram(hGroup); hProgram; - hProgram = PROGRAM_NextProgram(hProgram)) - PROGRAM_ExecuteProgram(hProgram); + WCHAR buffer[BUFFER_SIZE]; + + dwSize = sizeof(buffer); + lRet = RegQueryValueExW(Globals.hKeyPMSettings, L"Startup", NULL, &dwType, (LPBYTE)buffer, &dwSize); + if (lRet != ERROR_SUCCESS || dwType != REG_SZ) + return; + + for (hGroup = Globals.hGroups; hGroup; hGroup = hGroup->hNext) + { + if (_wcsicmp(buffer, hGroup->hName) == 0) + { + for (hProgram = hGroup->hPrograms; hProgram; hProgram = hProgram->hNext) + PROGRAM_ExecuteProgram(hProgram); + } + } } /*********************************************************************** @@ -170,33 +756,70 @@ VOID MAIN_AutoStart(void) * MAIN_MainWndProc */ -static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT msg, - WPARAM wParam, LPARAM lParam) +static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - switch (msg) + switch (uMsg) { - case WM_INITMENU: - CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE, - MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED)); - CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN, - MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED)); - CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS, - MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED)); - break; + case WM_INITMENU: + { + PROGGROUP* hActiveGroup = GROUP_ActiveGroup(); + if (hActiveGroup) + { + if (PROGRAM_ActiveProgram(hActiveGroup)) + { + EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_ENABLED); + EnableMenuItem(Globals.hFileMenu, PM_MOVE, MF_ENABLED); + EnableMenuItem(Globals.hFileMenu, PM_COPY, MF_ENABLED); + EnableMenuItem(Globals.hFileMenu, PM_DELETE , MF_ENABLED); + EnableMenuItem(Globals.hFileMenu, PM_ATTRIBUTES, MF_ENABLED); + } + else + { + if (!hActiveGroup->hWnd || IsIconic(hActiveGroup->hWnd)) + EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_ENABLED); + else + EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_GRAYED); - case WM_COMMAND: - if (LOWORD(wParam) < PM_FIRST_CHILD){ - MAIN_MenuCommand(hWnd, LOWORD(wParam), lParam); - } - break; + EnableMenuItem(Globals.hFileMenu, PM_MOVE, MF_GRAYED); + EnableMenuItem(Globals.hFileMenu, PM_COPY, MF_GRAYED); + EnableMenuItem(Globals.hFileMenu, PM_DELETE , MF_ENABLED); + EnableMenuItem(Globals.hFileMenu, PM_ATTRIBUTES, MF_ENABLED); + } + } + else + { + EnableMenuItem(Globals.hFileMenu, PM_OPEN, MF_GRAYED); + EnableMenuItem(Globals.hFileMenu, PM_MOVE, MF_GRAYED); + EnableMenuItem(Globals.hFileMenu, PM_COPY, MF_GRAYED); + EnableMenuItem(Globals.hFileMenu, PM_DELETE , MF_GRAYED); + EnableMenuItem(Globals.hFileMenu, PM_ATTRIBUTES, MF_GRAYED); + } - case WM_DESTROY: - PostQuitMessage (0); - break; + CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE, + MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED)); + CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN, + MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED)); + CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS, + MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED)); + break; + } + + case WM_DESTROY: + if (Globals.bSaveSettings) + MAIN_SaveSettings(); + PostQuitMessage(0); + break; + + case WM_COMMAND: + if (LOWORD(wParam) < PM_FIRST_CHILD) + MAIN_MenuCommand(hWnd, LOWORD(wParam), lParam); + break; } - return DefFrameProcW(hWnd, Globals.hMDIWnd, msg, wParam, lParam); + + return DefFrameProcW(hWnd, Globals.hMDIWnd, uMsg, wParam, lParam); } + /*********************************************************************** * * MAIN_MenuCommand @@ -204,6 +827,7 @@ static LRESULT CALLBACK MAIN_MainWndProc(HWND hWnd, UINT msg, static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { +#if 0 HLOCAL hActiveGroup = GROUP_ActiveGroup(); HLOCAL hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup); HWND hActiveGroupWnd = GROUP_GroupWnd(hActiveGroup); @@ -225,18 +849,6 @@ static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) } break; - case PM_OPEN: - if (hActiveProgram) - PROGRAM_ExecuteProgram(hActiveProgram); - else if (hActiveGroupWnd) - OpenIcon(hActiveGroupWnd); - break; - - case PM_MOVE: - case PM_COPY: - if (hActiveProgram) - PROGRAM_CopyMoveProgram(hActiveProgram, wParam == PM_MOVE); - break; case PM_DELETE: if (hActiveProgram) @@ -251,43 +863,7 @@ static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) } break; - case PM_ATTRIBUTES: - if (hActiveProgram) - PROGRAM_ModifyProgram(hActiveProgram); - else if (hActiveGroup) - GROUP_ModifyGroup(hActiveGroup); - break; - case PM_EXECUTE: - DIALOG_Execute(); - break; - - case PM_EXIT: - PostQuitMessage(0); - break; - - /* Menu Options */ - case PM_AUTO_ARRANGE: - Globals.bAutoArrange = !Globals.bAutoArrange; - CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE, - MF_BYCOMMAND | (Globals.bAutoArrange ? - MF_CHECKED : MF_UNCHECKED)); - WritePrivateProfileStringA("Settings", "AutoArrange", - Globals.bAutoArrange ? "1" : "0", - Globals.lpszIniFile); - WritePrivateProfileStringA(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */ - break; - - case PM_MIN_ON_RUN: - Globals.bMinOnRun = !Globals.bMinOnRun; - CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN, - MF_BYCOMMAND | (Globals.bMinOnRun ? - MF_CHECKED : MF_UNCHECKED)); - WritePrivateProfileStringA("Settings", "MinOnRun", - Globals.bMinOnRun ? "1" : "0", - Globals.lpszIniFile); - WritePrivateProfileStringA(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */ - break; case PM_SAVE_SETTINGS: Globals.bSaveSettings = !Globals.bSaveSettings; @@ -300,14 +876,6 @@ static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) WritePrivateProfileStringA(NULL,NULL,NULL,Globals.lpszIniFile); /* flush it */ break; - /* Menu Windows */ - case PM_OVERLAP: - SendMessageW(Globals.hMDIWnd, WM_MDICASCADE, 0, 0); - break; - - case PM_SIDE_BY_SIDE: - SendMessageW(Globals.hMDIWnd, WM_MDITILE, MDITILE_VERTICAL, 0); - break; case PM_ARRANGE: @@ -317,29 +885,165 @@ static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) SendMessageW(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0); break; - /* Menu Help */ - case PM_CONTENTS: - if (!WinHelpA(Globals.hMainWnd, "progman.hlp", HELP_CONTENTS, 0)) - MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK); - break; - - case PM_ABOUT_WINE: -#ifdef __REACTOS__ - { - WCHAR szTitle[MAX_STRING_LEN]; - LoadStringW(Globals.hInstance, IDS_PROGRAM_MANAGER, szTitle, ARRAYSIZE(szTitle)); - ShellAboutW(hWnd, szTitle, NULL, NULL); - break; } -#else - ShellAboutA(hWnd, "WINE", "Program Manager", 0); - break; + + + + #endif - default: - MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); - break; + DWORD Value; + + PROGGROUP* hActiveGroup; + PROGRAM* hActiveProgram; + HWND hActiveGroupWnd; + + hActiveGroup = GROUP_ActiveGroup(); + hActiveProgram = PROGRAM_ActiveProgram(hActiveGroup); + hActiveGroupWnd = (hActiveGroup ? hActiveGroup->hWnd : NULL); + + switch (wParam) + { + /* Menu File */ + + case PM_NEW: + { + BOOL Success; + INT nResult; + + if (!hActiveGroupWnd || IsIconic(hActiveGroupWnd)) + Success = DIALOG_New(PM_NEW_GROUP, &nResult); + else + Success = DIALOG_New(PM_NEW_PROGRAM, &nResult); + if (!Success) + break; + + if (nResult & 1) + { + GROUPFORMAT format; + BOOL bIsCommonGroup; + + format = (nResult & 0xC) >> 2; + bIsCommonGroup = (nResult & 2) != 0; + GROUP_NewGroup(format, bIsCommonGroup); + } + else if (hActiveGroup) + { + PROGRAM_NewProgram(hActiveGroup); + } + + break; + } + + case PM_OPEN: + if (hActiveProgram) + PROGRAM_ExecuteProgram(hActiveProgram); + else if (hActiveGroupWnd) + OpenIcon(hActiveGroupWnd); + break; + + case PM_MOVE: + case PM_COPY: + if (hActiveProgram) + PROGRAM_CopyMoveProgram(hActiveProgram, wParam == PM_MOVE); + break; + + case PM_DELETE: + { + if (hActiveProgram) + { + if (DIALOG_Delete(IDS_DELETE_PROGRAM_s, hActiveProgram->hName)) + PROGRAM_DeleteProgram(hActiveProgram, TRUE); + } + else if (hActiveGroup && DIALOG_Delete(IDS_DELETE_GROUP_s, hActiveGroup->hName)) + { + GROUP_DeleteGroup(hActiveGroup); + } + break; + } + + case PM_ATTRIBUTES: + if (hActiveProgram) + PROGRAM_ModifyProgram(hActiveProgram); + else if (hActiveGroup) + GROUP_ModifyGroup(hActiveGroup); + break; + + case PM_EXECUTE: + DIALOG_Execute(); + break; + + case PM_EXIT: + // MAIN_SaveSettings(); + PostQuitMessage(0); + break; + + + /* Menu Options */ + + case PM_AUTO_ARRANGE: + Globals.bAutoArrange = !Globals.bAutoArrange; + CheckMenuItem(Globals.hOptionMenu, PM_AUTO_ARRANGE, + MF_BYCOMMAND | (Globals.bAutoArrange ? MF_CHECKED : MF_UNCHECKED)); + Value = Globals.bAutoArrange; + RegSetValueExW(Globals.hKeyPMSettings, L"AutoArrange", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value)); + break; + + case PM_MIN_ON_RUN: + Globals.bMinOnRun = !Globals.bMinOnRun; + CheckMenuItem(Globals.hOptionMenu, PM_MIN_ON_RUN, + MF_BYCOMMAND | (Globals.bMinOnRun ? MF_CHECKED : MF_UNCHECKED)); + Value = Globals.bMinOnRun; + RegSetValueExW(Globals.hKeyPMSettings, L"MinOnRun", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value)); + break; + + case PM_SAVE_SETTINGS: + Globals.bSaveSettings = !Globals.bSaveSettings; + CheckMenuItem(Globals.hOptionMenu, PM_SAVE_SETTINGS, + MF_BYCOMMAND | (Globals.bSaveSettings ? MF_CHECKED : MF_UNCHECKED)); + Value = Globals.bSaveSettings; + RegSetValueExW(Globals.hKeyPMSettings, L"SaveSettings", 0, REG_DWORD, (LPBYTE)&Value, sizeof(Value)); + break; + + case PM_SAVE_SETTINGS_NOW: + MAIN_SaveSettings(); + break; + + + /* Menu Windows */ + + case PM_OVERLAP: + SendMessageW(Globals.hMDIWnd, WM_MDICASCADE, 0, 0); + break; + + case PM_SIDE_BY_SIDE: + SendMessageW(Globals.hMDIWnd, WM_MDITILE, MDITILE_VERTICAL, 0); + break; + + case PM_ARRANGE: + if (!hActiveGroupWnd || IsIconic(hActiveGroupWnd)) + SendMessageW(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0); + else + SendMessageA(hActiveGroup->hListView, LVM_ARRANGE, 0, 0); + break; + + + /* Menu Help */ + + case PM_CONTENTS: + if (!WinHelpW(Globals.hMainWnd, L"progman.hlp", HELP_CONTENTS, 0)) + MAIN_MessageBoxIDS(IDS_WINHELP_ERROR, IDS_ERROR, MB_OK); + break; + + case PM_ABOUT: + ShellAboutW(hWnd, szTitle, NULL, NULL); + break; + + default: + MAIN_MessageBoxIDS(IDS_NOT_IMPLEMENTED, IDS_ERROR, MB_OK); + break; } + } /*********************************************************************** @@ -347,22 +1051,22 @@ static VOID MAIN_MenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) * MAIN_RegisterMainWinClass */ -static ATOM MAIN_RegisterMainWinClass(void) +static ATOM MAIN_RegisterMainWinClass(VOID) { - WNDCLASSW class; + WNDCLASSW wndClass; - class.style = CS_HREDRAW | CS_VREDRAW; - class.lpfnWndProc = MAIN_MainWndProc; - class.cbClsExtra = 0; - class.cbWndExtra = 0; - class.hInstance = Globals.hInstance; - class.hIcon = Globals.hMainIcon; - class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW); - class.hbrBackground = GetStockObject (NULL_BRUSH); - class.lpszMenuName = 0; - class.lpszClassName = STRING_MAIN_WIN_CLASS_NAME; + wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = MAIN_MainWndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = Globals.hInstance; + wndClass.hIcon = LoadIconW(Globals.hInstance, MAKEINTRESOURCEW(IDI_APPICON)); + wndClass.hCursor = LoadCursorW(NULL, MAKEINTRESOURCEW(IDC_ARROW)); + wndClass.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = STRING_MAIN_WIN_CLASS_NAME; - return RegisterClassW(&class); + return RegisterClassW(&wndClass); } /*********************************************************************** @@ -370,35 +1074,50 @@ static ATOM MAIN_RegisterMainWinClass(void) * MAIN_CreateMainWindow */ -static VOID MAIN_CreateMainWindow(void) +static VOID MAIN_CreateMainWindow(VOID) { - INT left , top, right, bottom, width, height, show; - CHAR buffer[100]; + INT left, top, right, bottom; + INT width, height; + INT nCmdShow; + WCHAR buffer[100]; - Globals.hMDIWnd = 0; - Globals.hMainMenu = 0; + LONG lRet; + DWORD dwSize; + DWORD dwType; - /* Get the geometry of the main window */ - GetPrivateProfileStringA("Settings", "Window", "", buffer, sizeof(buffer), Globals.lpszIniFile); - if (5 == sscanf(buffer, "%d %d %d %d %d", &left, &top, &right, &bottom, &show)) - { - width = right - left; - height = bottom - top; - } - else - { - left = top = width = height = CW_USEDEFAULT; - show = SW_SHOWNORMAL; - } + Globals.hMDIWnd = NULL; + Globals.hMainMenu = NULL; - /* Create main Window */ - Globals.hMainWnd = - CreateWindowW(STRING_MAIN_WIN_CLASS_NAME, NULL, - WS_OVERLAPPEDWINDOW, left, top, width, height, - 0, 0, Globals.hInstance, 0); + /* Get the geometry of the main window */ + dwSize = sizeof(buffer); + lRet = RegQueryValueExW(Globals.hKeyPMSettings, L"Window", NULL, &dwType, (LPBYTE)buffer, &dwSize); + if (lRet != ERROR_SUCCESS || dwType != REG_SZ) + buffer[0] = '\0'; - ShowWindow (Globals.hMainWnd, show); - UpdateWindow (Globals.hMainWnd); + if (swscanf(buffer, L"%d %d %d %d %d", &left, &top, &right, &bottom, &nCmdShow) == 5) + { + width = right - left; + height = bottom - top; + } + else + { + left = top = width = height = CW_USEDEFAULT; + nCmdShow = SW_SHOWNORMAL; + } + + /* Create the main window */ + Globals.hMainWnd = + CreateWindowW(STRING_MAIN_WIN_CLASS_NAME, + szTitle, + WS_OVERLAPPEDWINDOW, // /* | WS_CLIPSIBLINGS | WS_CLIPCHILDREN */ + left, top, width, height, + NULL, NULL, + Globals.hInstance, + NULL); + + MAIN_SetMainWindowTitle(); + ShowWindow(Globals.hMainWnd, nCmdShow); + UpdateWindow(Globals.hMainWnd); } /*********************************************************************** @@ -406,27 +1125,30 @@ static VOID MAIN_CreateMainWindow(void) * MAIN_CreateMDIWindow */ -static VOID MAIN_CreateMDIWindow(void) +static VOID MAIN_CreateMDIWindow(VOID) { - CLIENTCREATESTRUCT ccs; - RECT rect; + CLIENTCREATESTRUCT ccs; + RECT rect; - /* Get the geometry of the MDI window */ - GetClientRect(Globals.hMainWnd, &rect); + /* Get the geometry of the MDI window */ + GetClientRect(Globals.hMainWnd, &rect); - ccs.hWindowMenu = Globals.hWindowsMenu; - ccs.idFirstChild = PM_FIRST_CHILD; + ccs.hWindowMenu = Globals.hWindowsMenu; + ccs.idFirstChild = PM_FIRST_CHILD; - /* Create MDI Window */ - Globals.hMDIWnd = - CreateWindowW(STRING_MDI_WIN_CLASS_NAME, NULL, - WS_CHILD, rect.left, rect.top, - rect.right - rect.left, rect.bottom - rect.top, - Globals.hMainWnd, 0, - Globals.hInstance, &ccs); + /* Create MDI Window */ + Globals.hMDIWnd = + CreateWindowW(WC_MDICLIENT, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL, // WS_CHILDWINDOW | ... + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + Globals.hMainWnd, 0, + Globals.hInstance, &ccs); - ShowWindow (Globals.hMDIWnd, SW_SHOW); - UpdateWindow (Globals.hMDIWnd); + /* Reset the background of the MDI client window (default: COLOR_APPWORKSPACE + 1) */ + SetClassLongPtrW(Globals.hMDIWnd, GCLP_HBRBACKGROUND, (COLOR_WINDOW + 1)); + + ShowWindow(Globals.hMDIWnd, SW_SHOW); + UpdateWindow(Globals.hMDIWnd); } /**********************************************************************/ @@ -436,30 +1158,30 @@ static VOID MAIN_CreateMDIWindow(void) */ INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type) { - CHAR text[MAX_STRING_LEN]; - CHAR title[MAX_STRING_LEN]; + WCHAR text[MAX_STRING_LEN]; + WCHAR title[MAX_STRING_LEN]; - LoadStringA(Globals.hInstance, ids_text, text, sizeof(text)); - LoadStringA(Globals.hInstance, ids_title, title, sizeof(title)); + LoadStringW(Globals.hInstance, ids_text , text , ARRAYSIZE(text)); + LoadStringW(Globals.hInstance, ids_title, title, ARRAYSIZE(title)); - return(MessageBoxA(Globals.hMainWnd, text, title, type)); + return MessageBoxW(Globals.hMainWnd, text, title, type); } /*********************************************************************** * * MAIN_MessageBoxIDS_s */ -INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type) +INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCWSTR str, UINT ids_title, WORD type) { - CHAR text[MAX_STRING_LEN]; - CHAR title[MAX_STRING_LEN]; - CHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN]; + WCHAR text[MAX_STRING_LEN]; + WCHAR title[MAX_STRING_LEN]; + WCHAR newtext[MAX_STRING_LEN + MAX_PATHNAME_LEN]; - LoadStringA(Globals.hInstance, ids_text, text, sizeof(text)); - LoadStringA(Globals.hInstance, ids_title, title, sizeof(title)); - wsprintfA(newtext, text, str); + LoadStringW(Globals.hInstance, ids_text , text , ARRAYSIZE(text)); + LoadStringW(Globals.hInstance, ids_title, title, ARRAYSIZE(title)); + wsprintfW(newtext, text, str); - return(MessageBoxA(Globals.hMainWnd, newtext, title, type)); + return MessageBoxW(Globals.hMainWnd, newtext, title, type); } /*********************************************************************** @@ -467,15 +1189,18 @@ INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type) * MAIN_ReplaceString */ -VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replace) +VOID MAIN_ReplaceString(LPWSTR* string, LPWSTR replace) { - HLOCAL newhandle = LocalAlloc(LMEM_FIXED, strlen(replace) + 1); - if (newhandle) + LPWSTR newstring; + + newstring = Alloc(HEAP_ZERO_MEMORY, (wcslen(replace) + 1) * sizeof(WCHAR)); + if (newstring) { - LPSTR newstring = LocalLock(newhandle); - strcpy(newstring, replace); - LocalFree(*handle); - *handle = newhandle; + wcscpy(newstring, replace); + *string = newstring; + } + else + { + MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); } - else MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); } diff --git a/reactos/base/shell/progman/new_resources.rc b/reactos/base/shell/progman/new_resources.rc new file mode 100644 index 00000000000..3753db3a12f --- /dev/null +++ b/reactos/base/shell/progman/new_resources.rc @@ -0,0 +1,299 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource_2.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Anglais (États-Unis) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource_2.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_NEW DIALOGEX 0, 0, 240, 70 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "New Object" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "",IDC_STATIC,5,5,165,44 + CONTROL "Program &Group",PM_NEW_GROUP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,10,4,66,11 + CONTROL "&Personal",PM_PERSONAL_GROUP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,20,15,44,14 + CONTROL "&Common",PM_COMMON_GROUP,"Button",BS_AUTORADIOBUTTON,73,15,39,14 + LTEXT "&Format:",PM_FORMAT_TXT,20,33,35,11 + COMBOBOX PM_FORMAT,61,31,104,15,CBS_DROPDOWNLIST | WS_TABSTOP + CONTROL "Program &Item",PM_NEW_PROGRAM,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,10,52,59,12 + DEFPUSHBUTTON "OK",IDOK,175,5,60,15 + PUSHBUTTON "Cancel",IDCANCEL,175,25,60,15 + PUSHBUTTON "&Help",IDHELP,175,49,60,15 +END + +IDD_COPY_MOVE DIALOGEX 0, 0, 250, 65 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Copy Program" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Copy program:",PM_COPY_MOVE_TXT,5,5,70,10 + LTEXT "P",PM_PROGRAM,80,5,100,10 + LTEXT "From group:",IDC_STATIC,5,18,70,10 + LTEXT "G",PM_FROM_GROUP,80,18,100,10 + LTEXT "&To group:",IDC_STATIC,5,32,70,10 + COMBOBOX PM_TO_GROUP,5,46,140,50,CBS_DROPDOWNLIST | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,185,5,60,15 + PUSHBUTTON "Cancel",IDCANCEL,185,25,60,15 + PUSHBUTTON "&Help",IDHELP,185,45,60,15 +END + +IDD_GROUP DIALOGEX 0, 0, 250, 65 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Program Group Attributes" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "&Description:",IDC_STATIC,5,16,50,11 + EDITTEXT PM_DESCRIPTION,60,14,120,15,ES_AUTOHSCROLL + LTEXT "&Group file:",IDC_STATIC,5,38,50,11 + EDITTEXT PM_FILE,60,35,120,15,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,185,5,60,15 + PUSHBUTTON "Cancel",IDCANCEL,185,25,60,15 + PUSHBUTTON "&Help",IDHELP,185,45,60,15 +END + +IDD_PROGRAM DIALOGEX 0, 0, 270, 105 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Program Attributes" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "&Description:",IDC_STATIC,5,11,65,10 + EDITTEXT PM_DESCRIPTION,75,7,115,15,ES_AUTOHSCROLL + LTEXT "&Command line:",IDC_STATIC,5,26,65,10 + EDITTEXT PM_COMMAND_LINE,75,23,115,15,ES_AUTOHSCROLL + LTEXT "&Working directory:",IDC_STATIC,5,41,65,10 + EDITTEXT PM_DIRECTORY,75,39,115,15,ES_AUTOHSCROLL + LTEXT "&Key combination:",IDC_STATIC,5,56,65,10 + CONTROL "",PM_HOT_KEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,75,55,115,15 + ICON "",PM_ICON,24,72,20,20 + CHECKBOX "&Run minimized",PM_SYMBOL,75,74,115,10 + CONTROL "Run in separate &memory space",PM_NEW_VDM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,75,87,115,11 + DEFPUSHBUTTON "OK",IDOK,195,5,70,15 + PUSHBUTTON "Cancel",IDCANCEL,195,25,70,15 + PUSHBUTTON "&Browse...",PM_BROWSE,195,45,70,15 + PUSHBUTTON "Change &icon...",PM_OTHER_SYMBOL,195,65,70,15 + PUSHBUTTON "&Help",IDHELP,195,85,70,15 +END + +IDD_SYMBOL DIALOGEX 0, 0, 240, 85 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Change Icon" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "&Filename:",IDC_STATIC,5,11,50,10 + EDITTEXT PM_ICON_FILE,60,9,110,15,ES_AUTOHSCROLL + LTEXT "Current &icon:",IDC_STATIC,5,32,50,10 + DEFPUSHBUTTON "OK",IDOK,175,5,60,15 + PUSHBUTTON "Cancel",IDCANCEL,175,25,60,15 + PUSHBUTTON "&Browse...",PM_BROWSE,175,45,60,15 + PUSHBUTTON "&Help",IDHELP,175,65,60,15 + LISTBOX PM_SYMBOL_LIST,5,45,165,35,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | LBS_DISABLENOSCROLL | WS_HSCROLL | WS_TABSTOP +END + +IDD_EXECUTE DIALOGEX 0, 0, 200, 85 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Execute Program" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "&Command line:",IDC_STATIC,5,15,125,10 + COMBOBOX PM_COMMAND,5,26,125,15,CBS_DROPDOWN | CBS_HASSTRINGS | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CHECKBOX "&Run minimized",PM_SYMBOL,5,46,115,10 + CONTROL "Run in separate &memory space",PM_NEW_VDM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,59,115,11 + DEFPUSHBUTTON "OK",IDOK,135,5,60,15 + PUSHBUTTON "Cancel",IDCANCEL,135,25,60,15 + PUSHBUTTON "&Browse...",PM_BROWSE,135,45,60,15 + PUSHBUTTON "&Help",IDHELP,135,65,60,15 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MAIN_MENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&New...", PM_NEW + MENUITEM "O&pen\tEnter", PM_OPEN + MENUITEM "&Move...\tF7", PM_MOVE + MENUITEM "&Copy...\tF8", PM_COPY + MENUITEM "&Delete\tDel", PM_DELETE + MENUITEM "&Properties\tAlt+Enter", PM_ATTRIBUTES + MENUITEM SEPARATOR + MENUITEM "&Execute...", PM_EXECUTE + MENUITEM SEPARATOR + MENUITEM "E&xit Windows", PM_EXIT + END + POPUP "&Options" + BEGIN + MENUITEM "&Arrange automatically", PM_AUTO_ARRANGE + MENUITEM "&Minimize on run", PM_MIN_ON_RUN + MENUITEM "&Save settings on exit", PM_SAVE_SETTINGS + MENUITEM SEPARATOR + MENUITEM "Save settings &now", PM_SAVE_SETTINGS_NOW + END + POPUP "&Windows" + BEGIN + MENUITEM "&Overlapped\tShift+F5", PM_OVERLAP + MENUITEM "&Side by side\tShift+F4", PM_SIDE_BY_SIDE + MENUITEM "&Arrange Icons", PM_ARRANGE + END + POPUP "&Help" + BEGIN + MENUITEM "&Contents\tF1", PM_CONTENTS + MENUITEM "&About Program Manager", PM_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDA_ACCEL ACCELERATORS +BEGIN + VK_RETURN, PM_ATTRIBUTES, VIRTKEY, ALT, NOINVERT + VK_F1, PM_CONTENTS, VIRTKEY, NOINVERT + VK_F4, PM_SIDE_BY_SIDE, VIRTKEY, SHIFT, NOINVERT + VK_F5, PM_OVERLAP, VIRTKEY, SHIFT, NOINVERT + VK_F7, PM_MOVE, VIRTKEY, NOINVERT + VK_F8, PM_COPY, VIRTKEY, NOINVERT + VK_DELETE, PM_DELETE, VIRTKEY, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_NEW, DIALOG + BEGIN + END + + IDD_COPY_MOVE, DIALOG + BEGIN + END + + IDD_GROUP, DIALOG + BEGIN + END + + IDD_PROGRAM, DIALOG + BEGIN + END + + IDD_SYMBOL, DIALOG + BEGIN + END + + IDD_EXECUTE, DIALOG + BEGIN + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_PROGRAM_MANAGER "Program Manager" + IDS_ERROR "ERROR" + IDS_WARNING "WARNING" + IDS_INFO "Information" + IDS_DELETE "Delete" + IDS_DELETE_GROUP_s "Delete group `%s'?" + IDS_DELETE_PROGRAM_s "Delete program `%s'?" + IDS_MOVE_PROGRAM_1 "Move Program" + IDS_MOVE_PROGRAM_2 "Move program:" + IDS_NOT_IMPLEMENTED "Not implemented" + IDS_FILE_READ_ERROR_s "Error reading `%s'." + IDS_FILE_WRITE_ERROR_s "Error writing `%s'." + IDS_GRPFILE_READ_ERROR_s + "The group file `%s' cannot be opened.\nShould it be tried further on?" + IDS_OUT_OF_MEMORY "Out of memory." +END + +STRINGTABLE +BEGIN + IDS_WINHELP_ERROR "Help not available." + IDS_UNKNOWN_FEATURE_s "Unknown feature in %s" + IDS_FILE_NOT_OVERWRITTEN_s "File `%s' exists. Not overwritten." + IDS_SAVE_GROUP_AS_s "Save group as `%s' to prevent overwriting original files." + IDS_ALL_FILES "All files (*.*)" + IDS_PROGRAMS "Programs (*.exe)" + IDS_LIBRARIES_DLL "Libraries (*.dll)" + IDS_SYMBOL_FILES "Icon files (*.ico;*.exe;*.dll)" + IDS_SYMBOLS_ICO "Icons (*.ico)" +END + +#endif // Anglais (États-Unis) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/reactos/base/shell/progman/progman.h b/reactos/base/shell/progman/progman.h index 3ab198a1817..337b5e0b7db 100644 --- a/reactos/base/shell/progman/progman.h +++ b/reactos/base/shell/progman/progman.h @@ -19,17 +19,36 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/progman.h + * PURPOSE: ProgMan header + * PROGRAMMERS: Ulrich Schmid + * Sylvain Petreolle + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #ifndef PROGMAN_H #define PROGMAN_H +#pragma once + #include +#include #define WIN32_NO_STATUS #include #include +#include #include #include +#include + +#include +#include + #define MAX_STRING_LEN 255 #define MAX_PATHNAME_LEN 1024 #define MAX_LANGUAGE_NUMBER (PM_LAST_LANGUAGE - PM_FIRST_LANGUAGE) @@ -39,173 +58,196 @@ /* Fallback icon */ #define DEFAULTICON OIC_WINLOGO -/* Icon index in MS Windows' progman.exe */ -#define PROGMAN_ICON_INDEX 0 -#define GROUP_ICON_INDEX 6 -#define DEFAULT_ICON_INDEX 7 - #define DEF_GROUP_WIN_XPOS 100 #define DEF_GROUP_WIN_YPOS 100 #define DEF_GROUP_WIN_WIDTH 300 #define DEF_GROUP_WIN_HEIGHT 200 -typedef struct + +/* + * windowsx.h extensions + */ +#define EnableDlgItem(hDlg, nID, bEnable) \ + EnableWindow(GetDlgItem((hDlg), (nID)), (bEnable)) + + + + + +typedef struct _PROGRAM PROGRAM, *PPROGRAM; +typedef struct _PROGGROUP PROGGROUP, *PPROGGROUP; + +struct _PROGRAM { - HLOCAL hGroup; - HLOCAL hPrior; - HLOCAL hNext; - HWND hWnd; - /**/ /* Numbers are byte indexes in *.grp */ + PROGGROUP* hGroup; + PROGRAM* hPrior; + PROGRAM* hNext; + HWND hWnd; - /**/ /* Program entry */ - INT x, y; /* 0 - 3 */ - INT nIconIndex; /* 4 - 5 */ - HICON hIcon; - /* icon flags ??? */ /* 6 - 7 */ - /* iconANDsize */ /* 8 - 9 */ - /* iconXORsize */ /* 10 - 11 */ - /* pointer to IconInfo */ /* 12 - 13 */ - /* pointer to iconXORbits */ /* 14 - 15 */ /* sometimes iconANDbits ?! */ - /* pointer to iconANDbits */ /* 16 - 17 */ /* sometimes iconXORbits ?! */ - HLOCAL hName; /* 18 - 19 */ - HLOCAL hCmdLine; /* 20 - 21 */ - HLOCAL hIconFile; /* 22 - 23 */ - HLOCAL hWorkDir; /* Extension 0x8101 */ - INT nHotKey; /* Extension 0x8102 */ - /* Modifier: bit 8... */ - INT nCmdShow; /* Extension 0x8103 */ + INT iItem; + INT x; + INT y; + INT nIconIndex; + HICON hIcon; + LPWSTR hName; + LPWSTR hCmdLine; + LPWSTR hIconFile; + LPWSTR hWorkDir; /* Extension 0x8101 */ + INT nHotKey; /* Extension 0x8102 */ + INT nCmdShow; /* Extension 0x8103 */ + BOOL bNewVDM; /* Extension 0x8104 */ - /**/ /* IconInfo */ - /* HotSpot x ??? */ /* 0 - 1 */ - /* HotSpot y ??? */ /* 2 - 3 */ - /* Width */ /* 4 - 5 */ - /* Height */ /* 6 - 7 */ - /* WidthBytes ??? */ /* 8 - 9 */ - /* Planes */ /* 10 - 10 */ - /* BitsPerPixel */ /* 11 - 11 */ -} PROGRAM; + SIZE_T TagsSize; + PVOID Tags; +}; // PROGRAM, *PPROGRAM; -typedef struct +typedef enum _GROUPFORMAT { - HLOCAL hPrior; - HLOCAL hNext; - HWND hWnd; - HLOCAL hGrpFile; - HLOCAL hActiveProgram; - BOOL bFileNameModified; - BOOL bOverwriteFileOk; - INT seqnum; + Win_311 = 0x0, + NT_Ansi = 0x1, // 0x02 + NT_Unicode = 0x2, // 0x03 +} GROUPFORMAT; - /**/ /* Absolute */ - /* magic `PMCC' */ /* 0 - 3 */ - /* checksum */ /* 4 - 5 */ - /* Extension ptr */ /* 6 - 7 */ - INT nCmdShow; /* 8 - 9 */ - INT x, y; /* 10 - 13 */ - INT width, height; /* 14 - 17 */ - INT iconx, icony; /* 18 - 21 */ - HLOCAL hName; /* 22 - 23 */ - /* unknown */ /* 24 - 31 */ - /* number of programs */ /* 32 - 33 */ - HLOCAL hPrograms; /* 34 ... */ - - /**/ /* Extensions */ - /* Extension type */ /* 0 - 1 */ - /* Program number */ /* 2 - 3 */ - /* Size of entry */ /* 4 - 5 */ - /* Data */ /* 6 ... */ - - /* magic `PMCC' */ /* Extension 0x8000 */ - /* End of Extensions */ /* Extension 0xffff */ -} PROGGROUP; - -typedef struct +struct _PROGGROUP { - HANDLE hInstance; - HANDLE hAccel; - HWND hMainWnd; - HWND hMDIWnd; - HICON hMainIcon; - HICON hGroupIcon; - HICON hDefaultIcon; - HMENU hMainMenu; - HMENU hFileMenu; - HMENU hOptionMenu; - HMENU hWindowsMenu; - HMENU hLanguageMenu; - LPCSTR lpszIniFile; -#ifndef __REACTOS__ - LPCSTR lpszIcoFile; -#endif - BOOL bAutoArrange; - BOOL bSaveSettings; - BOOL bMinOnRun; - HLOCAL hGroups; - HLOCAL hActiveGroup; -} GLOBALS; + PROGGROUP* hPrior; + PROGGROUP* hNext; + HWND hWnd; + + HWND hListView; + HIMAGELIST hListLarge; + HIMAGELIST hDragImageList; + HICON hOldCursor; + POINT ptStart; + BOOL bDragging; + + GROUPFORMAT format; + BOOL bIsCommonGroup; + // BOOL bFileNameModified; + BOOL bOverwriteFileOk; + LPWSTR hGrpFile; + INT seqnum; + INT nCmdShow; + INT x; + INT y; + INT width; + INT height; + INT iconx; + INT icony; + LPWSTR hName; + PROGRAM* hPrograms; + PROGRAM* hActiveProgram; + + SIZE_T TagsSize; + PVOID Tags; +}; // PROGGROUP, *PPROGGROUP; + + +typedef struct _GLOBALS +{ + HINSTANCE hInstance; + HACCEL hAccel; + HWND hMainWnd; + HWND hMDIWnd; + //HICON hMainIcon; + HICON hGroupIcon; + HICON hPersonalGroupIcon; + HICON hCommonGroupIcon; + HICON hDefaultIcon; + HMENU hMainMenu; + HMENU hFileMenu; + HMENU hOptionMenu; + HMENU hWindowsMenu; + HMENU hLanguageMenu; + + HKEY hKeyProgMan; + HKEY hKeyPMSettings; + HKEY hKeyPMCommonGroups; + HKEY hKeyPMAnsiGroups; + HKEY hKeyPMUnicodeGroups; + HKEY hKeyAnsiGroups; + HKEY hKeyUnicodeGroups; + HKEY hKeyCommonGroups; + + BOOL bAutoArrange; + BOOL bSaveSettings; + BOOL bMinOnRun; + PROGGROUP* hGroups; + PROGGROUP* hActiveGroup; + // int field_74; + // int field_78; + // PROGGROUP* field_79; +} GLOBALS, *PGLOBALS; extern GLOBALS Globals; +extern WCHAR szTitle[256]; + + +/* + * Memory management functions + */ +PVOID +Alloc(IN DWORD dwFlags, + IN SIZE_T dwBytes); + +BOOL +Free(IN PVOID lpMem); + +PVOID +ReAlloc(IN DWORD dwFlags, + IN PVOID lpMem, + IN SIZE_T dwBytes); + +PVOID +AppendToBuffer(IN PVOID pBuffer, + IN PSIZE_T pdwBufferSize, + IN PVOID pData, + IN SIZE_T dwDataSize); + INT MAIN_MessageBoxIDS(UINT ids_text, UINT ids_title, WORD type); -INT MAIN_MessageBoxIDS_s(UINT ids_text_s, LPCSTR str, UINT ids_title, WORD type); -VOID MAIN_ReplaceString(HLOCAL *handle, LPSTR replacestring); +INT MAIN_MessageBoxIDS_s(UINT ids_text, LPCWSTR str, UINT ids_title, WORD type); +VOID MAIN_ReplaceString(LPWSTR* string, LPWSTR replace); -HLOCAL GRPFILE_ReadGroupFile(const char* path); -BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup); +DWORD GRPFILE_ReadGroupFile(LPCWSTR lpszPath, BOOL bIsCommonGroup); +BOOL GRPFILE_WriteGroupFile(PROGGROUP* hGroup); -ATOM GROUP_RegisterGroupWinClass(void); -HLOCAL GROUP_AddGroup(LPCSTR lpszName, LPCSTR lpszGrpFile, INT nCmdShow, - INT x, INT y, INT width, INT height, - INT iconx, INT icony, - BOOL bFileNameModified, BOOL bOverwriteFileOk, - /* FIXME shouldn't be necessary */ - BOOL bSuppressShowWindow); -VOID GROUP_NewGroup(void); -VOID GROUP_ModifyGroup(HLOCAL hGroup); -VOID GROUP_DeleteGroup(HLOCAL hGroup); +ATOM GROUP_RegisterGroupWinClass(VOID); +PROGGROUP* GROUP_AddGroup(GROUPFORMAT format, BOOL bIsCommonGroup, LPCWSTR lpszName, LPCWSTR lpszGrpFile, + INT left, INT top, INT right, INT bottom, INT xMin, INT yMin, INT nCmdShow, + WORD cxIcon, WORD cyIcon, BOOL bOverwriteFileOk, + /* FIXME shouldn't be necessary */ + BOOL bSuppressShowWindow); +VOID GROUP_NewGroup(GROUPFORMAT format, BOOL bIsCommonGroup); +VOID GROUP_ModifyGroup(PROGGROUP* hGroup); +VOID GROUP_DeleteGroup(PROGGROUP* hGroup); /* FIXME shouldn't be necessary */ -VOID GROUP_ShowGroupWindow(HLOCAL hGroup); -HLOCAL GROUP_FirstGroup(void); -HLOCAL GROUP_NextGroup(HLOCAL hGroup); -HLOCAL GROUP_ActiveGroup(void); -HWND GROUP_GroupWnd(HLOCAL hGroup); -LPCSTR GROUP_GroupName(HLOCAL hGroup); +VOID GROUP_ShowGroupWindow(PROGGROUP* hGroup); +PROGGROUP* GROUP_ActiveGroup(VOID); -ATOM PROGRAM_RegisterProgramWinClass(void); -HLOCAL PROGRAM_AddProgram(HLOCAL hGroup, HICON hIcon, LPCSTR lpszName, - INT x, INT y, LPCSTR lpszCmdLine, - LPCSTR lpszIconFile, INT nIconIndex, - LPCSTR lpszWorkDir, INT nHotKey, INT nCmdShow); -VOID PROGRAM_NewProgram(HLOCAL hGroup); -VOID PROGRAM_ModifyProgram(HLOCAL hProgram); -VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove); -VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL BUpdateGrpFile); -HLOCAL PROGRAM_FirstProgram(HLOCAL hGroup); -HLOCAL PROGRAM_NextProgram(HLOCAL hProgram); -HLOCAL PROGRAM_ActiveProgram(HLOCAL hGroup); -LPCSTR PROGRAM_ProgramName(HLOCAL hProgram); -VOID PROGRAM_ExecuteProgram(HLOCAL hLocal); +PROGRAM* PROGRAM_AddProgram(PROGGROUP* hGroup, HICON hIcon, LPCWSTR lpszName, + INT x, INT y, LPCWSTR lpszCmdLine, LPCWSTR lpszIconFile, INT nIconIndex, + LPCWSTR lpszWorkDir, INT nHotKey, INT nCmdShow, BOOL bNewVDM); +VOID PROGRAM_NewProgram(PROGGROUP* hGroup); +VOID PROGRAM_ModifyProgram(PROGRAM* hProgram); +VOID PROGRAM_CopyMoveProgram(PROGRAM* hProgram, BOOL bMove); +VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile); +VOID PROGRAM_ExecuteProgram(PROGRAM* hProgram); +PROGRAM* PROGRAM_ActiveProgram(PROGGROUP* hGroup); -INT DIALOG_New(INT nDefault); -HLOCAL DIALOG_CopyMove(LPCSTR lpszProgramName, LPCSTR lpszGroupName, BOOL bMove); -BOOL DIALOG_Delete(UINT ids_format_s, LPCSTR lpszName); -BOOL DIALOG_GroupAttributes(LPSTR lpszTitle, LPSTR lpszPath, INT nSize); -BOOL DIALOG_ProgramAttributes(LPSTR lpszTitle, LPSTR lpszCmdLine, - LPSTR lpszWorkDir, LPSTR lpszIconFile, - HICON *lphIcon, INT *nIconIndex, - INT *lpnHotKey, INT *lpnCmdShow, INT nSize); -VOID DIALOG_Execute(void); +BOOL DIALOG_New(INT nDefault, PINT pnResult); +PROGGROUP* DIALOG_CopyMove(PROGRAM* hProgram, BOOL bMove); +BOOL DIALOG_Delete(UINT ids_text_s, LPCWSTR lpszName); +BOOL DIALOG_GroupAttributes(GROUPFORMAT format, LPWSTR lpszTitle, LPWSTR lpszGrpFile, INT nSize); +BOOL DIALOG_ProgramAttributes(LPWSTR lpszTitle, LPWSTR lpszCmdLine, LPWSTR lpszWorkDir, LPWSTR lpszIconFile, + HICON* lphIcon, INT* lpnIconIndex, INT* lpnHotKey, INT* lpnCmdShow, BOOL* lpbNewVDM, INT nSize); +VOID DIALOG_Execute(VOID); -VOID STRING_LoadMenus(VOID); +VOID STRING_LoadStrings(VOID); +VOID STRING_LoadMenus(VOID); /* Class names */ -extern WCHAR STRING_MAIN_WIN_CLASS_NAME[]; -extern WCHAR STRING_MDI_WIN_CLASS_NAME[]; -extern WCHAR STRING_GROUP_WIN_CLASS_NAME[]; -extern WCHAR STRING_PROGRAM_WIN_CLASS_NAME[]; +#define STRING_MAIN_WIN_CLASS_NAME L"PMMain" +#define STRING_GROUP_WIN_CLASS_NAME L"PMGroup" #endif /* PROGMAN_H */ - -/* Local Variables: */ -/* c-file-style: "GNU" */ -/* End: */ diff --git a/reactos/base/shell/progman/progman.rc b/reactos/base/shell/progman/progman.rc index ca6987fc733..bd610929abb 100644 --- a/reactos/base/shell/progman/progman.rc +++ b/reactos/base/shell/progman/progman.rc @@ -31,74 +31,22 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #define REACTOS_STR_ORIGINAL_FILENAME "progman.exe" #include -IDI_APPICON ICON "res/progman.ico" +IDI_APPICON ICON "res/progman.ico" +IDI_GROUP_PERSONAL_ICON ICON "res/group_personal.ico" +IDI_GROUP_COMMON_ICON ICON "res/group_common.ico" +IDI_ROSLOGO ICON "res/roslogo.ico" +IDI_GROUP_ICON ICON "res/group.ico" +IDI_TERMINAL ICON "res/terminal.ico" + +#include + +/* UTF-8 */ +#pragma code_page(65001) + +#if 0 // Work in progress! See "new_resources.rc" LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT -MAIN_MENU MENU -{ - POPUP "&File" { - MENUITEM "&New...", PM_NEW - MENUITEM "O&pen\tEnter", PM_OPEN - MENUITEM "&Move...\tF7", PM_MOVE, GRAYED - MENUITEM "&Copy...\tF8", PM_COPY, GRAYED - MENUITEM "&Delete\tDel", PM_DELETE - MENUITEM "&Properties\tAlt+Enter", PM_ATTRIBUTES - MENUITEM SEPARATOR - MENUITEM "&Execute...", PM_EXECUTE - MENUITEM SEPARATOR - MENUITEM "E&xit Windows", PM_EXIT - } - POPUP "&Options" { - MENUITEM "&Arrange automatically", PM_AUTO_ARRANGE - MENUITEM "&Minimize on run", PM_MIN_ON_RUN - MENUITEM "&Save settings on exit", PM_SAVE_SETTINGS - } - POPUP "&Windows" { - MENUITEM "&Overlapped\tShift+F5", PM_OVERLAP - MENUITEM "&Side by side\tShift+F4", PM_SIDE_BY_SIDE - MENUITEM "&Arrange Icons", PM_ARRANGE - } - -POPUP "&Help" { - MENUITEM "&Contents\tF1", PM_CONTENTS - MENUITEM "&About Program Manager", PM_ABOUT_WINE - } -} - -STRINGTABLE -{ -IDS_PROGRAM_MANAGER, "Program Manager" -IDS_ERROR, "ERROR" -IDS_WARNING, "WARNING" -IDS_INFO, "Information" -IDS_DELETE, "Delete" -IDS_DELETE_GROUP_s, "Delete group `%s'?" -IDS_DELETE_PROGRAM_s, "Delete program `%s'?" -IDS_NOT_IMPLEMENTED, "Not implemented" -IDS_FILE_READ_ERROR_s, "Error reading `%s'." -IDS_FILE_WRITE_ERROR_s, "Error writing `%s'." -IDS_GRPFILE_READ_ERROR_s, "\ -The group file `%s' cannot be opened.\n\ -Should it be tried further on?" -IDS_OUT_OF_MEMORY, "Out of memory." -IDS_WINHELP_ERROR, "Help not available." -IDS_UNKNOWN_FEATURE_s, "Unknown feature in %s" -IDS_FILE_NOT_OVERWRITTEN_s, "File `%s' exists. Not overwritten." -IDS_SAVE_GROUP_AS_s, "Save group as `%s to prevent overwriting original files." -IDS_NO_HOT_KEY, "#msgctxt#hotkey#None" -IDS_ALL_FILES, "All files (*.*)" -IDS_PROGRAMS, "Programs" -IDS_LIBRARIES_DLL, "Libraries (*.dll)" -IDS_SYMBOL_FILES, "Icon files" -IDS_SYMBOLS_ICO, "Icons (*.ico)" -} - -IDA_ACCEL ACCELERATORS -{ -VK_F1, PM_CONTENTS, VIRTKEY -VK_RETURN, PM_ATTRIBUTES, VIRTKEY, ALT -} /* Dialog `New' */ @@ -118,7 +66,7 @@ PUSHBUTTON "&Help", PM_HELP, 105, 45, 60, 15, WS_TABSTOP /* Dialog `Move' */ -IDD_MOVE DIALOG 0, 0, 250, 65 +IDD_COPY_MOVE DIALOG 0, 0, 250, 65 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Move Program" @@ -230,3 +178,7 @@ PUSHBUTTON "Cancel", IDCANCEL, 135, 25, 60, 15, WS_TABSTOP PUSHBUTTON "&Browse...", PM_BROWSE, 135, 45, 60, 15, WS_TABSTOP PUSHBUTTON "&Help", PM_HELP, 135, 65, 60, 15, WS_TABSTOP } + +#endif + +#include "new_resources.rc" diff --git a/reactos/base/shell/progman/program.c b/reactos/base/shell/progman/program.c index 5a4220a07fc..388287deb47 100644 --- a/reactos/base/shell/progman/program.c +++ b/reactos/base/shell/progman/program.c @@ -18,12 +18,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/program.c + * PURPOSE: Program items helper functions + * PROGRAMMERS: Ulrich Schmid + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #include "progman.h" -/*********************************************************************** - * - * PROGRAM_ProgramWndProc - */ +#if 0 static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -62,58 +68,44 @@ static LRESULT CALLBACK PROGRAM_ProgramWndProc(HWND hWnd, UINT msg, WPARAM wPara return DefWindowProcW(hWnd, msg, wParam, lParam); } -/*********************************************************************** - * - * PROGRAM_RegisterProgramWinClass - */ +#endif -ATOM PROGRAM_RegisterProgramWinClass(void) -{ - WNDCLASSW class; - class.style = CS_HREDRAW | CS_VREDRAW; - class.lpfnWndProc = PROGRAM_ProgramWndProc; - class.cbClsExtra = 0; - class.cbWndExtra = sizeof(LONG_PTR); - class.hInstance = Globals.hInstance; - class.hIcon = 0; - class.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW); - class.hbrBackground = GetStockObject (WHITE_BRUSH); - class.lpszMenuName = 0; - class.lpszClassName = STRING_PROGRAM_WIN_CLASS_NAME; - - return RegisterClassW(&class); -} /*********************************************************************** * * PROGRAM_NewProgram */ -VOID PROGRAM_NewProgram(HLOCAL hGroup) +VOID PROGRAM_NewProgram(PROGGROUP* hGroup) { - INT nCmdShow = SW_SHOWNORMAL; - INT nHotKey = 0; - INT nIconIndex = 0; - CHAR szName[MAX_PATHNAME_LEN] = ""; - CHAR szCmdLine[MAX_PATHNAME_LEN] = ""; - CHAR szIconFile[MAX_PATHNAME_LEN] = ""; - CHAR szWorkDir[MAX_PATHNAME_LEN] = ""; - HICON hIcon = 0; + HICON hIcon = NULL; + INT nIconIndex = 0; + INT nHotKey = 0; + INT nCmdShow = SW_SHOWNORMAL; + BOOL bNewVDM = FALSE; + WCHAR szTitle[MAX_PATHNAME_LEN] = L""; + WCHAR szCmdLine[MAX_PATHNAME_LEN] = L""; + WCHAR szIconFile[MAX_PATHNAME_LEN] = L""; + WCHAR szWorkDir[MAX_PATHNAME_LEN] = L""; - if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile, - &hIcon, &nIconIndex, &nHotKey, - &nCmdShow, MAX_PATHNAME_LEN)) - return; + if (!DIALOG_ProgramAttributes(szTitle, szCmdLine, szWorkDir, szIconFile, + &hIcon, &nIconIndex, &nHotKey, &nCmdShow, &bNewVDM, + MAX_PATHNAME_LEN)) + { + return; + } - if (!hIcon) hIcon = LoadIconW(0, (LPWSTR)IDI_WINLOGO); + if (!hIcon) + hIcon = LoadIconW(NULL, MAKEINTRESOURCEW(IDI_WINLOGO)); + if (!PROGRAM_AddProgram(hGroup, hIcon, szTitle, -1, -1, szCmdLine, szIconFile, + nIconIndex, szWorkDir, nHotKey, nCmdShow, bNewVDM)) + { + return; + } - if (!PROGRAM_AddProgram(hGroup, hIcon, szName, 0, 0, szCmdLine, szIconFile, - nIconIndex, szWorkDir, nHotKey, nCmdShow)) - return; - - GRPFILE_WriteGroupFile(hGroup); + GRPFILE_WriteGroupFile(hGroup); } /*********************************************************************** @@ -121,36 +113,39 @@ VOID PROGRAM_NewProgram(HLOCAL hGroup) * PROGRAM_ModifyProgram */ -VOID PROGRAM_ModifyProgram(HLOCAL hProgram) +VOID PROGRAM_ModifyProgram(PROGRAM* hProgram) { - PROGRAM *program = LocalLock(hProgram); - CHAR szName[MAX_PATHNAME_LEN]; - CHAR szCmdLine[MAX_PATHNAME_LEN]; - CHAR szIconFile[MAX_PATHNAME_LEN]; - CHAR szWorkDir[MAX_PATHNAME_LEN]; + LVITEMW lvItem; + WCHAR szName[MAX_PATHNAME_LEN]; + WCHAR szWorkDir[MAX_PATHNAME_LEN]; + WCHAR szCmdLine[MAX_PATHNAME_LEN]; + WCHAR szIconFile[MAX_PATHNAME_LEN]; - lstrcpynA(szName, LocalLock(program->hName), MAX_PATHNAME_LEN); - lstrcpynA(szCmdLine, LocalLock(program->hCmdLine), MAX_PATHNAME_LEN); - lstrcpynA(szIconFile, LocalLock(program->hIconFile), MAX_PATHNAME_LEN); - lstrcpynA(szWorkDir, LocalLock(program->hWorkDir), MAX_PATHNAME_LEN); + lstrcpynW(szName , hProgram->hName , ARRAYSIZE(szName)); + lstrcpynW(szCmdLine , hProgram->hCmdLine , ARRAYSIZE(szCmdLine)); + lstrcpynW(szIconFile, hProgram->hIconFile, ARRAYSIZE(szIconFile)); + lstrcpynW(szWorkDir , hProgram->hWorkDir , ARRAYSIZE(szWorkDir)); - if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile, - &program->hIcon, &program->nIconIndex, - &program->nHotKey, &program->nCmdShow, - MAX_PATHNAME_LEN)) - return; + if (!DIALOG_ProgramAttributes(szName, szCmdLine, szWorkDir, szIconFile, + &hProgram->hIcon, &hProgram->nIconIndex, + &hProgram->nHotKey, &hProgram->nCmdShow, + &hProgram->bNewVDM, MAX_PATHNAME_LEN)) + { + return; + } - MAIN_ReplaceString(&program->hName, szName); - MAIN_ReplaceString(&program->hCmdLine, szCmdLine); - MAIN_ReplaceString(&program->hIconFile, szIconFile); - MAIN_ReplaceString(&program->hWorkDir, szWorkDir); + MAIN_ReplaceString(&hProgram->hName , szName); + MAIN_ReplaceString(&hProgram->hCmdLine , szCmdLine); + MAIN_ReplaceString(&hProgram->hIconFile, szIconFile); + MAIN_ReplaceString(&hProgram->hWorkDir , szWorkDir); - SetWindowTextA(program->hWnd, szName); - UpdateWindow(program->hWnd); + ZeroMemory(&lvItem, sizeof(lvItem)); + lvItem.mask = LVIF_TEXT; + lvItem.iSubItem = 0; + lvItem.pszText = szName; + SendMessageW(hProgram->hGroup->hListView, LVM_SETITEMTEXTW, hProgram->iItem, (LPARAM)&lvItem); - GRPFILE_WriteGroupFile(program->hGroup); - - return; + GRPFILE_WriteGroupFile(hProgram->hGroup); } /*********************************************************************** @@ -158,106 +153,117 @@ VOID PROGRAM_ModifyProgram(HLOCAL hProgram) * PROGRAM_AddProgram */ -HLOCAL PROGRAM_AddProgram(HLOCAL hGroup, HICON hIcon, LPCSTR lpszName, - INT x, INT y, LPCSTR lpszCmdLine, - LPCSTR lpszIconFile, INT nIconIndex, - LPCSTR lpszWorkDir, INT nHotKey, INT nCmdShow) +PROGRAM* +PROGRAM_AddProgram(PROGGROUP* hGroup, HICON hIcon, LPCWSTR lpszName, + INT x, INT y, LPCWSTR lpszCmdLine, LPCWSTR lpszIconFile, INT nIconIndex, + LPCWSTR lpszWorkDir, INT nHotKey, INT nCmdShow, BOOL bNewVDM) { - PROGGROUP *group = LocalLock(hGroup); - PROGRAM *program; - HLOCAL hPrior, *p; - HLOCAL hProgram = LocalAlloc(LMEM_FIXED, sizeof(PROGRAM)); - HLOCAL hName = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszName)); - HLOCAL hCmdLine = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszCmdLine)); - HLOCAL hIconFile = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszIconFile)); - HLOCAL hWorkDir = LocalAlloc(LMEM_FIXED, 1 + strlen(lpszWorkDir)); - if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir) + PROGRAM* hProgram; + PROGRAM* hPrior; + PROGRAM** p; + LPWSTR hCmdLine; + LPWSTR hIconFile; + LPWSTR hName; + LPWSTR hWorkDir; + LVITEMW lvItem; + INT iItem; + + hProgram = Alloc(HEAP_ZERO_MEMORY, sizeof(*hProgram)); + hName = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszName) + 1) * sizeof(WCHAR)); + hCmdLine = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR)); + hIconFile = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR)); + hWorkDir = Alloc(HEAP_ZERO_MEMORY, (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR)); + if (!hProgram || !hName || !hCmdLine || !hIconFile || !hWorkDir) { - MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); - if (hProgram) LocalFree(hProgram); - if (hName) LocalFree(hName); - if (hCmdLine) LocalFree(hCmdLine); - if (hIconFile) LocalFree(hIconFile); - if (hWorkDir) LocalFree(hWorkDir); - return(0); + MAIN_MessageBoxIDS(IDS_OUT_OF_MEMORY, IDS_ERROR, MB_OK); + if (hProgram) Free(hProgram); + if (hName) Free(hName); + if (hCmdLine) Free(hCmdLine); + if (hIconFile) Free(hIconFile); + if (hWorkDir) Free(hWorkDir); + return NULL; } - memcpy(LocalLock(hName), lpszName, 1 + strlen(lpszName)); - memcpy(LocalLock(hCmdLine), lpszCmdLine, 1 + strlen(lpszCmdLine)); - memcpy(LocalLock(hIconFile), lpszIconFile, 1 + strlen(lpszIconFile)); - memcpy(LocalLock(hWorkDir), lpszWorkDir, 1 + strlen(lpszWorkDir)); + memcpy(hName , lpszName , (wcslen(lpszName) + 1) * sizeof(WCHAR)); + memcpy(hCmdLine , lpszCmdLine , (wcslen(lpszCmdLine) + 1) * sizeof(WCHAR)); + memcpy(hIconFile, lpszIconFile, (wcslen(lpszIconFile) + 1) * sizeof(WCHAR)); + memcpy(hWorkDir , lpszWorkDir , (wcslen(lpszWorkDir) + 1) * sizeof(WCHAR)); - group->hActiveProgram = hProgram; + hGroup->hActiveProgram = hProgram; - hPrior = 0; - p = &group->hPrograms; - while (*p) - { - hPrior = *p; - p = &((PROGRAM*)LocalLock(hPrior))->hNext; - } - *p = hProgram; + hPrior = NULL; + for (p = &hGroup->hPrograms; *p; p = &hPrior->hNext) + hPrior = *p; + *p = hProgram; - program = LocalLock(hProgram); - program->hGroup = hGroup; - program->hPrior = hPrior; - program->hNext = 0; - program->hName = hName; - program->hCmdLine = hCmdLine; - program->hIconFile = hIconFile; - program->nIconIndex = nIconIndex; - program->hWorkDir = hWorkDir; - program->hIcon = hIcon; - program->nCmdShow = nCmdShow; - program->nHotKey = nHotKey; + hProgram->hGroup = hGroup; + hProgram->hPrior = hPrior; + hProgram->hNext = NULL; + hProgram->hName = hName; + hProgram->hCmdLine = hCmdLine; + hProgram->hIconFile = hIconFile; + hProgram->nIconIndex = nIconIndex; + hProgram->hWorkDir = hWorkDir; + hProgram->hIcon = hIcon; + hProgram->nCmdShow = nCmdShow; + hProgram->nHotKey = nHotKey; + hProgram->bNewVDM = bNewVDM; + hProgram->TagsSize = 0; + hProgram->Tags = NULL; - program->hWnd = - CreateWindowW(STRING_PROGRAM_WIN_CLASS_NAME, NULL, - WS_CHILD | WS_CAPTION, - x, y, CW_USEDEFAULT, CW_USEDEFAULT, - group->hWnd, 0, Globals.hInstance, 0); + ZeroMemory(&lvItem, sizeof(lvItem)); + lvItem.mask = LVIF_PARAM | LVIF_IMAGE | LVIF_TEXT; + lvItem.pszText = (LPWSTR)lpszName; + lvItem.lParam = (LPARAM)hProgram; + lvItem.iImage = ImageList_ReplaceIcon(hGroup->hListLarge, -1, hIcon); + DestroyIcon(hIcon); - SetWindowTextA(program->hWnd, lpszName); - SetWindowLongPtrW(program->hWnd, 0, (LONG_PTR) hProgram); + lvItem.iItem = SendMessageA(hGroup->hListView, LVM_GETITEMCOUNT, 0, 0); + iItem = SendMessageW(hGroup->hListView, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); + hProgram->iItem = iItem; + if (x != -1 && y != -1) + SendMessageA(hGroup->hListView, LVM_SETITEMPOSITION, lvItem.iItem, MAKELPARAM(x, y)); - ShowWindow (program->hWnd, SW_SHOWMINIMIZED); - SetWindowPos (program->hWnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); - UpdateWindow (program->hWnd); - - return hProgram; + return hProgram; } + + /*********************************************************************** * * PROGRAM_CopyMoveProgram */ -VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove) +VOID PROGRAM_CopyMoveProgram(PROGRAM* hProgram, BOOL bMove) { - PROGRAM *program = LocalLock(hProgram); - PROGGROUP *fromgroup = LocalLock(program->hGroup); - HLOCAL hGroup = DIALOG_CopyMove(LocalLock(program->hName), - LocalLock(fromgroup->hName), bMove); - if (!hGroup) return; + PROGGROUP* hGroup; - /* FIXME shouldn't be necessary */ - OpenIcon(((PROGGROUP*)LocalLock(hGroup))->hWnd); + hGroup = DIALOG_CopyMove(hProgram, bMove); + if (!hGroup) + return; - if (!PROGRAM_AddProgram(hGroup, -#if 0 - CopyIcon(program->hIcon), -#else - program->hIcon, -#endif - LocalLock(program->hName), - program->x, program->y, - LocalLock(program->hCmdLine), - LocalLock(program->hIconFile), - program->nIconIndex, - LocalLock(program->hWorkDir), - program->nHotKey, program->nCmdShow)) return; - GRPFILE_WriteGroupFile(hGroup); + /* FIXME: shouldn't be necessary */ + OpenIcon(hGroup->hWnd); - if (bMove) PROGRAM_DeleteProgram(hProgram, TRUE); + if (!PROGRAM_AddProgram(hGroup, + hProgram->hIcon, + hProgram->hName, + hProgram->x, + hProgram->y, + hProgram->hCmdLine, + hProgram->hIconFile, + hProgram->nIconIndex, + hProgram->hWorkDir, + hProgram->nHotKey, + hProgram->nCmdShow, + hProgram->bNewVDM)) + { + return; + } + + GRPFILE_WriteGroupFile(hGroup); + + if (bMove) + PROGRAM_DeleteProgram(hProgram, TRUE); } /*********************************************************************** @@ -265,15 +271,14 @@ VOID PROGRAM_CopyMoveProgram(HLOCAL hProgram, BOOL bMove) * PROGRAM_ExecuteProgram */ -VOID PROGRAM_ExecuteProgram(HLOCAL hProgram) +VOID PROGRAM_ExecuteProgram(PROGRAM* hProgram) { - PROGRAM *program = LocalLock(hProgram); - LPSTR lpszCmdLine = LocalLock(program->hCmdLine); + // TODO: Use a (private?) shell API with which one can use hProgram->bNewVDM - /* FIXME set working directory from program->hWorkDir */ + ShellExecuteW(NULL, NULL, hProgram->hCmdLine, NULL, hProgram->hWorkDir, hProgram->nCmdShow); - WinExec(lpszCmdLine, program->nCmdShow); - if (Globals.bMinOnRun) CloseWindow(Globals.hMainWnd); + if (Globals.bMinOnRun) + CloseWindow(Globals.hMainWnd); } /*********************************************************************** @@ -281,86 +286,51 @@ VOID PROGRAM_ExecuteProgram(HLOCAL hProgram) * PROGRAM_DeleteProgram */ -VOID PROGRAM_DeleteProgram(HLOCAL hProgram, BOOL bUpdateGrpFile) +VOID PROGRAM_DeleteProgram(PROGRAM* hProgram, BOOL bUpdateGrpFile) { - PROGRAM *program = LocalLock(hProgram); - PROGGROUP *group = LocalLock(program->hGroup); + PROGGROUP* group; - group->hActiveProgram = 0; + group = hProgram->hGroup; + if (hProgram->hGroup->hActiveProgram == hProgram) + group->hActiveProgram = NULL; - if (program->hPrior) - ((PROGRAM*)LocalLock(program->hPrior))->hNext = program->hNext; - else - ((PROGGROUP*)LocalLock(program->hGroup))->hPrograms = program->hNext; + SendMessageA(group->hListView, LVM_DELETEITEM, hProgram->iItem, 0); - if (program->hNext) - ((PROGRAM*)LocalLock(program->hNext))->hPrior = program->hPrior; + if (hProgram->hPrior) + hProgram->hPrior->hNext = hProgram->hNext; + else + hProgram->hGroup->hPrograms = hProgram->hNext; - if (bUpdateGrpFile) - GRPFILE_WriteGroupFile(program->hGroup); + if (hProgram->hNext) + hProgram->hNext->hPrior = hProgram->hPrior; + + if (bUpdateGrpFile) + GRPFILE_WriteGroupFile(hProgram->hGroup); - DestroyWindow(program->hWnd); #if 0 - if (program->hIcon) - DestroyIcon(program->hIcon); + DestroyWindow(program->hWnd); + if (program->hIcon) + DestroyIcon(program->hIcon); #endif - LocalFree(program->hName); - LocalFree(program->hCmdLine); - LocalFree(program->hIconFile); - LocalFree(program->hWorkDir); - LocalFree(hProgram); + + if (hProgram->Tags) + Free(hProgram->Tags); + Free(hProgram->hName); + Free(hProgram->hCmdLine); + Free(hProgram->hIconFile); + Free(hProgram->hWorkDir); + Free(hProgram); } -/*********************************************************************** - * - * PROGRAM_FirstProgram - */ - -HLOCAL PROGRAM_FirstProgram(HLOCAL hGroup) -{ - PROGGROUP *group; - if (!hGroup) return(0); - group = LocalLock(hGroup); - return(group->hPrograms); -} - -/*********************************************************************** - * - * PROGRAM_NextProgram - */ - -HLOCAL PROGRAM_NextProgram(HLOCAL hProgram) -{ - PROGRAM *program; - if (!hProgram) return(0); - program = LocalLock(hProgram); - return(program->hNext); -} /*********************************************************************** * * PROGRAM_ActiveProgram */ -HLOCAL PROGRAM_ActiveProgram(HLOCAL hGroup) +PROGRAM* PROGRAM_ActiveProgram(PROGGROUP* hGroup) { - PROGGROUP *group; - if (!hGroup) return(0); - group = LocalLock(hGroup); - if (IsIconic(group->hWnd)) return(0); - - return(group->hActiveProgram); -} - -/*********************************************************************** - * - * PROGRAM_ProgramName - */ - -LPCSTR PROGRAM_ProgramName(HLOCAL hProgram) -{ - PROGRAM *program; - if (!hProgram) return(0); - program = LocalLock(hProgram); - return(LocalLock(program->hName)); + if (!hGroup) return NULL; + if (IsIconic(hGroup->hWnd)) return NULL; + return hGroup->hActiveProgram; } diff --git a/reactos/base/shell/progman/resource.h b/reactos/base/shell/progman/resource.h index b1c07d28409..ad9b77cc5eb 100644 --- a/reactos/base/shell/progman/resource.h +++ b/reactos/base/shell/progman/resource.h @@ -19,26 +19,34 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/resource.h + * PURPOSE: ProgMan resource header + * PROGRAMMERS: Ulrich Schmid + * Sylvain Petreolle + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #pragma once -/* Icon */ -#define IDI_APPICON 1 +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif -/* Resource names */ -#define IDD_MAIN 1 -#define IDD_NEW 2 -#define IDD_OPEN 3 -#define IDD_MOVE 4 -#define IDD_COPY 5 -#define IDD_DELETE 6 -#define IDD_GROUP 7 -#define IDD_PROGRAM 8 -#define IDD_SYMBOL 9 -#define IDD_EXECUTE 10 +/* Icons */ +#define IDI_APPICON 1 +#define IDI_GROUP_PERSONAL_ICON 8 +#define IDI_GROUP_COMMON_ICON 9 +#define IDI_ROSLOGO 10 +#define IDI_GROUP_ICON 48 +#define IDI_TERMINAL 49 +/* Accelerators */ #define IDA_ACCEL 1 -/* Stringtable index */ +/* String table index */ #define IDS_PROGRAM_MANAGER 0x02 #define IDS_ERROR 0x03 #define IDS_WARNING 0x04 @@ -46,21 +54,22 @@ #define IDS_DELETE 0x06 #define IDS_DELETE_GROUP_s 0x07 #define IDS_DELETE_PROGRAM_s 0x08 -#define IDS_NOT_IMPLEMENTED 0x09 -#define IDS_FILE_READ_ERROR_s 0x0a -#define IDS_FILE_WRITE_ERROR_s 0x0b -#define IDS_GRPFILE_READ_ERROR_s 0x0c -#define IDS_OUT_OF_MEMORY 0x0d -#define IDS_WINHELP_ERROR 0x0e -#define IDS_UNKNOWN_FEATURE_s 0x0f -#define IDS_FILE_NOT_OVERWRITTEN_s 0x10 -#define IDS_SAVE_GROUP_AS_s 0x11 -#define IDS_NO_HOT_KEY 0x12 -#define IDS_ALL_FILES 0x13 -#define IDS_PROGRAMS 0x14 -#define IDS_LIBRARIES_DLL 0x15 -#define IDS_SYMBOL_FILES 0x16 -#define IDS_SYMBOLS_ICO 0x17 +#define IDS_MOVE_PROGRAM_1 0x09 // FIXME: rename me! +#define IDS_MOVE_PROGRAM_2 0x0a // FIXME: rename me! +#define IDS_NOT_IMPLEMENTED 0x0b +#define IDS_FILE_READ_ERROR_s 0x0c +#define IDS_FILE_WRITE_ERROR_s 0x0d +#define IDS_GRPFILE_READ_ERROR_s 0x0e +#define IDS_OUT_OF_MEMORY 0x0f +#define IDS_WINHELP_ERROR 0x10 +#define IDS_UNKNOWN_FEATURE_s 0x11 +#define IDS_FILE_NOT_OVERWRITTEN_s 0x12 +#define IDS_SAVE_GROUP_AS_s 0x13 +#define IDS_ALL_FILES 0x14 +#define IDS_PROGRAMS 0x15 +#define IDS_LIBRARIES_DLL 0x16 +#define IDS_SYMBOL_FILES 0x17 +#define IDS_SYMBOLS_ICO 0x18 /* Menu */ @@ -76,7 +85,8 @@ #define PM_AUTO_ARRANGE 0x110 #define PM_MIN_ON_RUN 0x111 -#define PM_SAVE_SETTINGS 0x113 +#define PM_SAVE_SETTINGS 0x112 +#define PM_SAVE_SETTINGS_NOW 0x113 #define PM_OVERLAP 0x120 #define PM_SIDE_BY_SIDE 0x121 @@ -89,51 +99,51 @@ */ #define PM_CONTENTS 0x131 +#define PM_ABOUT 0x142 -#define PM_ABOUT_WINE 0x142 + +/* Dialogs */ +#define IDD_MAIN 1 +#define IDD_NEW 2 +#define IDD_COPY_MOVE 4 +#define IDD_GROUP 6 +#define IDD_PROGRAM 7 +#define IDD_SYMBOL 8 +#define IDD_EXECUTE 9 /* Dialog `New' */ /* RADIOBUTTON: The next two must be in sequence */ #define PM_NEW_GROUP 0x150 #define PM_NEW_PROGRAM 0x151 -#define PM_NEW_GROUP_TXT 0x152 -#define PM_NEW_PROGRAM_TXT 0x153 +#define PM_PERSONAL_GROUP 1001 +#define PM_COMMON_GROUP 1002 +#define PM_FORMAT_TXT 1003 +#define PM_FORMAT 1004 /* Dialogs `Copy', `Move' */ - -#define PM_PROGRAM 0x160 -#define PM_FROM_GROUP 0x161 -#define PM_TO_GROUP 0x162 -#define PM_TO_GROUP_TXT 0x163 +#define PM_COPY_MOVE_TXT 0x160 +#define PM_PROGRAM 0x161 +#define PM_FROM_GROUP 0x162 +#define PM_TO_GROUP 0x163 /* Dialogs `Group attributes' */ - #define PM_DESCRIPTION 0x170 -#define PM_DESCRIPTION_TXT 0x171 #define PM_FILE 0x172 -#define PM_FILE_TXT 0x173 /* Dialogs `Program attributes' */ #define PM_COMMAND_LINE 0x180 -#define PM_COMMAND_LINE_TXT 0x181 #define PM_DIRECTORY 0x182 -#define PM_DIRECTORY_TXT 0x183 #define PM_HOT_KEY 0x184 -#define PM_HOT_KEY_TXT 0x185 #define PM_ICON 0x186 #define PM_OTHER_SYMBOL 0x187 /* Dialog `Symbol' */ - #define PM_ICON_FILE 0x190 -#define PM_ICON_FILE_TXT 0x191 #define PM_SYMBOL_LIST 0x192 -#define PM_SYMBOL_LIST_TXT 0x193 /* Dialog `Execute' */ - -#define PM_COMMAND 0x1a0 -#define PM_SYMBOL 0x1a1 -#define PM_BROWSE 0x1a2 -#define PM_HELP 0x1a3 +#define PM_COMMAND 0x1a0 // FIXME: May be merged with PM_COMMAND_LINE ? +#define PM_SYMBOL 0x1a1 // FIXME: Rename: PM_RUN_MINIMIZED +#define PM_NEW_VDM 0x1a2 +#define PM_BROWSE 0x1a3 diff --git a/reactos/base/shell/progman/resource_2.h b/reactos/base/shell/progman/resource_2.h new file mode 100644 index 00000000000..981cc6ab2e1 --- /dev/null +++ b/reactos/base/shell/progman/resource_2.h @@ -0,0 +1,138 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by new_resources.rc +// + +#include + +#define IDHELP 9 + + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +/* Icons */ +#define IDI_APPICON 1 +#define IDI_GROUP_PERSONAL_ICON 8 +#define IDI_GROUP_COMMON_ICON 9 +#define IDI_ROSLOGO 10 +#define IDI_GROUP_ICON 48 +#define IDI_TERMINAL 49 + +/* Accelerators */ +#define IDA_ACCEL 1 + +/* String table index */ +#define IDS_PROGRAM_MANAGER 0x02 +#define IDS_ERROR 0x03 +#define IDS_WARNING 0x04 +#define IDS_INFO 0x05 +#define IDS_DELETE 0x06 +#define IDS_DELETE_GROUP_s 0x07 +#define IDS_DELETE_PROGRAM_s 0x08 +#define IDS_MOVE_PROGRAM_1 0x09 // FIXME: rename me! +#define IDS_MOVE_PROGRAM_2 0x0a // FIXME: rename me! +#define IDS_NOT_IMPLEMENTED 0x0b +#define IDS_FILE_READ_ERROR_s 0x0c +#define IDS_FILE_WRITE_ERROR_s 0x0d +#define IDS_GRPFILE_READ_ERROR_s 0x0e +#define IDS_OUT_OF_MEMORY 0x0f +#define IDS_WINHELP_ERROR 0x10 +#define IDS_UNKNOWN_FEATURE_s 0x11 +#define IDS_FILE_NOT_OVERWRITTEN_s 0x12 +#define IDS_SAVE_GROUP_AS_s 0x13 +#define IDS_ALL_FILES 0x14 +#define IDS_PROGRAMS 0x15 +#define IDS_LIBRARIES_DLL 0x16 +#define IDS_SYMBOL_FILES 0x17 +#define IDS_SYMBOLS_ICO 0x18 + +/* Menu */ + +#define MAIN_MENU 0x109 +#define PM_NEW 0x100 +#define PM_OPEN 0x101 +#define PM_MOVE 0x102 +#define PM_COPY 0x103 +#define PM_DELETE 0x104 +#define PM_ATTRIBUTES 0x105 +#define PM_EXECUTE 0x107 +#define PM_EXIT 0x108 + +#define PM_AUTO_ARRANGE 0x110 +#define PM_MIN_ON_RUN 0x111 +#define PM_SAVE_SETTINGS 0x112 +#define PM_SAVE_SETTINGS_NOW 0x113 + +#define PM_OVERLAP 0x120 +#define PM_SIDE_BY_SIDE 0x121 +#define PM_ARRANGE 0x122 +#define PM_FIRST_CHILD 0x3030 + +/* + *#define PM_FIRST_LANGUAGE 0x400 + *#define PM_LAST_LANGUAGE 0x499 + */ + +#define PM_CONTENTS 0x131 +#define PM_ABOUT 0x142 + + +/* Dialogs */ +#define IDD_MAIN 1 +#define IDD_NEW 2 +#define IDD_COPY_MOVE 4 +#define IDD_GROUP 6 +#define IDD_PROGRAM 7 +#define IDD_SYMBOL 8 +#define IDD_EXECUTE 9 + +/* Dialog `New' */ + +/* RADIOBUTTON: The next two must be in sequence */ +#define PM_NEW_GROUP 0x150 +#define PM_NEW_PROGRAM 0x151 +#define PM_PERSONAL_GROUP 1001 +#define PM_COMMON_GROUP 1002 +#define PM_FORMAT_TXT 1003 +#define PM_FORMAT 1004 + +/* Dialogs `Copy', `Move' */ +#define PM_COPY_MOVE_TXT 0x160 +#define PM_PROGRAM 0x161 +#define PM_FROM_GROUP 0x162 +#define PM_TO_GROUP 0x163 + +/* Dialogs `Group attributes' */ +#define PM_DESCRIPTION 0x170 +#define PM_FILE 0x172 + +/* Dialogs `Program attributes' */ +#define PM_COMMAND_LINE 0x180 +#define PM_DIRECTORY 0x182 +#define PM_HOT_KEY 0x184 +#define PM_ICON 0x186 +#define PM_OTHER_SYMBOL 0x187 + +/* Dialog `Symbol' */ +#define PM_ICON_FILE 0x190 +#define PM_SYMBOL_LIST 0x192 + +/* Dialog `Execute' */ +#define PM_COMMAND 0x1a0 // FIXME: May be merged with PM_COMMAND_LINE ? +#define PM_SYMBOL 0x1a1 // FIXME: Rename: PM_RUN_MINIMIZED +#define PM_NEW_VDM 0x1a2 +#define PM_BROWSE 0x1a3 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40002 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/reactos/base/shell/progman/string.c b/reactos/base/shell/progman/string.c index b60bf72fa61..5a753261ce4 100644 --- a/reactos/base/shell/progman/string.c +++ b/reactos/base/shell/progman/string.c @@ -19,47 +19,43 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* + * PROJECT: ReactOS Program Manager + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: base/shell/progman/string.c + * PURPOSE: String utility functions + * PROGRAMMERS: Ulrich Schmid + * Sylvain Petreolle + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + #include "progman.h" -/* Class names */ +WCHAR szTitle[256]; // MAX_STRING_LEN ? -WCHAR STRING_MAIN_WIN_CLASS_NAME[] = {'P','M','M','a','i','n',0}; -WCHAR STRING_MDI_WIN_CLASS_NAME[] = {'M','D','I','C','L','I','E','N','T',0}; -WCHAR STRING_GROUP_WIN_CLASS_NAME[] = {'P','M','G','r','o','u','p',0}; -WCHAR STRING_PROGRAM_WIN_CLASS_NAME[] = {'P','M','P','r','o','g','r','a','m',0}; +VOID STRING_LoadStrings(VOID) +{ + LoadStringW(Globals.hInstance, IDS_PROGRAM_MANAGER, szTitle, ARRAYSIZE(szTitle)); +} VOID STRING_LoadMenus(VOID) { -#ifdef __REACTOS__ - WCHAR caption[MAX_STRING_LEN]; -#else - CHAR caption[MAX_STRING_LEN]; -#endif - HMENU hMainMenu; + HMENU hMainMenu; - /* Set frame caption */ -#ifdef __REACTOS__ - LoadStringW(Globals.hInstance, IDS_PROGRAM_MANAGER, caption, sizeof(caption)); - SetWindowTextW(Globals.hMainWnd, caption); -#else - LoadStringA(Globals.hInstance, IDS_PROGRAM_MANAGER, caption, sizeof(caption)); - SetWindowTextA(Globals.hMainWnd, caption); -#endif + /* Create the menu */ + hMainMenu = LoadMenuW(Globals.hInstance, MAKEINTRESOURCEW(MAIN_MENU)); + Globals.hFileMenu = GetSubMenu(hMainMenu, 0); + Globals.hOptionMenu = GetSubMenu(hMainMenu, 1); + Globals.hWindowsMenu = GetSubMenu(hMainMenu, 2); + Globals.hLanguageMenu = GetSubMenu(hMainMenu, 3); - /* Create menu */ - hMainMenu = LoadMenuW(Globals.hInstance, MAKEINTRESOURCEW(MAIN_MENU)); - Globals.hFileMenu = GetSubMenu(hMainMenu, 0); - Globals.hOptionMenu = GetSubMenu(hMainMenu, 1); - Globals.hWindowsMenu = GetSubMenu(hMainMenu, 2); - Globals.hLanguageMenu = GetSubMenu(hMainMenu, 3); + if (Globals.hMDIWnd) + SendMessageW(Globals.hMDIWnd, WM_MDISETMENU, (WPARAM)hMainMenu, (LPARAM)Globals.hWindowsMenu); + else + SetMenu(Globals.hMainWnd, hMainMenu); - if (Globals.hMDIWnd) - SendMessageW(Globals.hMDIWnd, WM_MDISETMENU, - (WPARAM) hMainMenu, - (LPARAM) Globals.hWindowsMenu); - else SetMenu(Globals.hMainWnd, hMainMenu); - - /* Destroy old menu */ - if (Globals.hMainMenu) DestroyMenu(Globals.hMainMenu); - Globals.hMainMenu = hMainMenu; + /* Destroy the old menu */ + if (Globals.hMainMenu) + DestroyMenu(Globals.hMainMenu); + Globals.hMainMenu = hMainMenu; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 8e2dc3ab15e..32c6d629fe4 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -242,7 +242,7 @@ reactos/base/applications/regedit # Out of sync reactos/base/applications/winhlp32 # Synced to WineStaging-1.9.4 reactos/base/applications/wordpad # Synced to WineStaging-1.9.4 reactos/base/services/rpcss # Synced to WineStaging-1.9.4 -reactos/base/shell/progman # Synced to WineStaging-1.9.4 +reactos/base/shell/progman # Forked at WineStaging-1.9.4 reactos/base/system/expand # Synced to WineStaging-1.9.4 reactos/base/system/msiexec # Synced to WineStaging-1.9.4 reactos/modules/rosapps/winfile # Autosync