/*
 * COMMDLG functions
 *
 * Copyright 1994 Martin Ayotte
static char Copyright[] = "Copyright  Martin Ayotte, 1994";
*/

/*
#define DEBUG_OPENDLG
#define DEBUG_OPENDLG_DRAW
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dialog.h"
#include "win.h"
#include "user.h"
#include "message.h"
#include "library.h"
#include "heap.h"
#include "commdlg.h"
#include "dlgs.h"

#define OPENFILEDLG2			11
#define SAVEFILEDLG2			12

static	DWORD 		CommDlgLastError = 0;

static	HBITMAP		hFolder = 0;
static	HBITMAP		hFolder2 = 0;
static	HBITMAP		hFloppy = 0;
static	HBITMAP		hHDisk = 0;
static	HBITMAP		hCDRom = 0;

int DOS_GetDefaultDrive(void);
void DOS_SetDefaultDrive(int drive);
char *DOS_GetCurrentDir(int drive);
int DOS_ChangeDir(int drive, char *dirname);

BOOL FileDlg_Init(HWND hWnd, DWORD lParam);
BOOL OpenDlg_ScanFiles(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec);
BOOL OpenDlg_ScanDir(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec);
LPSTR OpenDlg_GetFileType(LPCSTR types, WORD index);
LPSTR OpenDlg_ExtractCurDir(LPSTR FullPath, short MaxLen);
BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
BOOL FileSaveDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
BOOL ColorDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
BOOL ReplaceTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);
BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam);

/***********************************************************************
 * 				GetOpenFileName			[COMMDLG.1]
 */
BOOL GetOpenFileName(LPOPENFILENAME lpofn)
{
	HANDLE		hDlgTmpl;
	HANDLE		hResInfo;
	HINSTANCE	hInst;
	WND 		*wndPtr;
	BOOL		bRet;
	printf("GetOpenFileName(%p); !\n", lpofn);
	if (lpofn == NULL) return FALSE;
	printf("GetOpenFileName // Flags=%08lX !\n", lpofn->Flags);
	printf("GetOpenFileName // nMaxFile=%ld lpstrFile='%s' !\n", 
						lpofn->nMaxFile, lpofn->lpstrFile);
	printf("GetOpenFileName // lpstrInitialDir='%s' !\n", lpofn->lpstrInitialDir);
	printf("GetOpenFileName // lpstrFilter=%p !\n", lpofn->lpstrFilter);
	printf("GetOpenFileName // nFilterIndex=%ld !\n", lpofn->nFilterIndex);
	if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
		hDlgTmpl = lpofn->hInstance;
		}
	else {
		if (lpofn->Flags & OFN_ENABLETEMPLATE) {
			printf("GetOpenFileName // avant FindResource hInstance=%04X lpTemplateName='%s' !\n", 
								lpofn->hInstance, lpofn->lpTemplateName);
			hInst = lpofn->hInstance;
			hResInfo = FindResource(hInst, 
				(LPSTR)lpofn->lpTemplateName, RT_DIALOG);
			}
		else {
			printf("GetOpenFileName // avant FindResource hSysRes=%04X !\n", hSysRes);
			hInst = hSysRes;
			hResInfo = FindResource(hInst, MAKEINTRESOURCE(OPENFILEDLG2), RT_DIALOG);
			}
		if (hResInfo == 0) {
			CommDlgLastError = CDERR_FINDRESFAILURE;
			return FALSE;
			}
		printf("GetOpenFileName // apres FindResource hResInfo=%04X!\n", hResInfo);
		hDlgTmpl = LoadResource(hInst, hResInfo);
		}
	if (hDlgTmpl == 0) {
		CommDlgLastError = CDERR_LOADRESFAILURE;
		return FALSE;
		}
	printf("GetOpenFileName // apres LoadResource hDlgTmpl=%04X!\n", hDlgTmpl);
    wndPtr = WIN_FindWndPtr(lpofn->hwndOwner);
	bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
		lpofn->hwndOwner, (WNDPROC)FileOpenDlgProc, (DWORD)lpofn); 

/*	strcpy(lpofn->lpstrFile, "SETUP.TXT"); */
/*	strcpy(lpofn->lpstrFileTitle, "SETUP.TXT");*/
/*
	lpofn->nFileOffset = 0;
	lpofn->nFileExtension = strlen(lpofn->lpstrFile) - 3;
	bRet = TRUE;
*/
	printf("GetOpenFileName // return lpstrFile='%s' !\n", lpofn->lpstrFile);
	return bRet;
}


/***********************************************************************
 * 				GetSaveFileName			[COMMDLG.2]
 */
BOOL GetSaveFileName(LPOPENFILENAME lpofn)
{
	HANDLE		hDlgTmpl;
	HANDLE		hResInfo;
	HINSTANCE	hInst;
    WND 		*wndPtr;
	BOOL		bRet;
	printf("GetSaveFileName(%p); !\n", lpofn);
	if (lpofn == NULL) return FALSE;
	printf("GetSaveFileName // Flags=%08lX !\n", lpofn->Flags);
	printf("GetSaveFileName // nMaxFile=%ld lpstrFile='%s' !\n", 
						lpofn->nMaxFile, lpofn->lpstrFile);
	printf("GetSaveFileName // lpstrInitialDir='%s' !\n", lpofn->lpstrInitialDir);
	printf("GetSaveFileName // lpstrFilter=%p !\n", lpofn->lpstrFilter);
	if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
		hDlgTmpl = lpofn->hInstance;
		}
	else {
		if (lpofn->Flags & OFN_ENABLETEMPLATE) {
			printf("GetSaveFileName // avant FindResource lpTemplateName='%s' !\n", 
												lpofn->lpTemplateName);
			hInst = lpofn->hInstance;
			hResInfo = FindResource(hInst, 
				(LPSTR)lpofn->lpTemplateName, RT_DIALOG);
			}
		else {
			printf("GetSaveFileName // avant FindResource !\n");
			hInst = hSysRes;
			hResInfo = FindResource(hInst, MAKEINTRESOURCE(SAVEFILEDLG2), RT_DIALOG);
			}
		if (hResInfo == 0) {
			CommDlgLastError = CDERR_FINDRESFAILURE;
			return FALSE;
			}
		hDlgTmpl = LoadResource(hInst, hResInfo);
		}
	if (hDlgTmpl == 0) {
		CommDlgLastError = CDERR_LOADRESFAILURE;
		return FALSE;
		}
    wndPtr = WIN_FindWndPtr(lpofn->hwndOwner);
	bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
		lpofn->hwndOwner, (WNDPROC)FileSaveDlgProc, (DWORD)lpofn);
	printf("GetSaveFileName // return lpstrFile='%s' !\n", lpofn->lpstrFile);
	return bRet;
}


/***********************************************************************
 * 				ChooseColor				[COMMDLG.5]
 */
BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
{
	HANDLE	hDlgTmpl;
	HANDLE	hResInfo;
    WND 	*wndPtr;
	BOOL	bRet;
	hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(COLORDLG), RT_DIALOG);
	hDlgTmpl = LoadResource(hSysRes, hResInfo);
    wndPtr = WIN_FindWndPtr(lpChCol->hwndOwner);
	bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
		lpChCol->hwndOwner, (WNDPROC)ColorDlgProc, (DWORD)lpChCol);
	return bRet;
}


/***********************************************************************
 * 				FileOpenDlgProc			[COMMDLG.6]
 */
BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	int		n;
	LPSTR	ptr;
	LPSTR	fspec;
	char	str[512];
	char	C2[128];
	WORD	wRet;
	HBRUSH	hBrush;
	HDC 	hMemDC;
	HBITMAP	hBitmap;
	BITMAP	bm;
	LPMEASUREITEMSTRUCT lpmeasure;
	LPDRAWITEMSTRUCT lpdis;
	static	int		nDrive;
	static 	char	CurPath[512];
	static LPOPENFILENAME lpofn;

	switch (wMsg) {
		case WM_INITDIALOG:
#ifdef DEBUG_OPENDLG
			printf("FileOpenDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
#endif
			printf("FileOpenDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
			if (!FileDlg_Init(hWnd, lParam)) return TRUE;
			SendDlgItemMessage(hWnd, cmb1, CB_RESETCONTENT, 0, 0L);
			lpofn = (LPOPENFILENAME)lParam;
			ptr = (LPSTR)lpofn->lpstrFilter;
			strcpy(CurPath, lpofn->lpstrInitialDir);
#ifdef DEBUG_OPENDLG
			printf("FileOpenDlgProc // lpstrInitialDir='%s' !\n", CurPath);
#endif
			while((n = strlen(ptr)) != 0) {
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // file type '%s' !\n", ptr);
#endif
				SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (DWORD)ptr);
				ptr += ++n;
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // file spec '%s' !\n", ptr);
#endif
				n = strlen(ptr);
				ptr += ++n;
				}
			SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
			SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL, 
						lpofn->nFilterIndex - 1, 0L);
			DlgDirListComboBox(hWnd, "", cmb2, 0, 0xC000);
			nDrive = 2; 		/* Drive 'C:' */
			SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, nDrive, 0L);
			sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
			fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, 
									lpofn->nFilterIndex);
#ifdef DEBUG_OPENDLG
			printf("FileOpenDlgProc // WM_INITDIALOG fspec #%d = '%s' !\n", 
											lpofn->nFilterIndex, fspec);
#endif
			if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
				printf("OpenDlg_ScanDir // ChangeDir Error !\n");
				}
			else {
				strcpy(CurPath, str);
				}
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return TRUE;

	case WM_SHOWWINDOW:
		if (wParam == 0) break;
		if (!(lpofn->Flags & OFN_SHOWHELP)) {
			ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
			}
		if (lpofn->Flags & OFN_HIDEREADONLY) {
			ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); 
			}
		return TRUE;

    case WM_MEASUREITEM:
		GetObject(hFolder2, sizeof(BITMAP), (LPSTR)&bm);
		lpmeasure = (LPMEASUREITEMSTRUCT)lParam;
		lpmeasure->itemHeight = bm.bmHeight;
#ifdef DEBUG_OPENDLG_DRAW
		printf("FileOpenDlgProc WM_MEASUREITEM Height=%d !\n", bm.bmHeight);
#endif
		return TRUE;

	case WM_DRAWITEM:
#ifdef DEBUG_OPENDLG_DRAW
		printf("FileOpenDlgProc // WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
#endif
		if (lParam == 0L) break;
		lpdis = (LPDRAWITEMSTRUCT)lParam;
#ifdef DEBUG_OPENDLG_DRAW
		printf("FileOpenDlgProc // WM_DRAWITEM CtlType=%04X CtlID=%04X \n", 
									lpdis->CtlType, lpdis->CtlID);
#endif
		if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst1)) {
			hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
			SelectObject(lpdis->hDC, hBrush);
			FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
			ptr = (LPSTR) lpdis->itemData;
			if (ptr == NULL) break;
			TextOut(lpdis->hDC, lpdis->rcItem.left,	lpdis->rcItem.top, 
											ptr, strlen(ptr));
			}
		if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst2)) {
			hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
			SelectObject(lpdis->hDC, hBrush);
			FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
			ptr = (LPSTR) lpdis->itemData;
			if (ptr == NULL) break;
			if (strcmp(ptr, "[.]") == 0) {
				hBitmap = hFolder2;
/*				ptr = OpenDlg_ExtractCurDir(CurPath, -1); */
				ptr = CurPath;
				}
			else
				hBitmap = hFolder;
			GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
			TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, 
							lpdis->rcItem.top, ptr, strlen(ptr));
			hMemDC = CreateCompatibleDC(lpdis->hDC);
			SelectObject(hMemDC, hBitmap);
			BitBlt(lpdis->hDC, lpdis->rcItem.left,	lpdis->rcItem.top,
						bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
			DeleteDC(hMemDC);
			}
		if ((lpdis->CtlType == ODT_COMBOBOX) && (lpdis->CtlID == cmb2)) {
			hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
			SelectObject(lpdis->hDC, hBrush);
			FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
			ptr = (LPSTR) lpdis->itemData;
			if (ptr == NULL) break;
			switch(ptr[2]) {
				case 'a':
				case 'b':
					hBitmap = hFloppy;
					break;
				default:
					hBitmap = hHDisk;
				}
			GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
			TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, 
							lpdis->rcItem.top, ptr, strlen(ptr));
			hMemDC = CreateCompatibleDC(lpdis->hDC);
			SelectObject(hMemDC, hBitmap);
			BitBlt(lpdis->hDC, lpdis->rcItem.left,	lpdis->rcItem.top,
						bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
			DeleteDC(hMemDC);
			}
		if (lpdis->itemState != 0) {
		    InvertRect(lpdis->hDC, &lpdis->rcItem);
		    }
        break;

	case WM_COMMAND:
		switch (wParam) {
			case lst1:
				if (HIWORD(lParam) == LBN_DBLCLK ||
					HIWORD(lParam) == LBN_SELCHANGE) {
#ifdef DEBUG_OPENDLG
					printf("FileOpenDlgProc // LBN_SELCHANGE on lst1 !\n");
#endif
					wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
					SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)C2);
					}
				if (HIWORD(lParam) == LBN_DBLCLK) {
#ifdef DEBUG_OPENDLG
					printf("FileOpenDlgProc // LBN_DBLCLK on lst1 !\n");
#endif
					return SendMessage(hWnd, WM_COMMAND, IDOK, 0L);
					}
				break;
			case lst2:
				if (HIWORD(lParam) == LBN_DBLCLK) {
#ifdef DEBUG_OPENDLG
					printf("FileOpenDlgProc // LBN_DBLCLK on lst2 !\n");
#endif
					wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
					if (wRet == (WORD)LB_ERR) return 0;
					fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
					C2[0] = '\0';
					wRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0L);
					if (wRet == (WORD)LB_ERR) return 0;
					SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, wRet, (DWORD)C2);
					if (C2[0] == '[') {
						C2[strlen(C2) - 1] = '\0';
						sprintf(str, "%s\\%s", CurPath, &C2[1]);
						if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
							printf("OpenDlg_ScanDir // ChangeDir Error !\n");
							}
						else {
							strcpy(CurPath, str);
							}
						}
					}
				break;
			case cmb1:
				if (HIWORD(lParam) == CBN_SELCHANGE) {
					wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
					if (wRet == (WORD)LB_ERR) return 0;
					fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
					printf("FileOpenDlgProc // new fspec #%d = '%s' !\n", wRet, fspec);
					if (!OpenDlg_ScanFiles(hWnd, nDrive, CurPath, fspec)) {
						printf("OpenDlg_ScanFiles // Change FileType Error !\n");
						}
					}
				break;
			case cmb2:
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // combo #2 changed !\n");
#endif
				wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
				if (wRet == (WORD)LB_ERR) return 0;
				fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
				wRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
				if (wRet == (WORD)LB_ERR) return 0;
				printf("FileOpenDlgProc // combo #2 CB_GETCURSEL=%d !\n", wRet);
				SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, wRet, (DWORD)C2);
				nDrive = C2[2] - 'a';
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // new drive selected=%d !\n", nDrive);
#endif
				sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // new drive , curPath='%s' !\n", str);
#endif
				if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
					printf("OpenDlg_ScanDir // ChangeDir Error !\n");
					}
				else {
					strcpy(CurPath, str);
					}
				break;
			case chx1:
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // read-only toggled !\n");
#endif
				break;
			case pshHelp:
#ifdef DEBUG_OPENDLG
				printf("FileOpenDlgProc // pshHelp pressed !\n");
#endif
				break;
			case IDOK:
				ShowWindow(hWnd, SW_HIDE); 
				SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 0, (DWORD)str);
				wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
				SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)str);
				printf("FileOpenDlgProc // IDOK str='%s'\n", str);
				strcpy(lpofn->lpstrFile, str);
				lpofn->nFileOffset = 0;
				lpofn->nFileExtension = strlen(lpofn->lpstrFile) - 3;
				if (lpofn->lpstrFileTitle != NULL) {
					wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
					SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)str);
					strcpy(lpofn->lpstrFileTitle, str);
					}
				EndDialog(hWnd, TRUE);
				return(TRUE);
			case IDCANCEL:
				EndDialog(hWnd, FALSE);
				return(TRUE);
			}
		return(FALSE);
	}


/*
    case WM_CTLCOLOR:
        SetBkColor((HDC)wParam, 0x00C0C0C0);
        switch (HIWORD(lParam))
            {
            case CTLCOLOR_BTN:
                SetTextColor((HDC)wParam, 0x00000000);
                return(hGRAYBrush);
            case CTLCOLOR_STATIC:
                SetTextColor((HDC)wParam, 0x00000000);
                return(hGRAYBrush);
            }
        return(FALSE);

*/
	return FALSE;
}


/***********************************************************************
 * 				FileDlg_Init			[internal]
 */
BOOL FileDlg_Init(HWND hWnd, DWORD lParam)
{
	LPOPENFILENAME	lpofn;
	lpofn = (LPOPENFILENAME)lParam;
	if (lpofn == NULL) {
		fprintf(stderr, "FileDlg_Init // Bad LPOPENFILENAME pointer !");
		return FALSE;
		}
	if (hFolder == (HBITMAP)NULL) 
		hFolder = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_FOLDER));
	if (hFolder2 == (HBITMAP)NULL) 
		hFolder2 = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_FOLDER2));
	if (hFloppy == (HBITMAP)NULL) 
		hFloppy = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_FLOPPY));
	if (hHDisk == (HBITMAP)NULL) 
		hHDisk = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_HDISK));
	if (hCDRom == (HBITMAP)NULL) 
		hCDRom = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CDROM));
	if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 || 
		hHDisk == 0 || hCDRom == 0)
		fprintf(stderr, "FileDlg_Init // Error loading bitmaps !");
	return TRUE;
}


/***********************************************************************
 * 				OpenDlg_ScanFiles		[internal]
 */
BOOL OpenDlg_ScanFiles(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec)
{
	int		OldDrive;
	char	OldPath[512];
	char	str[512];
	OldDrive = DOS_GetDefaultDrive();
	DOS_SetDefaultDrive(nDrive) ;
	strcpy(OldPath, DOS_GetCurrentDir(nDrive));
#ifdef DEBUG_OPENDLG
	printf("OpenDlg_ScanFiles // OldDrive=%d OldPath='%s'\n", OldDrive, OldPath);
	printf("OpenDlg_ScanFiles // wanted newPath='%s'\n", newPath);
#endif
	if (newPath[1] == ':')
		DOS_ChangeDir(nDrive, &newPath[2]);
	else
		DOS_ChangeDir(nDrive, newPath);
	sprintf(newPath, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
#ifdef DEBUG_OPENDLG
	printf("OpenDlg_ScanFiles // actual newPath='%s'\n", newPath);
#endif
	if (strlen(newPath) == 3) newPath[2] = '\0';
	sprintf(str, "%s\\%s", newPath, fileSpec);
	DlgDirList(hWnd, str, lst1, 0, 0x0000);
	SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
	DOS_ChangeDir(nDrive, OldPath);
	DOS_SetDefaultDrive(OldDrive);
	return TRUE;
}



/***********************************************************************
 * 				OpenDlg_ScanDir			[internal]
 */
BOOL OpenDlg_ScanDir(HWND hWnd, WORD nDrive, LPSTR newPath, LPSTR fileSpec)
{
	int		OldDrive;
	char	OldPath[512];
	char	str[512];
	OldDrive = DOS_GetDefaultDrive();
	DOS_SetDefaultDrive(nDrive) ;
	strcpy(OldPath, DOS_GetCurrentDir(nDrive));
#ifdef DEBUG_OPENDLG
	printf("OpenDlg_ScanDir // OldDrive=%d OldPath='%s'\n", OldDrive, OldPath);
	printf("OpenDlg_ScanDir // wanted newPath='%s'\n", newPath);
#endif
	if (newPath[1] == ':')
		DOS_ChangeDir(nDrive, &newPath[2]);
	else
		DOS_ChangeDir(nDrive, newPath);
	sprintf(newPath, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
#ifdef DEBUG_OPENDLG
	printf("OpenDlg_ScanDir // actual newPath='%s'\n", newPath);
#endif
	if (strlen(newPath) == 3) newPath[2] = '\0';
	sprintf(str, "%s\\%s", newPath, fileSpec);
	DlgDirList(hWnd, str, lst1, 0, 0x0000);
	SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
	sprintf(str, "%s\\*.*", newPath);
	DlgDirList(hWnd, str, lst2, 0, 0x8010);
	if (strlen(newPath) == 2) strcat(newPath, "\\");
	SendDlgItemMessage(hWnd, stc1, WM_SETTEXT, 0, (DWORD)newPath);
	DOS_ChangeDir(nDrive, OldPath);
	DOS_SetDefaultDrive(OldDrive);
	return TRUE;
}



/***********************************************************************
 * 				OpenDlg_GetFileType		[internal]
 */
LPSTR OpenDlg_GetFileType(LPCSTR types, WORD index)
{
	int		n;
	int		i = 1;
	LPSTR 	ptr = (LPSTR) types;
	if	(ptr == NULL) return NULL;
	while((n = strlen(ptr)) != 0) {
#ifdef DEBUG_OPENDLG
		printf("OpenDlg_GetFileType // file type '%s' !\n", ptr);
#endif
		ptr += ++n;
#ifdef DEBUG_OPENDLG
		printf("OpenDlg_GetFileType // file spec '%s' !\n", ptr);
#endif
		if (i++ == index) return ptr;
		n = strlen(ptr);
		ptr += ++n;
		}
	return NULL;
}


/***********************************************************************
 * 				OpenDlg_ExtractCurDir	[internal]
 */
LPSTR OpenDlg_ExtractCurDir(LPSTR FullPath, short MaxLen)
{
	LPSTR 	ptr;
	if (MaxLen < 0) MaxLen = strlen(FullPath);
	ptr = FullPath + MaxLen - 1;
	if (*ptr == '\\') return NULL;
	while (ptr > FullPath) {
		if (*ptr == '\\') return (ptr + 1);
		ptr--;
		}
	return NULL;
}


/***********************************************************************
 * 				FileSaveDlgProc			[COMMDLG.7]
 */
BOOL FileSaveDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	int		n;
	LPSTR	ptr;
	LPSTR	fspec;
	char	str[512];
	char	C2[128];
	WORD	wRet;
	HBRUSH	hBrush;
	HDC 	hMemDC;
	HBITMAP	hBitmap;
	BITMAP	bm;
	LPMEASUREITEMSTRUCT lpmeasure;
	LPDRAWITEMSTRUCT lpdis;
	static	int		nDrive;
	static 	char	CurPath[512];
	static LPOPENFILENAME lpofn;

	switch (wMsg) {
		case WM_INITDIALOG:
#ifdef DEBUG_OPENDLG
			printf("FileSaveDlgProc // WM_INITDIALOG lParam=%08X\n", lParam);
#endif
			if (!FileDlg_Init(hWnd, lParam)) return TRUE;
			SendDlgItemMessage(hWnd, cmb1, CB_RESETCONTENT, 0, 0L);
			lpofn = (LPOPENFILENAME)lParam;
			ptr = (LPSTR)lpofn->lpstrFilter;
			strcpy(CurPath, lpofn->lpstrInitialDir);
			while((n = strlen(ptr)) != 0) {
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // file type '%s' !\n", ptr);
#endif
				SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, (DWORD)ptr);
				ptr += ++n;
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // file spec '%s' !\n", ptr);
#endif
				n = strlen(ptr);
				ptr += ++n;
				}
			SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (DWORD)str);
			SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL, 
						lpofn->nFilterIndex - 1, 0L);
			DlgDirListComboBox(hWnd, "", cmb2, 0, 0xC000);
			nDrive = 2; 		/* Drive 'C:' */
			SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, nDrive, 0L);
			sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
			fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, 
									lpofn->nFilterIndex);
#ifdef DEBUG_OPENDLG
			printf("FileSaveDlgProc // WM_INITDIALOG fspec #%d = '%s' !\n", 
											lpofn->nFilterIndex, fspec);
#endif
			if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
				printf("OpenDlg_ScanDir // ChangeDir Error !\n");
				}
			else {
				strcpy(CurPath, str);
				}
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return (TRUE);

	case WM_SHOWWINDOW:
		if (wParam == 0) break;
		if (!(lpofn->Flags & OFN_SHOWHELP)) {
			ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
			}
		if (lpofn->Flags & OFN_HIDEREADONLY) {
			ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); 
			}
		return TRUE;

    case WM_MEASUREITEM:
		GetObject(hFolder2, sizeof(BITMAP), (LPSTR)&bm);
		lpmeasure = (LPMEASUREITEMSTRUCT)lParam;
		lpmeasure->itemHeight = bm.bmHeight;
#ifdef DEBUG_OPENDLG_DRAW
		printf("FileSaveDlgProc WM_MEASUREITEM Height=%d !\n", bm.bmHeight);
#endif
		return TRUE;

		case WM_DRAWITEM:
#ifdef DEBUG_OPENDLG_DRAW
			printf("FileSaveDlgProc // WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
#endif
			if (lParam == 0L) break;
			lpdis = (LPDRAWITEMSTRUCT)lParam;
#ifdef DEBUG_OPENDLG_DRAW
			printf("FileSaveDlgProc // WM_DRAWITEM lpdis->CtlID=%04X\n", lpdis->CtlID);
#endif
			if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst1)) {
				hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
				SelectObject(lpdis->hDC, hBrush);
				FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
				ptr = (LPSTR) lpdis->itemData;
				if (ptr == NULL) break;
				TextOut(lpdis->hDC, lpdis->rcItem.left,	lpdis->rcItem.top, 
														ptr, strlen(ptr));
				}
			if ((lpdis->CtlType == ODT_LISTBOX) && (lpdis->CtlID == lst2)) {
				hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
				SelectObject(lpdis->hDC, hBrush);
				FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
				ptr = (LPSTR) lpdis->itemData;
				if (ptr == NULL) break;
				if (strcmp(ptr, "[.]") == 0) {
					hBitmap = hFolder2;
					ptr = CurPath;
					}
				else
					hBitmap = hFolder;
				GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
				TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, 
								lpdis->rcItem.top, ptr, strlen(ptr));
				hMemDC = CreateCompatibleDC(lpdis->hDC);
				SelectObject(hMemDC, hBitmap);
				BitBlt(lpdis->hDC, lpdis->rcItem.left,	lpdis->rcItem.top,
							bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
				DeleteDC(hMemDC);
				}
			if ((lpdis->CtlType == ODT_COMBOBOX) && (lpdis->CtlID == cmb2)) {
				hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
				SelectObject(lpdis->hDC, hBrush);
				FillRect(lpdis->hDC, &lpdis->rcItem, hBrush);
				ptr = (LPSTR) lpdis->itemData;
				if (ptr == NULL) break;
				switch(ptr[2]) {
					case 'a':
					case 'b':
						hBitmap = hFloppy;
						break;
					default:
						hBitmap = hHDisk;
					}
				GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
				TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, 
								lpdis->rcItem.top, ptr, strlen(ptr));
				hMemDC = CreateCompatibleDC(lpdis->hDC);
				SelectObject(hMemDC, hBitmap);
				BitBlt(lpdis->hDC, lpdis->rcItem.left,	lpdis->rcItem.top,
							bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
				DeleteDC(hMemDC);
				}
	        break;

		case WM_COMMAND:
			switch (wParam) {
				case lst1:
					if (HIWORD(lParam) == LBN_DBLCLK ||
						HIWORD(lParam) == LBN_SELCHANGE) {
#ifdef DEBUG_OPENDLG
						printf("FileSaveDlgProc // LBN_SELCHANGE on lst1 !\n");
#endif
						wRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0L);
						SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, wRet, (DWORD)C2);
						}
					if (HIWORD(lParam) == LBN_DBLCLK) {
#ifdef DEBUG_OPENDLG
						printf("FileSaveDlgProc // LBN_DBLCLK on lst1 !\n");
#endif
						return SendMessage(hWnd, WM_COMMAND, IDOK, 0L);
						}
					break;
				case lst2:
				if (HIWORD(lParam) == LBN_DBLCLK) {
#ifdef DEBUG_OPENDLG
					printf("FileSaveDlgProc // LBN_DBLCLK on lst2 !\n");
#endif
					wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
					fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
					C2[0] = '\0';
					wRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0L);
					SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, wRet, (DWORD)C2);
					if (C2[0] == '[') {
						C2[strlen(C2) - 1] = '\0';
						sprintf(str, "%s\\%s", CurPath, &C2[1]);
						if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
							printf("FileSaveDlgProc // ChangeDir Error !\n");
							}
						else {
							strcpy(CurPath, str);
							}
						}
					}
				break;
			case cmb1:
				if (HIWORD(lParam) == CBN_SELCHANGE) {
					wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
					fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
					printf("FileSaveDlgProc // new fspec #%d = '%s' !\n", wRet, fspec);
					if (!OpenDlg_ScanFiles(hWnd, nDrive, CurPath, fspec)) {
						printf("OpenDlg_ScanFile // Change FileType Error !\n");
						}
					}
				break;
			case cmb2:
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // combo #2 changed !\n");
#endif
				wRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0L);
				if (wRet == (WORD)LB_ERR) return 0;
				fspec = OpenDlg_GetFileType(lpofn->lpstrFilter, wRet + 1);
				wRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
				if (wRet == (WORD)LB_ERR) return 0;
				printf("FileSaveDlgProc // combo #2 CB_GETCURSEL=%d !\n", wRet);
				SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, wRet, (DWORD)C2);
				nDrive = C2[2] - 'a';
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // new drive selected=%d !\n", nDrive);
#endif
				sprintf(str, "%c:\\%s", nDrive + 'A', DOS_GetCurrentDir(nDrive));
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // new drive , curPath='%s' !\n", str);
#endif
				if (!OpenDlg_ScanDir(hWnd, nDrive, str, fspec)) {
					printf("FileSaveDlgProc // Change Drive Error !\n");
					}
				else {
					strcpy(CurPath, str);
					}
				break;
			case chx1:
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // read-only toggled !\n");
#endif
				break;
			case pshHelp:
#ifdef DEBUG_OPENDLG
				printf("FileSaveDlgProc // pshHelp pressed !\n");
#endif
				break;
				case IDOK:
					strcpy(lpofn->lpstrFile, "titi.txt");
					if (lpofn->lpstrFileTitle != NULL) {
						strcpy(lpofn->lpstrFileTitle, "titi.txt");
						}
					EndDialog(hWnd, TRUE);
					return(TRUE);
				case IDCANCEL:
					EndDialog(hWnd, FALSE);
					return(TRUE);
				}
			return(FALSE);
		}
	return FALSE;
}


/***********************************************************************
 * 				ColorDlgProc			[COMMDLG.8]
 */
BOOL ColorDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	switch (wMsg) {
		case WM_INITDIALOG:
			printf("ColorDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return (TRUE);

		case WM_COMMAND:
			switch (wParam) {
				case IDOK:
					EndDialog(hWnd, TRUE);
					return(TRUE);
				case IDCANCEL:
					EndDialog(hWnd, FALSE);
					return(TRUE);
				}
			return(FALSE);
		}
	return FALSE;
}


/***********************************************************************
 * 				FindTextDlg				[COMMDLG.11]
 */
BOOL FindText(LPFINDREPLACE lpFind)
{
	HANDLE	hDlgTmpl;
	HANDLE	hResInfo;
    WND 	*wndPtr;
	BOOL	bRet;
	hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(FINDDLG), RT_DIALOG);
	if (hResInfo == 0) {
		CommDlgLastError = CDERR_FINDRESFAILURE;
		return FALSE;
		}
	hDlgTmpl = LoadResource(hSysRes, hResInfo);
	if (hDlgTmpl == 0) {
		CommDlgLastError = CDERR_LOADRESFAILURE;
		return FALSE;
		}
    wndPtr = WIN_FindWndPtr(lpFind->hwndOwner);
	bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
		lpFind->hwndOwner, (WNDPROC)FindTextDlgProc, (DWORD)lpFind);
	return bRet;
}


/***********************************************************************
 * 				ReplaceTextDlg			[COMMDLG.12]
 */
BOOL ReplaceText(LPFINDREPLACE lpFind)
{
	HANDLE	hDlgTmpl;
	HANDLE	hResInfo;
    WND 	*wndPtr;
	BOOL	bRet;
	hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(REPLACEDLG), RT_DIALOG);
	if (hResInfo == 0) {
		CommDlgLastError = CDERR_FINDRESFAILURE;
		return FALSE;
		}
	hDlgTmpl = LoadResource(hSysRes, hResInfo);
	if (hDlgTmpl == 0) {
		CommDlgLastError = CDERR_LOADRESFAILURE;
		return FALSE;
		}
    wndPtr = WIN_FindWndPtr(lpFind->hwndOwner);
	bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
		lpFind->hwndOwner, (WNDPROC)ReplaceTextDlgProc, (DWORD)lpFind);
	return bRet;
}


/***********************************************************************
 * 				FindTextDlgProc			[COMMDLG.13]
 */
BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	switch (wMsg) {
		case WM_INITDIALOG:
			printf("FindTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return (TRUE);

		case WM_COMMAND:
			switch (wParam) {
				case IDOK:
					EndDialog(hWnd, TRUE);
					return(TRUE);
				case IDCANCEL:
					EndDialog(hWnd, FALSE);
					return(TRUE);
				}
			return(FALSE);
		}
	return FALSE;
}


/***********************************************************************
 * 				ReplaceTextDlgProc		[COMMDLG.14]
 */
BOOL ReplaceTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	switch (wMsg) {
		case WM_INITDIALOG:
			printf("ReplaceTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return (TRUE);

		case WM_COMMAND:
			switch (wParam) {
				case IDOK:
					EndDialog(hWnd, TRUE);
					return(TRUE);
				case IDCANCEL:
					EndDialog(hWnd, FALSE);
					return(TRUE);
				}
			return(FALSE);
		}
	return FALSE;
}


/***********************************************************************
 * 				PrintDlg				[COMMDLG.20]
 */
BOOL PrintDlg(LPPRINTDLG lpPrint)
{
	HANDLE	hDlgTmpl;
	HANDLE	hResInfo;
    WND 	*wndPtr;
	BOOL	bRet;
	printf("PrintDlg(%p) // Flags=%08lX\n", lpPrint, lpPrint->Flags);
	if (lpPrint->Flags & PD_PRINTSETUP)
		hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(PRINTSETUPDLG), RT_DIALOG);
	else
		hResInfo = FindResource(hSysRes, MAKEINTRESOURCE(PRINTDLG), RT_DIALOG);
	if (hResInfo == 0) {
		CommDlgLastError = CDERR_FINDRESFAILURE;
		return FALSE;
		}
	hDlgTmpl = LoadResource(hSysRes, hResInfo);
	if (hDlgTmpl == 0) {
		CommDlgLastError = CDERR_LOADRESFAILURE;
		return FALSE;
		}
    wndPtr = WIN_FindWndPtr(lpPrint->hwndOwner);
	if (lpPrint->Flags & PD_PRINTSETUP)
		bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
			lpPrint->hwndOwner, (WNDPROC)PrintSetupDlgProc, (DWORD)lpPrint);
	else
		bRet = DialogBoxIndirectParam(wndPtr->hInstance, hDlgTmpl, 
			lpPrint->hwndOwner, (WNDPROC)PrintDlgProc, (DWORD)lpPrint);
	return bRet;
}


/***********************************************************************
 * 				PrintDlgProc			[COMMDLG.21]
 */
BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	switch (wMsg) {
		case WM_INITDIALOG:
			printf("PrintDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return (TRUE);

		case WM_COMMAND:
			switch (wParam) {
				case IDOK:
					EndDialog(hWnd, TRUE);
					return(TRUE);
				case IDCANCEL:
					EndDialog(hWnd, FALSE);
					return(TRUE);
				}
			return(FALSE);
		}
	return FALSE;
}


/***********************************************************************
 * 				PrintSetupDlgProc		[COMMDLG.22]
 */
BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
	switch (wMsg) {
		case WM_INITDIALOG:
			printf("PrintSetupDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
			ShowWindow(hWnd, SW_SHOWNORMAL);
			return (TRUE);

		case WM_COMMAND:
			switch (wParam) {
				case IDOK:
					EndDialog(hWnd, TRUE);
					return(TRUE);
				case IDCANCEL:
					EndDialog(hWnd, FALSE);
					return(TRUE);
				}
			return(FALSE);
		}
	return FALSE;
}


/***********************************************************************
 * 				CommDlgExtendError		[COMMDLG.26]
 */
DWORD CommDlgExtendError(void)
{
	return CommDlgLastError;
}


/***********************************************************************
 * 				GetFileTitle			[COMMDLG.27]
 */
int GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
{
	int		i, len;
	printf("GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
	if (lpFile == NULL || lpTitle == NULL) return -1;
	len = strlen(lpFile);
	if (len == 0) return -1;
	if (strchr(lpFile, '*') != NULL) return -1;
	if (strchr(lpFile, '[') != NULL) return -1;
	if (strchr(lpFile, ']') != NULL) return -1;
	len--;
	if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':') return -1;
	for (i = len; i >= 0; i--) {
		if (lpFile[i] == '/' || 
			lpFile[i] == '\\' || 
			lpFile[i] == ':') {
			i++;
			break;
			}
		}
	printf("\n---> '%s' ", &lpFile[i]);
	len = min(cbBuf, strlen(&lpFile[i]) + 1);
	strncpy(lpTitle, &lpFile[i], len + 1);
	if (len != cbBuf)
		return len;
	else
		return 0;
}



