
Unit TUI;
Interface
Uses CRT;
Const Winsets = 1;
      WinComponents = 10;


Var
    Item     : array[1..23] of String[80];
    Print    : Boolean;

Function Menu( NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
               StartX,StartY:Byte) : Byte;
Procedure Wind(Y1,X1,Y2,X2,FGCol,BGCol : Integer);
Function WindMen(NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
               WinFG,WinBG,StartX,StartY:Byte) : Byte;
Procedure Shade (FG,BG : Byte;Ch : Char);
Procedure TXTFG(Clr : Byte);
Procedure TXTBG(Clr : Byte);
Procedure Locate(X,Y : Byte);
Procedure Prnt(Strng : String);
Procedure PrntLN(Strng : String);
function IntToStr(I: Longint): String;
implementation
Procedure TXTFG(Clr : Byte);
Begin
Repeat Until Print;
Print:=False;
TextColor(CLR);
Print:=True;
End;
Procedure TXTBG(Clr : Byte);
Begin
Repeat Until Print;
Print:=False;
TextBackGround(CLR);
Print:=True;
End;
Procedure Locate(X,Y : Byte);
Begin
Repeat Until Print; Print:=False;
GotoXY(X,Y);
Print:=True;
End;
Procedure Prnt(Strng : String);
Begin
Repeat Until Print; Print:=False;
Write(Strng);
Print:=True;
End;
Procedure PrntLN(Strng : String);
Begin
Repeat Until Print; Print:=False;
WriteLn(Strng);
Print:=True;
End;
function IntToStr(I: Longint): String;
{ Convert any integer type to a string }
var
 S: string[11];
begin
 Str(I, S);
 IntToStr := S;
end;

Function Menu( NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
               StartX,StartY:Byte) : Byte;
Var MenuStrings : Array[1..25] of String;
    NowX,NowY,LastX,LastY,SaveAttr,SaveX,SaveY : Byte;
    ItemNow,LastItem : Byte;
    InChar : Array[1..5] of Char;
    TmpStr : String;
    Count1,Count2,Count3,Count4  : Byte;
    Done   : Boolean;
    StartItem : Byte;

Begin
SaveX:=WhereX;
SaveY:=WhereY;
StartItem:=1;
SaveAttr:=TextAttr;
NowX:=StartX;
NowY:=StartY;
LastX:=NowX;
LastY:=NowY;
ItemNow:=StartItem;
LastItem:=StartItem;
TXTFG(NormalFG);
TXTBG(NormalBG);
For Count2:=1 to NumItems do begin
Locate(StartX,(Count2+StartY)-1);
If Print then      PRNT(Item[Count2]);
                               End;
Done:=False;
Repeat
 Locate(LastX,LastY);
 TXTFG(NormalFG);
 TXTBG(NormalBG);
 PRNT(Item[LastItem]);
 Locate(NowX,NowY);
 TXTFG(LightBarFG);
 TXTBG(LightBarBG);
 PRNT(Item[ItemNow]);
Repeat Until Keypressed;
{If NOT keypressed then begin Menu:=0; Done:=True; End;}
Inchar[1]:=ReadKey;
If Inchar[1]=#0 then begin Inchar[1]:=ReadKey;
LastX:=NowX;
LastY:=NowY;
LastItem:=ItemNow;
 Case InChar[1] of
                 'P' : Begin Inc(NowY); Inc(ItemNow) End;
                 'H' : Begin Dec(NowY); Dec(ItemNow) End;
                 'K' : Begin Dec(NowY); Dec(ItemNow) End;
                 'M' : Begin Inc(NowY); Inc(ItemNow) End;
                 'G' : Begin NowY:=StartY; ItemNow:=1 End;
                 'O' : Begin NowY:=StartY+(NumItems-1); ItemNow:=NumItems End;
 End;
If ItemNow>NumItems then begin ItemNow:=1; NowY:=StartY; End;
If ItemNow<1 then begin ItemNow:=NumItems; NowY:=NowY+NumItems; End;

                     End;
If Inchar[1]=#27 then begin Menu:=255; Done:=True; End;
If Inchar[1]=#13 then begin Menu:=ItemNow; Done:=True; End;

Until Done;
TextAttr:=SaveAttr;
 Locate(SaveX,SaveY);
End;

Procedure Wind(Y1,X1,Y2,X2,FGCol,BGCol : Integer);
Var
Count : Array [1..4] of Byte;
TmpVar : Array [1..10] of Integer;
 WinSet : Array [1..WinSets,1..WinComponents] of Char;

Begin
          Winset[1,01]:='Û'; {Top left}
          Winset[1,02]:='ß'; {Top}
          Winset[1,03]:='Û'; {Top right}
          Winset[1,04]:='Ý'; {Left side}
          Winset[1,05]:='Þ'; {Right side}
          Winset[1,06]:='Û'; {Bottom Left}
          Winset[1,07]:='Ü'; {Bottom}
          Winset[1,08]:='Û'; {Bottom Right}
          Winset[1,09]:='±'; {Shadow}
 TXTFG(FGCol);
 TXTBG(BGCol);
 Locate(X1,Y1);
 PRNT(WinSet[1,01]);
For Count[1]:=X1+1 to X2-2 do begin
                    PRNT(Winset[1,02]);
                   End;
 PRNT(WinSet[1,03]);
For Count[1]:=Y1+1 to Y2-1 do begin
       TXTFG(FGCol);
       TXTBG(BGCol);
       Locate(X1,Count[1]);
       PRNT(WinSet[1,04]);
       Locate(X2-1,Count[1]);
       PRNT(WinSet[1,05]);
      If FGCol > 7 then  TXTFG(FgCol-8)
                        Else  TXTFG(8);
       TXTBG(0);
       PRNT(Winset[1,09]);
      End;
       Locate(X1,Y2);
       TXTFG(FGCol);
       TXTBG(BGCol);
                   For Count[1]:=X1 to X2-2 do begin
                   If count[1]<>X1 then  PRNT(Winset[1,07])
                   else  PRNT(Winset[1,06]);;
                   End;
                   PRNT(WinSet[1,08]);
      If FGCol > 7 then  TXTFG(FgCol-8) Else  TXTFG(8);
       TXTBG(0);
       PRNT(Winset[1,09]);
       Locate(X1+1,Y2+1);
       For Count[1]:=X1+1 to X2 do begin
        PRNT(Winset[1,09]);
       End;

End;

Function WindMen(NumItems, LightBarFG,LightBarBG,NormalFG,NormalBG,
               WinFG,WinBG,StartX,StartY:Byte) : Byte;
Var SaveX,SaveY,SaveAttr,Selec : Byte;
Begin
SaveX:=WhereX;
SaveY:=WhereY;
SaveAttr:=TextAttr;
Wind(StartY-1,StartX-1,(StartY)+NumItems,StartX+Length(Item[1])+1,WinFG,WinBG)
;Selec:=Menu(NumItems,LightbarFG,LightbarBG,NormalFG,NormalBG,StartX,StartY);
Locate(SaveX,SaveY);
TextAttr:=SaveAttr;
WindMen:=Selec;
End;

Procedure Shade (FG,BG : Byte;Ch : Char);
Var CNT : Integer;
Begin
 TXTFG(FG);
 TXTBG(BG);
 For CNT:=0 to 4000 do begin
 If Odd(Cnt) then Mem[$B800:Cnt]:=TextAttr
             else
                 Mem[$B800:Cnt]:=Ord(Ch);
             end;
End;

Begin
Print:=True;
End.
