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