| OLD | NEW |
| (Empty) |
| 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |
| 2 /* ***** BEGIN LICENSE BLOCK ***** | |
| 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | |
| 4 * | |
| 5 * The contents of this file are subject to the Mozilla Public License Version | |
| 6 * 1.1 (the "License"); you may not use this file except in compliance with | |
| 7 * the License. You may obtain a copy of the License at | |
| 8 * http://www.mozilla.org/MPL/ | |
| 9 * | |
| 10 * Software distributed under the License is distributed on an "AS IS" basis, | |
| 11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
| 12 * for the specific language governing rights and limitations under the | |
| 13 * License. | |
| 14 * | |
| 15 * The Original Code is mozilla.org code. | |
| 16 * | |
| 17 * The Initial Developer of the Original Code is | |
| 18 * Netscape Communications Corporation. | |
| 19 * Portions created by the Initial Developer are Copyright (C) 1998 | |
| 20 * the Initial Developer. All Rights Reserved. | |
| 21 * | |
| 22 * Contributor(s): | |
| 23 * | |
| 24 * Alternatively, the contents of this file may be used under the terms of | |
| 25 * either the GNU General Public License Version 2 or later (the "GPL"), or | |
| 26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | |
| 27 * in which case the provisions of the GPL or the LGPL are applicable instead | |
| 28 * of those above. If you wish to allow use of your version of this file only | |
| 29 * under the terms of either the GPL or the LGPL, and not to allow others to | |
| 30 * use your version of this file under the terms of the MPL, indicate your | |
| 31 * decision by deleting the provisions above and replace them with the notice | |
| 32 * and other provisions required by the GPL or the LGPL. If you do not delete | |
| 33 * the provisions above, a recipient may use your version of this file under | |
| 34 * the terms of any one of the MPL, the GPL or the LGPL. | |
| 35 * | |
| 36 * ***** END LICENSE BLOCK ***** */ | |
| 37 #define _CRT_SECURE_NO_DEPRECATE | |
| 38 | |
| 39 #include <windows.h> | |
| 40 #include <windowsx.h> | |
| 41 #include <direct.h> | |
| 42 #include <stdio.h> | |
| 43 | |
| 44 #include "resource.h" | |
| 45 | |
| 46 extern HINSTANCE hInst; | |
| 47 | |
| 48 #define ITEM_BITMAPWIDTH 16 | |
| 49 #define ITEM_BITMAPHEIGHT 16 | |
| 50 #define ITEM_LEFTMARGIN 4 | |
| 51 #define ITEM_GAP 4 | |
| 52 | |
| 53 static HWND hWndDirPicker; | |
| 54 static HICON hIconDrives[5]; | |
| 55 static HICON hIconFolders[3]; | |
| 56 static LPSTR lpszStringToReturn; | |
| 57 static char szUNCRoot[256] = ""; | |
| 58 | |
| 59 UINT DriveType(UINT iType); | |
| 60 | |
| 61 static void fillComboBox(HWND hWnd) | |
| 62 { | |
| 63 HWND hWndCB = GetDlgItem(hWnd, ID_COMBO_DIR); | |
| 64 HWND hWndTempLB = GetDlgItem(hWnd, ID_LISTTEMP_DIR); | |
| 65 if(hWndCB == NULL) | |
| 66 return; | |
| 67 ComboBox_ResetContent(hWndCB); | |
| 68 ListBox_ResetContent(hWndTempLB); | |
| 69 ListBox_Dir(hWndTempLB, DDL_DRIVES|DDL_EXCLUSIVE, (LPSTR)"*"); | |
| 70 | |
| 71 int iDriveCount = ListBox_GetCount(hWndTempLB); | |
| 72 int iCurDrive=_getdrive() - 1; | |
| 73 | |
| 74 char szDrive[16]; | |
| 75 char szItem[80]; | |
| 76 | |
| 77 for (int i = 0; i < iDriveCount; i++) | |
| 78 { | |
| 79 ListBox_GetText(hWndTempLB, i, szDrive); | |
| 80 CharLower(szDrive); | |
| 81 int iDrive = szDrive[2] - 'a'; | |
| 82 char szRoot[16]; | |
| 83 sprintf(szRoot, "%c:\\", szDrive[2]); | |
| 84 | |
| 85 int iType = DriveType(iDrive); | |
| 86 | |
| 87 if(iType < 2) | |
| 88 continue; | |
| 89 | |
| 90 //Start the item string with the drive letter, colon, and two spaces | |
| 91 sprintf(szItem, "%c%s", szDrive[2], ": "); | |
| 92 | |
| 93 if((iType == DRIVE_FIXED) || (iType == DRIVE_RAMDISK)) | |
| 94 { // get volume ID | |
| 95 char szVolumeID[80]; | |
| 96 DWORD dwMaxLength; | |
| 97 DWORD dwSysFlags; | |
| 98 GetVolumeInformation(szRoot, // address of root directory of t
he file system | |
| 99 szVolumeID, // address of name of the volume | |
| 100 sizeof(szVolumeID), // length of lpVolumeNameBuffer | |
| 101 NULL, // address of volume serial numbe
r | |
| 102 &dwMaxLength, // address of system's maximum fi
lename length | |
| 103 &dwSysFlags, // address of file system flags | |
| 104 NULL, // address of name of file system
| |
| 105 NULL); // length of lpFileSystemNameBuff
er | |
| 106 | |
| 107 CharLower(szVolumeID); | |
| 108 lstrcat(szItem, szVolumeID); | |
| 109 } | |
| 110 | |
| 111 //For network drives, go grab the \\server\share for it. | |
| 112 if(DRIVE_REMOTE == iType) | |
| 113 { | |
| 114 char szNet[64]; | |
| 115 szNet[0] = '\0'; | |
| 116 DWORD dwSizeOfszNet = sizeof(szNet); | |
| 117 | |
| 118 sprintf(szDrive, "%c:", szDrive[2]); | |
| 119 CharUpper(szDrive); | |
| 120 WNetGetConnection(szDrive, szNet, &dwSizeOfszNet); | |
| 121 CharLower(szNet); | |
| 122 lstrcat(szItem, szNet); | |
| 123 } | |
| 124 | |
| 125 int index = ComboBox_AddString(hWndCB, szItem); | |
| 126 ComboBox_SetItemData(hWndCB, index, MAKELONG(iDrive, iType)); | |
| 127 if(iDrive == iCurDrive) | |
| 128 ComboBox_SetCurSel(hWndCB, index); | |
| 129 if(szUNCRoot[0] != '\0') | |
| 130 ComboBox_SetCurSel(hWndCB, -1); | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 static void fillTempLBWithDirs(HWND hWndTempLB, LPSTR lpszDir) | |
| 135 { | |
| 136 BOOL bDone = FALSE; | |
| 137 WIN32_FIND_DATA ffdataStruct; | |
| 138 | |
| 139 char szPath[_MAX_PATH]; | |
| 140 char szFileName[_MAX_PATH]; | |
| 141 lstrcpy(szPath, lpszDir); | |
| 142 if(szPath[lstrlen(szPath) - 1] == '\\') | |
| 143 szPath[lstrlen(szPath) - 1] = '\0'; | |
| 144 lstrcpy(szFileName, szPath); | |
| 145 lstrcat(szFileName, "\\*"); | |
| 146 HANDLE handle = FindFirstFile(szFileName, &ffdataStruct); | |
| 147 if(handle == INVALID_HANDLE_VALUE) | |
| 148 { | |
| 149 FindClose(handle); | |
| 150 return; | |
| 151 } | |
| 152 while(!bDone) | |
| 153 { | |
| 154 lstrcpy(szFileName, szPath); | |
| 155 lstrcat(szFileName, "\\"); | |
| 156 lstrcat(szFileName, ffdataStruct.cFileName); | |
| 157 if(ffdataStruct. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) | |
| 158 { | |
| 159 char szStringToAdd[_MAX_PATH + 2]; | |
| 160 lstrcpy(szStringToAdd, "["); | |
| 161 lstrcat(szStringToAdd, ffdataStruct.cFileName); | |
| 162 lstrcat(szStringToAdd, "]"); | |
| 163 CharLower(szStringToAdd); | |
| 164 ListBox_AddString(hWndTempLB, szStringToAdd); | |
| 165 } | |
| 166 bDone = !FindNextFile(handle, &ffdataStruct); | |
| 167 } | |
| 168 FindClose(handle); | |
| 169 } | |
| 170 | |
| 171 static void fillListBox(HWND hWnd, LPSTR lpszDir) | |
| 172 { | |
| 173 HWND hWndLB = GetDlgItem(hWnd, ID_LIST_DIR); | |
| 174 HWND hWndTempLB = GetDlgItem(hWnd, ID_LISTTEMP_DIR); | |
| 175 HWND hWndEdit = GetDlgItem(hWnd, ID_EDIT_DIR); | |
| 176 if((hWndLB == NULL) || (lpszDir == NULL)) | |
| 177 return; | |
| 178 | |
| 179 int iLastChar = lstrlen(lpszDir); | |
| 180 if(lpszDir[iLastChar - 1] == '\\') | |
| 181 lpszDir[iLastChar - 1] = '\0'; | |
| 182 | |
| 183 SetWindowRedraw(hWndLB, FALSE); | |
| 184 ListBox_ResetContent(hWndLB); | |
| 185 ListBox_ResetContent(hWndTempLB); | |
| 186 | |
| 187 LPSTR lpszLast; | |
| 188 lpszLast = CharLower(lpszDir); | |
| 189 | |
| 190 SetWindowText(hWndLB, lpszDir); | |
| 191 | |
| 192 char szDir[_MAX_DIR]; | |
| 193 char szFullDir[_MAX_DIR]; | |
| 194 sprintf(szFullDir, "%s", lpszDir); | |
| 195 sprintf(szDir, "%s\\*.*", lpszDir); | |
| 196 | |
| 197 BOOL bFirst = TRUE; | |
| 198 char ch; | |
| 199 int index; | |
| 200 while (TRUE) | |
| 201 { | |
| 202 LPSTR lpsz; | |
| 203 if((lpszDir[0] == '\\') && (lpszDir[1] == '\\') && bFirst) | |
| 204 lpsz = strchr(lpszLast + lstrlen(szUNCRoot), '\\'); | |
| 205 else | |
| 206 lpsz = strchr(lpszLast, '\\'); | |
| 207 if(lpsz != NULL) { | |
| 208 if (bFirst) | |
| 209 ch = *(++lpsz); | |
| 210 else | |
| 211 ch = *lpsz; | |
| 212 *lpsz = 0; | |
| 213 } | |
| 214 else | |
| 215 { | |
| 216 //If we're looking at a drive only, then append a backslash | |
| 217 if (lpszLast == lpszDir && bFirst) | |
| 218 lstrcat(lpszLast, "\\"); | |
| 219 } | |
| 220 //Add the drive string--includes the last one where lpsz == NULL | |
| 221 index = ListBox_AddString(hWndLB, lpszLast); | |
| 222 | |
| 223 UINT i = (NULL != lpsz) ? ID_ICON_FOLDEROPEN : ID_ICON_OPENSELECT; | |
| 224 ListBox_SetItemData(hWndLB, index, MAKELONG(index, i)); | |
| 225 | |
| 226 if(NULL == lpsz) | |
| 227 break; | |
| 228 | |
| 229 //Restore last character. | |
| 230 *lpsz = ch; | |
| 231 lpsz += (bFirst) ? 0 : 1; | |
| 232 | |
| 233 bFirst=FALSE; | |
| 234 lpszLast = lpsz; | |
| 235 } | |
| 236 int indent = index + 1; | |
| 237 | |
| 238 //Get available directories | |
| 239 fillTempLBWithDirs(hWndTempLB, lpszDir); | |
| 240 | |
| 241 int itemCount = ListBox_GetCount(hWndTempLB); | |
| 242 | |
| 243 int i=0; | |
| 244 for (i = 0; i < itemCount; i++) { | |
| 245 index = ListBox_GetText(hWndTempLB, i, lpszDir); | |
| 246 //Skip directories beginning with . (skipping . and ..) | |
| 247 if(lpszDir[1] == '.') | |
| 248 continue; | |
| 249 //Remove the ending ']' | |
| 250 iLastChar = lstrlen(lpszDir); | |
| 251 lpszDir[iLastChar - 1] = '\0'; | |
| 252 //Add the string to the real directory list. | |
| 253 index = ListBox_AddString(hWndLB, lpszDir + 1); | |
| 254 ListBox_SetItemData(hWndLB, index, MAKELONG(indent, ID_ICON_FOLDERCLOSED)); | |
| 255 } | |
| 256 //Force a listbox repaint. | |
| 257 SetWindowRedraw(hWndLB, TRUE); | |
| 258 InvalidateRect(hWndLB, NULL, TRUE); | |
| 259 | |
| 260 if(szFullDir[lstrlen(szFullDir) - 1] == ':') | |
| 261 lstrcat(szFullDir, "\\"); | |
| 262 Edit_SetText(hWndEdit, szFullDir); | |
| 263 | |
| 264 GetScrollRange(hWndLB, SB_VERT, (LPINT)&i, (LPINT)&index); | |
| 265 | |
| 266 if(!(i == 0 && index == 0)) | |
| 267 ListBox_SetTopIndex(hWndLB, max((int)(index - 2), 0)); | |
| 268 | |
| 269 ListBox_SetCurSel(hWndLB, indent - 1); | |
| 270 } | |
| 271 | |
| 272 static void onDrawItem(LPDRAWITEMSTRUCT lpdis, BOOL bDrive) | |
| 273 { | |
| 274 if((int)lpdis->itemID < 0) | |
| 275 return; | |
| 276 | |
| 277 char szItem[_MAX_DIR]; | |
| 278 DWORD dwItemData; | |
| 279 | |
| 280 if(bDrive) | |
| 281 { | |
| 282 dwItemData = ComboBox_GetItemData(lpdis->hwndItem, lpdis->itemID); | |
| 283 ComboBox_GetLBText(lpdis->hwndItem, lpdis->itemID, szItem); | |
| 284 } | |
| 285 else | |
| 286 { | |
| 287 dwItemData = ListBox_GetItemData(lpdis->hwndItem, lpdis->itemID); | |
| 288 ListBox_GetText(lpdis->hwndItem, lpdis->itemID, szItem); | |
| 289 } | |
| 290 | |
| 291 if(lpdis->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) | |
| 292 { | |
| 293 COLORREF colorText; | |
| 294 COLORREF colorBack; | |
| 295 if(lpdis->itemState & ODS_SELECTED) | |
| 296 { | |
| 297 colorText = SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); | |
| 298 colorBack = SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); | |
| 299 } | |
| 300 HICON hIcon; | |
| 301 int indent = 0; | |
| 302 if(bDrive) | |
| 303 { | |
| 304 int iType=(int)HIWORD(dwItemData); | |
| 305 switch (iType) | |
| 306 { | |
| 307 case DRIVE_REMOVABLE: | |
| 308 hIcon = hIconDrives[0]; | |
| 309 break; | |
| 310 case DRIVE_FIXED: | |
| 311 hIcon = hIconDrives[1]; | |
| 312 break; | |
| 313 case DRIVE_REMOTE: | |
| 314 hIcon = hIconDrives[2]; | |
| 315 break; | |
| 316 case DRIVE_CDROM: | |
| 317 hIcon = hIconDrives[3]; | |
| 318 break; | |
| 319 case DRIVE_RAMDISK: | |
| 320 hIcon = hIconDrives[4]; | |
| 321 break; | |
| 322 } | |
| 323 | |
| 324 } | |
| 325 else | |
| 326 { | |
| 327 int iconID = (int)HIWORD(lpdis->itemData); | |
| 328 switch (iconID) | |
| 329 { | |
| 330 case ID_ICON_FOLDERCLOSED: | |
| 331 hIcon = hIconFolders[0]; | |
| 332 break; | |
| 333 case ID_ICON_FOLDEROPEN: | |
| 334 hIcon = hIconFolders[1]; | |
| 335 break; | |
| 336 case ID_ICON_OPENSELECT: | |
| 337 hIcon = hIconFolders[2]; | |
| 338 break; | |
| 339 } | |
| 340 indent = 4 * (1 + LOWORD(lpdis->itemData)); | |
| 341 } | |
| 342 | |
| 343 ExtTextOut(lpdis->hDC, | |
| 344 lpdis->rcItem.left + ITEM_LEFTMARGIN + ITEM_BITMAPWIDTH + ITEM_GA
P + indent, | |
| 345 lpdis->rcItem.top, | |
| 346 ETO_OPAQUE | ETO_CLIPPED, | |
| 347 &lpdis->rcItem, | |
| 348 szItem, | |
| 349 lstrlen(szItem), | |
| 350 NULL); | |
| 351 | |
| 352 BOOL res = DrawIcon(lpdis->hDC, | |
| 353 lpdis->rcItem.left + ITEM_LEFTMARGIN + indent, | |
| 354 lpdis->rcItem.top, | |
| 355 hIcon); | |
| 356 | |
| 357 if(lpdis->itemState & ODS_SELECTED) | |
| 358 { | |
| 359 SetTextColor(lpdis->hDC, colorText); | |
| 360 SetBkColor(lpdis->hDC, colorBack); | |
| 361 } | |
| 362 } | |
| 363 if((lpdis->itemAction & ODA_FOCUS) || (lpdis->itemState & ODS_FOCUS)) | |
| 364 DrawFocusRect(lpdis->hDC, &lpdis->rcItem); | |
| 365 } | |
| 366 | |
| 367 static void fillUNCRootArray(LPSTR lpsz) | |
| 368 { | |
| 369 char szCurDir[_MAX_PATH]; | |
| 370 _getcwd(szCurDir, sizeof(szCurDir)); | |
| 371 lstrcpy(szUNCRoot, lpsz); | |
| 372 if(szUNCRoot[lstrlen(szUNCRoot) - 1] == '\\') | |
| 373 szUNCRoot[lstrlen(szUNCRoot) - 1] = '\0'; | |
| 374 for(;;) | |
| 375 { | |
| 376 LPSTR lptemp = strrchr(szUNCRoot, '\\'); | |
| 377 if(lptemp == NULL) | |
| 378 break; | |
| 379 *lptemp = '\0'; | |
| 380 if(_chdir(szUNCRoot) == -1) | |
| 381 { | |
| 382 *lptemp = '\\'; | |
| 383 break; | |
| 384 } | |
| 385 } | |
| 386 _chdir(szCurDir); | |
| 387 } | |
| 388 | |
| 389 static void onInitDialog(HWND hWnd, LPSTR lpsz) | |
| 390 { | |
| 391 hWndDirPicker = hWnd; | |
| 392 lpszStringToReturn = lpsz; | |
| 393 | |
| 394 hIconDrives[0] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVEFLOPPY)); | |
| 395 hIconDrives[1] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVEHARD)); | |
| 396 hIconDrives[2] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVENETWORK)); | |
| 397 hIconDrives[3] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVECDROM)); | |
| 398 hIconDrives[4] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVERAM)); | |
| 399 | |
| 400 hIconFolders[0] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_FOLDERCLOSED)); | |
| 401 hIconFolders[1] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_FOLDEROPEN)); | |
| 402 hIconFolders[2] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_OPENSELECT)); | |
| 403 | |
| 404 if(lpsz[0] == '\0') | |
| 405 _getcwd(lpsz, _MAX_PATH); | |
| 406 else if(lpsz[lstrlen(lpsz) - 1] == ':') | |
| 407 lstrcat(lpsz, "\\"); | |
| 408 | |
| 409 int ret = _chdir(lpsz); | |
| 410 if(ret == -1) | |
| 411 { | |
| 412 char szText[_MAX_PATH + 80]; | |
| 413 sprintf(szText, "The specified directory %s\ncannot be found", lpsz); | |
| 414 MessageBox(GetParent(hWnd), szText, "Choose Directory", MB_ICONEXCLAMATION|M
B_OK); | |
| 415 _getcwd(lpsz, _MAX_PATH); | |
| 416 } | |
| 417 if((lpsz[0] == '\\') && (lpsz[1] == '\\')) | |
| 418 fillUNCRootArray(lpsz); | |
| 419 fillListBox(hWnd, lpsz); | |
| 420 fillComboBox(hWnd); | |
| 421 } | |
| 422 | |
| 423 static void shutDialog(HWND hWnd) | |
| 424 { | |
| 425 szUNCRoot[0] = '\0'; | |
| 426 } | |
| 427 | |
| 428 static void onCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) | |
| 429 { | |
| 430 char szCurDir[_MAX_PATH]; | |
| 431 switch(id) | |
| 432 { | |
| 433 case ID_LIST_DIR: | |
| 434 if(codeNotify == LBN_DBLCLK) | |
| 435 { | |
| 436 int index = ListBox_GetCurSel(hWndCtl); | |
| 437 DWORD dwItemData = ListBox_GetItemData(hWndCtl, index); | |
| 438 | |
| 439 if(HIWORD(dwItemData) == ID_ICON_OPENSELECT) | |
| 440 { | |
| 441 shutDialog(hWnd); | |
| 442 char szString[_MAX_PATH]; | |
| 443 Edit_GetText(GetDlgItem(hWndDirPicker, ID_EDIT_DIR), szString, sizeof(
szString)); | |
| 444 lstrcpy(lpszStringToReturn, szString); | |
| 445 EndDialog(hWnd, IDOK); | |
| 446 break; | |
| 447 } | |
| 448 | |
| 449 ListBox_GetText(hWndCtl, index, szCurDir); | |
| 450 | |
| 451 char szDir[_MAX_DIR]; | |
| 452 LPSTR lpsz; | |
| 453 if((HIWORD(dwItemData) == ID_ICON_FOLDEROPEN) && (index != 0)) | |
| 454 { | |
| 455 GetWindowText(hWndCtl, szDir, sizeof(szDir)); | |
| 456 lpsz=_fstrstr(szDir, szCurDir); | |
| 457 *(lpsz + lstrlen(szCurDir)) = '\0'; | |
| 458 lstrcpy(szCurDir, szDir); | |
| 459 } | |
| 460 if (_chdir(szCurDir) == 0) | |
| 461 { | |
| 462 _getcwd(szCurDir, _MAX_PATH); | |
| 463 fillListBox(hWndDirPicker, szCurDir); | |
| 464 } | |
| 465 } | |
| 466 break; | |
| 467 case ID_COMBO_DIR: | |
| 468 if(codeNotify == CBN_SELCHANGE) | |
| 469 { | |
| 470 char szDrive[80]; | |
| 471 int index = ComboBox_GetCurSel(hWndCtl); | |
| 472 if(index == CB_ERR) | |
| 473 break; | |
| 474 ComboBox_GetLBText(hWndCtl, index, szDrive); | |
| 475 | |
| 476 int iCurDrive = _getdrive(); | |
| 477 Retry: | |
| 478 HCURSOR hCursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT)); | |
| 479 SetCapture(hWndDirPicker); | |
| 480 if((0 == _chdrive((int)(szDrive[0] - 'a' + 1))) && (NULL != _getcwd(szCu
rDir, _MAX_PATH))) | |
| 481 { | |
| 482 fillListBox(hWndDirPicker, szCurDir); | |
| 483 ListBox_SetTopIndex(GetDlgItem(hWndDirPicker, ID_LIST_DIR), 0); | |
| 484 SetCursor(hCursorOld); | |
| 485 ReleaseCapture(); | |
| 486 break; | |
| 487 } | |
| 488 SetCursor(hCursorOld); | |
| 489 ReleaseCapture(); | |
| 490 | |
| 491 char szText[80]; | |
| 492 sprintf(szText, "Cannot read drive %c:", szDrive[0]); | |
| 493 if(IDRETRY == MessageBox(hWndDirPicker, szText, "Choose Directory", MB_I
CONEXCLAMATION|MB_RETRYCANCEL)) | |
| 494 goto Retry; | |
| 495 | |
| 496 //Changing drives failed so restore drive and selection | |
| 497 _chdrive(iCurDrive); | |
| 498 | |
| 499 sprintf(szDrive, "%c:", (char)(iCurDrive + 'a' - 1)); | |
| 500 index = ComboBox_SelectString(hWndCtl, -1, szDrive); | |
| 501 } | |
| 502 break; | |
| 503 case IDOK: | |
| 504 shutDialog(hWnd); | |
| 505 char szString[_MAX_PATH]; | |
| 506 Edit_GetText(GetDlgItem(hWndDirPicker, ID_EDIT_DIR), szString, sizeof(szSt
ring)); | |
| 507 lstrcpy(lpszStringToReturn, szString); | |
| 508 EndDialog(hWnd, IDOK); | |
| 509 break; | |
| 510 case IDCANCEL: | |
| 511 shutDialog(hWnd); | |
| 512 lpszStringToReturn[0] = '\0'; | |
| 513 EndDialog(hWnd, IDCANCEL); | |
| 514 break; | |
| 515 default: | |
| 516 break; | |
| 517 } | |
| 518 } | |
| 519 | |
| 520 static BOOL CALLBACK DirPickDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM l
Param) | |
| 521 { | |
| 522 switch(msg) { | |
| 523 case WM_INITDIALOG: | |
| 524 onInitDialog(hWnd, (LPSTR)lParam); | |
| 525 break; | |
| 526 case WM_COMMAND: | |
| 527 HANDLE_WM_COMMAND(hWnd, wParam, lParam, onCommand); | |
| 528 break; | |
| 529 case WM_MEASUREITEM: | |
| 530 { | |
| 531 static int cyItem = -1; //Height of a listbox item | |
| 532 LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam; | |
| 533 if(cyItem == -1) | |
| 534 { | |
| 535 HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0L); | |
| 536 if(hFont == NULL) | |
| 537 hFont = GetStockFont(SYSTEM_FONT); | |
| 538 HDC hDC = GetDC(hWnd); | |
| 539 HFONT hFontOld = SelectFont(hDC, hFont); | |
| 540 TEXTMETRIC tm; | |
| 541 GetTextMetrics(hDC, &tm); | |
| 542 cyItem = max(ITEM_BITMAPHEIGHT, tm.tmHeight); | |
| 543 SelectFont(hDC, hFontOld); | |
| 544 ReleaseDC(hWnd, hDC); | |
| 545 } | |
| 546 | |
| 547 lpmis->itemHeight = cyItem; | |
| 548 } | |
| 549 break; | |
| 550 case WM_DRAWITEM: | |
| 551 onDrawItem((LPDRAWITEMSTRUCT)lParam, ((UINT)wParam == ID_COMBO_DIR)); | |
| 552 return TRUE; // to prevent default action in listbox (drawing focus) | |
| 553 default: | |
| 554 return FALSE; | |
| 555 } | |
| 556 return TRUE; | |
| 557 } | |
| 558 | |
| 559 /* | |
| 560 * DriveType | |
| 561 * | |
| 562 * Purpose: | |
| 563 * Augments the Windows API GetDriveType with a call to the CD-ROM | |
| 564 * extensions to determine if a drive is a floppy, hard disk, CD-ROM, | |
| 565 * RAM-drive, or networked drive. | |
| 566 * | |
| 567 * Parameters: | |
| 568 * iDrive UINT containing the zero-based drive index | |
| 569 * | |
| 570 * Return Value: | |
| 571 * UINT One of the following values describing the drive: | |
| 572 * DRIVE_FLOPPY, DRIVE_HARD, DRIVE_CDROM, DRIVE_RAMDISK, | |
| 573 * DRIVE_NETWORK. | |
| 574 * | |
| 575 * Copyright (c)1992 Kraig Brockschmidt, All Right Reserved | |
| 576 * Compuserve: 70750,2344 | |
| 577 * Internet : kraigb@microsoft.com | |
| 578 * | |
| 579 */ | |
| 580 UINT DriveType(UINT iDrive) | |
| 581 { | |
| 582 //Validate possible drive indices | |
| 583 if((0 > iDrive) || (25 < iDrive)) | |
| 584 return (UINT)-1; | |
| 585 | |
| 586 static char path[] = "d:\\"; | |
| 587 path[0] = 'a' + iDrive; | |
| 588 int iType = GetDriveType(path); | |
| 589 | |
| 590 /* | |
| 591 * Under Windows NT, GetDriveType returns complete information | |
| 592 * not provided under Windows 3.x which we now get through other | |
| 593 * means. | |
| 594 */ | |
| 595 | |
| 596 return iType; | |
| 597 } | |
| 598 | |
| 599 BOOL PickupDirectory(HWND hWndOwner, LPSTR lpszString) | |
| 600 { | |
| 601 if(hWndOwner == NULL) | |
| 602 hWndOwner = GetDesktopWindow(); | |
| 603 int ret = DialogBoxParam(hInst, MAKEINTRESOURCE(ID_DIALOG_CHOOSEDIR), hWndOwne
r, DirPickDlgProc, (LPARAM)lpszString); | |
| 604 return (ret == IDOK); | |
| 605 } | |
| OLD | NEW |