MENULIB.MOD 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * MENULIB.MOD - COMMS Toolkit menu support *
  5. * *
  6. * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. IMPLEMENTATION MODULE MenuLib;
  11. IMPORT IO,Lib,Window;
  12. FROM Window IMPORT Color;
  13. CONST
  14. MenuFrame = Window.FrameStr('Õ͸³³Ô;');
  15. MenuTemplate = Window.WinDef(0,0,0,0,White,Black,FALSE,FALSE,FALSE,TRUE,MenuFrame,LightGray,Black);
  16. TYPE
  17. switch = (on,off);
  18. FuncKeys = (NotRecognised,Escape,Cup,Cdown,Cleft,Cright,PageUp,PageDown,FKey1,AltKey);
  19. VAR
  20. gotcha : BOOLEAN;
  21. FuncKeyTyped : FuncKeys;
  22. (*......................................*)
  23. PROCEDURE SetColor(NewColor:SHORTCARD);
  24. BEGIN
  25. Window.TextColor(VAL(Window.Color,NewColor MOD 16));
  26. Window.TextBackground(VAL(Window.Color,NewColor DIV 16));
  27. END SetColor;
  28. (*.............................................*)
  29. PROCEDURE Read(VAR c:CHAR);
  30. BEGIN
  31. FuncKeyTyped := NotRecognised;
  32. c := IO.RdKey();
  33. IF (c=CHR(27)) OR (c=0C) THEN
  34. IF c=0C THEN
  35. c := IO.RdKey();
  36. CASE ORD(c) OF
  37. 72 : FuncKeyTyped:=Cup; |
  38. 80 : FuncKeyTyped:=Cdown; |
  39. 75 : FuncKeyTyped:=Cleft; |
  40. 77 : FuncKeyTyped:=Cright; |
  41. 73 : FuncKeyTyped:=PageUp; |
  42. 81 : FuncKeyTyped:=PageDown;|
  43. 59 : FuncKeyTyped:=FKey1; |
  44. ELSE
  45. FuncKeyTyped := AltKey;
  46. END
  47. ELSE
  48. FuncKeyTyped := Escape
  49. END;
  50. END;
  51. END Read;
  52. (*........................................*)
  53. PROCEDURE DeAltify(VAR Ch:CHAR);
  54. VAR
  55. c : CARDINAL;
  56. Numrow,Qrow,Arow,
  57. Zrow : ARRAY[0..11] OF CHAR;
  58. BEGIN
  59. Numrow:='1234567890-=';
  60. Qrow:='QWERTYUIOP';
  61. Arow:='ASDFGHJKL';
  62. Zrow:='ZXCVBNM';
  63. IF FuncKeyTyped=AltKey THEN
  64. c := ORD(Ch);
  65. IF (c>=120) AND (c<=131) THEN
  66. Ch := Numrow[c-120]
  67. ELSIF (c>=16) AND (c<=25) THEN
  68. Ch := Qrow[c-16]
  69. ELSIF (c>=30) AND (c<=38) THEN
  70. Ch := Arow[c-30]
  71. ELSIF (c>=44) AND (c<=50) THEN
  72. Ch := Zrow[c-44]
  73. END;
  74. FuncKeyTyped := NotRecognised;
  75. ELSE
  76. Ch := CAP(Ch)
  77. END;
  78. END DeAltify;
  79. (*..................................................*)
  80. PROCEDURE InitMenu(VAR menu:MenuRec;menutitle:ARRAY OF CHAR;MenuX,MenuY,menuwidth:CARDINAL);
  81. VAR
  82. i,Lnth : CARDINAL;
  83. BEGIN
  84. menu.MenuX:=MenuX;
  85. menu.MenuY:=MenuY;
  86. WITH menu DO
  87. Lnth := Lib.ScanR(ADR(menutitle),HIGH(menutitle)+1,0C);
  88. IF Lnth>menuwidth THEN
  89. Lnth:=menuwidth;
  90. END;
  91. Lib.Move(ADR(menutitle),ADR(Title),Lnth+1);
  92. Width:=menuwidth;
  93. Normal := SHORTCARD(MenuColors.NormFore)+SHORTCARD(MenuColors.NormBack)*16;
  94. Selected := SHORTCARD(MenuColors.SelFore)+SHORTCARD(MenuColors.SelBack)*16;
  95. Highlite := SHORTCARD(MenuColors.HighFore)+SHORTCARD(MenuColors.HighBack)*16;
  96. SHighlite := SHORTCARD(MenuColors.HSelFore)+SHORTCARD(MenuColors.HSelBack)*16;
  97. EscapeOK := FALSE;
  98. ExitOnChar := FALSE;
  99. HelpOK := FALSE;
  100. PageKeysOK := FALSE;
  101. ExitSideWays := FALSE;
  102. IF Width>30 THEN
  103. Width:=30;
  104. END;
  105. Selection:=0;
  106. NumUsed:=0;
  107. winptr:=NIL;
  108. END;
  109. END InitMenu;
  110. (*......................................*)
  111. PROCEDURE AddOption(VAR menu:MenuRec; menutext:ARRAY OF CHAR);
  112. VAR
  113. curlen : CARDINAL;
  114. BEGIN
  115. WITH menu DO
  116. IF NumUsed<=MaxOption THEN
  117. WITH Option[NumUsed] DO
  118. curlen := Lib.ScanR(ADR(menutext),HIGH(menutext)+1,0C);
  119. IF curlen>Width THEN
  120. curlen:=Width;
  121. END;
  122. Lib.Move(ADR(menutext),ADR(Name),curlen+1);
  123. Lib.Fill(ADR(Name[curlen]),Width-curlen,' ');
  124. FirstNonSpace := Lib.ScanNeR(ADR(Name),Width,' ');
  125. IF FirstNonSpace # Width THEN
  126. Name[FirstNonSpace] := CAP(Name[FirstNonSpace]);
  127. END;
  128. END;
  129. INC(NumUsed);
  130. END
  131. END;
  132. END AddOption;
  133. (*......................................*)
  134. PROCEDURE KillMenu(VAR menu:MenuRec);
  135. BEGIN
  136. IF menu.winptr <> NIL THEN
  137. Window.Close(menu.winptr);
  138. menu.winptr:=NIL;
  139. END;
  140. END KillMenu;
  141. (*......................................*)
  142. PROCEDURE ShowSelectChars(VAR menu:MenuRec; onoff:switch);
  143. VAR
  144. i : CARDINAL;
  145. c : CHAR;
  146. BEGIN
  147. IF NOT menu.ExitOnChar THEN
  148. RETURN;
  149. END;
  150. i:=0;
  151. WHILE i<menu.NumUsed DO
  152. WITH menu.Option[i] DO
  153. c := Name[FirstNonSpace];
  154. IF onoff=on THEN
  155. IF i=menu.Selection THEN
  156. SetColor(menu.SHighlite)
  157. ELSE
  158. SetColor(menu.Highlite)
  159. END
  160. ELSE
  161. IF i=menu.Selection THEN
  162. SetColor(menu.Selected)
  163. ELSE
  164. SetColor(menu.Normal)
  165. END;
  166. END;
  167. Window.DirectWrite(XPos+FirstNonSpace+1,YPos+1,ADR(c),1);
  168. END;
  169. INC(i);
  170. END;
  171. END ShowSelectChars;
  172. (*......................................*)
  173. PROCEDURE HighLight(VAR menu:MenuRec; onoff:switch; opno:CARDINAL);
  174. VAR
  175. c : CHAR;
  176. BEGIN
  177. WITH menu.Option[opno] DO
  178. IF onoff=on THEN
  179. SetColor(menu.Selected)
  180. ELSE
  181. SetColor(menu.Normal)
  182. END;
  183. Window.DirectWrite(XPos+1,YPos+1,ADR(Name),menu.Width);
  184. c := Name[FirstNonSpace];
  185. IF menu.ExitOnChar THEN
  186. IF onoff=on THEN
  187. SetColor(menu.SHighlite)
  188. ELSE
  189. SetColor(menu.Highlite)
  190. END;
  191. Window.DirectWrite(XPos+FirstNonSpace+1,YPos+1,ADR(c),1);
  192. END;
  193. END;
  194. END HighLight;
  195. (*......................................*)
  196. PROCEDURE ChCheck(VAR menu:MenuRec; ch:CHAR);
  197. VAR
  198. start : CARDINAL;
  199. found : BOOLEAN;
  200. (*. . . . . . . . . . . . . . . . . . . . .*)
  201. PROCEDURE CharPresent():BOOLEAN;
  202. BEGIN
  203. WITH menu DO
  204. WITH Option[Selection] DO
  205. RETURN Name[FirstNonSpace] = ch;
  206. END;
  207. END;
  208. END CharPresent;
  209. (*. . . . . . . . . . . . . . . . . . . . .*)
  210. BEGIN (* ChCheck *)
  211. IF (ORD(ch)=32) OR (ORD(ch)=13) THEN
  212. RETURN;
  213. END;
  214. WITH menu DO
  215. found:=FALSE;
  216. start:=Selection;
  217. REPEAT
  218. Selection := (Selection+1) MOD NumUsed;
  219. found := CharPresent();
  220. UNTIL (Selection=start) OR (found);
  221. IF Selection<>start THEN
  222. HighLight(menu,off,start);
  223. HighLight(menu,on,Selection);
  224. END;
  225. gotcha := ExitOnChar AND found;
  226. END;
  227. END ChCheck;
  228. (*......................................*)
  229. PROCEDURE DisplayPopUp(VAR menu:MenuRec; MenuX,MenuY:CARDINAL);
  230. VAR
  231. i : CARDINAL;
  232. Def : Window.WinDef;
  233. BEGIN
  234. WITH menu DO
  235. IF winptr=NIL THEN
  236. Def := MenuTemplate;
  237. WITH Def DO
  238. X1:=MenuX;
  239. Y1:=MenuY;
  240. X2:=X1+Width+1;
  241. Y2:=Y1+NumUsed+1;
  242. Foreground := MenuColors.NormFore;
  243. Background := MenuColors.NormBack;
  244. FrameFore := MenuColors.FrameFore;
  245. FrameBack := MenuColors.FrameBack;
  246. END;
  247. winptr := Window.Open(Def);
  248. IF Title[0]<>0C THEN
  249. Window.SetTitle(winptr,Title,Window.LeftUpperTitle);
  250. END
  251. END;
  252. SetColor(Normal);
  253. FOR i:=0 TO NumUsed-1 DO
  254. WITH menu.Option[i] DO
  255. XPos:=0;
  256. YPos:=i;
  257. Window.DirectWrite(XPos+1,YPos+1,ADR(Name),Width);
  258. END;
  259. END;
  260. Window.PutOnTop(winptr);
  261. END;
  262. END DisplayPopUp;
  263. (*......................................*)
  264. PROCEDURE PopUpMenu(VAR menu:MenuRec):INTEGER;
  265. VAR
  266. ch : CHAR;
  267. BEGIN
  268. WITH menu DO
  269. Window.Use(winptr);
  270. ShowSelectChars(menu,on);
  271. HighLight(menu,on,Selection);
  272. REPEAT
  273. Read(ch);
  274. DeAltify(ch);
  275. CASE FuncKeyTyped OF
  276. Escape : IF EscapeOK THEN
  277. RETURN(-1);
  278. END; |
  279. PageUp : IF PageKeysOK THEN
  280. RETURN(-2);
  281. END; |
  282. PageDown : IF PageKeysOK THEN
  283. RETURN(-3);
  284. END; |
  285. FKey1 : IF HelpOK THEN
  286. RETURN(-4);
  287. END; |
  288. Cright,Cdown: IF (FuncKeyTyped=Cright) AND (ExitSideWays) THEN
  289. RETURN(-5);
  290. ELSE
  291. HighLight(menu,off,Selection);
  292. Selection:=(Selection+1) MOD NumUsed;
  293. HighLight(menu,on,Selection);
  294. END; |
  295. Cleft,Cup : IF (FuncKeyTyped=Cleft) AND (ExitSideWays) THEN
  296. RETURN(-6);
  297. ELSE
  298. HighLight(menu,off,Selection);
  299. IF Selection=0 THEN
  300. Selection:=NumUsed;
  301. END;
  302. DEC(Selection);
  303. HighLight(menu,on,Selection);
  304. END; |
  305. ELSE
  306. ChCheck(menu,ch)
  307. END;
  308. UNTIL (ch=CHR(13)) OR (gotcha);
  309. ShowSelectChars(menu,off);
  310. RETURN Selection;
  311. END;
  312. END PopUpMenu;
  313. (*......................................*)
  314. PROCEDURE DispMenu(VAR menu:MenuRec);
  315. BEGIN
  316. WITH menu DO
  317. DisplayPopUp(menu,MenuX,MenuY)
  318. END;
  319. END DispMenu;
  320. (*......................................*)
  321. PROCEDURE RepaintMenu(VAR menu:MenuRec);
  322. VAR
  323. i : CARDINAL;
  324. onoff : switch;
  325. BEGIN
  326. menu.Selection := 0;
  327. i:=0;
  328. WHILE i<menu.NumUsed DO
  329. IF i=menu.Selection THEN
  330. onoff := on;
  331. ELSE
  332. onoff := off;
  333. END ;
  334. HighLight(menu,onoff,i);
  335. INC(i);
  336. END;
  337. END RepaintMenu;
  338. (*......................................*)
  339. PROCEDURE MenuDrive(VAR menu:MenuRec):INTEGER;
  340. BEGIN
  341. gotcha:=FALSE;
  342. RETURN PopUpMenu(menu);
  343. END MenuDrive;
  344. (*......................................*)
  345. BEGIN
  346. WITH MenuColors DO (* default for color *)
  347. NormFore := LightCyan;
  348. NormBack := Black;
  349. FrameFore := LightGray;
  350. FrameBack := Black;
  351. HighFore := Yellow;
  352. HighBack := Black;
  353. SelFore := White;
  354. SelBack := Blue;
  355. HSelFore := Yellow;
  356. HSelBack := Blue;
  357. END;
  358. END MenuLib.
  359.