SUBROUTINE MULTI.WINDOW(COR,INLIST,OUTLIST,PL,MULTI,N,TITLE,DTYPE,INSERT.OK) * variable dtype setup as follows: * 0 = attributes, 1 = sub-valued, 2 = multi-sub-valued * if multi then multiple selections are allowed during the call * else the position where the single selection was found is returned in multi * data itself is always returned in outlist * n = dcount of inlist delimiters * PLACE = DTYPE + 1 GOSUB 300 IF INSERT.OK THEN IMSG = " 'I'nsert," ELSE IMSG = '' XIT.MSG = " or 'E'xit " SCOL = COR<1,1> SROW = COR<1,2> ECOL = COR<1,3> EROW = COR<1,4> WIDTH = ECOL-SCOL DEPTH = EROW - SROW GIVE.POS = MULTI<2> JUST.DISPLAY = MULTI<3> DELETE.FROM.LIST = MULTI<4> DELETE.ANYWAY = MULTI<5> HAVE.FRAME = MULTI<6> N.OFFSET = MULTI<7> + 0 DO.NOT.CENTER = MULTI<8> MULTI = MULTI<1> JUST = 'L#':WIDTH IF NOT(HAVE.FRAME) THEN IF DO.NOT.CENTER THEN WHERE = 1 END ELSE CALL CENTERED(TITLE,WHERE,WIDTH) END BORDER = STR('-',WIDTH+1) FOR J = SROW TO EROW PRINT @(SCOL,J):'|' JUST:'|' NEXT J PRINT @(SCOL,SROW-1):BORDER PRINT @(WHERE+SCOL,SROW):TITLE PRINT @(WHERE+SCOL,SROW+1):STR('_',LEN(TITLE)) PRINT @(SCOL,J):BORDER END ; * the first time through, they want the frame SROW = SROW + 2 DEPTH = EROW - SROW EQU DELETE.WORD TO " 'D'elete," SEL = 'T' DONE = 0 LOOP EMSG = '' OUTLIST = TRIM(OUTLIST,CHAR(253)) IF JUST.DISPLAY THEN SEL = 'T' DONE = 1 END ELSE IF OUTLIST = '' THEN UMSG = '' ELSE UMSG = DELETE.WORD IF UMSG = '' AND DELETE.FROM.LIST THEN UMSG = DELETE.WORD IF SEL = '' THEN PRINT PL:'Enter selection or':IMSG:UMSG:" 'T'op, 'F'orward, 'B'ack":XIT.MSG: INPUT SEL,3:_ END SEL = OCONV(SEL,'MCU') END BEGIN CASE CASE SEL[1,1] = 'F' OR SEL = '' IF LSEL < N THEN FSEL = LSEL + 1 LSEL = LSEL + DEPTH GOSUB 100 END ELSE EMSG = 'You are viewing the last page' CASE SEL[1,1] = 'E' DONE = 1 CASE NUM(SEL) IF INT(SEL) = SEL AND SEL > 0 AND SEL <= N THEN APOS = SEL GOSUB 200 LOCATE(SEL,OUTLIST,1;CVAL) THEN EMSG = 'Choice ':TRIM(SEL):' already included in list' END ELSE OUTLIST<1,CVAL> = SEL IF GIVE.POS THEN OUTLIST<2,CVAL> = APOS GOSUB 400 GOSUB 100 IF NOT(MULTI) THEN MULTI = APOS DONE = 1 END END END ELSE EMSG = TRIM(SEL):' is invalid' CASE SEL[1,1] = 'T' FSEL = 1 LSEL = DEPTH GOSUB 100 CASE SEL[1,1] = 'B' IF (LSEL - (DEPTH+1)) > 0 THEN FSEL = FSEL - DEPTH LSEL = LSEL - DEPTH GOSUB 100 END ELSE EMSG = 'You are viewing the first page' CASE SEL = 'I' AND INSERT.OK PRINT PL:'Enter item to insert or ': INPUT ADD.ITEM: IF ADD.ITEM # '' THEN GOSUB 300 IF DTYPE THEN LOCATE(ADD.ITEM,INLIST,TO.USE<1>,TO.USE<2>;APOS) ELSE GOSUB 500 END ELSE LOCATE(ADD.ITEM,INLIST;APOS) ELSE GOSUB 500 END END ; * else nothing was chosen CASE (SEL[1,1] = 'D' AND OUTLIST # '') OR (SEL[1,1] = 'D' AND DELETE.FROM.LIST) PRINT PL:'Enter choice to delete or ': INPUT SEL,3:_ IF NUM(SEL) AND SEL # '' THEN GOSUB 200 LOCATE(SEL,OUTLIST,1;DPOS) ELSE DPOS = 0 IF DPOS THEN OUTLIST = DELETE(OUTLIST,1,DPOS,0) IF GIVE.POS THEN OUTLIST = DELETE(OUTLIST,2,DPOS,0) END GOSUB 300 IF DTYPE THEN LOCATE(SEL,INLIST,TO.USE<1>,TO.USE<2>;APOS) THEN GOSUB 400 ELSE APOS = 0 END ELSE LOCATE(SEL,INLIST;APOS) THEN GOSUB 400 ELSE APOS = 0 END IF APOS AND DELETE.FROM.LIST THEN TO.USE = APOS INLIST = DELETE(INLIST,TO.USE<1>,TO.USE<2>,TO.USE<3>) N = N - 1 END IF DPOS OR DELETE.ANYWAY THEN GOSUB 100 ELSE EMSG = 'Choice ':TRIM(SEL):' is not included in list' END ELSE SEL = '' CASE 1 EMSG = TRIM(SEL):' is invalid' END CASE UNTIL DONE DO IF EMSG = '' THEN SEL = '' ELSE GOSUB 900 REPEAT RETURN 100 * print page CTR = 1 FOR I = FSEL TO LSEL IF I <= N THEN SEL = I GOSUB 200 LOCATE(SEL,OUTLIST,1;IPOS) THEN TAKEN = '*' ELSE TAKEN = '' SEL = '| ':(I+N.OFFSET) 'R#3 ':TAKEN 'L#2':SEL END ELSE SEL = '| ' PRINT @(SCOL,SROW+CTR):SEL JUST CTR = CTR + 1 NEXT I SEL = '' RETURN 200 * where is the choice? TO.USE = SEL SEL = INLIST,TO.USE<2>,TO.USE<3>> RETURN 300 * are we dealing with am/vm/svm? TO.USE = 1 TO.USE<3> = 0 IF DTYPE = 2 THEN TO.USE<2> = 1 ELSE TO.USE<2> = 0 RETURN 400 * determine current page SPOT = MOD(APOS,DEPTH) IF SPOT THEN FSEL = (APOS-SPOT)+1 LSEL = (FSEL+DEPTH)-1 END ELSE LSEL = APOS FSEL = (LSEL-DEPTH)+1 END RETURN 500 * insert new item TO.USE = APOS INLIST = INSERT(INLIST,TO.USE<1>,TO.USE<2>,TO.USE<3>,ADD.ITEM) N = N + 1 OUTLIST<1,-1> = ADD.ITEM GOSUB 400 GOSUB 100 IF NOT(MULTI) THEN MULTI = APOS DONE = 1 END RETURN 900 * error handling PRINT PL:EMSG:', please re-enter ': INPUT SEL,3:_ RETURN END