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