home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 11 Util
/
11-Util.zip
/
PMF202.ZIP
/
COPYDLGS.C
next >
Wrap
C/C++ Source or Header
|
1990-06-08
|
31KB
|
1,015 lines
/*
copydlgs.c
dialog box routines for pmfloppy
Copyright G. Bryant, 1990
Change Log
6-Jun-90 Change ParseFileName to return different value for empty
file Name -vs- invalid file name. change SELECT to ENTER
for IDD_DI_DIRS field in load and save.
8-Jun-90 Correct the busy check for Write
*/
#define INCL_PM
#define INCL_DOSERRORS
#define INCL_BASE
#include <os2.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "pmfloppy.h"
#include "DskIm.h"
// external function prototypes
extern VOID PutBox(PSZ, PSZ);
// global function prototypes
MRESULT EXPENTRY ReadDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY WriteDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY DeleteDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY LoadDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY SaveDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY CompDlgProc(HWND, USHORT, MPARAM, MPARAM);
MRESULT EXPENTRY AboutDlgProc(HWND, USHORT, MPARAM, MPARAM);
// local function prototypes
VOID GetImageList(HWND, USHORT, USHORT);
VOID GetDirList(HWND, CHAR *);
VOID GetFileList(HWND);
USHORT SetBox(HWND, MPARAM);
USHORT SetEdit(HWND, USHORT);
BOOL SetDrive(HWND, USHORT);
BOOL ParseFileName (CHAR *, CHAR *);
BOOL CheckLSParms(HWND, USHORT);
// PM vbls
extern HWND hWndFrame ;
// User response vbls
extern DskImage ImageBuffers[NUM_IMAGES];
extern USHORT BufferNum;
extern USHORT CompNum;
// set up image list and edit boxes
VOID GetImageList(HWND hwnd, USHORT EditB, USHORT ListB) {
USHORT curBuff;
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(ImageBuffers[curBuff].BufferName[0] != '\0');
curBuff++) {
WinSendDlgItemMsg(hwnd,
ListB,
LM_INSERTITEM,
MPFROM2SHORT(LIT_END,0),
MPFROMP(ImageBuffers[curBuff].BufferName));
}
curBuff = 0;
WinSendDlgItemMsg(hwnd,
EditB,
EM_SETTEXTLIMIT,
MPFROM2SHORT(BUFFERNMSZ,0),
NULL);
WinSetDlgItemText(hwnd, EditB, ImageBuffers[curBuff].BufferName);
return;
} // GetImageList
//
// return the buffer number of the selected image
//
USHORT SetBox(HWND hwnd, MPARAM mp1) {
USHORT curBuff;
SHORT Select;
CHAR curBuffName[BUFFERNMSZ];
// get the selection number
Select = (USHORT) WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYSELECTION,
0L,
0L);
// get the selection text
WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYITEMTEXT,
MPFROM2SHORT(Select,BUFFERNMSZ),
MPFROMP(curBuffName));
// get the buffer number
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++) ;
return(curBuff);
} // SetBox
// Set the drive letter - returns true if illegal value
BOOL SetDrive(HWND hwnd, USHORT curBuff) {
WinQueryDlgItemText(hwnd,
IDD_DI_DRV,
2,
ImageBuffers[curBuff].DriveID);
ImageBuffers[curBuff].DriveID[0] = (CHAR) toupper(ImageBuffers[curBuff].DriveID[0]);
if (!isupper((USHORT) ImageBuffers[curBuff].DriveID[0])) {
PutBox("Destination Drive must be a drive letter","e.g. A");
return(TRUE);
}
return(FALSE);
} // SetDrive
// ReadDlgProc -- Disk Read dialog procedure.
//
// Output: ReadDrive -- Global name of selected drive
MRESULT CALLBACK ReadDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2) {
USHORT curChar;
USHORT curBuff;
CHAR curBuffName[BUFFERNMSZ];
USHORT NameLen;
switch (id) {
case WM_INITDLG:
GetImageList(hwnd, IDD_DI_FLD, IDD_DI_BOX);
WinSendDlgItemMsg(hwnd,
IDD_DI_DRV,
EM_SETTEXTLIMIT,
MPFROM2SHORT(1,0),
NULL);
return(0);
case WM_CONTROL: // get the button that was clicked
if (SHORT1FROMMP(mp1) == IDD_DI_BOX) {
curBuff = SetBox(hwnd, mp1);
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_DI_FLD,
ImageBuffers[curBuff].BufferName);
return(0);
case LN_ENTER:
if (SetDrive(hwnd, curBuff)) return(0);
if (ImageBuffers[curBuff].Busy) {
PutBox("That image is busy -","please select another");
}
else {
ImageBuffers[curBuff].Busy = BUSY_READ;
BufferNum = curBuff;
WinDismissDlg(hwnd, TRUE);
}
return(0);
}
}
return(0);
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
NameLen = WinQueryDlgItemText(hwnd,
IDD_DI_FLD,
BUFFERNMSZ,
curBuffName);
if (NameLen == 0) {
PutBox("You must enter a buffer name,","or select 'Cancel'");
return(0);
}
for (curChar=0;curChar < BUFFERNMSZ;curChar++)
curBuffName[curChar] = (CHAR) toupper(curBuffName[curChar]);
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(ImageBuffers[curBuff].BufferName[0] != '\0') &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++) ;
if (curBuff < NUM_IMAGES) {
if (SetDrive(hwnd, curBuff)) return(0);
if (ImageBuffers[curBuff].Busy) {
PutBox("That image is busy -","please select another");
}
else {
ImageBuffers[curBuff].Busy = BUSY_READ;
strncpy(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ);
BufferNum = curBuff;
WinDismissDlg(hwnd, TRUE);
}
}
else {
PutBox("No image buffers left","(try deleting some)");
}
return(0);
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return(0);
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // ReadDlgProc
// WriteDlgProc -- Disk Write dialog procedure.
//
// Output: WriteDrive -- Global name of selected drive
MRESULT CALLBACK WriteDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2) {
USHORT NameLen;
USHORT curChar;
USHORT curBuff;
static CHAR curBuffName[BUFFERNMSZ];
static USHORT FormOpt;
switch (id)
{
case WM_INITDLG:
GetImageList(hwnd, IDD_DI_FLD, IDD_DI_BOX);
WinSendDlgItemMsg(hwnd,
IDD_DI_DRV,
EM_SETTEXTLIMIT,
MPFROM2SHORT(1,0),
NULL);
WinSendDlgItemMsg(hwnd,
IDD_WRF_MAYBE,
BM_SETCHECK,
MPFROMSHORT(1),
NULL);
FormOpt = IDD_WRF_MAYBE;
return(0);
case WM_CONTROL: // get the button that was clicked
if (SHORT1FROMMP(mp1) == IDD_DI_BOX) {
curBuff = SetBox(hwnd, mp1);
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_DI_FLD,
ImageBuffers[curBuff].BufferName);
return(0);
case LN_ENTER:
if (SetDrive(hwnd, curBuff)) return(0);
if (ImageBuffers[curBuff].Busy) {
PutBox("That image is busy -","please select another");
}
else {
ImageBuffers[curBuff].Busy = BUSY_WRITE;
ImageBuffers[curBuff].FormatOptions = FormOpt;
BufferNum = curBuff;
WinDismissDlg(hwnd, TRUE);
}
return(0);
}
}
else if ((SHORT1FROMMP(mp1) == IDD_WRF_NEVER) ||
(SHORT1FROMMP(mp1) == IDD_WRF_MAYBE) ||
(SHORT1FROMMP(mp1) == IDD_WRF_ALWAYS))
FormOpt = SHORT1FROMMP(mp1);
return(0);
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
NameLen = WinQueryDlgItemText(hwnd,
IDD_DI_FLD,
BUFFERNMSZ,
curBuffName);
for (curChar=0;curChar < BUFFERNMSZ;curChar++)
curBuffName[curChar] = (CHAR) toupper(curBuffName[curChar]);
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++) ;
if ((curBuff < NUM_IMAGES) && (NameLen > 0)) {
if (SetDrive(hwnd, curBuff)) return(0);
if (ImageBuffers[curBuff].Busy) {
PutBox("That image is busy -","please select another");
}
else {
ImageBuffers[curBuff].Busy = BUSY_WRITE;
strncpy(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ);
ImageBuffers[curBuff].FormatOptions = FormOpt;
BufferNum = curBuff;
WinDismissDlg(hwnd, TRUE);
}
}
else {
PutBox("You must select an existing","image buffer");
}
return(0);
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return(0);
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // WriteDlgProc
// DeleteDlgProc -- Image Buffer Delete dialog procedure.
//
MRESULT CALLBACK DeleteDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2) {
USHORT NameLen;
USHORT curChar;
USHORT curBuff;
CHAR curBuffName[BUFFERNMSZ];
switch (id)
{
case WM_INITDLG:
GetImageList(hwnd, IDD_DI_FLD, IDD_DI_BOX);
return(0);
case WM_CONTROL: // get the button that was clicked
if (SHORT1FROMMP(mp1) == IDD_DI_BOX) {
curBuff = SetBox(hwnd, mp1);
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_DI_FLD,
ImageBuffers[curBuff].BufferName);
return(0);
case LN_ENTER:
if (ImageBuffers[curBuff].Busy)
PutBox("That buffer is in use.","");
else {
// free the memory used by that buffer and coalesce the list
DosFreeSeg(ImageBuffers[curBuff].DskSel);
free(ImageBuffers[curBuff].DskLayout);
while (((curBuff+1) < NUM_IMAGES) &&
(ImageBuffers[curBuff].BufferName[0] != '\0')) {
ImageBuffers[curBuff] = ImageBuffers[curBuff+1];
curBuff++;
}
WinDismissDlg(hwnd, TRUE);
}
}
}
return(0);
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
NameLen = WinQueryDlgItemText(hwnd,
IDD_DI_FLD,
BUFFERNMSZ,
curBuffName);
for (curChar=0;curChar < BUFFERNMSZ;curChar++)
curBuffName[curChar] = (CHAR) toupper(curBuffName[curChar]);
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++) ;
if ((curBuff < NUM_IMAGES) && (NameLen > 0)) {
if (ImageBuffers[curBuff].Busy)
PutBox("That buffer is in use.","");
else {
// free the memory used by that buffer and coalesce the list
DosFreeSeg(ImageBuffers[curBuff].DskSel);
free(ImageBuffers[curBuff].DskLayout);
while (((curBuff+1) < NUM_IMAGES) &&
(ImageBuffers[curBuff].BufferName[0] != '\0')) {
ImageBuffers[curBuff] = ImageBuffers[curBuff+1];
curBuff++;
}
WinDismissDlg(hwnd, TRUE);
}
}
else {
PutBox("You must select an existing","image buffer");
}
return(0);
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return(0);
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // DeleteDlgProc
VOID GetDirList(HWND hwnd, CHAR *pcCurrentPath) {
static CHAR szDrive [] = " :" ;
FILEFINDBUF findbuf ;
HDIR hDir = 1 ;
SHORT sDrive ;
USHORT usDriveNum, usCurPathLen, usSearchCount = 1 ;
ULONG ulDriveMap ;
DosQCurDisk (&usDriveNum, &ulDriveMap) ;
pcCurrentPath[0] = (CHAR) usDriveNum + '@' ;
pcCurrentPath[1] = ':' ;
pcCurrentPath[2] = '\\' ;
usCurPathLen = 64 ;
DosQCurDir(0, pcCurrentPath + 3, &usCurPathLen) ;
WinSetDlgItemText (hwnd, IDD_DI_PATH, pcCurrentPath) ;
WinSendDlgItemMsg (hwnd, IDD_DI_DIRS, LM_DELETEALL, NULL, NULL) ;
for (sDrive = 0 ; sDrive < 26 ; sDrive++)
if (ulDriveMap & 1L << sDrive) {
szDrive [1] = (CHAR) sDrive + 'A' ;
WinSendDlgItemMsg(hwnd,
IDD_DI_DIRS,
LM_INSERTITEM,
MPFROM2SHORT (LIT_END, 0),
MPFROMP (szDrive)) ;
}
DosFindFirst("*.*",&hDir,0x0017,&findbuf,sizeof findbuf,&usSearchCount,0L) ;
while (usSearchCount) {
if ((findbuf.attrFile & 0x0010) &&
(findbuf.achName [0] != '.' || findbuf.achName [1]))
WinSendDlgItemMsg (hwnd, IDD_DI_DIRS, LM_INSERTITEM,
MPFROM2SHORT (LIT_SORTASCENDING, 0),
MPFROMP (findbuf.achName)) ;
DosFindNext (hDir, &findbuf, sizeof findbuf, &usSearchCount) ;
}
} // GetDirList
VOID GetFileList(HWND hwnd) {
FILEFINDBUF findbuf ;
HDIR hDir = 1 ;
USHORT usSearchCount = 1 ;
WinSendDlgItemMsg (hwnd, IDD_DI_FILES, LM_DELETEALL, NULL, NULL) ;
DosFindFirst("*.*",&hDir,0x0007,&findbuf,sizeof findbuf,&usSearchCount,0L);
while (usSearchCount) {
WinSendDlgItemMsg(hwnd,
IDD_DI_FILES,
LM_INSERTITEM,
MPFROM2SHORT (LIT_SORTASCENDING, 0),
MPFROMP (findbuf.achName)) ;
DosFindNext(hDir, &findbuf, sizeof findbuf, &usSearchCount) ;
}
} // GetFileList
// In: pcOut -- Pointer to parsed file spec
// pcIn -- Pointer to raw file spec
// Returns 0 if bad file name
// 1 if nothing
// else ok
//
// Note: Changes current drive and directory to pcIn
//
BOOL ParseFileName (CHAR *pcOut, CHAR *pcIn) {
CHAR *pcLastSlash;
CHAR *pcFileOnly;
ULONG ulDriveMap ;
USHORT usDriveNum;
USHORT usDirLen = 64;
strupr(pcIn);
if (pcIn[0] == '\0') return(1);
// Get drive from input string or current drive
if (pcIn[1] == ':') {
if (DosSelectDisk(pcIn[0] - '@')) return(0);
pcIn += 2 ;
}
DosQCurDisk(&usDriveNum, &ulDriveMap) ;
*pcOut++ = (CHAR) usDriveNum + '@' ;
*pcOut++ = ':' ;
*pcOut++ = '\\' ;
// If rest of string is empty, return error
if (pcIn[0] == '\0') return(1);
// Search for last backslash. If none, could be directory.
if (NULL == (pcLastSlash = strrchr(pcIn, '\\'))) {
if (!DosChDir(pcIn, 0L)) return(1);
// Otherwise, get current dir & attach input filename
DosQCurDir(0, pcOut, &usDirLen);
if (*(pcOut + strlen(pcOut) - 1) != '\\') strcat(pcOut++, "\\");
strcat(pcOut, pcIn) ;
return(2);
}
// If the only backslash is at beginning, change to root
if (pcIn == pcLastSlash) {
DosChDir("\\", 0L) ;
if (pcIn[1] == '\0') return(1);
strcpy(pcOut, pcIn + 1);
return(2);
}
// Attempt to change directory -- Get current dir if OK
*pcLastSlash = '\0';
if (DosChDir(pcIn, 0L)) return(0);
DosQCurDir(0, pcOut, &usDirLen);
// Append input filename, if any
pcFileOnly = pcLastSlash + 1;
if (*pcFileOnly == '\0') return(1);
if (*(pcOut + strlen(pcOut) - 1) != '\\') strcat(pcOut++, "\\");
strcat(pcOut, pcFileOnly);
return(2);
} // ParseFileName
// return true if everything is okay
BOOL CheckLSParms(HWND hwnd, USHORT Mode) {
CHAR szBuffer[FILENMSZ];
USHORT curBuff;
CHAR curBuffName[BUFFERNMSZ];
USHORT NameLen;
USHORT curChar;
CHAR szFileName[FILENMSZ];
NameLen = WinQueryDlgItemText(hwnd,
IDD_DI_FNAME,
FILENMSZ,
szBuffer);
switch (ParseFileName(szFileName, szBuffer)) {
case 0:
PutBox("Illegal file name.","");
return(FALSE);
case 1: // no error, just don't do anything
return(FALSE);
}
NameLen = WinQueryDlgItemText(hwnd,
IDD_DI_FLD,
BUFFERNMSZ,
curBuffName);
if (NameLen == 0) {
PutBox("You must enter a buffer name,","or select 'Cancel'");
return(FALSE);
}
for (curChar=0;curChar < BUFFERNMSZ;curChar++)
curBuffName[curChar] = (CHAR) toupper(curBuffName[curChar]);
// set the current buffer - must base on mode 'cause save can only use
// existing buffers while load can create new ones
if (Mode == BUSY_LOAD)
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(ImageBuffers[curBuff].BufferName[0] != '\0') &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++);
else
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++);
if (NameLen < 1) {
PutBox("You must select an","image buffer");
return(FALSE);
}
if (curBuff < NUM_IMAGES) {
if (ImageBuffers[curBuff].Busy)
PutBox("That buffer is in use.","");
else {
strcpy(ImageBuffers[curBuff].FileName,szFileName);
strncpy(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ);
ImageBuffers[curBuff].DriveID[0] = ' ';
ImageBuffers[curBuff].Busy = Mode;
BufferNum = curBuff;
return(TRUE);
}
}
else
PutBox("You must select an existing","image buffer");
return(FALSE);
} // CheckLSParms
// LoadDlgProc -- Image Buffer Load dialog procedure.
//
MRESULT CALLBACK LoadDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2) {
USHORT curBuff;
static CHAR szCurrentPath[FILENMSZ];
static CHAR szBuffer[FILENMSZ];
SHORT Select;
switch (id)
{
case WM_INITDLG:
GetImageList(hwnd, IDD_DI_FLD, IDD_DI_BOX);
GetDirList(hwnd, szCurrentPath) ;
GetFileList(hwnd) ;
WinSendDlgItemMsg(hwnd,
IDD_DI_FNAME,
EM_SETTEXTLIMIT,
MPFROM2SHORT (FILENMSZ, 0),
NULL) ;
WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,IDD_DI_FNAME));
return(0);
case WM_CONTROL: // get the button that was clicked
switch (SHORT1FROMMP(mp1)) {
case IDD_DI_DIRS:
Select = (USHORT) WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYSELECTION,
0L,
0L) ;
WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYITEMTEXT,
MPFROM2SHORT(Select, sizeof szBuffer),
MPFROMP(szBuffer)) ;
switch (SHORT2FROMMP(mp1)) {
case LN_ENTER:
if (szBuffer[0] == ' ') DosSelectDisk(szBuffer[1] - '@');
else DosChDir (szBuffer, 0L);
GetDirList(hwnd, szCurrentPath);
GetFileList(hwnd);
WinSetDlgItemText(hwnd, IDD_DI_FNAME, "");
return(0);
}
break;
case IDD_DI_FILES:
Select = (USHORT) WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYSELECTION,
0L,
0L) ;
WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYITEMTEXT,
MPFROM2SHORT(Select, sizeof szBuffer),
MPFROMP(szBuffer)) ;
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd, IDD_DI_FNAME, szBuffer);
return(0);
case LN_ENTER:
if (CheckLSParms(hwnd, BUSY_LOAD)) {
WinDismissDlg(hwnd, TRUE);
}
return(0);
}
break ;
case IDD_DI_BOX:
curBuff = SetBox(hwnd, mp1);
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_DI_FLD,
ImageBuffers[curBuff].BufferName);
return(0);
case LN_ENTER:
if (ImageBuffers[curBuff].Busy)
PutBox("That buffer is in use.","");
else {
if (CheckLSParms(hwnd, BUSY_LOAD)) {
WinDismissDlg(hwnd, TRUE);
}
}
}
}
return(0);
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
if (CheckLSParms(hwnd, BUSY_LOAD)) {
WinDismissDlg(hwnd, TRUE);
}
return(0);
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return(0);
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // LoadDlgProc
// SaveDlgProc -- Image Buffer Save dialog procedure.
//
MRESULT CALLBACK SaveDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2) {
USHORT curBuff;
static CHAR szCurrentPath [FILENMSZ];
static CHAR szBuffer [FILENMSZ];
SHORT Select;
switch (id)
{
case WM_INITDLG:
GetImageList(hwnd, IDD_DI_FLD, IDD_DI_BOX);
GetDirList(hwnd, szCurrentPath) ;
GetFileList(hwnd) ;
WinSendDlgItemMsg(hwnd,
IDD_DI_FNAME,
EM_SETTEXTLIMIT,
MPFROM2SHORT (FILENMSZ, 0),
NULL) ;
return(0);
case WM_CONTROL: // get the button that was clicked
switch (SHORT1FROMMP(mp1)) {
case IDD_DI_DIRS:
Select = (USHORT) WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYSELECTION,
0L,
0L) ;
WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYITEMTEXT,
MPFROM2SHORT(Select, sizeof szBuffer),
MPFROMP(szBuffer)) ;
switch (SHORT2FROMMP(mp1)) {
case LN_ENTER:
if (szBuffer[0] == ' ') DosSelectDisk(szBuffer[1] - '@');
else DosChDir (szBuffer, 0L);
GetDirList(hwnd, szCurrentPath);
GetFileList(hwnd);
WinSetDlgItemText(hwnd, IDD_DI_FNAME, "");
return(0);
}
break;
case IDD_DI_FILES:
Select = (USHORT) WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYSELECTION,
0L,
0L) ;
WinSendDlgItemMsg(hwnd,
SHORT1FROMMP(mp1),
LM_QUERYITEMTEXT,
MPFROM2SHORT(Select, sizeof szBuffer),
MPFROMP(szBuffer)) ;
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd, IDD_DI_FNAME, szBuffer);
return(0);
case LN_ENTER:
if (CheckLSParms(hwnd, BUSY_SAVE)) {
WinDismissDlg(hwnd, TRUE);
}
return(0);
}
break ;
case IDD_DI_BOX:
curBuff = SetBox(hwnd, mp1);
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_DI_FLD,
ImageBuffers[curBuff].BufferName);
return(0);
case LN_ENTER:
if (ImageBuffers[curBuff].Busy)
PutBox("That buffer is in use.","");
else {
if (CheckLSParms(hwnd, BUSY_SAVE)) {
WinDismissDlg(hwnd, TRUE);
}
}
}
} // switch for CONTROL
return(0);
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
if (CheckLSParms(hwnd, BUSY_SAVE)) {
WinDismissDlg(hwnd, TRUE);
}
return(0);
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return(0);
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // SaveDlgProc
//
// return the buffer number of the field in the edit box
//
USHORT SetEdit(HWND hwnd, USHORT EditB) {
USHORT curBuff;
USHORT curChar;
CHAR curBuffName[BUFFERNMSZ];
USHORT NameLen;
NameLen = WinQueryDlgItemText(hwnd,
EditB,
BUFFERNMSZ,
curBuffName);
if (NameLen == 0) {
PutBox("You must enter an image name,"," or select 'Cancel'");
return(NUM_IMAGES+1);
}
for (curChar=0;curChar < BUFFERNMSZ;curChar++)
curBuffName[curChar] = (CHAR) toupper(curBuffName[curChar]);
for (curBuff=0;
(curBuff < NUM_IMAGES) &&
(ImageBuffers[curBuff].BufferName[0] != '\0') &&
(strncmp(ImageBuffers[curBuff].BufferName,curBuffName,BUFFERNMSZ));
curBuff++) ;
if (curBuff == NUM_IMAGES) {
PutBox("You must select an existing","image buffer");
return(NUM_IMAGES+1);
}
if (ImageBuffers[curBuff].Busy) {
PutBox("The image is busy -","please select another");
return(NUM_IMAGES+1);
}
return(curBuff);
}
// CompDlgProc -- Image Buffer Compare dialog procedure.
//
MRESULT CALLBACK CompDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2) {
USHORT curBuff;
switch (id)
{
case WM_INITDLG:
GetImageList(hwnd, IDD_DI_FLD, IDD_DI_BOX);
GetImageList(hwnd, IDD_CM_FLD, IDD_CM_BOX);
BufferNum = NUM_IMAGES+1;
CompNum = NUM_IMAGES+1;
return(0);
case WM_CONTROL: // get the button that was clicked
curBuff = SetBox(hwnd, mp1);
switch (SHORT1FROMMP(mp1)) {
case IDD_DI_BOX:
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_DI_FLD,
ImageBuffers[curBuff].BufferName);
return(0);
case LN_ENTER:
BufferNum = SetEdit(hwnd, IDD_DI_FLD);
CompNum = SetEdit(hwnd, IDD_CM_FLD);
if ((CompNum == NUM_IMAGES+1) ||
(CompNum == BufferNum))
PutBox("You must select two","different (and existing) images");
else {
ImageBuffers[BufferNum].Busy = BUSY_COMP;
ImageBuffers[CompNum].Busy = BUSY_COMP;
WinDismissDlg(hwnd, TRUE);
}
}
break;
case IDD_CM_BOX:
switch (SHORT2FROMMP(mp1)) {
case LN_SELECT:
WinSetDlgItemText(hwnd,
IDD_CM_FLD,
ImageBuffers[curBuff].BufferName);
CompNum = curBuff;
return(0);
case LN_ENTER:
BufferNum = SetEdit(hwnd, IDD_DI_FLD);
CompNum = SetEdit(hwnd, IDD_CM_FLD);
if ((BufferNum == NUM_IMAGES+1) ||
(BufferNum == CompNum))
PutBox("You must select two","different (and existing) images");
else {
ImageBuffers[BufferNum].Busy = BUSY_COMP;
ImageBuffers[CompNum].Busy = BUSY_COMP;
WinDismissDlg(hwnd, TRUE);
}
}
break;
} // switch for CONTROL
return(0);
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
BufferNum = SetEdit(hwnd, IDD_DI_FLD);
CompNum = SetEdit(hwnd, IDD_CM_FLD);
ImageBuffers[BufferNum].Busy = BUSY_COMP;
ImageBuffers[CompNum].Busy = BUSY_COMP;
WinDismissDlg(hwnd, TRUE);
return(0);
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return(0);
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // CompDlgProc
// AboutDlgProc -- About box dialog procedure.
//
MRESULT CALLBACK AboutDlgProc(HWND hwnd, USHORT id, MPARAM mp1, MPARAM mp2)
{
switch (id)
{
case WM_COMMAND:
switch (COMMANDMSG(&id)->cmd)
{
case DID_OK:
case DID_CANCEL:
WinDismissDlg(hwnd, TRUE);
return 0;
} // switch on commandID
break;
} // switch on msgID
return(WinDefDlgProc(hwnd, id, mp1, mp2));
} // AboutDlgProc