@TITLE GRAT04
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MENU LIBRARY
@BOX 2.0
PROCEDURES:
   SET UP MENU [GRAT04.1]
   FIND MENU ITEM [GRAT04.2]
   DELETE MENU [GRAT04.3]
@BOX 3.0
END
@BOX 1.1
**TLSEG 0 %0 %600000 -1 0
**TLSEG 1 %0 %F80000 -3 0
**TLSEG 2 %0 %FA0000 -3 0
*TLLOAD 1 2;
*TLLOAD 2 3;
*INFORM %2400;
MODULE(SET.UP.MENU,FIND.MENU.ITEM,DELETE.MENU);
$LI X=%7FF0, Y=%7FF1, X0=%7FF2, Y0=%7FF3,
    XS=%7FF4, YS=%7FF5, FUNC=%7FF8, STATUS=%7FF9,
    COLB=%7FFA, COLP=%7FFB;
$LI BACKGROUND=%20,C.ITEM=%6000,YMA=%6001,YMB=%6002,
    XMA=%6003,XMB=%6004,SMX=%6005,MENU.ST=%6006,LINES=%6007,
    MENX=%6008,MENY=%6009,MENZ=%600A,MENCOPY=%600B,HIGHLIGHT=%200;
*GLOBAL 2;
$LO16[%8000] GRAMPTR;
*GLOBAL 3;
$LO16[1920] CHSTR;
*GLOBAL 0;
@BOX 2.1
LSPEC SET.UP.MENU($AD[$LO8],$IN,$IN);
LSPEC FIND.MENU.ITEM()/$IN;
LSPEC DELETE.MENU();
#GRAT04.1
#GRAT04.2
#GRAT04.3
@BOX 3.1
*END
@END
@TITLE GRAT04.1
@COL 1S-2R-3R-4T-5R-6R-7F
@FLOW 1-2-3-4Y-5-6-7
@FLOW 4N-3
@BOX 1.0
SET UP MENU (MENU, Y, X)
@BOX 2.0
FORM INDEX INTO CHAR STORE
OF START OF MENU AREA
@BOX 3.0
COPY LINE FROM MENU STRING
INTO CHAR STORE AND COPY AREA
CLEAR REST OF LINE
INCREMENT LINE INDEX
@BOX 4.0
END OF STRING?
@BOX 5.0
FORM MENU BOUNDARY VALUES
IN TABLET UNITS
@BOX 6.0
SET NO ITEM HIGHLIGHTED
@BOX 7.0
END
@BOX 1.1
PROC SET.UP.MENU(MENU,YC,XC);
$IN I,J,K,M;
@BOX 2.1
XC => GRAMPTR[MENX] + 1 * 80 => M;
YC => GRAMPTR[MENY];
SIZE(MENU) => GRAMPTR[MENZ=>K];
XC*80+YC-1=>I=>GRAMPTR[MENU.ST];
-1=>J;0=>GRAMPTR[LINES];
@BOX 3.1
WHILE MENU^[1+>J]=>GRAMPTR[1+>K] /= '$L DO
   MENU^[J] ! %2000 => CHSTR[1+>I];
OD
WHILE 1+>I < M DO
   BACKGROUND => CHSTR[I];
OD
80 +> M;
YC - 1 +> I;
1 +> GRAMPTR[LINES];
@BOX 4.1
IF J+1 < GRAMPTR[MENZ]
@BOX 5.1
YC*9->>1<<-GRAMPTR[YS]+GRAMPTR[Y0]=>GRAMPTR[YMA];
XC*11<<-GRAMPTR[XS]+GRAMPTR[X0]=>GRAMPTR[XMA];
80*9->>1<<-GRAMPTR[YS]+GRAMPTR[Y0]=>GRAMPTR[YMB];
XC+GRAMPTR[LINES]*11<<-GRAMPTR[XS]+GRAMPTR[X0]=>GRAMPTR[XMB];
11<<-GRAMPTR[XS]=>GRAMPTR[SMX];
@BOX 6.1
-1 => GRAMPTR[C.ITEM];
@BOX 7.1
END
@END
@TITLE GRAT04.2
@COL 1S-2R-10R-5T-6T-3T-4R-7R-8R-11R-12R-9F
@FLOW 1-2-10-5Y-6Y-3Y-4-7-8-11-12-9
@FLOW 3N-7
@FLOW 5N-10
@FLOW 6N-10
@BOX 1.0
FIND MENU ITEM ()LINE NO.
@BOX 2.0
RESET CURSOR VALUES
DISPLAY MENU
@BOX 3.0
ANY ITEM CURRENTLY HIGHLIGHTED?
@BOX 4.0
REMOVE HIGHLIGHTING
@BOX 5.0
IS PEN IN THE MENU AREA HORIZONTALLY?
@BOX 6.0
IS PEN IN MENU AREA VERTICALLY?
@BOX 7.0
FORM LINE NO. WITHIN MENU
AND STORE AS RESULT
@BOX 8.0
HIGHLIGHT SELECTED ITEM
NOTE POSN OF SELECTED ITEM
@BOX 9.0
END
@BOX 10.0
START CURSOR WITH NO PAINTING AND
WAIT UNTIL PEN IS DEPRESSED
@BOX 11.0
START PEN WAIT UNTIL IT IS RAISED THEN
WAIT ANOTHER SECOND
@BOX 12.0
REMOVE MENU
@BOX 1.1
PROC FIND.MENU.ITEM;
$IN PX,PY,I,J,K,L,CH;
@BOX 2.1
0 => GRAMPTR[X] => GRAMPTR[Y];
MENCOPY -1 => K;
GRAMPTR[MENX]*80 => I;
FOR GRAMPTR[LINES] DO
   GRAMPTR[MENY] -1 => J;
   IF I+J = GRAMPTR[C.ITEM] THEN
      HIGHLIGHT => L;
   ELSE
      0 => L;
   FI
   WHILE GRAMPTR[1+>K]&%FF=>CH /= '$L DO
      CH ! %2000 ! L => CHSTR[1+>J+I];
   OD
   WHILE J < 79 DO
      BACKGROUND ! L => CHSTR[1+>J+I];
   OD
80 +> I;
OD
@BOX 3.1
IF GRAMPTR[C.ITEM] => J < 0
@BOX 4.1
80 - GRAMPTR[MENY] => I;
FOR I DO
   HIGHLIGHT -=> CHSTR[1+>J];
OD
@BOX 5.1
IF GRAMPTR[Y] => PY < GRAMPTR[YMA] OR
   PY > GRAMPTR[YMB]
@BOX 6.1
IF GRAMPTR[X] => PX < GRAMPTR[XMA] OR
   PX > GRAMPTR[XMB]
@BOX 7.1
PX - GRAMPTR[XMA]/GRAMPTR[SMX] => FIND.MENU.ITEM;
@BOX 8.1
PX/GRAMPTR[SMX]*80 +GRAMPTR[MENY] -1
   => GRAMPTR[C.ITEM] => J;
80 - GRAMPTR[MENY] => I;
FOR I DO
   HIGHLIGHT !> CHSTR[1+>J];
OD
@BOX 9.1
END
@BOX 10.1
GRAMPTR[STATUS] & 2 ! 1 => GRAMPTR[STATUS];
WHILE GRAMPTR[STATUS] & %8000 = 0 DO OD
@BOX 11.1
BACK:
%7FFF &> GRAMPTR[STATUS];
IF GRAMPTR[FUNC] /= 0,->BACK;
WAIT(-1,1);
@BOX 12.1
DELETE.MENU();
@END
@TITLE GRAT04.3
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DELETE MENU
@BOX 2.0
PICK UP INDEX INTO CHAR STORE
AND NO OF LINES IN MENU
WRITE BACKGROUND TO MENU AREA
@BOX 3.0
END
@BOX 1.1
PROC DELETE.MENU;
$IN I,J,K;
@BOX 2.1
GRAMPTR[MENX] * 80 => I;
GRAMPTR[LINES] => J;
FOR J DO
   GRAMPTR[MENY] -1 => K;
   WHILE 1+>K < 80 DO
      BACKGROUND => CHSTR[I+K];
   OD
   80 +> I;
OD
@BOX 3.1
END
@END
