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 (Info->Proxy == 2)
73         {
74             EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), TRUE);
75             EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), TRUE);
76         }
77         else
78         {
79             EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
80             EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
81         }
82 
83         SetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER), Info->szProxyServer);
84         SetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), Info->szNoProxyFor);
85     }
86 
87     INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
88     {
89         switch (Msg)
90         {
91         case WM_INITDIALOG:
92         {
93             NewSettingsInfo = SettingsInfo;
94             InitSettingsControls(hDlg, &SettingsInfo);
95         }
96         break;
97 
98         case WM_COMMAND:
99         {
100             switch (LOWORD(wParam))
101             {
102             case IDC_CHOOSE:
103                 ChooseFolder(hDlg);
104                 break;
105 
106             case IDC_SAVE_WINDOW_POS:
107                 NewSettingsInfo.bSaveWndPos = IsCheckedDlgItem(hDlg, IDC_SAVE_WINDOW_POS);
108                 break;
109 
110             case IDC_UPDATE_AVLIST:
111                 NewSettingsInfo.bUpdateAtStart = IsCheckedDlgItem(hDlg, IDC_UPDATE_AVLIST);
112                 break;
113 
114             case IDC_LOG_ENABLED:
115                 NewSettingsInfo.bLogEnabled = IsCheckedDlgItem(hDlg, IDC_LOG_ENABLED);
116                 break;
117 
118             case IDC_DEL_AFTER_INSTALL:
119                 NewSettingsInfo.bDelInstaller = IsCheckedDlgItem(hDlg, IDC_DEL_AFTER_INSTALL);
120                 break;
121 
122             case IDC_PROXY_DEFAULT:
123                 NewSettingsInfo.Proxy = 0;
124                 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
125                 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
126                 break;
127 
128             case IDC_NO_PROXY:
129                 NewSettingsInfo.Proxy = 1;
130                 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), FALSE);
131                 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), FALSE);
132                 break;
133 
134             case IDC_USE_PROXY:
135                 NewSettingsInfo.Proxy = 2;
136                 EnableWindow(GetDlgItem(hDlg, IDC_PROXY_SERVER), TRUE);
137                 EnableWindow(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), TRUE);
138                 break;
139 
140             case IDC_DEFAULT_SETTINGS:
141                 FillDefaultSettings(&NewSettingsInfo);
142                 InitSettingsControls(hDlg, &NewSettingsInfo);
143                 break;
144 
145             case IDOK:
146             {
147                 ATL::CStringW szDir;
148                 ATL::CStringW szProxy;
149                 ATL::CStringW szNoProxy;
150                 DWORD dwAttr;
151 
152                 GetWindowTextW(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT),
153                                szDir.GetBuffer(MAX_PATH), MAX_PATH);
154                 szDir.ReleaseBuffer();
155 
156                 GetWindowTextW(GetDlgItem(hDlg, IDC_PROXY_SERVER),
157                                szProxy.GetBuffer(MAX_PATH), MAX_PATH);
158                 szProxy.ReleaseBuffer();
159                 ATL::CStringW::CopyChars(NewSettingsInfo.szProxyServer,
160                                          _countof(NewSettingsInfo.szProxyServer),
161                                          szProxy.GetString(),
162                                          szProxy.GetLength() + 1);
163 
164                 GetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR),
165                                szNoProxy.GetBuffer(MAX_PATH), MAX_PATH);
166                 szNoProxy.ReleaseBuffer();
167                 ATL::CStringW::CopyChars(NewSettingsInfo.szNoProxyFor,
168                                          _countof(NewSettingsInfo.szNoProxyFor),
169                                          szNoProxy.GetString(),
170                                          szNoProxy.GetLength() + 1);
171 
172                 dwAttr = GetFileAttributesW(szDir.GetString());
173                 if (dwAttr != INVALID_FILE_ATTRIBUTES &&
174                     (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
175                 {
176                     ATL::CStringW::CopyChars(NewSettingsInfo.szDownloadDir,
177                                              _countof(NewSettingsInfo.szDownloadDir),
178                                              szDir.GetString(),
179                                              szDir.GetLength() + 1);
180                 }
181                 else
182                 {
183                     ATL::CStringW szMsgText;
184                     szMsgText.LoadStringW(IDS_CHOOSE_FOLDER_ERROR);
185 
186                     if (MessageBoxW(hDlg, szMsgText.GetString(), NULL, MB_YESNO) == IDYES)
187                     {
188                         if (CreateDirectoryW(szDir.GetString(), NULL))
189                         {
190                             EndDialog(hDlg, LOWORD(wParam));
191                         }
192                     }
193                     else
194                     {
195                         SetFocus(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT));
196                         break;
197                     }
198                 }
199 
200                 SettingsInfo = NewSettingsInfo;
201                 SaveSettings(GetParent(hDlg));
202                 EndDialog(hDlg, LOWORD(wParam));
203             }
204             break;
205 
206             case IDCANCEL:
207                 EndDialog(hDlg, LOWORD(wParam));
208                 break;
209             }
210         }
211         break;
212         }
213 
214         return FALSE;
215     }
216 }
217 
218 VOID CreateSettingsDlg(HWND hwnd)
219 {
220     DialogBoxW(hInst,
221                MAKEINTRESOURCEW(IDD_SETTINGS_DIALOG),
222                hwnd,
223                SettingsDlgProc);
224 }
225