15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ***** BEGIN LICENSE BLOCK ***** 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Version: MPL 1.1/GPL 2.0/LGPL 2.1 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The contents of this file are subject to the Mozilla Public License Version 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1.1 (the "License"); you may not use this file except in compliance with 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the License. You may obtain a copy of the License at 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.mozilla.org/MPL/ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Software distributed under the License is distributed on an "AS IS" basis, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for the specific language governing rights and limitations under the 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Original Code is mozilla.org code. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The Initial Developer of the Original Code is 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Netscape Communications Corporation. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Portions created by the Initial Developer are Copyright (C) 1998 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the Initial Developer. All Rights Reserved. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contributor(s): 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Alternatively, the contents of this file may be used under the terms of 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * either the GNU General Public License Version 2 or later (the "GPL"), or 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in which case the provisions of the GPL or the LGPL are applicable instead 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of those above. If you wish to allow use of your version of this file only 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * under the terms of either the GPL or the LGPL, and not to allow others to 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use your version of this file under the terms of the MPL, indicate your 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * decision by deleting the provisions above and replace them with the notice 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and other provisions required by the GPL or the LGPL. If you do not delete 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the provisions above, a recipient may use your version of this file under 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the terms of any one of the MPL, the GPL or the LGPL. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ***** END LICENSE BLOCK ***** */ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _CRT_SECURE_NO_DEPRECATE 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windowsx.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <direct.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "resource.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern HINSTANCE hInst; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ITEM_BITMAPWIDTH 16 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ITEM_BITMAPHEIGHT 16 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ITEM_LEFTMARGIN 4 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ITEM_GAP 4 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static HWND hWndDirPicker; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static HICON hIconDrives[5]; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static HICON hIconFolders[3]; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static LPSTR lpszStringToReturn; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char szUNCRoot[256] = ""; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UINT DriveType(UINT iType); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void fillComboBox(HWND hWnd) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hWndCB = GetDlgItem(hWnd, ID_COMBO_DIR); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hWndTempLB = GetDlgItem(hWnd, ID_LISTTEMP_DIR); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(hWndCB == NULL) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComboBox_ResetContent(hWndCB); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_ResetContent(hWndTempLB); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_Dir(hWndTempLB, DDL_DRIVES|DDL_EXCLUSIVE, (LPSTR)"*"); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDriveCount = ListBox_GetCount(hWndTempLB); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCurDrive=_getdrive() - 1; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szDrive[16]; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szItem[80]; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < iDriveCount; i++) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_GetText(hWndTempLB, i, szDrive); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharLower(szDrive); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDrive = szDrive[2] - 'a'; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szRoot[16]; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szRoot, "%c:\\", szDrive[2]); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iType = DriveType(iDrive); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(iType < 2) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Start the item string with the drive letter, colon, and two spaces 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szItem, "%c%s", szDrive[2], ": "); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((iType == DRIVE_FIXED) || (iType == DRIVE_RAMDISK)) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // get volume ID 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szVolumeID[80]; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD dwMaxLength; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD dwSysFlags; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetVolumeInformation(szRoot, // address of root directory of the file system 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szVolumeID, // address of name of the volume 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(szVolumeID), // length of lpVolumeNameBuffer 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // address of volume serial number 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &dwMaxLength, // address of system's maximum filename length 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &dwSysFlags, // address of file system flags 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // address of name of file system 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); // length of lpFileSystemNameBuffer 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharLower(szVolumeID); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szItem, szVolumeID); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //For network drives, go grab the \\server\share for it. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(DRIVE_REMOTE == iType) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szNet[64]; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szNet[0] = '\0'; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD dwSizeOfszNet = sizeof(szNet); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szDrive, "%c:", szDrive[2]); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharUpper(szDrive); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WNetGetConnection(szDrive, szNet, &dwSizeOfszNet); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharLower(szNet); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szItem, szNet); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = ComboBox_AddString(hWndCB, szItem); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComboBox_SetItemData(hWndCB, index, MAKELONG(iDrive, iType)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(iDrive == iCurDrive) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComboBox_SetCurSel(hWndCB, index); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(szUNCRoot[0] != '\0') 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComboBox_SetCurSel(hWndCB, -1); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void fillTempLBWithDirs(HWND hWndTempLB, LPSTR lpszDir) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL bDone = FALSE; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIN32_FIND_DATA ffdataStruct; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szPath[_MAX_PATH]; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szFileName[_MAX_PATH]; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(szPath, lpszDir); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(szPath[lstrlen(szPath) - 1] == '\\') 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szPath[lstrlen(szPath) - 1] = '\0'; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(szFileName, szPath); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szFileName, "\\*"); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE handle = FindFirstFile(szFileName, &ffdataStruct); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(handle == INVALID_HANDLE_VALUE) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindClose(handle); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while(!bDone) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(szFileName, szPath); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szFileName, "\\"); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szFileName, ffdataStruct.cFileName); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(ffdataStruct. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szStringToAdd[_MAX_PATH + 2]; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(szStringToAdd, "["); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szStringToAdd, ffdataStruct.cFileName); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szStringToAdd, "]"); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharLower(szStringToAdd); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_AddString(hWndTempLB, szStringToAdd); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bDone = !FindNextFile(handle, &ffdataStruct); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindClose(handle); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void fillListBox(HWND hWnd, LPSTR lpszDir) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hWndLB = GetDlgItem(hWnd, ID_LIST_DIR); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hWndTempLB = GetDlgItem(hWnd, ID_LISTTEMP_DIR); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND hWndEdit = GetDlgItem(hWnd, ID_EDIT_DIR); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((hWndLB == NULL) || (lpszDir == NULL)) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLastChar = lstrlen(lpszDir); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpszDir[iLastChar - 1] == '\\') 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpszDir[iLastChar - 1] = '\0'; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWindowRedraw(hWndLB, FALSE); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_ResetContent(hWndLB); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_ResetContent(hWndTempLB); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPSTR lpszLast; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpszLast = CharLower(lpszDir); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWindowText(hWndLB, lpszDir); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szDir[_MAX_DIR]; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szFullDir[_MAX_DIR]; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szFullDir, "%s", lpszDir); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szDir, "%s\\*.*", lpszDir); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL bFirst = TRUE; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char ch; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (TRUE) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPSTR lpsz; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((lpszDir[0] == '\\') && (lpszDir[1] == '\\') && bFirst) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpsz = strchr(lpszLast + lstrlen(szUNCRoot), '\\'); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpsz = strchr(lpszLast, '\\'); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpsz != NULL) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bFirst) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ch = *(++lpsz); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ch = *lpsz; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *lpsz = 0; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //If we're looking at a drive only, then append a backslash 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lpszLast == lpszDir && bFirst) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(lpszLast, "\\"); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Add the drive string--includes the last one where lpsz == NULL 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = ListBox_AddString(hWndLB, lpszLast); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT i = (NULL != lpsz) ? ID_ICON_FOLDEROPEN : ID_ICON_OPENSELECT; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_SetItemData(hWndLB, index, MAKELONG(index, i)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(NULL == lpsz) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Restore last character. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *lpsz = ch; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpsz += (bFirst) ? 0 : 1; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bFirst=FALSE; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpszLast = lpsz; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int indent = index + 1; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Get available directories 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fillTempLBWithDirs(hWndTempLB, lpszDir); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int itemCount = ListBox_GetCount(hWndTempLB); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i=0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < itemCount; i++) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = ListBox_GetText(hWndTempLB, i, lpszDir); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Skip directories beginning with . (skipping . and ..) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpszDir[1] == '.') 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Remove the ending ']' 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iLastChar = lstrlen(lpszDir); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpszDir[iLastChar - 1] = '\0'; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Add the string to the real directory list. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = ListBox_AddString(hWndLB, lpszDir + 1); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_SetItemData(hWndLB, index, MAKELONG(indent, ID_ICON_FOLDERCLOSED)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Force a listbox repaint. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWindowRedraw(hWndLB, TRUE); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(hWndLB, NULL, TRUE); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(szFullDir[lstrlen(szFullDir) - 1] == ':') 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(szFullDir, "\\"); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Edit_SetText(hWndEdit, szFullDir); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetScrollRange(hWndLB, SB_VERT, (LPINT)&i, (LPINT)&index); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(!(i == 0 && index == 0)) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_SetTopIndex(hWndLB, max((int)(index - 2), 0)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_SetCurSel(hWndLB, indent - 1); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void onDrawItem(LPDRAWITEMSTRUCT lpdis, BOOL bDrive) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((int)lpdis->itemID < 0) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szItem[_MAX_DIR]; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD dwItemData; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(bDrive) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dwItemData = ComboBox_GetItemData(lpdis->hwndItem, lpdis->itemID); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComboBox_GetLBText(lpdis->hwndItem, lpdis->itemID, szItem); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dwItemData = ListBox_GetItemData(lpdis->hwndItem, lpdis->itemID); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_GetText(lpdis->hwndItem, lpdis->itemID, szItem); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpdis->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLORREF colorText; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLORREF colorBack; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpdis->itemState & ODS_SELECTED) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colorText = SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colorBack = SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HICON hIcon; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int indent = 0; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(bDrive) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iType=(int)HIWORD(dwItemData); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (iType) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DRIVE_REMOVABLE: 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconDrives[0]; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DRIVE_FIXED: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconDrives[1]; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DRIVE_REMOTE: 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconDrives[2]; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DRIVE_CDROM: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconDrives[3]; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DRIVE_RAMDISK: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconDrives[4]; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iconID = (int)HIWORD(lpdis->itemData); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (iconID) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_ICON_FOLDERCLOSED: 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconFolders[0]; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_ICON_FOLDEROPEN: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconFolders[1]; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_ICON_OPENSELECT: 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon = hIconFolders[2]; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) indent = 4 * (1 + LOWORD(lpdis->itemData)); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtTextOut(lpdis->hDC, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpdis->rcItem.left + ITEM_LEFTMARGIN + ITEM_BITMAPWIDTH + ITEM_GAP + indent, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpdis->rcItem.top, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ETO_OPAQUE | ETO_CLIPPED, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &lpdis->rcItem, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szItem, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrlen(szItem), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL res = DrawIcon(lpdis->hDC, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpdis->rcItem.left + ITEM_LEFTMARGIN + indent, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpdis->rcItem.top, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIcon); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpdis->itemState & ODS_SELECTED) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTextColor(lpdis->hDC, colorText); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBkColor(lpdis->hDC, colorBack); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((lpdis->itemAction & ODA_FOCUS) || (lpdis->itemState & ODS_FOCUS)) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawFocusRect(lpdis->hDC, &lpdis->rcItem); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void fillUNCRootArray(LPSTR lpsz) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szCurDir[_MAX_PATH]; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _getcwd(szCurDir, sizeof(szCurDir)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(szUNCRoot, lpsz); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(szUNCRoot[lstrlen(szUNCRoot) - 1] == '\\') 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szUNCRoot[lstrlen(szUNCRoot) - 1] = '\0'; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(;;) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPSTR lptemp = strrchr(szUNCRoot, '\\'); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lptemp == NULL) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *lptemp = '\0'; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(_chdir(szUNCRoot) == -1) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *lptemp = '\\'; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _chdir(szCurDir); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void onInitDialog(HWND hWnd, LPSTR lpsz) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hWndDirPicker = hWnd; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpszStringToReturn = lpsz; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconDrives[0] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVEFLOPPY)); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconDrives[1] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVEHARD)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconDrives[2] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVENETWORK)); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconDrives[3] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVECDROM)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconDrives[4] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_DRIVERAM)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconFolders[0] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_FOLDERCLOSED)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconFolders[1] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_FOLDEROPEN)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hIconFolders[2] = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_OPENSELECT)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(lpsz[0] == '\0') 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _getcwd(lpsz, _MAX_PATH); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if(lpsz[lstrlen(lpsz) - 1] == ':') 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcat(lpsz, "\\"); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = _chdir(lpsz); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(ret == -1) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szText[_MAX_PATH + 80]; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szText, "The specified directory %s\ncannot be found", lpsz); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageBox(GetParent(hWnd), szText, "Choose Directory", MB_ICONEXCLAMATION|MB_OK); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _getcwd(lpsz, _MAX_PATH); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((lpsz[0] == '\\') && (lpsz[1] == '\\')) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fillUNCRootArray(lpsz); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fillListBox(hWnd, lpsz); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fillComboBox(hWnd); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void shutDialog(HWND hWnd) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) szUNCRoot[0] = '\0'; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void onCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szCurDir[_MAX_PATH]; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(id) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_LIST_DIR: 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(codeNotify == LBN_DBLCLK) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = ListBox_GetCurSel(hWndCtl); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD dwItemData = ListBox_GetItemData(hWndCtl, index); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(HIWORD(dwItemData) == ID_ICON_OPENSELECT) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutDialog(hWnd); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szString[_MAX_PATH]; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Edit_GetText(GetDlgItem(hWndDirPicker, ID_EDIT_DIR), szString, sizeof(szString)); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(lpszStringToReturn, szString); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndDialog(hWnd, IDOK); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_GetText(hWndCtl, index, szCurDir); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szDir[_MAX_DIR]; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPSTR lpsz; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((HIWORD(dwItemData) == ID_ICON_FOLDEROPEN) && (index != 0)) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWindowText(hWndCtl, szDir, sizeof(szDir)); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpsz=_fstrstr(szDir, szCurDir); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(lpsz + lstrlen(szCurDir)) = '\0'; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(szCurDir, szDir); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (_chdir(szCurDir) == 0) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _getcwd(szCurDir, _MAX_PATH); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fillListBox(hWndDirPicker, szCurDir); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ID_COMBO_DIR: 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(codeNotify == CBN_SELCHANGE) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szDrive[80]; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = ComboBox_GetCurSel(hWndCtl); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(index == CB_ERR) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComboBox_GetLBText(hWndCtl, index, szDrive); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCurDrive = _getdrive(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Retry: 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HCURSOR hCursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT)); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCapture(hWndDirPicker); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((0 == _chdrive((int)(szDrive[0] - 'a' + 1))) && (NULL != _getcwd(szCurDir, _MAX_PATH))) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fillListBox(hWndDirPicker, szCurDir); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListBox_SetTopIndex(GetDlgItem(hWndDirPicker, ID_LIST_DIR), 0); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCursor(hCursorOld); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseCapture(); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCursor(hCursorOld); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseCapture(); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szText[80]; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szText, "Cannot read drive %c:", szDrive[0]); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(IDRETRY == MessageBox(hWndDirPicker, szText, "Choose Directory", MB_ICONEXCLAMATION|MB_RETRYCANCEL)) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto Retry; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Changing drives failed so restore drive and selection 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _chdrive(iCurDrive); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sprintf(szDrive, "%c:", (char)(iCurDrive + 'a' - 1)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index = ComboBox_SelectString(hWndCtl, -1, szDrive); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDOK: 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutDialog(hWnd); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char szString[_MAX_PATH]; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Edit_GetText(GetDlgItem(hWndDirPicker, ID_EDIT_DIR), szString, sizeof(szString)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lstrcpy(lpszStringToReturn, szString); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndDialog(hWnd, IDOK); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDCANCEL: 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutDialog(hWnd); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpszStringToReturn[0] = '\0'; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndDialog(hWnd, IDCANCEL); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static BOOL CALLBACK DirPickDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(msg) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_INITDIALOG: 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onInitDialog(hWnd, (LPSTR)lParam); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_COMMAND: 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE_WM_COMMAND(hWnd, wParam, lParam, onCommand); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MEASUREITEM: 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int cyItem = -1; //Height of a listbox item 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT)lParam; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(cyItem == -1) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HFONT hFont = (HFONT)SendMessage(hWnd, WM_GETFONT, 0, 0L); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(hFont == NULL) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hFont = GetStockFont(SYSTEM_FONT); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hDC = GetDC(hWnd); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HFONT hFontOld = SelectFont(hDC, hFont); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEXTMETRIC tm; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTextMetrics(hDC, &tm); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cyItem = max(ITEM_BITMAPHEIGHT, tm.tmHeight); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectFont(hDC, hFontOld); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseDC(hWnd, hDC); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lpmis->itemHeight = cyItem; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_DRAWITEM: 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onDrawItem((LPDRAWITEMSTRUCT)lParam, ((UINT)wParam == ID_COMBO_DIR)); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TRUE; // to prevent default action in listbox (drawing focus) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FALSE; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TRUE; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DriveType 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Purpose: 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Augments the Windows API GetDriveType with a call to the CD-ROM 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extensions to determine if a drive is a floppy, hard disk, CD-ROM, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * RAM-drive, or networked drive. 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parameters: 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * iDrive UINT containing the zero-based drive index 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return Value: 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UINT One of the following values describing the drive: 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DRIVE_FLOPPY, DRIVE_HARD, DRIVE_CDROM, DRIVE_RAMDISK, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DRIVE_NETWORK. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c)1992 Kraig Brockschmidt, All Right Reserved 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compuserve: 70750,2344 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internet : kraigb@microsoft.com 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UINT DriveType(UINT iDrive) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //Validate possible drive indices 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if((0 > iDrive) || (25 < iDrive)) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (UINT)-1; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static char path[] = "d:\\"; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path[0] = 'a' + iDrive; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iType = GetDriveType(path); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Under Windows NT, GetDriveType returns complete information 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not provided under Windows 3.x which we now get through other 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * means. 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iType; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BOOL PickupDirectory(HWND hWndOwner, LPSTR lpszString) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(hWndOwner == NULL) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hWndOwner = GetDesktopWindow(); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = DialogBoxParam(hInst, MAKEINTRESOURCE(ID_DIALOG_CHOOSEDIR), hWndOwner, DirPickDlgProc, (LPARAM)lpszString); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret == IDOK); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 606