SUBROUTINE USER.ACTION(ACTIONS,VALIDACTS,OPT,PROGRAM,PARAMETER)
* Program:
* Copyright ALP Systems LLC
*
* ACTIONS - Opened File Name
* VALIDACTS - Available options to user
* OPT - Return value of User Choice
* PROGRAM - Calling Program
* PARAMETER<1>- spacing of action words
* PARAMETER<2>- y coordinate
*
*-----
PROMPT ''
CLR=@(-1)
EOP=@(-3)
EOL=@(-4)
BON=@(-7)
BOF=@(-8)
BELL=CHAR(7)
AM=CHAR(254)
VM=CHAR(253)
SVM=CHAR(252)
PR=@(0,22):EOL:@(0,22)
ER=@(0,23):EOL:@(0,23)
ABORT=0
TODAY=OCONV(DATE(),'D2-')
BADS=''
FOR M=0 TO 31
BADS:=CHAR(M)
NEXT M
*-----
SPACING=PARAMETER<1> ; YCORD=PARAMETER<2>
IF SPACING='' THEN SPACING=10
IF YCORD='' THEN YCORD=22
********************
* Validate Options *
********************
Z=VALIDACTS ; DESC=''
VALIDACTS=''
LOOP
UNTIL Z='' DO
ZID=Z<1>
READ DACTIONS FROM ACTIONS, ZID ELSE DACTIONS=''
Z=DELETE(Z,1,0,0)
IF DACTIONS#'' THEN
DESC<-1>=DACTIONS<2>
VALIDACTS<-1>=ZID
END
REPEAT
IF DESC='' THEN
OPT='' ; * Abort, no valid options
RETURN
END
XVAL=0 ; CURRENT=VALIDACTS<1>
MAX=DCOUNT(VALIDACTS,AM) ; * Number of valid actions
**************
* User Input *
**************
10 LOCATE CURRENT IN VALIDACTS SETTING PPP ELSE PPP=0
GOSUB 20
IF PPP THEN CRT @(0,YCORD+1):SPACE(40):@(0):DESC:
CRT @(0,YCORD):EOL:@(0,YCORD):LN:@(XVAL,YCORD):
INPUT OPT,0:
OPT=OCONV(OPT,'MCU')
SEQVAL=SEQ(OPT)
BEGIN CASE
CASE SEQVAL=6 OR SEQVAL=32 OR SEQVAL=10 ;*6=right,10=down,32=space
IF MAX>PPP THEN OPT=VALIDACTS
IF MAX=PPP THEN OPT=VALIDACTS<1>
CASE SEQVAL=21 OR SEQVAL=26 ; * left arrow & up arrow
IF PPP>1 THEN OPT=VALIDACTS
IF PPP=1 THEN OPT=VALIDACTS
CASE SEQVAL=13 OR SEQVAL=255 ; * Enter
OPT=CURRENT
CRT @(0,YCORD):EOL:@(0,YCORD+1):SPACE(40):
RETURN
END CASE
LOCATE OPT IN VALIDACTS SETTING PPP ELSE PPP=0
IF NOT(PPP) THEN GO 10
XVAL=(PPP*SPACING)-SPACING ; CURRENT=VALIDACTS
GO 10
************
* Build LN *
************
20 Z=VALIDACTS ; LN='' ; X=0 ; CNT=0
LOOP
UNTIL Z='' DO
ZID=Z<1> ; CNT+=1
READV D1 FROM ACTIONS, ZID, 1 ELSE D1=''
Z=DELETE(Z,1,0,0)
X+=SPACING
DMY1='' ; DMY2=''
IF CNT=PPP THEN DMY1=@(-7) ; DMY2=@(-8)
LN:=@(X-SPACING,YCORD):DMY1:D1:DMY2
REPEAT
RETURN