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