home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 18 REXX
/
18-REXX.zip
/
RXCALC.ZIP
/
RXHAFILE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-09
|
72KB
|
1,251 lines
/* static char *SCCSID = "@(#)rxhafile.c 6.3 91/12/24"; */
/********************* START OF SPECIFICATIONS ******************************/
/* */
/* SOURCE FILE NAME: RXHAFILE.C */
/* */
/* DESCRIPTIVE NAME: File routines for PMREXX. */
/* */
/* COPYRIGHT: IBM Corporation 1991 */
/* */
/* STATUS: Version 2.00 */
/* */
/* FUNCTION: */
/* Process the file requests from the user, to allow them to save */
/* their output to a file. */
/* */
/* NOTES: */
/* DEPENDENCIES: */
/* This function has dependencies on the following */
/* files for compilation. */
/* os2.h - All OS/2 specific definitions */
/* rxhdluse.h - necessary equates used by the file procedures */
/* pmrexx.h - global typedefs, defines and prototypes */
/* pmrexxio.h - diaglog control defines */
/* */
/* PROCEDURES: */
/* CheckDosError - see if a dos error occurred and take action */
/* ErrorNotifyProc - Display error message box */
/* MapButtonText - Map Text to Buttons */
/* OpenFile - Open file with given mode */
/* SaveQuit - Bring up Save/Quit/Cancel Dialog Box */
/* SaveQuitDlgProc - Handle messages for Save/Quit dialog */
/* WriteFile - Write contents of window to given file */
/* */
/* */
/*********************** END OF SPECIFICATIONS ******************************/
/******************************************************************************/
/* Define Constants for additional includes */
/******************************************************************************/
#define INCL_WINCOUNTRY /* Code page support */
#define INCL_WINDIALOGS /* Dialog boxes */
#define INCL_WINENTRYFIELDS /* Entry fields */
#define INCL_WINFRAMEMGR /* Frame manager */
#define INCL_WINHELP /* Help manager definitions */
#define INCL_WININPUT /* Mouse and keyboard input */
#define INCL_WINMESSAGEMGR /* Message management */
#define INCL_WINSHELLDATA /* Profile calls */
#define INCL_WINSWITCHLIST /* Task list calls */
#define INCL_WINTIMER /* Timer routines */
#define INCL_WINWINDOWMGR /* General window management */
#define INCL_WINMENUS /* Menu controls */
#define INCL_WINMLE /* Multiple line edit fields */
#define INCL_WINPOINTERS /* Mouse pointers */
#define INCL_WINSTDFILE /* Standard File dialog */
#define INCL_WINSYS /* Sytem Values (and colors) */
#define INCL_WINSTATICS /* Static Controls */
#define INCL_WINMESSAGEMGR /* Win Message functions */
#define INCL_WINSTDFONT /* Standard Font dialog */
#define INCL_DOSQUEUES /* Queue Support */
#define INCL_DOSERRORS /* OS/2 Errors */
#define INCL_DOSMISC /* for DosError function */
#define INCL_DOSFILEMGR /* File Managment */
#define INCL_DOSSEMAPHORES /* OS/2 semaphores */
#define INCL_RXSYSEXIT /* REXX system exits */
/******************************************************************************/
/* Include required header files */
/******************************************************************************/
#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rexxsaa.h>
/******************************************************************************/
/* Include Application Header Files */
/******************************************************************************/
#include "rxhdluse.h"
#include "pmrexx.h"
#include "pmrexxio.h"
/******************************************************************************/
/* Declare character arrays for buttons */
/******************************************************************************/
static char ok[BUTTON_TEXT_LENGTH];
static char cancel[BUTTON_TEXT_LENGTH];
static char retry[BUTTON_TEXT_LENGTH];
static char abortstr[BUTTON_TEXT_LENGTH];
static char ignore[BUTTON_TEXT_LENGTH];
static char yes[BUTTON_TEXT_LENGTH];
static char no[BUTTON_TEXT_LENGTH];
static char enter[BUTTON_TEXT_LENGTH];
static SHORT stringSize = BUTTON_TEXT_LENGTH;/* Define string size */
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: OpenFile */
/* */
/* DESCRIPTIVE NAME: */
/* Open a file with the indicated mode. */
/* */
/* FUNCTION: */
/* Open a file and return the file handle and the action taken */
/* to the caller. */
/* */
/* NOTES: None. */
/* */
/* ENTRY POINT: */
/* LINKAGE: int OpenFile */
/* */
/* INPUT: */
/* PSZ pszFileName - ptr to ascii string containing file to open */
/* PHFILE pFileHandle - ptr to file handle (returned) */
/* PULONG pActionTaken - ptr to action taken (returned) */
/* ULONG iMode - indicates how to open file */
/* */
/* EXIT-NORMAL: */
/* Returns 0 */
/* */
/* EXIT-ERROR: */
/* Returns ERROR_OPEN_FAILED. */
/* */
/* EFFECTS: None. */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* None. */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* DosOpen */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
ULONG OpenFile(PSZ pszFileName,PHFILE pFileHandle,PULONG pActionTaken,ULONG
iMode)
{
ULONG DosRC; /* Return Code */
ULONG openflag,openmode; /* bitmaps for DosOpen */
/******************************************************************************/
/* Set openflag and openmode based on iMode */
/******************************************************************************/
switch (iMode) {
case 0 : /* Read-only mode */
openflag = OPEN_ACTION_OPEN_IF_EXISTS;/* Open if exists, else fail */
openmode = OPEN_SHARE_DENYWRITE; /* R/O access, deny Write */
break;
case 1 : /* Write-only mode, new file */
openflag = OPEN_ACTION_CREATE_IF_NEW;/* Fail if exists */
openmode = OPEN_FLAGS_WRITE_THROUGH|OPEN_SHARE_DENYWRITE|
OPEN_ACCESS_WRITEONLY; /* R/W access, deny Write Synchronous */
/* Write */
break;
case 2 : /* Write-only mode, replace */
openflag = OPEN_ACTION_REPLACE_IF_EXISTS|OPEN_ACTION_CREATE_IF_NEW;/* */
/* Replace if exists */
openmode = OPEN_FLAGS_WRITE_THROUGH|OPEN_SHARE_DENYWRITE|
OPEN_ACCESS_WRITEONLY; /* R/W access, deny Write Synchronous */
/* Write */
break;
default : /* Default processing */
return (ERROR_OPEN_FAILED);
} /* endswitch */
/******************************************************************************/
/* Call DosOpen to open the file and return the return code */
/* from the DosOpen call. */
/******************************************************************************/
*pActionTaken = 0;
DosRC = DosOpen(pszFileName, /* File name */
pFileHandle, /* File handle */
pActionTaken, /* Action taken */
0L, /* File's new size */
0, /* File attribute bits */
openflag, /* Open flag */
openmode, /* Open mode */
0L /* Reserved, must be 0 */
);
return (DosRC);
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: WriteFile */
/* */
/* DESCRIPTIVE NAME: */
/* Write contents of the window to a file. */
/* */
/* FUNCTION: */
/* Write contents of the window to a file. */
/* */
/* */
/* NOTES: None. */
/* */
/* ENTRY POINT: */
/* LINKAGE: BOOL WriteFile */
/* */
/* INPUT: */
/* HWND hwnd - window handle */
/* PSZ pszFileName - file name to write to */
/* PSZ pszPgmName - Rexx program executing */
/* BOOL bConfirm - indicates if fail or replace on write (TRUE => FAIL) */
/* */
/* EXIT-NORMAL: */
/* Returns TRUE. */
/* */
/* EXIT-ERROR: */
/* Returns FALSE. */
/* */
/* EFFECTS: None. */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: OpenFile, CheckDosError */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* DosWrite */
/* WinLoadString, */
/* WinMessageBox, */
/* WinSendMsg, */
/* WinWindowFromID, */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
BOOL WriteFile(HAB hab, /* Window Anchor Block */
HWND hwnd, /* Window Handle */
PSZ pszFileName, /* File Name */
PSZ pszPgmName, /* Rexx program name */
BOOL bConfirm) /* Confirm */
{
ULONG ulFileSize; /* File Size */
ULONG ulFmtSize; /* Format Size */
HFILE hFile; /* File Handle */
ULONG actionTaken; /* Action Taken */
CHAR *buffer; /* Pointer to buffer */
ULONG DosRC; /* OpenFile Return Code */
ULONG UserResponse; /* User Response */
ULONG iMode; /* OpenFile mode */
ULONG textLen; /* Text Length */
LONG bytesCopied = 0; /* Number of bytes copied */
ULONG usWriteSize; /* Write Size */
DosError(FERR_DISABLEHARDERR); /* Disable exception popups */
/* Determine filesize */
ulFileSize = (LONG)WinSendMsg(WinWindowFromID(hwnd, (USHORT)MLE_WNDW),
MLM_QUERYTEXTLENGTH,
(MPARAM)0, (MPARAM)0);
ulFmtSize = (LONG)WinSendMsg(WinWindowFromID(hwnd, (USHORT)MLE_WNDW),
MLM_QUERYFORMATTEXTLENGTH, 0,
(MPARAM)ulFileSize);
/***************************************************************************/
/* If file size is greater or equal to limit set text length to */
/* FFFE hex otherwise set it to the text format size. */
/***************************************************************************/
textLen = (ulFileSize >= (ULONG)0xffff)?0xfffe:ulFmtSize;
/* Allocate buffer */
DosRC = DosAllocMem((PVOID)&buffer, textLen+1, PAG_COMMIT+PAG_WRITE);
/***************************************************************************/
/* Determine if a DosError occurred in allocating the buffer */
/* and take appropriate action */
/***************************************************************************/
if ((UserResponse = CheckDosError(hab, hwnd, DosRC, pszPgmName))
== MBID_CANCEL)
return (FALSE);
/* Import text from window to buffer */
WinSendMsg(WinWindowFromID(hwnd, (USHORT)MLE_WNDW),
MLM_SETIMPORTEXPORT, (MPARAM)buffer, MPFROMSHORT(textLen));
iMode = (bConfirm)?1:2; /* Set the file mode and user response */
UserResponse = MBID_RETRY;
/***************************************************************************/
/* Try to open the file as long as user response is set to retry */
/***************************************************************************/
do {
DosRC = OpenFile((PSZ)pszFileName, &hFile, &actionTaken, iMode);
/* If open fails, print message */
if ((bConfirm) && (DosRC == ERROR_OPEN_FAILED)) {
CHAR pszOverWrite[MSG_SIZE]; /* Declare variables for messages */
CHAR pszOverWriteMsg[MSG_SIZE];
CHAR pszWarning[MSG_SIZE];
CHAR pszWarningMsg[MSG_SIZE];
CHAR pszFormFN[FNAME_SIZE];
/* Load string for overwrite prompt */
WinLoadString(hab, (HMODULE)NULL, RXHD_EXISTS,
sizeof(pszOverWrite), pszOverWrite);
/*********************************************************************/
/* Copy overwrite prompt and filename to pszOverWriteMsg */
/*********************************************************************/
sprintf(pszOverWriteMsg, pszOverWrite, pszFormFN);
/* Load Warning message */
WinLoadString(hab, (HMODULE)NULL, RXH_WARNING,
sizeof(pszWarning), pszWarning);
/*********************************************************************/
/* Copy warning prompt and program name to pszWarningMsg */
/*********************************************************************/
sprintf(pszWarningMsg, pszWarning, pszPgmName);
/*********************************************************************/
/* Create, display, and operate the message box window */
/*********************************************************************/
if (WinMessageBox(HWND_DESKTOP, hwnd, pszOverWriteMsg, pszWarningMsg, 0,
MB_YESNO|MB_CUAWARNING|MB_MOVEABLE) == MBID_YES) {
bConfirm = FALSE; /* yes, open specified file */
DosRC = OpenFile((PSZ)pszFileName, &hFile, &actionTaken, 2);
}
else /* otherwise return failure */
return (FALSE);
}
/* check and handle errors */
if ((UserResponse = CheckDosError(hab, hwnd, DosRC, pszPgmName)) ==
MBID_CANCEL)
return (FALSE);
}
/*************************************************************************/
/* While the user selects retry, attempt to write to file */
/* from the buffer */
/*************************************************************************/
while (UserResponse == MBID_RETRY);
do {
/***********************************************************************/
/* Get the size of the date to be written from the window */
/***********************************************************************/
usWriteSize = (ULONG )WinSendMsg(WinWindowFromID(hwnd, (USHORT)MLE_WNDW),
MLM_EXPORT, &bytesCopied, &ulFileSize);
do {
/* Write the buffer to the file */
DosRC = DosWrite(hFile, buffer, usWriteSize, &actionTaken);
/*********************************************************************/
/* If an error occurs, handle the error. Return if canceled */
/*********************************************************************/
if (DosRC) {
if ((UserResponse = CheckDosError(hab, hwnd, DosRC, pszPgmName)) ==
MBID_CANCEL)
return (FALSE);
}
}
while (UserResponse == MBID_RETRY);/* Do-While loop for retry */
}
while (ulFileSize); /* Do-While loop for file write */
/* Write EOF marker and do cleanup */
DosRC = DosWrite(hFile, "\032", 1, &actionTaken);
DosClose(hFile);
DosFreeMem(buffer);
DosError(FERR_ENABLEHARDERR); /* Enable exception popups and return */
return (TRUE);
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: CheckDosError */
/* */
/* DESCRIPTIVE NAME: */
/* Determine if a DosError occurred, and decide what action */
/* to take. */
/* */
/* FUNCTION: */
/* Check the return code and see what sort of action should be */
/* taken. */
/* */
/* NOTES: MB_?????? constants are used to define which buttons are */
/* to be displayed. This is a fulblown Dialog box , not a */
/* message box, so these values mean nothing to the dialog */
/* manager here. We just use them because they are convenient */
/* and we use the same text that they would have in a message */
/* box. */
/* */
/* ENTRY POINT: */
/* LINKAGE: ULONG CheckDosError */
/* */
/* INPUT: */
/* HAB hab - PM anchor block */
/* HWND hClientWnd - window handle */
/* ULONG DosError - error code from DosCalls */
/* */
/* EXIT-NORMAL: */
/* Returns TRUE */
/* */
/* EXIT-ERROR: */
/* Returns FALSE */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* DosErrClass */
/* WinDlgBox */
/* WinLoadString */
/* WinQueryWindowULong */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
ULONG CheckDosError(HAB hab, HWND hClientWnd,ULONG DosError,
PSZ pszPgmName)
{
CHAR pszMsg[MSG_SIZE]; /* string for error message */
ULONG usButtons; /* bit-map of which buttons to display */
USHORT usTitle; /* Number of title to put on error box */
CHAR pszTitle[TITLE_SIZE]; /* string of title to put on error box */
CHAR pszTitleText[TITLE_SIZE]; /* Formatted title text */
CHAR pszFormattedErr[MSG_SIZE]; /* contains string version of DosError */
CHAR pszLocus[MSG_SIZE]; /* string for what device is causing */
/* error */
CHAR pszClass[MSG_SIZE]; /* what is the class of the error */
ULONG ErrClass; /* code for class of error */
ULONG ErrAction; /* code for action to take on error */
ULONG ErrLocus; /* code for what device is causing the */
/* prob. */
RXHA_ERR rxhaErr; /* passed indirectly to ErrorNotifyProc*/
USHORT usMsgNum; /* ID of message string to diplay */
/***************************************************************************/
/* Find out which dos error has occured */
/***************************************************************************/
if (!DosError)
return (MBID_OK);
else {
WinSetPointer(HWND_DESKTOP, /* End wait issued in INITDLG of dialog*/
WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE));
switch (DosError) {
case ERROR_NOT_READY : /* Drive is not ready */
usMsgNum = RXH_NOT_READY;
break;
case ERROR_PATH_NOT_FOUND : /* Path could not be found */
usMsgNum = RXH_BAD_PATH;
break;
case ERROR_TOO_MANY_OPEN_FILES :/* No more file handles */
usMsgNum = RXH_TOO_MANY_OPEN;
break;
case ERROR_ACCESS_DENIED : /* System lock in effect */
usMsgNum = RXH_ACCESS_DENIED;
break;
case ERROR_INVALID_ACCESS : /* Bad access attempt */
usMsgNum = RXH_INV_ACCESS;
break;
case ERROR_NOT_DOS_DISK : /* Unrecognized device */
usMsgNum = RXH_NOT_DISK;
break;
case ERROR_SHARING_VIOLATION : /* Appl. lock on file */
usMsgNum = RXH_SHARE_VIOL;
break;
case ERROR_SHARING_BUFFER_EXCEEDED :/* Sharing buffer exceeded */
usMsgNum = RXH_SHARE_BUFF_EXC;
break;
case ERROR_CANNOT_MAKE : /* Cannot create the file */
usMsgNum = RXH_CANNOT_MAKE;
break;
case ERROR_DRIVE_LOCKED : /* Drive is locked */
usMsgNum = RXH_DRIVE_LOCKED;
break;
case ERROR_DISK_FULL : /* No space left */
usMsgNum = RXH_DISK_FULL;
break;
case ERROR_NOT_ENOUGH_MEMORY : /* Can't allocate memory */
usMsgNum = RXH_OUTOF_MEM;
break;
case ERROR_WRITE_PROTECT : /* Disk is read-only */
usMsgNum = RXH_WRITE_PROT;
break;
case ERROR_FILENAME_EXCED_RANGE :/* Filename is too long */
usMsgNum = RXH_NAME_LONG;
break;
case ERROR_INVALID_NAME : /* Illegal filename */
usMsgNum = RXH_BAD_NAME;
break;
default :
usMsgNum = RXH_APP_ERROR; /* generic messages... */
break;
}
/************************************************************************/
/* Classify error, and set message box buttons accordingly */
/************************************************************************/
usTitle = RXH_WARNING; /* set default Icon and title */
rxhaErr.usIconStyle = SPTR_ICONWARNING;
DosErrClass(DosError, &ErrClass, &ErrAction, &ErrLocus);
switch (ErrAction) {
case ERRACT_RETRY : /* retry immediatly */
case ERRACT_DLYRET : /* Delay and retry */
case ERRACT_USER : /* Bad user input - get new values */
case ERRACT_INTRET : /* Retry after user intervention */
usButtons = MB_RETRYCANCEL; /* Retry and Cancel Buttons */
break;
case ERRACT_ABORT : /* Terminate in an ordely Fashion */
case ERRACT_PANIC : /* Terminate immediatly */
usButtons = MB_CANCEL; /* Show a Cancel Button */
usTitle = RXH_CRITICAL; /* Critical Title on dlg box */
rxhaErr.usIconStyle = SPTR_ICONERROR;/* Error Icon */
break;
case ERRACT_IGNORE : /* Ignore Error */
usButtons = MB_ABORTRETRYIGNORE;/* abort retry and ignore buttons */
usTitle = RXH_WARNING; /* title with Warning */
rxhaErr.usIconStyle = SPTR_ICONWARNING;/* warning Icon */
break;
default :
usButtons = 0;
break;
}
/***************************************************************************/
/* Load the message and title from application resources */
/***************************************************************************/
WinLoadString(hab, (HMODULE)NULL, usTitle, sizeof(pszTitle), pszTitle);
WinLoadString(hab, (HMODULE)NULL, usMsgNum, sizeof(pszMsg), pszMsg);
WinLoadString(hab, (HMODULE)NULL, (USHORT)(RXH_ERRL_START+ErrLocus),
sizeof(pszLocus), pszLocus);
WinLoadString(hab, (HMODULE)NULL, (USHORT)(RXH_ERRC_START+ErrClass),
sizeof(pszClass), pszClass);
/***************************************************************************/
/* Display message to user; return choice to caller */
/***************************************************************************/
sprintf(pszTitleText, pszTitle, pszPgmName);/* format title */
rxhaErr.Title = pszTitleText; /* pass to ErrorNotifyProc */
sprintf(pszFormattedErr, "%i", DosError);/* error number */
rxhaErr.RetCode = pszFormattedErr;
rxhaErr.Locus = pszLocus;
rxhaErr.Class = pszClass;
rxhaErr.message = pszMsg;
rxhaErr.buttonStyle = usButtons;
rxhaErr.action = 1;
rxhaErr.hab = hab;
{
ULONG retVal;
/* Start dialog box */
retVal = WinDlgBox(HWND_DESKTOP, hClientWnd, (PFNWP)ErrorNotifyProc,
(HMODULE)NULL, RXHD_ERROR, &rxhaErr);
return (rxhaErr.action); /* return action code */
}
} /* end: error occurred */
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: ErrorNotifyProc */
/* */
/* DESCRIPTIVE NAME: */
/* Display error message box. */
/* */
/* FUNCTION: */
/* Creates and handles messages for error box. */
/* */
/* NOTES: */
/* */
/* ENTRY POINT: */
/* LINKAGE: MRESULT EXPENTRY ErrorNotifyProc */
/* */
/* INPUT: */
/* HWND hwnd - window handle */
/* ULONG msg - message to process */
/* MPARAM lParam1 - parameter 1 */
/* MPARAM lParam2 - parameter 2 */
/* */
/* The messages handled are: */
/* WM_INITDLG - initialize the error box */
/* WM_CLOSE - close dialog box */
/* WM_COMMAND - the following WM_COMMAND message are handled */
/* BUTTON1 - perform the action assigned to button 1 */
/* BUTTON2 - perform the action assigned to button 2 */
/* BUTTON3 - perform the action assigned to button 3 */
/* */
/* EXIT-NORMAL: */
/* Returns TRUE */
/* */
/* EXIT-ERROR: */
/* Returns FALSE */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* InitDlgSysMenu - Remove unwanted options from the system menu */
/* MapButtonText - Change button text to Numbers */
/* PositionDlg - Position dialog box */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* WinDefDlgProc WinSendMsg */
/* WinDismissDlg WinShowWindow */
/* WinLoadString WinWindowFromID */
/* WinQueryWindowText WinSetWindowText */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
MRESULT EXPENTRY ErrorNotifyProc(HWND hwnd,ULONG msg,MPARAM lParam1,MPARAM
lParam2)
{
static PRXHA_ERR prxhaErr; /* we only get prxhaerr on a WM_INITDLG*/
/* message */
CHAR buttonText[BUTTON_TEXT_LENGTH]; /* Text of button user clicked on */
switch (msg) {
case WM_INITDLG :
/* Start Wait was issued on the call to this dialog */
PositionDlg(hwnd); /* position dialog window */
InitDlgSysMenu(hwnd, FALSE); /* remove items on system menu we dont */
/* want */
prxhaErr = (PRXHA_ERR)lParam2; /* get all of our data */
WinSetWindowText(hwnd, /* display title */
prxhaErr->Title);
/* display error code */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)RC), prxhaErr->RetCode);
/* display area of error */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)LOCUS), prxhaErr->Locus);
/* display class of error */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)CLASS), prxhaErr->Class);
/* display message */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)MESSAGE),
prxhaErr->message);
stringSize = BUTTON_TEXT_LENGTH; /* Load the button strings */
WinLoadString(prxhaErr->hab, (HMODULE)NULL, OK, stringSize, ok);
WinLoadString(prxhaErr->hab, (HMODULE)NULL, CANCEL, stringSize, cancel);
WinLoadString(prxhaErr->hab, (HMODULE)NULL, RETRY, stringSize, retry);
WinLoadString(prxhaErr->hab, prxhaErr->hmod, ABORT, stringSize, abortstr);
WinLoadString(prxhaErr->hab, (HMODULE)NULL, IGNORE, stringSize, ignore);
WinLoadString(prxhaErr->hab, (HMODULE)NULL, YES, stringSize, yes);
WinLoadString(prxhaErr->hab, (HMODULE)NULL, NO, stringSize, no);
WinLoadString(prxhaErr->hab, (HMODULE)NULL, BENTER, stringSize, enter);
if (ON_m(prxhaErr->buttonStyle, MB_OKCANCEL)) {/* buttons are OK, */
/* Cancel, and button3 not shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), ok);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON2), cancel);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_RETRYCANCEL)) {/* buttons are Retry, */
/* Cancel and Button3 not shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), retry);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON2), cancel);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_ABORTRETRYIGNORE)) {/* buttons are */
/* Abort, Retry, and Ignore */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), abortstr);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON2), retry);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON3), ignore);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_YESNO)) {/* Buttons are Yes, No and */
/* button3 not shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), yes);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON2), no);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_YESNOCANCEL)) {/* Buttons are Yes No */
/* and Cancel */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), yes);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON2), no);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON3), cancel);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_CANCEL)) {/* Buttons are Cancel and */
/* buttons 2 & 3 not shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), cancel);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON2), FALSE);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_ENTER)) {/* Buttons are Enter and */
/* buttons 2 & 3 not shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), enter);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON2), FALSE);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
else
if (ON_m(prxhaErr->buttonStyle, MB_ENTERCANCEL)) {/* Buttons are Enter, */
/* Cancel and Button 3 not shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), enter);
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON2), cancel);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
else { /* Buttons are OK and buttons 2 & 3 not*/
/* shown */
WinSetWindowText(WinWindowFromID(hwnd, (USHORT)BUTTON1), ok);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON2), FALSE);
WinShowWindow(WinWindowFromID(hwnd, (USHORT)BUTTON3), FALSE);
}
WinSendMsg(WinWindowFromID(hwnd,RXHD_ICON),
SM_SETHANDLE,
MPFROMHWND(WinQuerySysPointer(HWND_DESKTOP,
prxhaErr->usIconStyle, FALSE) ),
(MPARAM)0);
WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP,
SPTR_ARROW, FALSE));
break;
case WM_CLOSE :
return ((MRESULT)TRUE);
break;
case WM_COMMAND :
switch (LOUSHORT(lParam1)) {
case BUTTON1 :
case BUTTON2 :
case BUTTON3 : /* read the text from the button */
WinQueryWindowText(WinWindowFromID(hwnd, LOUSHORT(lParam1)),
stringSize, buttonText);
/* convert text to an number and set */
/* return code */
prxhaErr->action = MapButtonText(buttonText);/* dismiss the dialog */
/* box */
WinDismissDlg(hwnd, TRUE);
break;
default :
return (MRESULT)(TRUE);
break;
}
break;
default :
break;
}
return (WinDefDlgProc(hwnd, msg, lParam1, lParam2));
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: MapButtonText */
/* */
/* DESCRIPTIVE NAME: */
/* Map button text to integers. */
/* */
/* FUNCTION: */
/* Compares the input string to the different buttons and */
/* returns the button number. */
/* */
/* NOTES: */
/* */
/* ENTRY POINT: */
/* LINKAGE: ULONG MapButtonText */
/* */
/* INPUT: */
/* PSZ pszText - ptr to ascii string containing text for button */
/* */
/* EXIT-NORMAL: */
/* Returns action for specified text */
/* */
/* EXIT-ERROR: */
/* None. */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
ULONG MapButtonText(PSZ pszText)
{
if (!strcmp(pszText, ok)) /* Map text to the correct button */
return (MBID_OK);
if (!strcmp(pszText, cancel))
return (MBID_CANCEL);
if (!strcmp(pszText, abortstr))
return (MBID_ABORT);
if (!strcmp(pszText, retry))
return (MBID_RETRY);
if (!strcmp(pszText, ignore))
return (MBID_IGNORE);
if (!strcmp(pszText, yes))
return (MBID_YES);
if (!strcmp(pszText, no))
return (MBID_NO);
if (!strcmp(pszText, enter))
return (MBID_ENTER);
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: SaveQuit */
/* */
/* DESCRIPTIVE NAME: */
/* Bring up Save/Quit/Cancel Dialog */
/* */
/* FUNCTION: */
/* Sets up call to Save/Quit dialog procedure. */
/* */
/* NOTES: */
/* */
/* ENTRY POINT: */
/* LINKAGE: ULONG SaveQuit */
/* */
/* INPUT: */
/* HAB hab - anchor block handle */
/* HWND hwnd - window handle */
/* PSZ pszFName - filename to save output in */
/* */
/* EXIT-NORMAL: */
/* Returns TRUE if Save/Quit processed */
/* */
/* EXIT-ERROR: */
/* Returns FALSE if user hits CANCEL */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* WinLoadString */
/* WinDlgBox */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
ULONG SaveQuit(HAB hab,HWND hwnd,PSZ pszFName)
{
char pszSaveQuitMsg[120]; /* string for save/quit message */
char pszMsg[MSG_SIZE]; /* save/quit message with filename */
/* inserted */
char pszFormFN[FNAME_SIZE]; /* Holds formatted filename */
ULONG UserResponse; /* What did they do? */
RX_SAVQUIT_STRUCT rx_SaveQuit; /* data structure for this dialog box */
if (strlen(pszFName)) { /* user already entered filename */
rx_SaveQuit.bNamedFile = TRUE;
}
else {
rx_SaveQuit.bNamedFile = FALSE; /* else say it's untitled */
WinLoadString(hab, /* load the untitled string from */
/* resource */
(HMODULE)NULL, RX_UNTITLED, FNAME_SIZE, pszFName);
}
WinLoadString(hab, /* load the save/quit message */
(HMODULE)NULL, SAVE_QUIT, sizeof(pszSaveQuitMsg), pszSaveQuitMsg);
sprintf(pszMsg, pszSaveQuitMsg, pszFormFN);/* insert the filename into */
/* message */
rx_SaveQuit.pszSaveQuitMsg = pszMsg; /* load up all the parameters into */
/* struct */
rx_SaveQuit.hab = hab;
rx_SaveQuit.hClientWnd = hwnd;
UserResponse =
WinDlgBox(HWND_DESKTOP, /* Parent */
hwnd, /* Owner */
(PFNWP)SaveQuitDlgProc,/* Dlg Proc */
(HMODULE)NULL, /* Resource is Loaded */
RXD_SAVEQUIT, /* Dialog ID */
&rx_SaveQuit); /* Create parms */
return (UserResponse);
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: SaveQuitDlgProc */
/* */
/* DESCRIPTIVE NAME: */
/* Handle messages for Save/Quit dialog. */
/* */
/* FUNCTION: */
/* See above. */
/* */
/* NOTES: */
/* */
/* ENTRY POINT: */
/* LINKAGE: MRESULT EXPENTRY SaveQuitDlgProc */
/* */
/* INPUT: */
/* HWND hDlg - window handle */
/* USHORT message - message to process */
/* MPARAM lparm1 - parameter 1 */
/* MPARAM lparm2 - parameter 2 */
/* */
/* The messages handled are: */
/* WM_INITDLG - initialize the error box */
/* WM_CLOSE - close dialog box */
/* WM_COMMAND - the following WM_COMMAND message are handled */
/* RXHD_B_SAVE - user pressed SAVE */
/* RXHD_B_SAVEAS - user pressed SAVEAS */
/* ESCAPE - user pressed CANCEL */
/* RXHD_B_DISCARD - user pressed DISCARD */
/* */
/* EXIT-NORMAL: */
/* Returns TRUE if processed correctly */
/* */
/* EXIT-ERROR: */
/* Returns FALSE otherwise */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* InitDlgSysMenu */
/* PositionDlg */
/* */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* WinDefDlgProc WinSendMsg */
/* WinDismissDlg WinSetDlgItemText */
/* WinEnableWindow WinWindowFromID */
/* WinQuerySysPointer */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
MRESULT EXPENTRY SaveQuitDlgProc(HWND hDlg,ULONG message,MPARAM
lparm1,MPARAM lparm2)
{
static PRX_SAVQUIT_STRUCT ppszParms; /* static because we only get it once */
MPARAM mpResponse; /* return code */
/******************************************************************************/
/* Retrieve the handles of buttons and list boxes. */
/******************************************************************************/
switch (message) {
case WM_INITDLG : /* Initialize the Dialog */
PositionDlg(hDlg); /* position the Dialog box */
InitDlgSysMenu(hDlg, TRUE); /* strip system menue */
/************************************************************************/
/* Create the Path, and Init Boxes/Buttons */
/************************************************************************/
ppszParms = (PRX_SAVQUIT_STRUCT)lparm2;
if (!(ppszParms->bNamedFile)) { /* Gray Save Button */
WinEnableWindow(WinWindowFromID(hDlg, (USHORT)RXHD_B_SAVE), FALSE);
}
/* display the warning ICON */
WinSendMsg(WinWindowFromID(hDlg, (USHORT)RXHD_ICON),
SM_SETHANDLE,
MPFROMHWND(WinQuerySysPointer(HWND_DESKTOP,
SPTR_ICONWARNING, FALSE) ), NULL);
/* display the save quit message */
WinSetDlgItemText(hDlg, RXHD_CHANGETEXT, (*ppszParms).pszSaveQuitMsg);
break;
case WM_CLOSE :
WinDismissDlg(hDlg, 0); /* close with a return code of 0 */
return ((MRESULT)TRUE);
break;
case WM_COMMAND : /* Process the Buttons */
switch (LOUSHORT(lparm1)) {
case RXHD_B_SAVE : /* send message to Client to get file */
/* saved */
mpResponse = WinSendMsg(ppszParms->hClientWnd, WM_COMMAND,
MPFROMSHORT(PMRXA_SAVE), 0L);
if (mpResponse) /* if it worked close dialog box */
WinDismissDlg(hDlg, LOUSHORT(mpResponse));
break;
case RXHD_B_SAVEAS : /* let the user pick a new name to save*/
/* as */
mpResponse = WinSendMsg(ppszParms->hClientWnd, WM_COMMAND,
MPFROMSHORT(PMRXA_SAVEAS), 0L);
if /* Cancel or error on save as */
((mpResponse != (MPARAM)0) && (mpResponse != (MPARAM)ESCAPE)) {
WinDismissDlg(hDlg, LOUSHORT(mpResponse));
}
break;
case ESCAPE : /* Cancel */
WinDismissDlg(hDlg, 0);
break;
case RXHD_B_DISCARD : /* discard changes */
WinDismissDlg(hDlg, 2);
break;
default :
return (MRESULT)TRUE;
break;
}
break;
default :
return (WinDefDlgProc(hDlg, message, lparm1, lparm2));
}
return ((MRESULT)NULL);
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: PositionDlg */
/* */
/* DESCRIPTIVE NAME: */
/* Position the Font dialog. */
/* */
/* FUNCTION: */
/* This routine positions the Font dialog relative to the owner */
/* window and the desktop. */
/* */
/* NOTES: */
/* */
/* ENTRY POINT: */
/* LINKAGE: PositionDlg(HWND hDlg) */
/* */
/* INPUT: */
/* hDlg - Handle to the dialog window. */
/* */
/* EXIT-NORMAL: */
/* */
/* EXIT-ERROR: */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* WinQuerySysValue */
/* WinQueryWindow */
/* WinQueryWindowPos */
/* WinSetWindowPos */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
BOOL PositionDlg(HWND hDlg)
{
SWP DlgPos; /* Postion of dialog window */
SWP ClientPos; /* Position of client window */
LONG Desktop_cx; /* Desktop horizontal coordinate */
LONG Desktop_cy; /* Desktop vertical coordinate */
/* Get window position */
WinQueryWindowPos(WinQueryWindow(hDlg, QW_OWNER), &ClientPos);
WinQueryWindowPos(hDlg, &DlgPos);
Desktop_cx=WinQuerySysValue(HWND_DESKTOP, SV_CXFULLSCREEN);
Desktop_cy=WinQuerySysValue(HWND_DESKTOP, SV_CYFULLSCREEN);
/* calculate y value from Client */
DlgPos.y = (SHORT)(ClientPos.y+ClientPos.cy - DlgPos.cy - DLG_OFFSET_TOP);
/* Don't let go off the top of the page*/
DlgPos.y = (SHORT)( (LONG)(DlgPos.y + DlgPos.cy) > Desktop_cy)
? (SHORT)(Desktop_cy-(LONG)DlgPos.cy) : DlgPos.y;
/* Position within bottom too */
DlgPos.y= (SHORT)((DlgPos.y > DLG_OFFSET_Y ) ? DlgPos.y : DLG_OFFSET_Y);
DlgPos.x=(ClientPos.cx>DlgPos.cx) /* Center box under the Title */
? (ClientPos.x+((ClientPos.cx/(SHORT)2)-(DlgPos.cx/(SHORT)2)))
: (ClientPos.x-((DlgPos.cx/(SHORT)2)-(ClientPos.cx/(SHORT)2)));
ClientPos.x = (ClientPos.x > 0) ? ClientPos.x : (SHORT)0;
/* Don't let it go off the left edge */
DlgPos.x= (DlgPos.x > DLG_OFFSET_X ) ? DlgPos.x : (SHORT)DLG_OFFSET_X;
/* or the right edge */
DlgPos.x = (SHORT)(((LONG)DlgPos.x + DlgPos.cx) > Desktop_cx)
? (SHORT)(Desktop_cx-(LONG)DlgPos.cx-DLG_OFFSET_X) : DlgPos.x;
/* Adjust dlgbox, (relative to owner) */
WinSetWindowPos( hDlg,
HWND_TOP,
DlgPos.x, DlgPos.y,
DlgPos.cx, DlgPos.cy,
SWP_SIZE | SWP_MOVE | SWP_ZORDER);
return(TRUE);
}
/************************** START OF SPECIFICATIONS ***************************/
/* */
/* SUBROUTINE NAME: InitDlgSysMenu */
/* */
/* DESCRIPTIVE NAME: */
/* Initialize the system menu for dialogues. */
/* */
/* FUNCTION: */
/* Removes items from the system menu that we don't want. */
/* */
/* NOTES: */
/* */
/* ENTRY POINT: */
/* LINKAGE: void InitDlgSysMenu */
/* */
/* INPUT: */
/* HWND hDlg - window handle */
/* BOOL bClose - Disable close option (TRUE) */
/* */
/* EXIT-NORMAL: void */
/* */
/* EXIT-ERROR: void */
/* */
/* EFFECTS: */
/* */
/* INTERNAL REFERENCES: */
/* ROUTINES: */
/* */
/* EXTERNAL REFERENCES: */
/* ROUTINES: */
/* WinSendMsg */
/* WinWindowFromID */
/* */
/**************************** END OF SPECIFICATIONS ***************************/
void InitDlgSysMenu( HWND hDlg, BOOL bClose )
{
HWND hSysMenu; /* handle to the system menu window */
/* get handle to system menu */
hSysMenu=WinWindowFromID(hDlg, (USHORT)FID_SYSMENU);
/******************************************************************
* Remove Items from the system menu that we don't want *
*******************************************************************/
WinSendMsg(hSysMenu, /* no Switch to .. option */
MM_DELETEITEM,
MPFROM2SHORT(SC_TASKMANAGER,TRUE),
MPFROMSHORT(NULL));
WinSendMsg(hSysMenu, /* no Minimize option */
MM_DELETEITEM,
MPFROM2SHORT(SC_MINIMIZE,TRUE),
MPFROMSHORT(NULL));
WinSendMsg(hSysMenu, /* no Maximize option */
MM_DELETEITEM,
MPFROM2SHORT(SC_MAXIMIZE,TRUE),
MPFROMSHORT(NULL));
WinSendMsg(hSysMenu, /* no Size option */
MM_DELETEITEM,
MPFROM2SHORT(SC_SIZE,TRUE),
MPFROMSHORT(NULL));
WinSendMsg(hSysMenu, /* no Restore option */
MM_DELETEITEM,
MPFROM2SHORT(SC_RESTORE,TRUE),
MPFROMSHORT(NULL));
if (!bClose) /* disable close option if necessary */
WinSendMsg (hSysMenu,
MM_SETITEMATTR,
MPFROM2SHORT(SC_CLOSE, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
return;
}