(* Release 3.10 *) (*-------------------------------------------------------------------------* * * * MENULIB.MOD - COMMS Toolkit menu support * * * * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. * * All Rights Reserved * * * *--------------------------------------------------------------------------*) IMPLEMENTATION MODULE MenuLib; IMPORT IO,Lib,Window; FROM Window IMPORT Color; CONST MenuFrame = Window.FrameStr('Õ͸³³Ô;'); MenuTemplate = Window.WinDef(0,0,0,0,White,Black,FALSE,FALSE,FALSE,TRUE,MenuFrame,LightGray,Black); TYPE switch = (on,off); FuncKeys = (NotRecognised,Escape,Cup,Cdown,Cleft,Cright,PageUp,PageDown,FKey1,AltKey); VAR gotcha : BOOLEAN; FuncKeyTyped : FuncKeys; (*......................................*) PROCEDURE SetColor(NewColor:SHORTCARD); BEGIN Window.TextColor(VAL(Window.Color,NewColor MOD 16)); Window.TextBackground(VAL(Window.Color,NewColor DIV 16)); END SetColor; (*.............................................*) PROCEDURE Read(VAR c:CHAR); BEGIN FuncKeyTyped := NotRecognised; c := IO.RdKey(); IF (c=CHR(27)) OR (c=0C) THEN IF c=0C THEN c := IO.RdKey(); CASE ORD(c) OF 72 : FuncKeyTyped:=Cup; | 80 : FuncKeyTyped:=Cdown; | 75 : FuncKeyTyped:=Cleft; | 77 : FuncKeyTyped:=Cright; | 73 : FuncKeyTyped:=PageUp; | 81 : FuncKeyTyped:=PageDown;| 59 : FuncKeyTyped:=FKey1; | ELSE FuncKeyTyped := AltKey; END ELSE FuncKeyTyped := Escape END; END; END Read; (*........................................*) PROCEDURE DeAltify(VAR Ch:CHAR); VAR c : CARDINAL; Numrow,Qrow,Arow, Zrow : ARRAY[0..11] OF CHAR; BEGIN Numrow:='1234567890-='; Qrow:='QWERTYUIOP'; Arow:='ASDFGHJKL'; Zrow:='ZXCVBNM'; IF FuncKeyTyped=AltKey THEN c := ORD(Ch); IF (c>=120) AND (c<=131) THEN Ch := Numrow[c-120] ELSIF (c>=16) AND (c<=25) THEN Ch := Qrow[c-16] ELSIF (c>=30) AND (c<=38) THEN Ch := Arow[c-30] ELSIF (c>=44) AND (c<=50) THEN Ch := Zrow[c-44] END; FuncKeyTyped := NotRecognised; ELSE Ch := CAP(Ch) END; END DeAltify; (*..................................................*) PROCEDURE InitMenu(VAR menu:MenuRec;menutitle:ARRAY OF CHAR;MenuX,MenuY,menuwidth:CARDINAL); VAR i,Lnth : CARDINAL; BEGIN menu.MenuX:=MenuX; menu.MenuY:=MenuY; WITH menu DO Lnth := Lib.ScanR(ADR(menutitle),HIGH(menutitle)+1,0C); IF Lnth>menuwidth THEN Lnth:=menuwidth; END; Lib.Move(ADR(menutitle),ADR(Title),Lnth+1); Width:=menuwidth; Normal := SHORTCARD(MenuColors.NormFore)+SHORTCARD(MenuColors.NormBack)*16; Selected := SHORTCARD(MenuColors.SelFore)+SHORTCARD(MenuColors.SelBack)*16; Highlite := SHORTCARD(MenuColors.HighFore)+SHORTCARD(MenuColors.HighBack)*16; SHighlite := SHORTCARD(MenuColors.HSelFore)+SHORTCARD(MenuColors.HSelBack)*16; EscapeOK := FALSE; ExitOnChar := FALSE; HelpOK := FALSE; PageKeysOK := FALSE; ExitSideWays := FALSE; IF Width>30 THEN Width:=30; END; Selection:=0; NumUsed:=0; winptr:=NIL; END; END InitMenu; (*......................................*) PROCEDURE AddOption(VAR menu:MenuRec; menutext:ARRAY OF CHAR); VAR curlen : CARDINAL; BEGIN WITH menu DO IF NumUsed<=MaxOption THEN WITH Option[NumUsed] DO curlen := Lib.ScanR(ADR(menutext),HIGH(menutext)+1,0C); IF curlen>Width THEN curlen:=Width; END; Lib.Move(ADR(menutext),ADR(Name),curlen+1); Lib.Fill(ADR(Name[curlen]),Width-curlen,' '); FirstNonSpace := Lib.ScanNeR(ADR(Name),Width,' '); IF FirstNonSpace # Width THEN Name[FirstNonSpace] := CAP(Name[FirstNonSpace]); END; END; INC(NumUsed); END END; END AddOption; (*......................................*) PROCEDURE KillMenu(VAR menu:MenuRec); BEGIN IF menu.winptr <> NIL THEN Window.Close(menu.winptr); menu.winptr:=NIL; END; END KillMenu; (*......................................*) PROCEDURE ShowSelectChars(VAR menu:MenuRec; onoff:switch); VAR i : CARDINAL; c : CHAR; BEGIN IF NOT menu.ExitOnChar THEN RETURN; END; i:=0; WHILE i