Tue Jun 6 12:11:41 1995 Alexandre Julliard (julliard@sunsite.unc.edu) * [controls/menu.c] Fixed bug with drawing multi-column menus with vertical separator. * [debugger/debug.l] Fixed NULL-pointer reference after readline(). * [if1632/winprocs.spec] [miscemu/int21.c] [miscemu/interrupts.c] Added interrupt vector emulation. Allows to retrieve an interrupt vector and jump to it without crashing. * [loader/ldt.c] Moved ldt.c to memory directory. * [loader/task.c] Implemented LockCurrentTask() and GetInstanceData(). * [objects/bitblt.c] Fixed a bug that caused StretchBlt() to use wrong colors when stretching a monochrome bitmap to a color display. * [objects/bitmap.c] Fixed a segmented pointer bug in CreateBitmapIndirect(). * [tools/build.c] Added possibility to have arguments for register functions; used by interrupt vectors to remove the flags from the stack. Generate a new function CallTo32_LargeStack(), that allows calling a 32-bit function using the original 32-bit stack, for functions that need more that 64k of stack. Tue May 30 10:29:56 1995 Martin von Loewis <martin@informatik.hu-berlin.de> * [if1632/shell.spec] [misc/shell.c] DoEnvironmentSubst: fixed prototype * [if1632/gdi.spec] [objects/palette.c] SetSystemPaletteUse: new function * [if1632/kernel.spec] [loader/resource.c] DirectResAlloc: new function * [if1632/user.spec] [windows/keyboard.c] SetKeyboardState: new function Mon May 29 12:58:28 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de> * [tools/build.c] Prevent interrupts from destroying the args for a 32 bit function by loading the correct value into %esp directly after %ss. * [loader/ne_image.c] [loader/module.c] The new instance must be created earlier in LoadModule(), so that fixups referencing it will be handled correctly. Initialize the local heap for a DGROUP in NE_LoadSegment(). * [objects/dib.c] Like RLE8 bitmaps, RLE4 bitmaps don't always end with a proper code. This used to crash Wine. Fixed. * [objects/text.c] Fix possible null pointer dereference in debugging output. * [misc/commdlg.c] Handle user input in the edit control better. Some bugs fixed. * [memory/local.c] Started implementing moveable blocks. This is unfinished (!), but at least it does not seem to break things. Wed May 24 13:26:36 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de> * [loader/module.c] LoadModule(): DLLs occasionally have a data segment, and they work much better if it is loaded :-) LoadLibrary(): pass HMODULE instead of HINSTANCE to NE_InitializeDLLs. FindModule(): also strip off the last backslash of the pathnames (Winhelp tried to load C:\WINDOWS\SYSTEM\COMMDLG.DLL). GetModuleHandle(): just call MODULE_FindModule, it does the same job, only better. * [loader/ne_image.c] LocalInit() the heap of a DLL in NE_InitDLL. (This is probably not really correct, it seems that all programs and DLLs try to do this themselves. But they pass weird parameters.) NE_InitializeDLLs should also call NE_InitDLL for the passed hModule. * [loader/task.c] [misc/user.c] Finish global initializations in InitTask instead of InitApp, or all the DLLs will be initialized in InitTask without any available window classes!
819 lines
22 KiB
C
819 lines
22 KiB
C
/*
|
|
* COMMDLG functions
|
|
*
|
|
* Copyright 1994 Martin Ayotte
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "dialog.h"
|
|
#include "win.h"
|
|
#include "user.h"
|
|
#include "message.h"
|
|
#include "commdlg.h"
|
|
#include "dlgs.h"
|
|
#include "selectors.h"
|
|
#include "../rc/sysres.h"
|
|
#include "dos_fs.h"
|
|
#include "stackframe.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;
|
|
|
|
/***********************************************************************
|
|
* FileDlg_Init [internal]
|
|
*/
|
|
static BOOL FileDlg_Init()
|
|
{
|
|
static BOOL initialized = 0;
|
|
|
|
if (!initialized) {
|
|
if (!hFolder) hFolder = LoadBitmap(0, MAKEINTRESOURCE(OBM_FOLDER));
|
|
if (!hFolder2) hFolder2 = LoadBitmap(0, MAKEINTRESOURCE(OBM_FOLDER2));
|
|
if (!hFloppy) hFloppy = LoadBitmap(0, MAKEINTRESOURCE(OBM_FLOPPY));
|
|
if (!hHDisk) hHDisk = LoadBitmap(0, MAKEINTRESOURCE(OBM_HDISK));
|
|
if (!hCDRom) hCDRom = LoadBitmap(0, MAKEINTRESOURCE(OBM_CDROM));
|
|
if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 ||
|
|
hHDisk == 0 || hCDRom == 0)
|
|
{
|
|
fprintf(stderr, "FileDlg_Init // Error loading bitmaps !");
|
|
return FALSE;
|
|
}
|
|
initialized = TRUE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* GetOpenFileName [COMMDLG.1]
|
|
*/
|
|
BOOL GetOpenFileName(LPOPENFILENAME lpofn)
|
|
{
|
|
HANDLE hDlgTmpl;
|
|
HANDLE hResInfo;
|
|
HINSTANCE hInst;
|
|
BOOL bRet;
|
|
LPCSTR dlgTemplate;
|
|
|
|
if (!FileDlg_Init()) return FALSE;
|
|
|
|
if (lpofn == NULL) return FALSE;
|
|
if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
|
|
dlgTemplate = GlobalLock(lpofn->hInstance);
|
|
if (!dlgTemplate) {
|
|
CommDlgLastError = CDERR_LOADRESFAILURE;
|
|
return FALSE;
|
|
}
|
|
} else {
|
|
if (lpofn->Flags & OFN_ENABLETEMPLATE) {
|
|
hInst = lpofn->hInstance;
|
|
hResInfo = FindResource(hInst, lpofn->lpTemplateName, RT_DIALOG);
|
|
if (hResInfo == 0) {
|
|
CommDlgLastError = CDERR_FINDRESFAILURE;
|
|
return FALSE;
|
|
}
|
|
hDlgTmpl = LoadResource(hInst, hResInfo);
|
|
if (hDlgTmpl == 0) {
|
|
CommDlgLastError = CDERR_LOADRESFAILURE;
|
|
return FALSE;
|
|
}
|
|
dlgTemplate = GlobalLock(hDlgTmpl);
|
|
} else {
|
|
dlgTemplate = sysres_DIALOG_3;
|
|
}
|
|
}
|
|
hInst = GetWindowWord(lpofn->hwndOwner, GWW_HINSTANCE);
|
|
bRet = DialogBoxIndirectParamPtr(hInst, dlgTemplate, lpofn->hwndOwner,
|
|
GetWndProcEntry16("FileOpenDlgProc"),
|
|
(DWORD)lpofn);
|
|
|
|
printf("GetOpenFileName // return lpstrFile='%s' !\n",
|
|
(LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* GetSaveFileName [COMMDLG.2]
|
|
*/
|
|
BOOL GetSaveFileName(LPOPENFILENAME lpofn)
|
|
{
|
|
HANDLE hDlgTmpl;
|
|
HANDLE hResInfo;
|
|
HINSTANCE hInst;
|
|
BOOL bRet;
|
|
LPCSTR dlgTemplate;
|
|
|
|
if (!FileDlg_Init()) return FALSE;
|
|
|
|
if (lpofn == NULL) return FALSE;
|
|
if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
|
|
dlgTemplate = GlobalLock(lpofn->hInstance);
|
|
if (!dlgTemplate) {
|
|
CommDlgLastError = CDERR_LOADRESFAILURE;
|
|
return FALSE;
|
|
}
|
|
} else {
|
|
if (lpofn->Flags & OFN_ENABLETEMPLATE) {
|
|
hInst = lpofn->hInstance;
|
|
hResInfo = FindResource(hInst, lpofn->lpTemplateName, RT_DIALOG);
|
|
if (hResInfo == 0) {
|
|
CommDlgLastError = CDERR_FINDRESFAILURE;
|
|
return FALSE;
|
|
}
|
|
hDlgTmpl = LoadResource(hInst, hResInfo);
|
|
if (hDlgTmpl == 0) {
|
|
CommDlgLastError = CDERR_LOADRESFAILURE;
|
|
return FALSE;
|
|
}
|
|
dlgTemplate = GlobalLock(hDlgTmpl);
|
|
} else {
|
|
dlgTemplate = sysres_DIALOG_4; /* SAVEFILEDIALOG */
|
|
}
|
|
}
|
|
hInst = GetWindowWord(lpofn->hwndOwner, GWW_HINSTANCE);
|
|
bRet = DialogBoxIndirectParamPtr(hInst, dlgTemplate, lpofn->hwndOwner,
|
|
GetWndProcEntry16("FileSaveDlgProc"),
|
|
(DWORD)lpofn);
|
|
printf("GetSaveFileName // return lpstrFile='%s' !\n",
|
|
(LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
|
|
return bRet;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_StripEditControl [internal]
|
|
* Strip pathnames off the contents of the edit control.
|
|
*/
|
|
static void FILEDLG_StripEditControl(HWND hwnd)
|
|
{
|
|
char temp[512], *cp;
|
|
|
|
SendDlgItemMessage(hwnd, edt1, WM_GETTEXT, 511, MAKE_SEGPTR(temp));
|
|
cp = strrchr(temp, '\\');
|
|
if (cp != NULL) {
|
|
strcpy(temp, cp+1);
|
|
}
|
|
cp = strrchr(temp, ':');
|
|
if (cp != NULL) {
|
|
strcpy(temp, cp+1);
|
|
}
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_ScanDir [internal]
|
|
*/
|
|
static BOOL FILEDLG_ScanDir(HWND hWnd, LPSTR newPath)
|
|
{
|
|
char str[512],str2[512];
|
|
|
|
strcpy(str,newPath);
|
|
SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 511, MAKE_SEGPTR(str2));
|
|
strcat(str, str2);
|
|
if (!DlgDirList(hWnd, str, lst1, 0, 0x0000)) return FALSE;
|
|
DlgDirList(hWnd, "*.*", lst2, stc1, 0x8010);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_GetFileType [internal]
|
|
*/
|
|
static LPSTR FILEDLG_GetFileType(LPSTR ptr, WORD index)
|
|
{
|
|
int n, i;
|
|
|
|
if (ptr == NULL) return NULL;
|
|
|
|
for (i = 1;;i++) {
|
|
n = strlen(ptr);
|
|
if (n == 0) break;
|
|
ptr += n + 1;
|
|
if (i == index) return ptr;
|
|
n = strlen(ptr);
|
|
ptr += n + 1;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_WMDrawItem [internal]
|
|
*/
|
|
static LONG FILEDLG_WMDrawItem(HWND hWnd, WORD wParam, LONG lParam)
|
|
{
|
|
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)PTR_SEG_TO_LIN(lParam);
|
|
LPSTR str;
|
|
HBRUSH hBrush;
|
|
HBITMAP hBitmap, hPrevBitmap;
|
|
BITMAP bm;
|
|
HDC hMemDC;
|
|
|
|
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);
|
|
str = (LPSTR) PTR_SEG_TO_LIN(lpdis->itemData);
|
|
if (str != NULL) {
|
|
TextOut(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
|
|
str, strlen(str));
|
|
if (lpdis->itemState != 0) {
|
|
InvertRect(lpdis->hDC, &lpdis->rcItem);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
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);
|
|
str = (LPSTR) PTR_SEG_TO_LIN(lpdis->itemData);
|
|
if (str != NULL) {
|
|
hBitmap = hFolder;
|
|
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
|
|
TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
|
|
lpdis->rcItem.top, str, strlen(str));
|
|
hMemDC = CreateCompatibleDC(lpdis->hDC);
|
|
hPrevBitmap = SelectObject(hMemDC, hBitmap);
|
|
BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
|
|
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
|
SelectObject(hMemDC, hPrevBitmap);
|
|
DeleteDC(hMemDC);
|
|
if (lpdis->itemState != 0) {
|
|
InvertRect(lpdis->hDC, &lpdis->rcItem);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
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);
|
|
str = (LPSTR) PTR_SEG_TO_LIN(lpdis->itemData);
|
|
if (str != NULL) {
|
|
switch(str[2]) {
|
|
case 'a': case 'b':
|
|
hBitmap = hFloppy;
|
|
break;
|
|
default:
|
|
hBitmap = hHDisk;
|
|
break;
|
|
}
|
|
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
|
|
TextOut(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth,
|
|
lpdis->rcItem.top, str, strlen(str));
|
|
hMemDC = CreateCompatibleDC(lpdis->hDC);
|
|
hPrevBitmap = SelectObject(hMemDC, hBitmap);
|
|
BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
|
|
bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
|
|
SelectObject(hMemDC, hPrevBitmap);
|
|
DeleteDC(hMemDC);
|
|
if (lpdis->itemState != 0) {
|
|
InvertRect(lpdis->hDC, &lpdis->rcItem);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_WMMeasureItem [internal]
|
|
*/
|
|
static LONG FILEDLG_WMMeasureItem(HWND hWnd, WORD wParam, LONG lParam)
|
|
{
|
|
BITMAP bm;
|
|
LPMEASUREITEMSTRUCT lpmeasure;
|
|
|
|
GetObject(hFolder2, sizeof(BITMAP), (LPSTR)&bm);
|
|
lpmeasure = (LPMEASUREITEMSTRUCT)PTR_SEG_TO_LIN(lParam);
|
|
lpmeasure->itemHeight = bm.bmHeight;
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_WMInitDialog [internal]
|
|
*/
|
|
static LONG FILEDLG_WMInitDialog(HWND hWnd, WORD wParam, LONG lParam)
|
|
{
|
|
int n;
|
|
LPOPENFILENAME lpofn;
|
|
char tmpstr[512];
|
|
LPSTR pstr;
|
|
|
|
SetWindowLong(hWnd, DWL_USER, lParam);
|
|
lpofn = (LPOPENFILENAME)lParam;
|
|
|
|
/* read filter information */
|
|
pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
|
|
while(*pstr) {
|
|
n = strlen(pstr);
|
|
strcpy(tmpstr, pstr);
|
|
SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, MAKE_SEGPTR(tmpstr));
|
|
pstr += n + 1;
|
|
n = strlen(pstr);
|
|
pstr += n + 1;
|
|
}
|
|
|
|
/* set default filter */
|
|
SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL,
|
|
lpofn->nFilterIndex - 1, 0);
|
|
strcpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrFilter),
|
|
lpofn->nFilterIndex));
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
|
|
|
|
/* get drive list */
|
|
strcpy(tmpstr,"");
|
|
DlgDirListComboBox(hWnd, MAKE_SEGPTR(tmpstr), cmb2, 0, 0xC000);
|
|
|
|
/* read initial directory */
|
|
if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL) {
|
|
strcpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir));
|
|
if (strlen(tmpstr) > 0 && tmpstr[strlen(tmpstr)-1] != '\\'
|
|
&& tmpstr[strlen(tmpstr)-1] != ':')
|
|
{
|
|
strcat(tmpstr,"\\");
|
|
}
|
|
} else {
|
|
strcpy(tmpstr,"");
|
|
}
|
|
if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
|
|
fprintf(stderr, "FileDlg: couldn't read initial directory!\n");
|
|
}
|
|
|
|
/* select current drive in combo 2 */
|
|
n = DOS_GetDefaultDrive();
|
|
SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, n, 0);
|
|
|
|
if (!(lpofn->Flags & OFN_SHOWHELP)) {
|
|
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
|
|
}
|
|
if (lpofn->Flags & OFN_HIDEREADONLY) {
|
|
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FILEDLG_WMCommand [internal]
|
|
*/
|
|
static LONG FILEDLG_WMCommand(HWND hWnd, WORD wParam, LONG lParam)
|
|
{
|
|
LONG lRet;
|
|
LPOPENFILENAME lpofn;
|
|
char tmpstr[512], tmpstr2[512];
|
|
LPSTR pstr, pstr2;
|
|
|
|
lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
|
|
switch (wParam) {
|
|
case lst1:
|
|
FILEDLG_StripEditControl(hWnd);
|
|
if (HIWORD(lParam) == LBN_DBLCLK) {
|
|
lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
|
|
if (lRet == LB_ERR) return TRUE;
|
|
SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet, MAKE_SEGPTR(tmpstr));
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
|
|
return SendMessage(hWnd, WM_COMMAND, IDOK, 0);
|
|
}
|
|
return TRUE;
|
|
case lst2:
|
|
FILEDLG_StripEditControl(hWnd);
|
|
if (HIWORD(lParam) == LBN_DBLCLK) {
|
|
lRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0);
|
|
if (lRet == LB_ERR) return TRUE;
|
|
SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, lRet, MAKE_SEGPTR(tmpstr));
|
|
|
|
if (tmpstr[0] == '[') {
|
|
tmpstr[strlen(tmpstr) - 1] = 0;
|
|
strcpy(tmpstr,tmpstr+1);
|
|
}
|
|
strcat(tmpstr, "\\");
|
|
FILEDLG_ScanDir(hWnd, tmpstr);
|
|
}
|
|
return TRUE;
|
|
|
|
case cmb1:
|
|
if (HIWORD(lParam) == CBN_SELCHANGE) {
|
|
lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0);
|
|
if (lRet == LB_ERR) return TRUE;
|
|
strcpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrFilter),
|
|
lRet + 1));
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
|
|
FILEDLG_ScanDir(hWnd, "");
|
|
}
|
|
return TRUE;
|
|
|
|
case cmb2:
|
|
FILEDLG_StripEditControl(hWnd);
|
|
lRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
|
|
if (lRet == LB_ERR) return 0;
|
|
SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, lRet, MAKE_SEGPTR(tmpstr));
|
|
sprintf(tmpstr, "%c:", tmpstr[2]);
|
|
FILEDLG_ScanDir(hWnd, tmpstr);
|
|
return TRUE;
|
|
|
|
case chx1:
|
|
return TRUE;
|
|
|
|
case pshHelp:
|
|
return TRUE;
|
|
|
|
case IDOK:
|
|
SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 511, MAKE_SEGPTR(tmpstr));
|
|
|
|
pstr = strrchr(tmpstr, '\\');
|
|
if (pstr == NULL) pstr = strrchr(tmpstr, ':');
|
|
|
|
if (strchr(tmpstr,'*') != NULL || strchr(tmpstr,'?') != NULL) {
|
|
/* edit control contains wildcards */
|
|
if (pstr != NULL) {
|
|
strcpy(tmpstr2, pstr+1);
|
|
*(pstr+1) = 0;
|
|
} else {
|
|
strcpy(tmpstr2, tmpstr);
|
|
strcpy(tmpstr, "");
|
|
}
|
|
printf("commdlg: %s, %s\n", tmpstr, tmpstr2);
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
|
|
FILEDLG_ScanDir(hWnd, tmpstr);
|
|
return TRUE;
|
|
}
|
|
|
|
/* no wildcards, we might have a directory or a filename */
|
|
/* try appending a wildcard and reading the directory */
|
|
pstr2 = tmpstr + strlen(tmpstr);
|
|
if (pstr == NULL || *(pstr+1) != 0) {
|
|
strcat(tmpstr, "\\");
|
|
}
|
|
lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0);
|
|
if (lRet == LB_ERR) return TRUE;
|
|
strcpy(tmpstr2, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrFilter),
|
|
lRet + 1));
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
|
|
/* if ScanDir succeeds, we have changed the directory */
|
|
if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
|
|
|
|
/* if not, this must be a filename */
|
|
*pstr2 = 0;
|
|
|
|
if (pstr != NULL) {
|
|
/* strip off the pathname */
|
|
*pstr = 0;
|
|
strcpy(tmpstr2, pstr+1);
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
|
|
/* Should we MessageBox() if this fails? */
|
|
if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
|
|
strcpy(tmpstr, tmpstr2);
|
|
} else {
|
|
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
|
|
}
|
|
|
|
ShowWindow(hWnd, SW_HIDE);
|
|
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr);
|
|
lpofn->nFileOffset = 0;
|
|
lpofn->nFileExtension = strlen(PTR_SEG_TO_LIN(lpofn->lpstrFile)) - 3;
|
|
if (PTR_SEG_TO_LIN(lpofn->lpstrFileTitle) != NULL) {
|
|
lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
|
|
SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet, MAKE_SEGPTR(tmpstr));
|
|
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
|
|
}
|
|
EndDialog(hWnd, TRUE);
|
|
return TRUE;
|
|
case IDCANCEL:
|
|
EndDialog(hWnd, FALSE);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* FileOpenDlgProc [COMMDLG.6]
|
|
*/
|
|
BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
|
|
|
|
case WM_MEASUREITEM:
|
|
return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
|
|
|
|
case WM_DRAWITEM:
|
|
return FILEDLG_WMDrawItem(hWnd, wParam, lParam);
|
|
|
|
case WM_COMMAND:
|
|
return FILEDLG_WMCommand(hWnd, wParam, lParam);
|
|
}
|
|
|
|
/*
|
|
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;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* FileSaveDlgProc [COMMDLG.7]
|
|
*/
|
|
BOOL FileSaveDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
|
|
{
|
|
switch (wMsg) {
|
|
case WM_INITDIALOG:
|
|
return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
|
|
|
|
case WM_MEASUREITEM:
|
|
return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
|
|
|
|
case WM_DRAWITEM:
|
|
return FILEDLG_WMDrawItem(hWnd, wParam, lParam);
|
|
|
|
case WM_COMMAND:
|
|
return FILEDLG_WMCommand(hWnd, wParam, lParam);
|
|
}
|
|
|
|
/*
|
|
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;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* ChooseColor [COMMDLG.5]
|
|
*/
|
|
BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
|
|
{
|
|
WND *wndPtr;
|
|
BOOL bRet;
|
|
wndPtr = WIN_FindWndPtr(lpChCol->hwndOwner);
|
|
bRet = DialogBoxIndirectParamPtr(wndPtr->hInstance, sysres_DIALOG_8,
|
|
lpChCol->hwndOwner, GetWndProcEntry16("ColorDlgProc"),
|
|
(DWORD)lpChCol);
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* 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)
|
|
{
|
|
WND *wndPtr;
|
|
BOOL bRet;
|
|
LPCSTR lpTemplate;
|
|
|
|
lpTemplate = sysres_DIALOG_9;
|
|
wndPtr = WIN_FindWndPtr(lpFind->hwndOwner);
|
|
bRet = DialogBoxIndirectParamPtr(wndPtr->hInstance, lpTemplate,
|
|
lpFind->hwndOwner, GetWndProcEntry16("FindTextDlgProc"),
|
|
(DWORD)lpFind);
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
* ReplaceTextDlg [COMMDLG.12]
|
|
*/
|
|
BOOL ReplaceText(LPFINDREPLACE lpFind)
|
|
{
|
|
WND *wndPtr;
|
|
BOOL bRet;
|
|
LPCSTR lpTemplate;
|
|
|
|
lpTemplate = sysres_DIALOG_10;
|
|
wndPtr = WIN_FindWndPtr(lpFind->hwndOwner);
|
|
bRet = DialogBoxIndirectParamPtr(wndPtr->hInstance, lpTemplate,
|
|
lpFind->hwndOwner, GetWndProcEntry16("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)
|
|
{
|
|
WND *wndPtr;
|
|
BOOL bRet;
|
|
LPCSTR lpTemplate;
|
|
|
|
printf("PrintDlg(%p) // Flags=%08lX\n", lpPrint, lpPrint->Flags);
|
|
if (lpPrint->Flags & PD_PRINTSETUP) {
|
|
lpTemplate = sysres_DIALOG_6;
|
|
} else {
|
|
lpTemplate = sysres_DIALOG_5;
|
|
}
|
|
wndPtr = WIN_FindWndPtr(lpPrint->hwndOwner);
|
|
if (lpPrint->Flags & PD_PRINTSETUP)
|
|
bRet = DialogBoxIndirectParamPtr(wndPtr->hInstance, lpTemplate,
|
|
lpPrint->hwndOwner, GetWndProcEntry16("PrintSetupDlgProc"),
|
|
(DWORD)lpPrint);
|
|
else
|
|
bRet = DialogBoxIndirectParamPtr(wndPtr->hInstance, lpTemplate,
|
|
lpPrint->hwndOwner, GetWndProcEntry16("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;
|
|
}
|