home *** CD-ROM | disk | FTP | other *** search
-
-
-
- (* NOTE : TO USE THIS MENU PROCEDURE THE FOLLOWING FILES
-
- MUST APPEAR IN ORDER AT THE TOP OF THE MAIN PROGRAM
-
- {$I RVSONOFF.PAS}
- {$I REP_CHAR.PAS}
- {$I CENTER.PAS}
- {$I MENU.PAS} *)
-
- {****************************************************************************}
- TYPE {* JUST A COUPLE OF TYPE DECLARATIONS*}
- MENU_ITEM = STRING[40]; {* NEEDED FOR A NUMBER OF ROUTINES *}
- {*************************************}
-
- MENU_SELECTIONS = ARRAY[1..15] OF MENU_ITEM;
- HL_SELECTIONS = ARRAY[1..15] OF CHAR;
-
- CURS_COND = (ON,OFF);
-
- {18**************************************************************************}
- PROCEDURE FRAME( {* FRAME THE SECTION OF SCREEN WITHIN *}
- UPPERLEFTX, {* THESE BOUNDS *}
- UPPERLEFTY, {**************************************}
- LOWERRIGHTX,
- LOWERRIGHTY: INTEGER);
- VAR
- I: INTEGER;
-
- BEGIN
- GOTOXY(UPPERLEFTX,UPPERLEFTY);
- WRITE(CHR(201));
- GOTOXY(UPPERLEFTX,LOWERRIGHTY);
- WRITE(CHR(200));
- GOTOXY(LOWERRIGHTX,UPPERLEFTY);
- WRITE(CHR(187));
- GOTOXY(LOWERRIGHTX,LOWERRIGHTY);
- WRITE(CHR(188));
- FOR I := UPPERLEFTX + 1 TO LOWERRIGHTX - 1 DO
- BEGIN
- GOTOXY(I,UPPERLEFTY);
- WRITE(CHR(205));
- GOTOXY(I,LOWERRIGHTY);
- WRITE(CHR(205));
- END;
- FOR I := UPPERLEFTY + 1 TO LOWERRIGHTY - 1 DO
- BEGIN
- GOTOXY(UPPERLEFTX,I);
- WRITE(CHR(186));
- GOTOXY(LOWERRIGHTX,I);
- WRITE(CHR(186));
- END;
- END; { FRAME }
-
- {22**************************************************************************}
- PROCEDURE WINDOW_FRAME(X1,Y1, {* CREATE, FRAME AND TITLE A *}
- X2,Y2, {* WINDOW *}
- COLOR : INTEGER; {**********************************}
- TITLE : MENU_ITEM);
-
- VAR
- CENTER : INTEGER;
-
- BEGIN
- WINDOW(1,1,80,25);
-
- TEXTCOLOR(WHITE);
- FRAME(X1 - 1, Y1 - 1,
- X2 + 1, Y2 + 1);
- CENTER := ((X2 - X1) DIV 2) + X1;
- IF ODD(CENTER) AND FALSE THEN
- GOTOXY(CENTER - (LENGTH(TITLE) DIV 2),Y1-1)
- ELSE
- GOTOXY(CENTER - ((LENGTH(TITLE) DIV 2) - 1),Y1-1);
- IF COLOR = 0 THEN
- BEGIN
- TEXTCOLOR(WHITE);
- TEXTBACKGROUND(RED);
- END
- ELSE RVSON;
- WRITE(TITLE);
- RVSOFF;
- WINDOW(X1,Y1,X2,Y2);
- CLRSCR;
- END;
-
- {************************************************************************}
- PROCEDURE CURSOR (STATE : CURS_COND);
-
- TYPE
- BIOSPARAMTYPE = RECORD
- AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAGS : INTEGER;
- END;
- VAR
- BIOSPARAM : BIOSPARAMTYPE;
-
- BEGIN
- WITH BIOSPARAM DO BEGIN
- AX := 1 SHL 8 + 0; {LOAD AH WITH REQUEST TO SET CURSOR LINES}
- CASE STATE OF
- ON : CX := 6 SHL 8 + 7; { SET DEFAULT CURSOR TYPE }
- OFF : CX := 32 SHL 8 + 0; { SET CURSOR OFF }
- END;
- END;
- INTR($10,BIOSPARAM); {CALL VIDEO INTERUPT}
- END;
-
- {****************************************************************************}
- FUNCTION MENU ( {* DISPLAYS A MENU *}
- {* *}
- ITEM_LIST : MENU_SELECTIONS; {* LIST OF OPTIONS ON MENU *}
- {* LAST ITEM MUST BE NULL *}
- {* STRING FOR PROPER OPERATION*}
- {* MAX 20 ITEMS PER MENU *}
- {* *}
- HL_CHAR : HL_SELECTIONS; {* HIGHLIGHTED LETTER *}
- {* OF OPTION *}
- {* *}
- MENU_TITLE : MENU_ITEM; {* TITLE OF MENU *}
- {* *}
- {* IF X=0 AND Y=0 THEN : *}
- {* -- MENU CENTERED -- *}
- MENU_X : INTEGER; {* IF (78-MAX.OPTION LENGTH) *}
- {* => X => 2 AND *}
- MENU_Y : INTEGER; {* IF (24-MAX. NUM. OPTIONS) *}
- {* => Y => 2 THEN: *}
- {* X AND Y DEFINE UPPER *}
- {* LEFT CORNER OF MENU *}
- {* *}
- COLOR : INTEGER; {* 0 = COLOR 1 = MONO *}
- {* *}
- DEFAULT : INTEGER {* DEFAULT OPTION SELECTION *}
- {* *}
- ) : INTEGER; {* RETURNS THE INDEX OF THE *}
- {* ITEM SELECTED BY THE USER *}
- {* *}
- {****************************************************************************}
-
- TYPE
- HI_LITE_CHAR = SET OF #48..#122;
- SPECIAL_KEYS = SET OF #59..#68;
- ITEM_KEY = STRING[3];
- STUFFINHEAP = ^PUTINHEAP; {POINTER TO SCREEN IN HEAP}
- PUTINHEAP = RECORD
- SCREENIMAGE : ARRAY[1..4096] OF CHAR;
- END;
-
- VAR
- HLCHARS : HI_LITE_CHAR;
- FKYS : SPECIAL_KEYS;
- INCHAR : CHAR;
- DONE,
- FIRST_MENU,
- FUNCKEY : BOOLEAN;
- MENU_POINTER,
- MENU_LEN,
- MENU_LENGTH : 1..20;
- FILL_CHAR : STRING[80];
- LEGEND : STRING[80];
- SEC_KEY : ARRAY[1..10] OF CHAR;
- HL_CHAR_POS : ARRAY[1..20] OF INTEGER;
- FKEY : ARRAY[1..10] OF ITEM_KEY;
- COLORPAGE : ARRAY[1..4096] OF CHAR ABSOLUTE $B800:0000;
- SCREEN : ARRAY[0..0] OF STUFFINHEAP;
- X,Y,
- LAST,
- M_X,M_Y,
- MAX_TITLE_LENGTH : INTEGER;
-
- BEGIN {MENU}
-
- FUNCKEY := FALSE;
- MENU_POINTER := 1;
- MAX_TITLE_LENGTH := 0;
-
- NEW(SCREEN[0]); { ALLOCATE SCREEN IN HEAPSPACE }
- MOVE(COLORPAGE,SCREEN[0]^.SCREENIMAGE,4096); { STORE CURRENT SCREEN }
-
- CURSOR(OFF); { IF MENU CENTERED DISPLAY INSTRUCTIONS }
- IF ((MENU_X = 0) AND (MENU_Y = 0)) THEN
- BEGIN
- GOTOXY(1,25);
- TEXTCOLOR(LIGHTGRAY);
- IF COLOR = 0 THEN TEXTBACKGROUND(BLUE)
- ELSE RVSON;
- WRITE(' ',#24,'-',#25,'-move bar. Select by pressing a highlighted letter,'
- ,' a function key, or ',#17,#196,#217,' ');
- IF COLOR = 0 THEN TEXTCOLOR(WHITE);
- GOTOXY(37,25);
- WRITE('highlighted');
- GOTOXY(59,25);
- WRITE('function key');
- TEXTCOLOR(BLACK);
- TEXTBACKGROUND(LIGHTGRAY);
- GOTOXY(2,25);
- WRITE(#24);
- GOTOXY(4,25);
- WRITE(#25);
- GOTOXY(76,25);
- WRITE(#17,#196,#217);
- NORMVIDEO;
- END;
- { CALCULATE MAX_TITLE_LENGTH }
- REPEAT { AND MENU_LENGTH }
- MENU_LENGTH := MENU_POINTER;
- IF MAX_TITLE_LENGTH < LENGTH(ITEM_LIST[MENU_POINTER]) THEN
- MAX_TITLE_LENGTH := LENGTH(ITEM_LIST[MENU_POINTER]);
- MENU_POINTER := MENU_POINTER + 1;
- UNTIL (MENU_POINTER =20) OR (LENGTH(ITEM_LIST[MENU_POINTER]) = 0);
-
- IF MAX_TITLE_LENGTH < 9 THEN
- MAX_TITLE_LENGTH := 17
- ELSE
- MAX_TITLE_LENGTH := MAX_TITLE_LENGTH + 8 ;
-
- MENU_LENGTH := MENU_POINTER - 1 ;
-
- IF MENU_LENGTH <= 10 THEN MENU_LEN := MENU_LENGTH
- ELSE MENU_LEN := 12;
-
- { CALCULATE AND FRAME WINDOW }
- IF (ODD(MAX_TITLE_LENGTH)) AND FALSE THEN
- M_X := ((80 - MAX_TITLE_LENGTH) DIV 2)
- ELSE
- M_X := ((80 - MAX_TITLE_LENGTH) DIV 2) + 1 ;
- IF (ODD(MENU_LEN)) AND FALSE THEN
- M_Y := ((25 - MENU_LEN) DIV 2) - 1
- ELSE
- M_Y := (25 - MENU_LEN) DIV 2;
-
- MENU_TITLE := COPY(MENU_TITLE,1,MAX_TITLE_LENGTH); { TRUNCATE TITLE THAT }
- { EXCEEDS ALLOWED WIDTH }
- IF ((MENU_X = 0) AND (MENU_Y = 0)) THEN
- WINDOW_FRAME
- (M_X,M_Y,(M_X + MAX_TITLE_LENGTH),(M_Y + MENU_LEN),COLOR,MENU_TITLE)
- ELSE
- BEGIN
- IF MENU_X < 2 THEN MENU_X := 2 ;
- IF MENU_X > (78-MAX_TITLE_LENGTH) THEN MENU_X := (78-MAX_TITLE_LENGTH);
- IF MENU_Y < 2 THEN MENU_Y := 2 ;
- IF MENU_Y > (24-MENU_LENGTH) THEN MENU_Y := (24-MENU_LENGTH);
- WINDOW_FRAME (MENU_X,MENU_Y,MENU_X + MAX_TITLE_LENGTH,
- MENU_Y + MENU_LEN,COLOR,MENU_TITLE);
- END;
-
-
- INCHAR := ' '; {INITIALIZE VARIABLES}
- MENU_POINTER := 1;
- HLCHARS := [];
- FKYS := [];
- DONE := FALSE;
- FIRST_MENU := TRUE;
-
- FKEY[1] := 'F1';
- FKEY[2] := 'F2';
- FKEY[3] := 'F3';
- FKEY[4] := 'F4';
- FKEY[5] := 'F5';
- FKEY[6] := 'F6';
- FKEY[7] := 'F7';
- FKEY[8] := 'F8';
- FKEY[9] := 'F9';
- FKEY[10] := 'F10';
-
- SEC_KEY[1] := #59;
- SEC_KEY[2] := #60;
- SEC_KEY[3] := #61;
- SEC_KEY[4] := #62;
- SEC_KEY[5] := #63;
- SEC_KEY[6] := #64;
- SEC_KEY[7] := #65;
- SEC_KEY[8] := #66;
- SEC_KEY[9] := #67;
- SEC_KEY[10] := #68;
-
-
-
- {///////////////////////////// BEGIN MAIN LOOP ///////////////////////////////}
-
- REPEAT
-
- IF FIRST_MENU THEN
- BEGIN
- X := 1 ;
- Y := 10
- END
- ELSE
- BEGIN
- X := 11 ;
- Y := 20 ;
- END;
- {DISPLAY THE ACTUAL MENU SELECTIONS}
-
- WHILE ((MENU_POINTER >= X) AND (MENU_POINTER <= Y)
- AND (MENU_POINTER <= MENU_LENGTH)
- AND (NOT DONE)) DO
-
- BEGIN
- IF MENU_POINTER > 10 THEN GOTOXY(2,(MENU_POINTER - 9))
- ELSE GOTOXY( 2, MENU_POINTER + 1 );
- TEXTCOLOR(BLACK);
- TEXTBACKGROUND(LIGHTGRAY);
- IF MENU_POINTER <= 10 THEN
- WRITE(FKEY[MENU_POINTER])
- ELSE
- WRITE(FKEY[MENU_POINTER - 10]);
-
- IF ((MENU_POINTER <= 10) AND (MENU_POINTER <= MENU_LENGTH )) THEN
- FKYS := FKYS + [SEC_KEY[MENU_POINTER]];
- IF ((MENU_POINTER > 10) AND (MENU_POINTER <= MENU_LENGTH )) THEN
- FKYS := FKYS + [SEC_KEY[MENU_POINTER - 10 ]];
-
- HLCHARS := HLCHARS + [HL_CHAR[MENU_POINTER]]
- + [CHR(ORD(HL_CHAR[MENU_POINTER]) + 32)];
-
- TEXTCOLOR(CYAN);
- TEXTBACKGROUND(BLACK);
- IF MENU_POINTER > 10 THEN GOTOXY(7,(MENU_POINTER - 9))
- ELSE GOTOXY( 7 , MENU_POINTER + 1 );
- WRITE(ITEM_LIST[MENU_POINTER]);
- TEXTCOLOR(LIGHTCYAN);
- HL_CHAR_POS[MENU_POINTER] :=
- POS(HL_CHAR[MENU_POINTER],ITEM_LIST[MENU_POINTER]);
- IF MENU_POINTER > 10 THEN
- GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER - 9 )
- ELSE GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER + 1 );
- WRITE(HL_CHAR[MENU_POINTER]);
- MENU_POINTER := MENU_POINTER + 1;
- END; {WHILE}
-
- {IF MORE THAN 10 OPTIONS}
- IF MENU_LENGTH >10 THEN { PRINT NOTICE OF "MORE"}
- BEGIN
- LEGEND := CENTER(MAX_TITLE_LENGTH - 1,'more spacebar');
- RVSON;
- GOTOXY(2,13);
- WRITE(LEGEND);
- GOTOXY((POS('e',LEGEND) + 2 ),13);
- WRITE(#196,#16);
- RVSOFF;
- END;
-
-
- IF NOT DONE THEN
- BEGIN
- IF ((DEFAULT < 1) OR (DEFAULT > MENU_LENGTH)) THEN DEFAULT := 1;
- MENU_POINTER := DEFAULT;
- END;
- IF ((NOT FIRST_MENU) AND (NOT DONE)) THEN MENU_POINTER := MENU_LENGTH ;
- DONE := TRUE;
- FUNCKEY := FALSE;
-
- IF COLOR = 0 THEN { HIGHLIGHT THE }
- BEGIN { CURRENT MENU ITEM }
- TEXTBACKGROUND(BLUE);
- TEXTCOLOR(LIGHTGRAY);
- END
- ELSE RVSON;
- IF MENU_POINTER > 10 THEN
- FKEY[MENU_POINTER] := FKEY[MENU_POINTER - 10];
- IF LENGTH(FKEY[MENU_POINTER]) <= 2 THEN
- BEGIN
- IF MENU_POINTER > 10 THEN
- GOTOXY( 4 ,MENU_POINTER - 9 )
- ELSE GOTOXY( 4 ,MENU_POINTER + 1 );
- WRITE(' ');
- END
- ELSE
- BEGIN
- IF MENU_POINTER > 10 THEN
- GOTOXY( 5 ,MENU_POINTER - 9 )
- ELSE GOTOXY( 5 ,MENU_POINTER + 1 );
- WRITE(' ');
- END;
- WRITE(ITEM_LIST[MENU_POINTER]);
- FILL_CHAR := REPLICATE(((MAX_TITLE_LENGTH + 1 ) - WHEREX),' ');
- WRITE(FILL_CHAR);
- IF COLOR = 1 THEN TEXTBACKGROUND(BLACK);
- TEXTCOLOR(WHITE);
- IF MENU_POINTER > 10 THEN
- GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER - 9 )
- ELSE GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER + 1 );
- WRITE(HL_CHAR[MENU_POINTER]);
-
- READ(KBD,INCHAR); {GET A CHARACTER FROM THE USER}
-
- LAST := MENU_POINTER;
-
- IF (INCHAR = ^[) AND KEYPRESSED THEN {IF FUNCTION KEY PRESSED }
- BEGIN {GET THE SECOND CHARACTER}
- FUNCKEY := TRUE;
- READ(KBD, INCHAR);
- END;
-
- IF INCHAR = 'H' THEN {UP ARROW PRESSED}
- BEGIN
- MENU_POINTER := MENU_POINTER - 1;
- IF ((MENU_POINTER < 1) AND (FIRST_MENU)
- AND (MENU_LENGTH <= 10)) THEN MENU_POINTER := MENU_LENGTH;
- IF ((MENU_POINTER < 1) AND (FIRST_MENU)
- AND (MENU_LENGTH > 10)) THEN MENU_POINTER := 10;
- IF ((MENU_POINTER = 10) AND (NOT FIRST_MENU)
- AND (MENU_LENGTH > 10 )) THEN MENU_POINTER := MENU_LENGTH;
- END; {IF}
-
- IF INCHAR = 'P' THEN {DOWN ARROW PRESSED}
- BEGIN
- MENU_POINTER := MENU_POINTER + 1;
- IF ((MENU_POINTER > 10) AND (FIRST_MENU))
- THEN MENU_POINTER := 1;
- IF ((MENU_POINTER > MENU_LENGTH) AND (FIRST_MENU))
- THEN MENU_POINTER := 1;
- IF ((MENU_POINTER > 20) AND (NOT FIRST_MENU))
- THEN MENU_POINTER := 11;
- IF ((MENU_POINTER > MENU_LENGTH) AND (NOT FIRST_MENU))
- THEN MENU_POINTER := 11;
- END; {IF}
-
-
- IF COLOR = 0 THEN {UNHIGHLIGHT THE OLD SELECTION}
- BEGIN
- TEXTBACKGROUND(BLACK);
- TEXTCOLOR(CYAN);
- END
- ELSE RVSOFF;
- IF LENGTH(FKEY[LAST]) <= 2 THEN
- BEGIN
- IF MENU_POINTER > 10 THEN
- GOTOXY( 4 ,LAST - 9 )
- ELSE GOTOXY( 4 ,LAST + 1 );
- WRITE(' ');
- END
- ELSE
- BEGIN
- IF MENU_POINTER > 10 THEN
- GOTOXY( 5 ,LAST - 9 )
- ELSE GOTOXY( 5 ,LAST + 1 );
- WRITE(' ');
- END;
- WRITE(ITEM_LIST[LAST]);
- FILL_CHAR := REPLICATE(((MAX_TITLE_LENGTH + 1 ) - WHEREX),' ');
- WRITE(FILL_CHAR);
- TEXTCOLOR(LIGHTCYAN);
- IF MENU_POINTER > 10 THEN
- GOTOXY( 6 + HL_CHAR_POS[LAST],LAST - 9 )
- ELSE GOTOXY( 6 + HL_CHAR_POS[LAST],LAST + 1 );
- WRITE(HL_CHAR[LAST]);
-
- IF ((INCHAR = #32) AND (MENU_LENGTH > 10) {SPACEBAR PRESSED }
- AND (MENU_POINTER <= 10)) THEN {GO TO SECOND MENU}
- BEGIN
- MENU_POINTER := 11;
- FIRST_MENU := FALSE;
- DONE := FALSE;
- FKYS := [];
- HLCHARS := [];
- INCHAR := '0';
- CLRSCR;
- END;
-
- IF ((INCHAR = #32) AND (MENU_LENGTH > 10) {SPACEBAR PRESSED}
- AND (MENU_POINTER >= 11)) THEN {GO TO FIRST MENU}
- BEGIN
- MENU_POINTER := 1;
- FIRST_MENU := TRUE;
- DONE := FALSE;
- FKYS := [];
- HLCHARS := [];
- CLRSCR;
- END;
-
- MENU := MENU_POINTER;
-
- UNTIL ((INCHAR = #13)
- OR ((NOT FUNCKEY) AND (INCHAR IN HLCHARS))
- OR ((FUNCKEY) AND (INCHAR IN FKYS)));
-
- {////////////////////////////// END MAIN LOOP ////////////////////////////////}
-
-
- MENU_POINTER := 1;
-
- WHILE (MENU_POINTER <= MENU_LENGTH) AND (MENU_POINTER <= 10)
- AND ((NOT FUNCKEY)
- AND FIRST_MENU
- AND (INCHAR <> HL_CHAR[MENU_POINTER])
- AND (INCHAR <> (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
- DO MENU_POINTER := MENU_POINTER + 1;
-
- IF ((INCHAR = HL_CHAR[MENU_POINTER]) OR
- (INCHAR = (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
- THEN MENU := MENU_POINTER;
-
- MENU_POINTER := 11;
-
- WHILE (MENU_POINTER <= MENU_LENGTH) AND (MENU_POINTER > 10)
- AND ((NOT FUNCKEY)
- AND (NOT FIRST_MENU)
- AND (INCHAR <> HL_CHAR[MENU_POINTER])
- AND (INCHAR <> (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
- DO MENU_POINTER := MENU_POINTER + 1;
-
- IF ((INCHAR = HL_CHAR[MENU_POINTER]) OR
- (INCHAR = (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
- THEN MENU := MENU_POINTER;
-
- MENU_POINTER := 1;
-
- WHILE (MENU_POINTER <= MENU_LENGTH) AND ( FUNCKEY
- AND (INCHAR <> SEC_KEY[MENU_POINTER])) DO
- MENU_POINTER := MENU_POINTER + 1;
-
- IF ((INCHAR = SEC_KEY[MENU_POINTER]) AND FIRST_MENU)
- THEN MENU := MENU_POINTER;
- IF ((INCHAR = SEC_KEY[MENU_POINTER]) AND NOT FIRST_MENU)
- THEN MENU := MENU_POINTER + 10;
-
- MOVE(SCREEN[0]^.SCREENIMAGE,COLORPAGE,4096); {RESTORE ORIGINAL SCREEN}
-
- WINDOW(1,1,80,25); {RESET FULL SCREEN AS WINDOW}
-
- RVSOFF;
- CURSOR(ON);
-
- END; {MENU}
-
-
-