Synchronize with trunk revision 59781.
[reactos.git] / base / applications / rapps / settingsdlg.c
1 /*
2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/rapps/settingsdlg.c
5 * PURPOSE: Settings Dialog
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
7 */
8
9 #define _WIN32_DCOM // For CoInitializeEx, etc...
10 #include "rapps.h"
11
12 SETTINGS_INFO NewSettingsInfo;
13
14 #define IS_CHECKED(a, b) \
15 a = (SendDlgItemMessage(hDlg, b, BM_GETCHECK, 0, 0) == BST_CHECKED) ? TRUE : FALSE
16
17 BOOL
18 ChooseFolder(HWND hwnd)
19 {
20 BOOL bRet = FALSE;
21 BROWSEINFO bi;
22 WCHAR szPath[MAX_PATH], szBuf[MAX_STR_LEN];
23
24 LoadStringW(hInst, IDS_CHOOSE_FOLDER_TEXT, szBuf, sizeof(szBuf) / sizeof(TCHAR));
25
26 ZeroMemory(&bi, sizeof(bi));
27 bi.hwndOwner = hwnd;
28 bi.pidlRoot = NULL;
29 bi.lpszTitle = szBuf;
30 bi.ulFlags = BIF_USENEWUI | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | /* BIF_BROWSEFILEJUNCTIONS | */ BIF_VALIDATE;
31
32 if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
33 {
34 LPITEMIDLIST lpItemList = SHBrowseForFolder(&bi);
35 if (lpItemList && SHGetPathFromIDList(lpItemList, szPath))
36 {
37 if (szPath[0] != 0)
38 {
39 SetDlgItemTextW(hwnd, IDC_DOWNLOAD_DIR_EDIT, szPath);
40 bRet = TRUE;
41 }
42 }
43
44 CoTaskMemFree(lpItemList);
45 CoUninitialize();
46 }
47
48 return bRet;
49 }
50
51 static VOID
52 InitSettingsControls(HWND hDlg, SETTINGS_INFO Info)
53 {
54 SendDlgItemMessage(hDlg, IDC_SAVE_WINDOW_POS, BM_SETCHECK, Info.bSaveWndPos, 0);
55 SendDlgItemMessage(hDlg, IDC_UPDATE_AVLIST, BM_SETCHECK, Info.bUpdateAtStart, 0);
56 SendDlgItemMessage(hDlg, IDC_LOG_ENABLED, BM_SETCHECK, Info.bLogEnabled, 0);
57 SendDlgItemMessage(hDlg, IDC_DEL_AFTER_INSTALL, BM_SETCHECK, Info.bDelInstaller, 0);
58
59 SetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
60 Info.szDownloadDir);
61 }
62
63 static
64 INT_PTR CALLBACK
65 SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
66 {
67 switch (Msg)
68 {
69 case WM_INITDIALOG:
70 {
71 NewSettingsInfo = SettingsInfo;
72 InitSettingsControls(hDlg, SettingsInfo);
73 }
74 break;
75
76 case WM_COMMAND:
77 {
78 switch (LOWORD(wParam))
79 {
80 case IDC_CHOOSE:
81 ChooseFolder(hDlg);
82 break;
83
84 case IDC_SAVE_WINDOW_POS:
85 IS_CHECKED(NewSettingsInfo.bSaveWndPos, IDC_SAVE_WINDOW_POS);
86 break;
87
88 case IDC_UPDATE_AVLIST:
89 IS_CHECKED(NewSettingsInfo.bUpdateAtStart, IDC_UPDATE_AVLIST);
90 break;
91
92 case IDC_LOG_ENABLED:
93 IS_CHECKED(NewSettingsInfo.bLogEnabled, IDC_LOG_ENABLED);
94 break;
95
96 case IDC_DEL_AFTER_INSTALL:
97 IS_CHECKED(NewSettingsInfo.bDelInstaller, IDC_DEL_AFTER_INSTALL);
98 break;
99
100 case IDC_DEFAULT_SETTINGS:
101 FillDefaultSettings(&NewSettingsInfo);
102 InitSettingsControls(hDlg, NewSettingsInfo);
103 break;
104
105 case IDOK:
106 {
107 WCHAR szDir[MAX_PATH];
108 DWORD dwAttr;
109
110 GetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
111 szDir, MAX_PATH);
112
113 dwAttr = GetFileAttributesW(szDir);
114 if (dwAttr != INVALID_FILE_ATTRIBUTES &&
115 (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
116 {
117 wcscpy(NewSettingsInfo.szDownloadDir, szDir);
118 }
119 else
120 {
121 WCHAR szMsgText[MAX_STR_LEN];
122
123 LoadStringW(hInst,
124 IDS_CHOOSE_FOLDER_ERROR,
125 szMsgText, sizeof(szMsgText) / sizeof(WCHAR));
126
127 if (MessageBoxW(hDlg, szMsgText, NULL, MB_YESNO) == IDYES)
128 {
129 if (CreateDirectoryW(szDir, NULL))
130 {
131 EndDialog(hDlg, LOWORD(wParam));
132 }
133 }
134
135 SetFocus(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT));
136 break;
137 }
138
139 SettingsInfo = NewSettingsInfo;
140 SaveSettings(GetParent(hDlg));
141 EndDialog(hDlg, LOWORD(wParam));
142 }
143 break;
144
145 case IDCANCEL:
146 EndDialog(hDlg, LOWORD(wParam));
147 break;
148 }
149 }
150 break;
151 }
152
153 return FALSE;
154 }
155
156 VOID
157 CreateSettingsDlg(HWND hwnd)
158 {
159 DialogBoxW(hInst,
160 MAKEINTRESOURCEW(IDD_SETTINGS_DIALOG),
161 hwnd,
162 SettingsDlgProc);
163 }