[RAPPS]
[reactos.git] / reactos / base / applications / rapps / settingsdlg.cpp
1 /*
2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * FILE: base/applications/rapps/settingsdlg.cpp
5 * PURPOSE: Settings Dialog
6 * COPYRIGHT: Copyright 2009 Dmitry Chapyshev (dmitry@reactos.org)
7 * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
8 */
9 #include "rapps.h"
10
11 SETTINGS_INFO NewSettingsInfo;
12
13 BOOL ChooseFolder(HWND hwnd)
14 {
15 BOOL bRet = FALSE;
16 BROWSEINFOW bi;
17 ATL::CStringW szChooseFolderText;
18
19 szChooseFolderText.LoadStringW(IDS_CHOOSE_FOLDER_TEXT);
20
21 ZeroMemory(&bi, sizeof(bi));
22 bi.hwndOwner = hwnd;
23 bi.pidlRoot = NULL;
24 bi.lpszTitle = szChooseFolderText.GetString();
25 bi.ulFlags = BIF_USENEWUI | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | /* BIF_BROWSEFILEJUNCTIONS | */ BIF_VALIDATE;
26
27 if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
28 {
29 ATL::CStringW szBuf;
30
31 LPITEMIDLIST lpItemList = SHBrowseForFolderW(&bi);
32 if (lpItemList && SHGetPathFromIDListW(lpItemList, szBuf.GetBuffer(MAX_PATH)))
33 {
34 szBuf.ReleaseBuffer();
35 if (!szBuf.IsEmpty())
36 {
37 SetDlgItemTextW(hwnd, IDC_DOWNLOAD_DIR_EDIT, szBuf.GetString());
38 bRet = TRUE;
39 }
40 }
41 else
42 {
43 szBuf.ReleaseBuffer();
44 }
45
46 CoTaskMemFree(lpItemList);
47 CoUninitialize();
48 }
49
50 return bRet;
51 }
52
53 namespace
54 {
55 inline BOOL IsCheckedDlgItem(HWND hDlg, INT nIDDlgItem)
56 {
57 return (SendDlgItemMessageW(hDlg, nIDDlgItem, BM_GETCHECK, 0, 0) == BST_CHECKED) ? TRUE : FALSE;
58 }
59
60 VOID InitSettingsControls(HWND hDlg, PSETTINGS_INFO Info)
61 {
62 SendDlgItemMessageW(hDlg, IDC_SAVE_WINDOW_POS, BM_SETCHECK, Info->bSaveWndPos, 0);
63 SendDlgItemMessageW(hDlg, IDC_UPDATE_AVLIST, BM_SETCHECK, Info->bUpdateAtStart, 0);
64 SendDlgItemMessageW(hDlg, IDC_LOG_ENABLED, BM_SETCHECK, Info->bLogEnabled, 0);
65 SendDlgItemMessageW(hDlg, IDC_DEL_AFTER_INSTALL, BM_SETCHECK, Info->bDelInstaller, 0);
66
67 SetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
68 Info->szDownloadDir);
69
70 CheckRadioButton(hDlg, IDC_PROXY_DEFAULT, IDC_USE_PROXY, IDC_PROXY_DEFAULT + Info->Proxy);
71
72 if (IDC_PROXY_DEFAULT + Info->Proxy == IDC_USE_PROXY)
73 {
74 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), TRUE);
75 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), TRUE);
76 }
77
78 SetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER), Info->szProxyServer);
79 SetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), Info->szNoProxyFor);
80 }
81
82 INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
83 {
84 switch (Msg)
85 {
86 case WM_INITDIALOG:
87 {
88 NewSettingsInfo = SettingsInfo;
89 InitSettingsControls(hDlg, &SettingsInfo);
90 }
91 break;
92
93 case WM_COMMAND:
94 {
95 switch (LOWORD(wParam))
96 {
97 case IDC_CHOOSE:
98 ChooseFolder(hDlg);
99 break;
100
101 case IDC_SAVE_WINDOW_POS:
102 NewSettingsInfo.bSaveWndPos = IsCheckedDlgItem(hDlg, IDC_SAVE_WINDOW_POS);
103 break;
104
105 case IDC_UPDATE_AVLIST:
106 NewSettingsInfo.bUpdateAtStart = IsCheckedDlgItem(hDlg, IDC_UPDATE_AVLIST);
107 break;
108
109 case IDC_LOG_ENABLED:
110 NewSettingsInfo.bLogEnabled = IsCheckedDlgItem(hDlg, IDC_LOG_ENABLED);
111 break;
112
113 case IDC_DEL_AFTER_INSTALL:
114 NewSettingsInfo.bDelInstaller = IsCheckedDlgItem(hDlg, IDC_DEL_AFTER_INSTALL);
115 break;
116
117 case IDC_PROXY_DEFAULT:
118 NewSettingsInfo.Proxy = 0;
119 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
120 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
121 break;
122
123 case IDC_NO_PROXY:
124 NewSettingsInfo.Proxy = 1;
125 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
126 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
127 break;
128
129 case IDC_USE_PROXY:
130 NewSettingsInfo.Proxy = 2;
131 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), TRUE);
132 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), TRUE);
133 break;
134
135 case IDC_DEFAULT_SETTINGS:
136 FillDefaultSettings(&NewSettingsInfo);
137 InitSettingsControls(hDlg, &NewSettingsInfo);
138 break;
139
140 case IDOK:
141 {
142 ATL::CStringW szDir;
143 ATL::CStringW szProxy;
144 ATL::CStringW szNoProxy;
145 DWORD dwAttr;
146
147 GetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
148 szDir.GetBuffer(MAX_PATH), MAX_PATH);
149 szDir.ReleaseBuffer();
150
151 GetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER),
152 szProxy.GetBuffer(MAX_PATH), MAX_PATH);
153 szProxy.ReleaseBuffer();
154 ATL::CStringW::CopyChars(NewSettingsInfo.szProxyServer,
155 _countof(NewSettingsInfo.szProxyServer),
156 szProxy.GetString(),
157 szProxy.GetLength() + 1);
158
159 GetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR),
160 szNoProxy.GetBuffer(MAX_PATH), MAX_PATH);
161 szNoProxy.ReleaseBuffer();
162 ATL::CStringW::CopyChars(NewSettingsInfo.szNoProxyFor,
163 _countof(NewSettingsInfo.szNoProxyFor),
164 szNoProxy.GetString(),
165 szNoProxy.GetLength() + 1);
166
167 dwAttr = GetFileAttributesW(szDir.GetString());
168 if (dwAttr != INVALID_FILE_ATTRIBUTES &&
169 (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
170 {
171 ATL::CStringW::CopyChars(NewSettingsInfo.szDownloadDir,
172 _countof(NewSettingsInfo.szDownloadDir),
173 szDir.GetString(),
174 szDir.GetLength() + 1);
175 }
176 else
177 {
178 ATL::CStringW szMsgText;
179 szMsgText.LoadStringW(IDS_CHOOSE_FOLDER_ERROR);
180
181 if (MessageBoxW(hDlg, szMsgText.GetString(), NULL, MB_YESNO) == IDYES)
182 {
183 if (CreateDirectoryW(szDir.GetString(), NULL))
184 {
185 EndDialog(hDlg, LOWORD(wParam));
186 }
187 }
188 else
189 {
190 SetFocus(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT));
191 break;
192 }
193 }
194
195 SettingsInfo = NewSettingsInfo;
196 SaveSettings(GetParent(hDlg));
197 EndDialog(hDlg, LOWORD(wParam));
198 }
199 break;
200
201 case IDCANCEL:
202 EndDialog(hDlg, LOWORD(wParam));
203 break;
204 }
205 }
206 break;
207 }
208
209 return FALSE;
210 }
211 }
212
213 VOID CreateSettingsDlg(HWND hwnd)
214 {
215 DialogBoxW(hInst,
216 MAKEINTRESOURCEW(IDD_SETTINGS_DIALOG),
217 hwnd,
218 SettingsDlgProc);
219 }