home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
VSCPPv8.zip
/
VACPP
/
IBMCPP
/
samples
/
TOOLKIT
/
OS2
/
EAEDIT
/
EAS.C
next >
Wrap
C/C++ Source or Header
|
1994-11-17
|
71KB
|
1,538 lines
/*static char *SCCSID = "@(#)eas.c 6.14 92/03/18";*/
/*==============================================================*\
* EAS.C -New Extended Attribute Display sample PM application *
* *
* (C) Copyright IBM Corporation 1992. *
*--------------------------------------------------------------*
* *
* This program implements an extended attributes editor. *
* Included in this file are all of the PM interface procedures*
* All of these procs represent procedures for dialog boxes. *
* This code is implemented as it was written to show how to *
* show how to use EA editor. *
* *
* The EA code revolves around the HoldFEA structure. This *
* structure is a linked list which contains one EA per *
* structure. Each HoldFEA structure is dynamically allocated *
* as are the two string pointer members of the structure, *
* szName and aValue. This is done to make handling the EAs *
* easier and more flexable. *
* *
* This application also serves as a template that can be *
* easily modified by an application developer. The source *
* files are organized so that the overhead code that should *
* be in all applications is located in the same files so *
* that these files do not need to be modified. The routines *
* that deal with application specific code are also located *
* in their own modules. An application developer need only *
* change these files in order to modify this template for *
* his application. *
* *
*--------------------------------------------------------------*
* Procedures in this file: *
* main() Sets up the PM environment and heap and *
* calls the MainWndProc *
* MainWndProc() Handles the main window messages *
* MainPaint() Handles the main paint window messages *
* MainCommand() Handles the main command window messages *
* ProcExit() Handles the WinClose window messages *
* UserCommand() Handles the user command window messages *
* MainControl() Handles the main control window messages *
* MessageBox Handles all error messages *
* AddEAProc() Handles new EA name entry and type selection*
* AsciiEditProc()Handles editing of EA name/value *
* IconDlgProc() Unimplemented icon procedure handler *
* MultiTypeProc()Handles the Multi-type dialog box *
* ShowEAType() Shows Selected EA Type for MainDlgProc *
* EditEA() Handles selection of an EA in the listbox *
* GetCurFEA() Gets a ptr to the hi-lited EA in the listbox*
* GetMem() *
\*==============================================================*/
/*--------------------------------------------------------------*\
* Include files, macros, defined constants, and externs *
\*--------------------------------------------------------------*/
#include "eas.h"
/* Setup the table, the order is related to DLGTEMPLATE of IDD_ADDEA */
EADATA ConvTable[EATABLESIZE] = {
{ EA_LPASCII ,"Length preceeded ascii\0 ",IDD_LPDATA},
{ EA_LPBINARY ,"Length preceeded hex binary\0 ",IDD_LPDATA},
{ EA_ASCIIZ ,"Asciiz\0 ",IDD_ASCIIZ},
{ EA_LPMETAFILE,"Metafile\0 ",IDD_LPDATA},
{ EA_ASCIIZFN ,"Asciiz file name of associated data\0",IDD_ASCIIZ},
{ EA_ASCIIZEA ,"Asciiz EA of associated data\0 ",IDD_ASCIIZ},
{ EA_MVMT ,"Multi value multi type field\0 ",IDD_MULTILIST},
{ EA_ASN1 ,"ASN.1 field\0 ",IDD_ASCIIZ},
{ EA_LPBITMAP ,"Length preceeded bitmap\0 ",IDD_LPDATA},
{ EA_LPICON ,"Length preceeded icon\0 ",IDD_LPDATA},
{ EA_MVST ,"Multi value single type field\0 ",IDD_MULTILIST},
{ 0 ,"Non conventional format\0 ",IDD_ASCIIZ}
};
/****************************************************************\
* Main routine *
*--------------------------------------------------------------*
* *
* Name: main(int argc, char *argv[]) *
* *
* Purpose: Initializes the PM environment, calls the *
* initialization routine, creates the main window, *
* and polls the message queue. *
* *
* Usage: *
* *
* Method: -obtains anchor block handle and creates message *
* queue *
* -calls the initialization routine *
* -creates the main frame window which creates the *
* main client window *
* -polls the message queue via Get/Dispatch Msg loop *
* -upon exiting the loop, exits *
* *
* Returns: 1 - if sucessful execution completed *
* 0 - if error *
* *
\****************************************************************/
INT main(int argc, char *argv[])
{
QMSG qmsg; /* message structure */
ULONG ctlData=FCF_SYSMENU | FCF_MENU | FCF_ICON | /* frame control data */
FCF_TASKLIST | FCF_TITLEBAR |
FCF_SIZEBORDER | FCF_ACCELTABLE |
FCF_MINMAX | FCF_SHELLPOSITION;
FILE_ISOPEN = FALSE;
FILE_CHANGED = FALSE;
COMMAND_LINE_FILE = FALSE;
if(argc > 1) /* If a command line file, get EAs from it */
if(ParseFileName(szFileName,argv[1]) != FILE_VALID) /* Bad file name */
*szFileName=0;
else
COMMAND_LINE_FILE = TRUE;
/* Note: The following 3 setup calls aren't currently checked for errors */
hab = WinInitialize(0);
if(!hab) {
DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR);
return(RETURN_ERROR);
}
hmq = WinCreateMsgQueue(hab, 0);
if(!hmq) {
DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR);
WinTerminate(hab);
return(RETURN_ERROR);
}
if(!Init())
{
MessageBox(HWND_DESKTOP, IDMSG_INITFAILED, "Error !",
MB_OK | MB_ERROR | MB_MOVEABLE, TRUE);
DosExit(EXIT_PROCESS, RETURN_ERROR);
}
/* create the main window */
hwndMainFrame = WinCreateStdWindow(HWND_DESKTOP,
WS_VISIBLE,
(PVOID)&ctlData,
(PSZ)szAppName,
(PSZ)NULL,
WS_VISIBLE,
(HMODULE)NULL,
ID_RESOURCE,
(PHWND)&hwndMain);
if(!hwndMainFrame)
{
MessageBox(HWND_DESKTOP, IDMSG_MAINWINCREATEFAILED, "Error !",
MB_OK | MB_ERROR | MB_MOVEABLE, TRUE);
DosExit(EXIT_PROCESS, RETURN_ERROR);
}
InitHelp();
while(WinGetMsg(hmq, (PQMSG)&qmsg, 0L, 0L, 0L))
WinDispatchMsg(hmq, (PQMSG)&qmsg);
/* destroy the help instance */
DestroyHelpInstance();
/* will normally be put in ExitProc */
DosExit(EXIT_PROCESS, RETURN_SUCCESS);
return 0;
} /* main() */
/****************************************************************\
* Main client window procedure *
*--------------------------------------------------------------*
* *
* Name: MainWndProc(hwnd, msg, mp1, mp2) *
* *
* Purpose: Processes the messages sent to the main client *
* window. This routine processes the basic messages *
* all client windows should process and passes all *
* others onto UserWndProc where the developer can *
* process any others. *
* *
* Usage: Called for each message placed in the main *
* window's message queue *
* *
* Method: a switch statement branches to the routines to be *
* performed for each message processed. Any messages *
* not specifically process are passed to the user's *
* message processing procedure UserWndProc(). *
* *
* Returns: Return values are determined by each message *
* *
\****************************************************************/
MRESULT EXPENTRY MainWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
MRESULT sRC;
switch(msg)
{
case WM_CREATE:
WinPostMsg(hwnd,WM_USER,(MPARAM)0,(MPARAM)0);
break;
case WM_USER: /* Posted by WM_INITDLG allows main window to open 1st */
if(COMMAND_LINE_FILE)
{
OpenFile(hwnd, ARGFILE);
}
break;
case WM_PAINT:
MainPaint(hwnd);
break;
case WM_COMMAND:
MainCommand(hwnd, mp1, mp2);
break;
case WM_CONTROL:
MainControl(hwnd, mp1, mp2);
break;
/*--------------------------------------------------*\
* Any messages not processed are passed on *
* to the user's window proc. It is *
* responsible for passing any messages it *
* doesn't handle onto WinDefWindowProc() *
\*--------------------------------------------------*/
case HM_QUERY_KEYS_HELP:
return ((MRESULT)PANEL_KEYSHELP);
default:
sRC = WinDefWindowProc(hwnd, msg, mp1, mp2);
return sRC;
}
return (MRESULT)0L;
/* all window procedures should return 0 as a default */
} /* MainWndProc() */
/****************************************************************\
* Main client painting routine *
*--------------------------------------------------------------*
* *
* Name: MainPaint(hwnd) *
* *
* Purpose: Paints the main client window. *
* *
* Usage: Routine is called whenver the client window *
* procedure receives a WM_PAINT message *
* *
* Method: -begins painting by calling WinBeginPaint *
* and retriving the HPS for the window *
* -paint page info boxes *
* *
* -ends painting by calling WinEndPaint *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID MainPaint(HWND hwnd)
{
HPS hps; /* Handle for painting */
RECTL rect; /* Rectangle struct for painting */
CHAR szBuffer[BUFF_SIZE];
POINTL ptl;
hps = WinBeginPaint(hwnd, 0L, (PRECTL)&rect);
WinFillRect(hps, (PRECTL)&rect, CLR_BACKGROUND);
/* Fill update rectangle with window color */
WinQueryWindowRect(hwndMain, (PRECTL)&rect);
ptl.x = HORZ_INDENT;
ptl.y = rect.yTop - VERT_TEXT_POS;
memset(szBuffer, 0, sizeof(szBuffer));
strcpy(szBuffer, "File Name:");
GpiCharStringAt(hps, &ptl, strlen(szBuffer), szBuffer);
ptl.x = HORZ_INDENT;
ptl.y = rect.yTop - VERT_TEXT_POS*3;
memset(szBuffer, 0, sizeof(szBuffer));
strcpy(szBuffer, "EA Type:");
GpiCharStringAt(hps, &ptl, strlen(szBuffer), szBuffer);
ptl.x = HORZ_INDENT;
ptl.y = rect.yTop - VERT_TEXT_POS*5;
memset(szBuffer, 0, sizeof(szBuffer));
strcpy(szBuffer, "EA Names:");
GpiCharStringAt(hps, &ptl, strlen(szBuffer), szBuffer);
if(FILE_ISOPEN)
{
ptl.x = HORZ_INDENT + 10;
ptl.y = rect.yTop - VERT_TEXT_POS*2;
GpiCharStringAt(hps, &ptl, strlen(szFileName), szFileName);
ptl.x = HORZ_INDENT + 10;
ptl.y = rect.yTop - VERT_TEXT_POS*4;
GpiCharStringAt(hps, &ptl, strlen(szEAType), szEAType);
}
else
{
ptl.x = HORZ_INDENT + 10;
ptl.y = rect.yTop - VERT_TEXT_POS*2;
strcpy(szBuffer, "File name will appear here!");
GpiCharStringAt(hps, &ptl, strlen(szBuffer), szBuffer);
ptl.x = HORZ_INDENT + 10;
ptl.y = rect.yTop - VERT_TEXT_POS*4;
strcpy(szBuffer, "EA types will appear here!");
GpiCharStringAt(hps, &ptl, strlen(szBuffer), szBuffer);
}
WinEndPaint(hps);
return ;
} /* MainPaint() */
/****************************************************************\
* Main window WM_COMMAND processing procedure *
*--------------------------------------------------------------*
* *
* Name: MainCommand(hwnd, mp1, mp2) *
* *
* Purpose:Calls the appropriate procedures that deal with *
* the selected menu item. *
* *
* Usage: Routine is called whenever a WM_COMMAND message *
* is posted to the main window. *
* *
* Method: a switch statement branches on the id of the *
* menu item that posted the message and the *
* appropriate action for that item is taken. Any *
* menu ids that are not part of the standard menu *
* set are passed onto the user defined WM_COMMAND *
* processing procedure. *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID MainCommand(HWND hwnd, MPARAM mp1, MPARAM mp2)
{
switch(SHORT1FROMMP(mp1))
{
case IDM_GENERALHELP:
HelpExtended(mp2);
break;
case IDM_USINGHELP:
HelpHelpForHelp(mp2);
break;
case IDM_TUTORIAL:
HelpKeys(mp2);
break;
case IDM_HELPINDEX:
HelpIndex(mp2);
break;
case IDM_HELPPRODUCTINFO:
HelpAbout(mp2);
break;
/*--------------------------------------------------*\
* User command processing routine is called *
* here so any ids not procecessed here can be *
* processed *
\*--------------------------------------------------*/
default:
UserCommand(hwnd, mp1, mp2);
break;
}
return;
} /* MainCommand() */
/****************************************************************\
* Main window WM_CONTROL processing procedure *
*--------------------------------------------------------------*
* *
* Name: MainControl(hwnd, mp1, mp2) *
* *
* Purpose:Calls the appropriate procedures that deal with *
* the selected menu item. *
* *
* Usage: Routine is called whenever a WM_CONTROL message *
* is posted to the main window. *
* *
* Method: a switch statement branches on the id of the *
* menu item that posted the message and the *
* appropriate action for that item is taken. Any *
* menu ids that are not part of the standard menu *
* set are passed onto the user defined WM_CONTROL *
* processing procedure. *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID MainControl(HWND hwnd, MPARAM mp1, MPARAM mp2)
{
switch(SHORT1FROMMP(mp1))
{
case IDD_WINLBOX:
switch(SHORT2FROMMP(mp1))
{
case LN_SELECT: /* A new item has been hi-lited */
ShowEAType(hwnd); /* Display appropriate EA Type */
break;
case LN_ENTER: /* Edit the selected EA */
EditEA(hwnd);
break;
}
}
/* This routine currently doesn't use the msg & mp2 parameter but *\
* it is referenced here to prevent an 'Unreferenced Parameter' *
\* warning at compile time. */
return;
}
/****************************************************************\
* Exit routine *
*--------------------------------------------------------------*
* *
* Name: ProcExit(hwnd, mp2) *
* *
* Purpose: Processes the menu's Exit item. *
* *
* Usage: called whenever Exit from the menu is selected *
* *
* Method: Routine posts a WM_CLOSE message to the main *
* application window. *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID ProcExit(HWND hwnd, MPARAM mp2)
{
USHORT usRet;
if(FILE_CHANGED) /* Give user a chance to save changes */
{
usRet= MessageBox(hwnd, IDMSG_FILECHANGED, "Warning !",
MB_YESNOCANCEL | MB_ICONEXCLAMATION, TRUE);
switch(usRet)
{
case MBID_YES: /* They want to save the EAs */
WriteEAs();
break;
case MBID_CANCEL: /* They don't really want to quit */
break;
}
}
WinPostMsg(hwndMain, WM_CLOSE, (MPARAM)NULL, (MPARAM)NULL);
/* This routine currently doesn't use the mp2 parameter but *\
* it is referenced here to prevent an 'Unreferenced Parameter' *
\* warning at compile time. */
return;
} /* ProcExit() */
/****************************************************************\
* Non-standard menu item command processing procedure *
*--------------------------------------------------------------*
* *
* Name: UserCommand(hwnd, mp1, mp2) *
* *
* Purpose: Process any WM_COMMAND messages send to hwndMain *
* that are not processed by MainCommand *
* *
* Usage: Routine is called for each WM_COMMAND that is *
* not posted by a standard menu item *
* *
* Method: A switch statement branches control based upon *
* the id of the control which posted the message *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID UserCommand(HWND hwnd, MPARAM mp1, MPARAM mp2)
{
RECTL rect; /* Rectangle struct for painting */
LONG usRet;
switch (SHORT1FROMMP(mp1))
{
case IDM_OPEN: /* Select another file to view/edit EAs */
if(FILE_CHANGED) /* Give them a chance to save modifications */
{
usRet = MessageBox(hwnd, IDMSG_FILECHANGED, "Warning !",
MB_YESNOCANCEL | MB_ICONEXCLAMATION, TRUE);
switch(usRet)
{
case MBID_YES:
WriteEAs();
break;
case MBID_NO:
break;
case MBID_CANCEL:
return;
}
}
WinQueryWindowRect(hwnd, &rect);
if(hwndChild1)
WinDestroyWindow(hwndChild1);
hwndChild1 = WinCreateWindow(hwnd,
WC_LISTBOX,
NULL,
WS_VISIBLE,
rect.xLeft,
rect.yBottom,
rect.xRight-rect.xLeft,
rect.yTop -rect.yBottom -VERT_TEXT_POS*5,
hwnd,
HWND_TOP,
IDD_WINLBOX,
NULL,
(PVOID)NULL);
if(OpenFile(hwnd,0)) /* File open ok */
break;
break;
case IDM_SAVE: /* Write EA's out to disk */
WriteEAs();
break;
case IDM_ADD: /* Add an EA to current list in memory */
AddEA(hwnd);
break;
case IDM_DELETE: /* Delete an EA from memory */
DeleteCurEA(hwnd);
break;
case IDM_EDIT: /* Edit the hilited EA */
EditEA(hwnd);
break;
default:
break;
}
/* This routine currently doesn't use the mp2 parameter but *\
* it is referenced here to prevent an 'Unreferenced Parameter' *
\* warning at compile time. */
return;
}
/****************************************************************\
* Message Box procedure *
*--------------------------------------------------------------*
* *
* Name: MessageBox(hwndOwner,IdMsg,pszMsg,fsStyle,bBeep) *
* *
* Purpose: Displays the warning message box with the message *
* given in nIdMsg retrived from the message table *
* *
* Usage: Called whever an error occurs and a message wishes *
* to be displayed to the user *
* *
* Method: - Message string is loaded from the process' *
* message table *
* - Alarm beep is sounded if desired *
* - Message box with the message is displayed *
* *
* Returns: *
* *
\****************************************************************/
LONG MessageBox(HWND hwndOwner, LONG IdMsg, PSZ pszMsg, LONG fsStyle,
BOOL bBeep)
{
CHAR szText[MESSAGELEN];
LONG usRet;
if(!WinLoadMessage(hab, (HMODULE)NULL, IdMsg, MESSAGELEN, (PSZ)szText))
{
WinAlarm(HWND_DESKTOP, WA_ERROR);
return RETURN_ERROR;
}
if(bBeep)
WinAlarm(HWND_DESKTOP, WA_ERROR);
usRet = WinMessageBox(HWND_DESKTOP,
hwndOwner,
szText,
(PSZ)pszMsg,
IDM_MSGBOX,
fsStyle);
return usRet;
} /* MessageBox() */
/****************************************************************\
* *
* Name: AddEAProc(hwnd, msg, mp1, mp2) *
* *
* Purpose: Handles the screen that allows the user to enter a *
* new EA Name and select the EA type. It checks to *
* make sure the name is unique and is not NULL before*
* returning. The user pointer is used to determine *
* whether the name is allowed to change or not. *
* If it points to a PassData structure, the Point *
* member gives the static EA Name. *
* *
* Usage: Called by MainDlgProc when user select the ADD. *
* *
* Method: Called by both the add EA routine and the m-m EA *
* add routine. This routine places the user typed *
* name in global szEAName, and the EA type in global *
* usRetEAType. *
* *
* Returns: Exits with WinDismissDlg set to TRUE if the user *
* selects OK, FALSE if the user selects CANCEL. *
* *
\****************************************************************/
MRESULT EXPENTRY AddEAProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
static CHAR bPDat = 0; /* flag indicating if the pPDat struct is valid */
PASSDATA FAR *pPDat; /* struct used to pass in default EA name */
USHORT i;
MRESULT sRC;
switch(msg)
{
case WM_INITDLG:
FixSysMenu(hwnd);
bPDat = 0;
WinSendDlgItemMsg(hwnd, IDD_EANAME,EM_SETTEXTLIMIT,
MPFROM2SHORT(MAXEANAME,0),NULL);
WinSendDlgItemMsg(hwnd, EA_LPASCII, BM_CLICK,(MPARAM)0L,(MPARAM)0L);
pPDat=PVOIDFROMMP(mp2);
if(pPDat)
{
bPDat = 1;
WinSetDlgItemText(hwnd, IDD_EANAME, pPDat->Point);
WinEnableWindow(WinWindowFromID(hwnd,IDD_EANAME),
FALSE); /* Disable EA Name field */
WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,DID_OK));
return (MRESULT)TRUE; /* We don't want default focus setting */
}
return (MRESULT)0L;
case WM_COMMAND:
switch(LOUSHORT(mp1))
{
case DID_OK:
if(bPDat == 0) /* It is a new EA (not multi-type) */
{
WinQueryDlgItemText(hwnd, IDD_EANAME, MAXEANAME+1, szEAName);
if(!strlen(szEAName)) /* Don't allow a Null EA Name */
{
MessageBox(hwnd, IDMSG_ERROREANAME, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
if(EAExists(szEAName)) /* Don't allow duplicate EA Name */
{
MessageBox(hwnd, IDMSG_DUPLICATENAME, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
usRetEAType = (USHORT) WinSendDlgItemMsg(hwnd, EA_ASCIIZ,
BM_QUERYCHECKINDEX,(MPARAM)0L,(MPARAM)0L);
/* New MVST EAname */
if (ConvTable[usRetEAType].usPrefix == EA_MVST)
{
for (i=0; i<MAXEANAME+1 && szEAName[i] != '\000'; i++)
{ /* Transfer lowercase to uppercase */
if(szEAName[i]>='a' && szEAName[i]<='z')
szEAName[i] = szEAName[i] - (CHAR)' ';
}
/* Store MVST name & type */
for(i=0; i<MSNUM && MSdata[i].szName != NULL;)
i++;
GetMem((PPVOID)&MSdata[i].szName, sizeof(MVSTDATA));
strcpy(MSdata[i].szName,szEAName);
MSdata[i].usType = usRetEAType;
}
}
else /* It is multi value */
{
usRetEAType = (USHORT) WinSendDlgItemMsg(hwnd,
EA_ASCIIZ,
BM_QUERYCHECKINDEX,
(MPARAM)0L,(MPARAM)0L);
/* Check Type Name is in the list of MVST or not */
for (i=0; i<MSNUM && MSdata[i].szName!=NULL &&
strcmp(szEAName,MSdata[i].szName)!=0;)
i++;
/* 2'nd value of existed MVST type */
if(i<MSNUM && MSdata[i].szName!=NULL)
{
if (ConvTable[usRetEAType].usPrefix == EA_MVST)
{
MessageBox(hwnd, IDMSG_ERRORMULTIVALUE, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
if (ConvTable[usRetEAType].usPrefix == EA_MVMT)
{
MessageBox(hwnd, IDMSG_ERRORMULTITYPE, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
MSdata[i].usType = usRetEAType;
}
}
WinDismissDlg(hwnd, TRUE);
return (MRESULT)0L;
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return (MRESULT)0L;
}
break;
case WM_CLOSE:
WinDismissDlg(hwnd, FALSE);
return (MRESULT)0L;
}
sRC = WinDefDlgProc(hwnd, msg, mp1, mp2);
return sRC;
}
/****************************************************************\
* *
* Name: AsciiEditProc(hwnd, msg, mp1, mp2) *
* *
* Purpose: This proc handles the editing of EA Names and their*
* associated ASCII strings. *
* *
* Method: A PassData struct must be passed in when called. *
* Note that the Value buffer is dynamically allocated*
* and it is the responsibility of the calling *
* procedure to deallocate the buffer (szScratch) when*
* finished with it. Note also that memory allocations*
* are NOT fully error trapped. *
* *
* Returns: Exits with WinDismissDlg set to TRUE if the user *
* selects OK, FALSE if the user selects CANCEL. Global
* szEAName contains the modified EA Value. the fFlag*
* member of the passed in data will be updated to *
* reflect the currentstate of the Need bit. * *
* *
\****************************************************************/
MRESULT EXPENTRY AsciiEditProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
static PASSDATA FAR *pPDat;
MRESULT sRC;
switch(msg)
{
case WM_INITDLG:
FixSysMenu(hwnd);
WinSendDlgItemMsg(hwnd, IDD_EANAME,EM_SETTEXTLIMIT,
MPFROM2SHORT(MAXEANAME,0),NULL);
WinSendDlgItemMsg(hwnd, IDD_EAVALUE,EM_SETTEXTLIMIT,
MPFROM2SHORT(MAXEAVALUE,0),NULL);
pPDat=PVOIDFROMMP(mp2);
WinSetDlgItemText(hwnd, IDD_EANAME,pPDat->Point);
WinSetDlgItemText(hwnd, IDD_EATYPE,ConvTable[usRetEAType].szFormat);
WinSendDlgItemMsg(hwnd, IDD_NEEDBIT, BM_SETCHECK,
MPFROM2SHORT(pPDat->fFlag,0),NULL);
if(szAscii) /* Set default EA Value if global var is != NULL */
WinSetDlgItemText(hwnd, IDD_EAVALUE,szAscii);
if(pPDat->usIndex) /* Disable EANAME if passed in a non-zero value */
{
WinEnableWindow(WinWindowFromID(hwnd,IDD_EANAME),FALSE);
WinEnableWindow(WinWindowFromID(hwnd,IDD_NEEDBIT),FALSE);
WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,IDD_EAVALUE));
return (MRESULT)TRUE; /* We don't want default focus setting */
}
return (MRESULT)0L;
case WM_COMMAND:
switch(LOUSHORT(mp1))
{
case DID_OK:
pPDat->fFlag = (BYTE) WinSendDlgItemMsg(hwnd, IDD_NEEDBIT,
BM_QUERYCHECK, 0L, 0L);
WinQueryDlgItemText(hwnd, IDD_EANAME, MAXEANAME+1, szEAName);
if(!strlen(szEAName)) /* They nulled out the name */
{
MessageBox(hwnd, IDMSG_ERROREANAME, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
GetMem( &szScratch, (ULONG)MAXEAVALUE+1L); /* Allocate buffer for value */
WinQueryDlgItemText(hwnd, IDD_EAVALUE, MAXEAVALUE+1, szScratch);
if(!strlen(szScratch)) /* They nulled out the value */
{
FreeMem(szScratch); /* Free the value buffer */
MessageBox(hwnd, IDMSG_ERRORVALUE, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
if(stricmp(szEAName,pPDat->Point)) /* changed the EA name */
{
if(EAExists(szEAName)) /* Can't have duplicate EA names */
{
MessageBox(hwnd, IDMSG_DUPLICATENAME, "Error !",
MB_OK | MB_ERROR, TRUE);
FreeMem(szScratch); /* Free value buffer */
return (MRESULT)0L;
}
}
DosSetMem(szScratch, strlen(szScratch)+1, fPERM|PAG_COMMIT);
WinDismissDlg(hwnd, TRUE);
return (MRESULT)0L;
case DID_CANCEL:
WinDismissDlg(hwnd, FALSE);
return (MRESULT)0L;
}
break;
case WM_CLOSE:
WinDismissDlg(hwnd, FALSE);
return (MRESULT)0L;
}
sRC = WinDefDlgProc(hwnd, msg, mp1, mp2);
return sRC;
}
/****************************************************************\
* Name: IconDlgProc(hwnd, msg, mp1, mp2) *
* *
* Purpose: This proc is intedned to handle displaying and *
* editing icons/bitmaps. *
* *
* Usage : *
* *
* Method : *
* *
* Returns: *
* *
\****************************************************************/
MRESULT EXPENTRY IconDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
MRESULT sRC;
switch(msg)
{
case WM_INITDLG:
FixSysMenu(hwnd);
return 0L;
case WM_COMMAND:
WinDismissDlg(hwnd, TRUE);
return 0L;
case WM_PAINT:
{
SWP swpTxt, swpDlg;
HPS hps;
POINTL ptl;
HBITMAP hbm;
WinDefDlgProc(hwnd, WM_PAINT, mp1, mp2); /* normal dialog painting */
hps = WinGetPS(hwnd); /* now, add our stuff */
/* load and draw Example */
hbm = GpiLoadBitmap(hps, 0, ID_BMP, 0L, 0L);
WinQueryWindowPos(WinWindowFromID(hwnd, ID_LOGOTEXT), &swpTxt);
WinQueryWindowPos(hwnd, &swpDlg);
ptl.x = (LONG)((swpDlg.cx - 95) / 2);
ptl.y = (LONG)((((swpDlg.cy - swpTxt.y) - 53) / 2) + swpTxt.y);
WinDrawBitmap(hps,
hbm,
NULL,
&ptl,
0L,
0L,
DBM_IMAGEATTRS);
WinReleasePS(hps);
return (MRESULT)0L;
}
}
sRC = WinDefDlgProc(hwnd, msg, mp1, mp2);
return sRC;
}
/****************************************************************\
* *
* Name: MultiValueProc(hwnd, msg, mp1, mp2) *
* *
* Purpose: This proc handles the multi-valuee EA stuff. Allows*
* the fields in a given m-m to be edited. *
* Usage : *
* *
* Method : NOTE that this procedure is fully reentrant/ *
* recursive in that it calls EditEAValue() which can *
* call MultiValueProc. Since PassData information is *
* placed in static variables,the ReEnter structure is*
* used to hold a dynamic linked list of values *
* passed intothe proc and thus keeps the static data*
* set to the proper values. *
* *
* Returns: Always returns TRUE thru WinDismissDlg when DONE is*
* clicked. *
* *
\****************************************************************/
MRESULT EXPENTRY MultiValueProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
static HOLDFEA *pFEA; /* Points to the current EA */
static PASSDATA FAR *pPDat; /* Points to the passed Data struct */
static REENTER *CurEntry; /* Points to most recent data frame */
REENTER *ReEntHold=NULL; /* Temp used to setup the frame */
PASSDATA PDat; /* Used for call to EditEAValue */
USHORT *pusPtr,cnt; /* Utility vars */
SHORT sOffset;
CHAR *pInsert,*pValue,*pDelete;
CHAR szCodePage[LENUSHORTBUF];
BYTE fNeed; /* Holds state of need checkbox */
MRESULT sRC;
switch(msg)
{
case WM_INITDLG:
FixSysMenu(hwnd);
pPDat = PVOIDFROMMP(mp2); /* Set up static vars */
pFEA = (HOLDFEA *) pPDat->Point;
GetMem((PPVOID)&ReEntHold, (LONG)sizeof(REENTER)); /* Allows for recusive calls */
ReEntHold->pPDat = pPDat;
ReEntHold->pFEA = pFEA;
ReEntHold->next = CurEntry;
CurEntry = ReEntHold;
WinSendDlgItemMsg(hwnd, IDD_NEEDBIT, BM_SETCHECK,/* Need bit setup */
MPFROM2SHORT((pFEA->fEA&0x80)? TRUE : FALSE,0),
NULL);
WinSetDlgItemText(hwnd, IDD_EATYPE,""); /* Setup the codepage */
WinSetDlgItemText(hwnd, IDD_EANAME,pFEA->szName);
WinSendDlgItemMsg(hwnd, IDD_CODEPAGE,EM_SETTEXTLIMIT,
MPFROM2SHORT(LENUSHORTBUF-1,0),NULL);
pusPtr= (USHORT *) ((CHAR *) pFEA->aValue+pPDat->usMultiOffset);
pusPtr++; /* Skip the EA_Type field and point to codepage */
sprintf(szCodePage,"%u",*pusPtr);
WinSetDlgItemText(hwnd, IDD_CODEPAGE,szCodePage);
pusPtr++; /* Skip codepage and point to the field count */
for(cnt=0;cnt< *pusPtr;cnt++) /* Add each field to the L-Box */
{
pInsert = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,cnt);
pValue = EAValueString(pInsert); /* Ptr to asciiz string */
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_INSERTITEM,
MPFROM2SHORT(LIT_END,0),
MPFROMP(pValue));
FreeMem(pValue); /* Free asciiz string */
}
return (MRESULT)0L;
case WM_CONTROL:
switch(SHORT1FROMMP(mp1))
{
case IDD_LBOX:
switch(SHORT2FROMMP(mp1))
{
case LN_SELECT: /* Display proper EA type for selection */
sOffset = (SHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0)
break;
pValue = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,
sOffset);
pusPtr = (USHORT *) pValue;
WinSetDlgItemText(hwnd,IDD_EATYPE,
ConvTable[LookupEAType(*pusPtr)].szFormat);
break;
case LN_ENTER: /* Setup and edit a m-m field */
sOffset = (SHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0)
return 0L;
PDat.Point = (CHAR *) pFEA; /* Pass curr data */
PDat.cbMulti = pPDat->cbMulti;
PDat.usMultiOffset = pPDat->usMultiOffset;
PDat.usIndex = sOffset;
if(EditEAValue(hwnd,&PDat)) /* They didn't cancel */
{
pInsert=MultiTypeIndex(pFEA->aValue
+ pPDat->usMultiOffset,
sOffset);
pValue =EAValueString(pInsert);
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_SETITEMTEXT,
MPFROMSHORT(sOffset),
MPFROMP(pValue));
FreeMem(pValue); /* Free asciiz str */
}
return (MRESULT)0L;
}
}
break;
case WM_COMMAND:
switch(LOUSHORT(mp1))
{
case IDD_ADD: /* Add an item for a m-m */
if(!WinDlgBox(HWND_DESKTOP, /* Do an ascii text edit */
hwnd,
AsciiEditProc,
'\0',
IDD_ASCIIEDIT,
&PDat))
return (MRESULT)0L; /* They said cancel */
break;
case IDD_EDIT: /* Setup and edit a m-m field */
sOffset = (SHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0)
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
PDat.Point = (CHAR *) pFEA; /* Pass curr data */
PDat.cbMulti = pPDat->cbMulti;
PDat.usMultiOffset = pPDat->usMultiOffset;
PDat.usIndex = sOffset;
if(EditEAValue(hwnd,&PDat)) /* They didn't cancel */
{
pInsert=MultiTypeIndex(pFEA->aValue + pPDat->usMultiOffset,
sOffset);
pValue =EAValueString(pInsert);
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_SETITEMTEXT,
MPFROMSHORT(sOffset),
MPFROMP(pValue));
FreeMem(pValue); /* Free asciiz str */
}
return (MRESULT)0L;
case IDD_DELETE: /* Delete hi-lited item */
sOffset = (USHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0) /* No item is currently selected */
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_DELETEITEM,
MPFROMSHORT(sOffset),0L);
/* Get pointers to start of selected field and the following
field, then move the rest of the EA back, resize the
buffer, and change the EA Value counter */
pDelete = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,
sOffset);
pValue = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,
(sOffset+1) );
memmove(pDelete,pValue,pFEA->cbValue-(pValue-pFEA->aValue));
DosSetMem(pFEA->aValue, pFEA->cbValue-(pValue-pDelete), fPERM|PAG_COMMIT);
pFEA->cbValue -= pValue-pDelete;
/* Decrement the field count in the m-m */
pusPtr = (USHORT *) ((CHAR *) pFEA->aValue +
pPDat->usMultiOffset);
pusPtr+=2; /* Point to the field count */
*pusPtr -= 1; /* Decrement the field cnt */
FILE_CHANGED = TRUE;
return (MRESULT)0L;
case DID_DONE:
/* Handle the possible change of the need checkbox */
fNeed = (BYTE) WinSendDlgItemMsg(hwnd, IDD_NEEDBIT,
BM_QUERYCHECK,
0L, 0L);
if(fNeed)
fNeed = 0x80;
if(fNeed != (BYTE) (pFEA->fEA & 0x80)) /* Need changed */
{
pFEA->fEA = (BYTE)((pFEA->fEA & 0x7F) | fNeed);
FILE_CHANGED = TRUE;
}
/* Handle the possible change of the codepage */
WinQueryDlgItemText(hwnd, IDD_CODEPAGE,
LENUSHORTBUF, szCodePage);
sscanf(szCodePage,"%u",&cnt);
pusPtr= (USHORT *) ((CHAR *) pFEA->aValue+pPDat->usMultiOffset);
pusPtr++; /* Skip the EA_Type field and point to codepage */
if(*pusPtr != cnt) /* They changed the codepage value */
{
*pusPtr = cnt;
FILE_CHANGED = TRUE;
}
ReEntHold = CurEntry->next; /* Finish recursion safety */
FreeMem(CurEntry);
CurEntry = ReEntHold;
if(CurEntry)
{
pPDat = CurEntry->pPDat;
pFEA = CurEntry->pFEA;
}
WinDismissDlg(hwnd, TRUE);
return (MRESULT)0L;
}
case WM_CLOSE:
WinDismissDlg(hwnd, FALSE);
return (MRESULT)0L;
}
sRC = WinDefDlgProc(hwnd, msg, mp1, mp2);
return sRC;
}
/****************************************************************\
* *
* Name: MultiTypeProc(hwnd, msg, mp1, mp2) *
* *
* Purpose: This proc handles the multi-type EA stuff. Allows *
* the fields in a given m-m to be edited. *
* Usage : *
* *
* Method : NOTE that this procedure is fully reentrant/ *
* recursive in that it calls EditEAValue() which can *
* call MultiTypeProc. Since PassData information is *
* placed in static variables, the ReEnter structure *
* is used to hold a dynamic linked list of values *
* passed into the proc and thus keeps the static data*
* set to the proper values. *
* *
* Returns: Always returns TRUE thru WinDismissDlg when DONE is*
* clicked. *
* *
\****************************************************************/
MRESULT EXPENTRY MultiTypeProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
static HOLDFEA *pFEA; /* Points to the current EA */
static PASSDATA FAR *pPDat; /* Points to the passed Data struct */
static REENTER *CurEntry; /* Points to most recent data frame */
REENTER *ReEntHold=NULL; /* Temp used to setup the frame */
PASSDATA PDat; /* Used for call to EditEAValue */
USHORT *pusPtr,cnt; /* Utility vars */
SHORT sOffset;
CHAR *pInsert,*pValue,*pDelete;
CHAR szCodePage[LENUSHORTBUF];
BYTE fNeed; /* Holds state of need checkbox */
MRESULT sRC;
switch(msg)
{
case WM_INITDLG:
FixSysMenu(hwnd);
pPDat = PVOIDFROMMP(mp2); /* Set up static vars */
pFEA = (HOLDFEA *) pPDat->Point;
GetMem((PPVOID)&ReEntHold, (ULONG)sizeof(REENTER)); /* Allows for recusive calls */
ReEntHold->pPDat = pPDat;
ReEntHold->pFEA = pFEA;
ReEntHold->next = CurEntry;
CurEntry = ReEntHold;
WinSendDlgItemMsg(hwnd, IDD_NEEDBIT, BM_SETCHECK,/* Need bit setup */
MPFROM2SHORT((pFEA->fEA&0x80)? TRUE : FALSE,0),
NULL);
WinSetDlgItemText(hwnd, IDD_EATYPE,""); /* Setup the codepage */
WinSetDlgItemText(hwnd, IDD_EANAME,pFEA->szName);
WinSendDlgItemMsg(hwnd, IDD_CODEPAGE,EM_SETTEXTLIMIT,
MPFROM2SHORT(LENUSHORTBUF-1,0),NULL);
pusPtr= (USHORT *) ((CHAR *) pFEA->aValue+pPDat->usMultiOffset);
pusPtr++; /* Skip the EA_Type field and point to codepage */
sprintf(szCodePage,"%u",*pusPtr);
WinSetDlgItemText(hwnd, IDD_CODEPAGE,szCodePage);
pusPtr++; /* Skip codepage and point to the field count */
for(cnt=0;cnt< *pusPtr;cnt++) /* Add each field to the L-Box */
{
pInsert = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,cnt);
pValue = EAValueString(pInsert); /* Ptr to asciiz string */
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_INSERTITEM,
MPFROM2SHORT(LIT_END,0),
MPFROMP(pValue));
FreeMem(pValue); /* Free asciiz string */
}
return (MRESULT)0L;
case WM_CONTROL:
switch(SHORT1FROMMP(mp1))
{
case IDD_LBOX:
switch(SHORT2FROMMP(mp1))
{
case LN_SELECT: /* Display proper EA type for selection */
sOffset = (SHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0)
break;
pValue = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,
sOffset);
pusPtr = (USHORT *) pValue;
WinSetDlgItemText(hwnd,IDD_EATYPE,
ConvTable[LookupEAType(*pusPtr)].szFormat);
break;
case LN_ENTER: /* Setup and edit a m-m field */
sOffset = (SHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0)
return (MRESULT)0L;
PDat.Point = (CHAR *) pFEA; /* Pass curr data */
PDat.cbMulti = pPDat->cbMulti;
PDat.usMultiOffset = pPDat->usMultiOffset;
PDat.usIndex = sOffset;
if(EditEAValue(hwnd,&PDat)) /* They didn't cancel */
{
pInsert=MultiTypeIndex(pFEA->aValue
+ pPDat->usMultiOffset,
sOffset);
pValue =EAValueString(pInsert);
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_SETITEMTEXT,
MPFROMSHORT(sOffset),
MPFROMP(pValue));
FreeMem(pValue); /* Free asciiz str */
}
return (MRESULT)0L;
}
}
break;
case WM_COMMAND:
switch(LOUSHORT(mp1))
{
case IDD_ADD: /* Add an item for a m-m */
MultiAdd(hwnd, pFEA,pPDat);
return (MRESULT)0L;
case IDD_EDIT: /* Setup and edit a m-m field */
if(ConvTable[usRetEAType].usPrefix != EA_MVST)
{
sOffset = (SHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0)
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
} else sOffset=0;
PDat.Point = (CHAR *) pFEA; /* Pass curr data */
PDat.cbMulti = pPDat->cbMulti;
PDat.usMultiOffset = pPDat->usMultiOffset;
PDat.usIndex = sOffset;
if(EditEAValue(hwnd,&PDat)) /* They didn't cancel */
{
pInsert=MultiTypeIndex(pFEA->aValue + pPDat->usMultiOffset,
sOffset);
pValue =EAValueString(pInsert);
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_SETITEMTEXT,
MPFROMSHORT(sOffset),
MPFROMP(pValue));
FreeMem(pValue); /* Free asciiz str */
}
return (MRESULT)0L;
case IDD_DELETE: /* Delete hi-lited item */
sOffset = (USHORT) WinSendDlgItemMsg(hwnd, IDD_LBOX,
LM_QUERYSELECTION,0,0);
if(sOffset<0) /* No item is currently selected */
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return (MRESULT)0L;
}
WinSendDlgItemMsg(hwnd, IDD_LBOX, LM_DELETEITEM,
MPFROMSHORT(sOffset),0L);
/* Get pointers to start of selected field and the following
field, then move the rest of the EA back, resize the
buffer, and change the EA Value counter */
pDelete = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,
sOffset);
pValue = MultiTypeIndex(pFEA->aValue+pPDat->usMultiOffset,
(sOffset+1) );
memmove(pDelete,pValue,pFEA->cbValue-(pValue-pFEA->aValue));
DosSetMem(pFEA->aValue, pFEA->cbValue-(pValue-pDelete), fPERM|PAG_COMMIT);
pFEA->cbValue -= pValue-pDelete;
/* Decrement the field count in the m-m */
pusPtr = (USHORT *) ((CHAR *) pFEA->aValue +
pPDat->usMultiOffset);
pusPtr+=2; /* Point to the field count */
*pusPtr -= 1; /* Decrement the field cnt */
FILE_CHANGED = TRUE;
return (MRESULT)0L;
case DID_DONE:
/* Handle the possible change of the need checkbox */
fNeed = (BYTE) WinSendDlgItemMsg(hwnd, IDD_NEEDBIT,
BM_QUERYCHECK,
0L, 0L);
if(fNeed)
fNeed = 0x80;
if(fNeed != (BYTE) (pFEA->fEA & 0x80)) /* Need changed */
{
pFEA->fEA = (BYTE)((pFEA->fEA & 0x7F) | fNeed);
FILE_CHANGED = TRUE;
}
/* Handle the possible change of the codepage */
WinQueryDlgItemText(hwnd, IDD_CODEPAGE,
LENUSHORTBUF, szCodePage);
sscanf(szCodePage,"%u",&cnt);
pusPtr= (USHORT *) ((CHAR *) pFEA->aValue+pPDat->usMultiOffset);
pusPtr++; /* Skip the EA_Type field and point to codepage */
if(*pusPtr != cnt) /* They changed the codepage value */
{
*pusPtr = cnt;
FILE_CHANGED = TRUE;
}
ReEntHold = CurEntry->next; /* Finish recursion safety */
FreeMem(CurEntry);
CurEntry = ReEntHold;
if(CurEntry)
{
pPDat = CurEntry->pPDat;
pFEA = CurEntry->pFEA;
}
WinDismissDlg(hwnd, TRUE);
return (MRESULT)0L;
}
case WM_CLOSE:
WinDismissDlg(hwnd, FALSE);
return (MRESULT)0L;
}
sRC = WinDefDlgProc(hwnd, msg, mp1, mp2);
return sRC;
}
/****************************************************************\
* *
* Name: ShowEAType(hwnd) *
* *
* Purpose: This routine handles the display of the current EA *
* type by setting the text in the appropriate dialog *
* field. *
* Usage : *
* Method : Routine should be bullet proof as it does its own *
* error checking. It assumes that hwnd points to the *
* correct window with the name listbox in it. *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID ShowEAType(HWND hwnd)
{
HOLDFEA *pFEA;
pFEA = GetCurFEA(hwnd, pHoldFEA); /* Points to the selected EA */
if(!pFEA) /* Kill line if nothing is selected */
{
memset(szEAType, 0, sizeof(szEAType) );
WinInvalidateRect(hwndMain, NULL, FALSE);
return;
}
strcpy(szEAType, ConvTable[usRetEAType].szFormat);
WinInvalidateRect(hwndMain, NULL, FALSE);
return;
}
/****************************************************************\
* *
* Name: EditEA(hwnd) *
* *
* Purpose: This routine handles the editing of an EA when it *
* is selected from the listbox. It get the item *
* selected, sets up the PassData structure then calls*
* EditEAValue to do the actual edi *
* Usage : *
* Method : Routine should be bullet proof as it does its own *
* error checking. It assumes that hwnd points to the *
* correct window with the name listbox in it. * *
* *
* Returns: TRUE if the edit was successful. *
* *
\****************************************************************/
BOOL EditEA(HWND hwnd)
{
HOLDFEA *pFEA=pHoldFEA; /* Pointer for selected EA */
SHORT soffset,sCnt; /* Both used to reference offset of selected EA */
PASSDATA PData;
if(!FILE_ISOPEN)
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return(FALSE);
}
soffset = sCnt = (SHORT) WinSendDlgItemMsg(hwnd, IDD_WINLBOX,
LM_QUERYSELECTION,0,0);
if(soffset< 0) /* Nothing is selected */
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return(FALSE);
}
while(sCnt--) /* Get to the right EA */
pFEA = pFEA->next;
PData.Point = (CHAR *)pFEA; /* Set the pass data struct */
PData.usMultiOffset = 0;
PData.cbMulti = 0;
if(EditEAValue(hwnd,&PData)) /* It worked */
{
WinSendDlgItemMsg(hwnd, IDD_WINLBOX, LM_SETITEMTEXT,
MPFROMSHORT(soffset),MPFROMP(pFEA->szName));
return(TRUE);
}
return(FALSE);
}
/****************************************************************\
* *
* Name: GetCurFEA(hwnd, pFEA) *
* *
* Purpose: This routine returns a pointer to the EA currently *
* highlighted in the list box. *
* Usage : *
* Method : Routine should be bullet proof as it does its own *
* error checking. It assumes that hwnd points to the *
* correct window with the name listbox in it. *
* *
* Returns: The current EA as determined by querying the l-box *
* selector, returns NULL if there is an error or *
* nothing is selected. *
* *
\****************************************************************/
HOLDFEA *GetCurFEA(HWND hwnd, HOLDFEA *pFEA)
{
LONG lOffset;
lOffset = (LONG) WinSendDlgItemMsg(hwnd, IDD_WINLBOX,
LM_QUERYSELECTION,0,0);
if(lOffset == 0xffff) /* Nothing is highlighted */
{
MessageBox(hwnd, IDMSG_ERRORSELECT, "Error !",
MB_OK | MB_ERROR, TRUE);
return(NULL);
}
while(lOffset--)
{
pFEA = pFEA->next;
}
return(pFEA);
}
/****************************************************************\
* *
* Name: GetMem (ppv, cb) *
* *
* Purpose: This routine returns a pointer to a available* *
* memory space. *
* *
* Usage : *
* Method : Routine should be bullet proof as it does its own *
* error checking. It assumes that hwnd points to the *
* correct window with the name listbox in it. *
* *
* Returns: The current EA as determined by querying the l-box *
* selector. *
* *
\****************************************************************/
VOID GetMem (PVOID *ppv, ULONG cb)
{
BOOL f;
f =(BOOL) DosAllocMem(ppv, cb, fPERM|PAG_COMMIT);
if (f)
{
MessageBox(HWND_DESKTOP, IDMSG_MEMORYFULL, "Error !",
MB_OK | MB_ERROR, TRUE);
*ppv = NULL;
return;
}
return;
}
/****************************************************************\
* *
* Name: ResizeMem(ppv, cbOld, cbNew) *
* *
* Purpose: This routine returns a pointer to a available *
* memory space. *
* *
* Usage : *
* Method : *
* *
* Returns: VOID *
* *
\****************************************************************/
VOID ResizeMem (PVOID *ppv, ULONG cbOld, ULONG cbNew)
{
BOOL f;
PVOID pvNew=NULL;
f = (BOOL) DosAllocMem(&pvNew, cbNew, fPERM|PAG_COMMIT);
if (f) {
MessageBox(HWND_DESKTOP, IDMSG_MEMORYFULL, "Error !",
MB_OK | MB_ERROR, TRUE);
*ppv = NULL;
return;
}
memcpy(pvNew, *ppv, cbOld);
f = (BOOL) DosFreeMem(*ppv);
*ppv = pvNew;
return ;
}