SCRNUTL1.LST 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529
  1. Listing:
  2. 1 IMPLEMENTATION MODULE ScrnUtl1;
  3. 2 (*
  4. 3 * REPERTOIRE
  5. 4 * Release 1.6
  6. 5 * By Charles Bradford and Cole Brecheen
  7. 6 * (c) Copyright 1985-1992 PMI
  8. 7 * Green Bay, Wisconsin
  9. 8 * All rights reserved
  10. 9 * (414) 468-6040
  11. 10 *
  12. 11 * $Header: D:/logfiles/mods/scrnutl1.mov 1.5 10 Mar 1991 15:32:22 coleb $
  13. 12 *
  14. 13 *)
  15. 14
  16. 15 IMPORT ErrorNames;
  17. 16 IMPORT GenLists;
  18. 17 IMPORT ListUtils;
  19. 18 IMPORT M2Strings;
  20. 19 IMPORT MsColors;
  21. 20 IMPORT NumTypes;
  22. 21 IMPORT PosUtils;
  23. 22 IMPORT Rectangles;
  24. 23 IMPORT ScrnTypes;
  25. 24 IMPORT StrConv;
  26. 25 IMPORT StrEdit;
  27. 26 IMPORT SYSTEM;
  28. 27 IMPORT UserOps;
  29. 28 IMPORT VEditor;
  30. 29 IMPORT VWindows;
  31. 30
  32. 31 VAR
  33. 32 Initialized : BOOLEAN;
  34. 33
  35. 34 PROCEDURE Init();
  36. 35 BEGIN
  37. 36 IF Initialized THEN
  38. 37 RETURN;
  39. 38 ELSE
  40. 39 Initialized := TRUE;
  41. 40 END;
  42. 41 ErrorNames.Init();
  43. ***** ^ not supported yet
  44. ***** ^ not supported yet
  45. ***** ^ not supported yet
  46. 42 GenLists.Init();
  47. ***** ^ not supported yet
  48. ***** ^ not supported yet
  49. ***** ^ not supported yet
  50. 43 ListUtils.Init();
  51. ***** ^ not supported yet
  52. ***** ^ not supported yet
  53. ***** ^ not supported yet
  54. 44 M2Strings.Init();
  55. ***** ^ not supported yet
  56. ***** ^ not supported yet
  57. ***** ^ not supported yet
  58. 45 MsColors.Init();
  59. ***** ^ not supported yet
  60. ***** ^ not supported yet
  61. ***** ^ not supported yet
  62. 46 NumTypes.Init();
  63. ***** ^ not supported yet
  64. ***** ^ not supported yet
  65. ***** ^ not supported yet
  66. 47 PosUtils.Init();
  67. ***** ^ not supported yet
  68. ***** ^ not supported yet
  69. ***** ^ not supported yet
  70. 48 Rectangles.Init();
  71. ***** ^ not supported yet
  72. ***** ^ not supported yet
  73. ***** ^ not supported yet
  74. 49 ScrnTypes.Init();
  75. ***** ^ not supported yet
  76. ***** ^ not supported yet
  77. ***** ^ not supported yet
  78. 50 StrConv.Init();
  79. ***** ^ not supported yet
  80. ***** ^ not supported yet
  81. ***** ^ not supported yet
  82. 51 StrEdit.Init();
  83. ***** ^ not supported yet
  84. ***** ^ not supported yet
  85. ***** ^ not supported yet
  86. 52 UserOps.Init();
  87. ***** ^ not supported yet
  88. ***** ^ not supported yet
  89. ***** ^ not supported yet
  90. 53 VEditor.Init();
  91. ***** ^ not supported yet
  92. ***** ^ not supported yet
  93. ***** ^ not supported yet
  94. 54 VWindows.Init();
  95. ***** ^ not supported yet
  96. ***** ^ not supported yet
  97. ***** ^ not supported yet
  98. 55 END Init;
  99. ***** ^ not supported yet
  100. 56
  101. 57 CONST
  102. 58 Bit15 = 15; (*most significant bit*)
  103. 59 Bit14 = 14; (*next most significant*)
  104. 60 AfterLastElmt = 65535;
  105. 61
  106. 62 TYPE
  107. 63 VariantType =
  108. 64 RECORD
  109. 65 CASE : CARDINAL OF
  110. ***** ^ not supported yet
  111. ***** ^ 'POINTER' expected
  112. 66 1: c: CARDINAL;
  113. 67 | 2: l, h: CHAR;
  114. 68 | 3: b: BITSET;
  115. 69 END
  116. 70 END;
  117. 71
  118. 72
  119. 73 PROCEDURE AbsFieldCol( TheFrame: ScrnTypes.DisplayFrame;
  120. 74 FieldNum: CARDINAL ): INTEGER;
  121. 75 VAR
  122. 76 tmp: CARDINAL;
  123. 77 ImagePtr: ScrnTypes.ImageElmtPtr;
  124. 78 BEGIN
  125. 79 GetFieldImagePtr( TheFrame, FieldNum, ImagePtr );
  126. 80 (*
  127. 81 Diagnostics.diagC( 'ImagePtr^.col', ImagePtr^.col );
  128. 82 *)
  129. 83 tmp := ImagePtr^.col;
  130. 84 DecodeWord( tmp );
  131. 85 (*
  132. 86 Diagnostics.diagC( 'TheFrame^.startcol', TheFrame^.startcol );
  133. 87 Diagnostics.diagC( 'TheFrame^.ColsScrolled', TheFrame^.ColsScrolled );
  134. 88 *)
  135. 89 RETURN INTEGER( INTEGER(tmp) + INTEGER(TheFrame^.startcol)) -
  136. 90 INTEGER(TheFrame^.ColsScrolled);
  137. 91 END AbsFieldCol;
  138. 92
  139. 93
  140. 94 PROCEDURE AbsFieldRow( TheFrame: ScrnTypes.DisplayFrame;
  141. 95 FieldNum: CARDINAL ): INTEGER;
  142. 96 VAR
  143. 97 tmp: CARDINAL;
  144. 98 ImagePtr: ScrnTypes.ImageElmtPtr;
  145. 99 BEGIN
  146. 100 GetFieldImagePtr( TheFrame, FieldNum, ImagePtr );
  147. 101 (*
  148. 102 Diagnostics.diagC( 'ImagePtr^.row', ImagePtr^.row );
  149. 103 *)
  150. 104 tmp := ImagePtr^.row;
  151. 105 DecodeWord( tmp );
  152. 106 (*
  153. 107 IF (tmp + TheFrame^.startrow) < TheFrame^.RowsScrolled THEN
  154. 108 END;
  155. 109 Diagnostics.diagC( 'ImagePtr^.row', tmp );
  156. 110 Diagnostics.diagC( 'TheFrame^.startrow', TheFrame^.startrow );
  157. 111 Diagnostics.diagC( 'TheFrame^.RowsScrolled', TheFrame^.RowsScrolled );
  158. 112 *)
  159. 113
  160. 114 RETURN INTEGER( INTEGER(tmp) + INTEGER(TheFrame^.startrow)) -
  161. 115 INTEGER(TheFrame^.RowsScrolled);
  162. 116 END AbsFieldRow;
  163. 117
  164. 118
  165. 119 PROCEDURE AllFieldsThisType( TheFrame: ScrnTypes.DisplayFrame;
  166. 120 TheType: CHAR ): BOOLEAN;
  167. 121 VAR
  168. 122 FieldCount, LastField: CARDINAL;
  169. 123 CountingDispFields: BOOLEAN;
  170. 124 typ : CHAR;
  171. 125 BEGIN
  172. 126 FieldCount := 1;
  173. 127 CountingDispFields := TheType = ScrnTypes.DispCode;
  174. 128 LastField := FieldListTotal( TheFrame );
  175. 129 WHILE (FieldCount <= LastField) DO
  176. 130 typ := FieldType(TheFrame, FieldCount);
  177. 131 IF (typ # TheType) THEN
  178. 132 IF NOT CountingDispFields THEN
  179. 133 IF typ # ScrnTypes.DispCode THEN
  180. 134 RETURN FALSE;
  181. 135 END;
  182. 136 ELSE
  183. 137 RETURN FALSE;
  184. 138 END;
  185. 139 END;
  186. 140 INC( FieldCount );
  187. 141 END;
  188. 142 RETURN TRUE;
  189. 143 END AllFieldsThisType;
  190. 144
  191. 145
  192. 146 PROCEDURE BoxFrame( TheFrame: ScrnTypes.DisplayFrame; Active: BOOLEAN );
  193. 147 VAR
  194. 148 TheBoxStr: VWindows.BoxStr;
  195. 149 BEGIN
  196. 150 IF Active THEN
  197. 151 TheBoxStr := TheFrame^.EntryBox;
  198. 152 ELSE
  199. 153 TheBoxStr := TheFrame^.ExitBox;
  200. 154 END;
  201. 155 IF TheBoxStr[0] # 0C THEN
  202. 156 SetBorderColors( TheFrame );
  203. 157 VWindows.DrawBox( TheFrame^.WindowHandle, TheBoxStr,
  204. 158 TheFrame^.startcol + 1, TheFrame^.startrow + 1,
  205. 159 TheFrame^.endcol + 1, TheFrame^.endrow + 1 );
  206. 160 IF TheFrame^.Caption[0] # 0C THEN
  207. 161 WriteBetween( TheFrame^.WindowHandle, TheFrame^.Caption,
  208. 162 TheFrame^.startcol + 1, TheFrame^.startrow + 1,
  209. 163 TheFrame^.endcol + 1, TheFrame^.endcol + 1 );
  210. 164 END;
  211. 165 END;
  212. 166 END BoxFrame;
  213. 167
  214. 168
  215. 169 PROCEDURE BoxInFrame( TheFrame: ScrnTypes.DisplayFrame ): BOOLEAN;
  216. 170 BEGIN
  217. 171 RETURN (TheFrame^.EntryBox[0] # 0C) OR (TheFrame^.ExitBox[0] # 0C);
  218. 172 END BoxInFrame;
  219. 173
  220. 174
  221. 175 PROCEDURE ChoiceNumber( TheFrame: ScrnTypes.DisplayFrame;
  222. 176 TheField: CARDINAL ): CARDINAL;
  223. 177 VAR
  224. 178 FieldPtr: ScrnTypes.InputFieldPtr;
  225. 179 BEGIN
  226. 180 GetFieldPtr( TheFrame, TheField, FieldPtr );
  227. 181 RETURN FieldPtr^.GroupID;
  228. 182 END ChoiceNumber;
  229. 183
  230. 184
  231. 185 PROCEDURE CoordsInField( TheFrame: ScrnTypes.DisplayFrame;
  232. 186 TheField, TheCol, TheRow: CARDINAL ): BOOLEAN;
  233. 187 VAR
  234. 188 c1, r1, c2, r2: CARDINAL;
  235. 189 BEGIN
  236. 190 c1 := VirtualFieldCol( TheFrame, TheField );
  237. 191 IF (TheCol < c1) THEN
  238. 192 RETURN FALSE;
  239. 193 END;
  240. 194 r1 := VirtualFieldRow( TheFrame, TheField );
  241. 195 IF (TheRow < r1) THEN
  242. 196 RETURN FALSE;
  243. 197 END;
  244. 198 c2 := c1 + FieldWidth( TheFrame, TheField ) - 1;
  245. 199 IF (TheCol > c2) THEN
  246. 200 RETURN FALSE;
  247. 201 END;
  248. 202 r2 := r1 + FieldHeight( TheFrame, TheField ) - 1;
  249. 203 IF (TheRow > r2) THEN
  250. 204 RETURN FALSE;
  251. 205 END;
  252. 206 RETURN TRUE;
  253. 207 END CoordsInField;
  254. 208
  255. 209
  256. 210 PROCEDURE CurrentField( TheFrame: ScrnTypes.DisplayFrame ):
  257. 211 CARDINAL;
  258. 212 VAR
  259. 213 ImagePtr: ScrnTypes.ImageElmtPtr;
  260. 214 BEGIN
  261. 215 GetFieldImagePtr( TheFrame, TheFrame^.CurrentField, ImagePtr );
  262. 216 (*Make sure the list pointers are correct.*)
  263. 217 RETURN TheFrame^.CurrentField;
  264. 218 END CurrentField;
  265. 219
  266. 220
  267. 221 PROCEDURE DecodeByte( VAR AnyByte: SYSTEM.BYTE );
  268. 222 BEGIN
  269. 223 IF CHAR(AnyByte) = 377C THEN
  270. 224 AnyByte := SYSTEM.BYTE(0C);
  271. 225 ELSIF CHAR(AnyByte) = 0C THEN
  272. 226 ErrorNames.WarningName( 'EncodErr' );
  273. 227 END;
  274. 228 END DecodeByte;
  275. 229
  276. 230
  277. 231 PROCEDURE DecodeImageRec( VAR TheImageRec:
  278. 232 ScrnTypes.ImageElement );
  279. 233 BEGIN
  280. 234 DecodeWord( TheImageRec.row );
  281. 235 DecodeWord( TheImageRec.col );
  282. 236 DecodeWord( TheImageRec.field );
  283. 237 DecodeByte( TheImageRec.foreg );
  284. 238 DecodeByte( TheImageRec.backg );
  285. 239 DecodeByte( TheImageRec.atrb );
  286. 240 END DecodeImageRec;
  287. 241
  288. 242
  289. 243 PROCEDURE DecodeWord( VAR AnyWord: SYSTEM.WORD );
  290. 244 VAR
  291. 245 v: VariantType;
  292. 246 BEGIN
  293. 247 v.c := CARDINAL(AnyWord);
  294. 248 IF Bit14 IN v.b THEN
  295. 249 v.l := 0C;
  296. 250 EXCL( v.b, Bit14 );
  297. 251 END;
  298. 252 IF Bit15 IN v.b THEN
  299. 253 v.h := 0C;
  300. 254 END;
  301. 255 AnyWord := SYSTEM.WORD(v.c);
  302. 256 END DecodeWord;
  303. 257
  304. 258
  305. 259 PROCEDURE EncodeByte( VAR AnyByte: SYSTEM.BYTE );
  306. 260 BEGIN
  307. 261 IF CHAR(AnyByte) = 0C THEN
  308. 262 AnyByte := SYSTEM.BYTE(377C);
  309. 263 ELSIF CHAR(AnyByte) = 377C THEN
  310. 264 ErrorNames.WarningName( 'EncodErr' );
  311. 265 END;
  312. 266 END EncodeByte;
  313. 267
  314. 268
  315. 269 PROCEDURE EncodeImageRec( VAR TheImageRec:
  316. 270 ScrnTypes.ImageElement );
  317. 271 BEGIN
  318. 272 EncodeWord( TheImageRec.row );
  319. 273 EncodeWord( TheImageRec.col );
  320. 274 EncodeWord( TheImageRec.field );
  321. 275 EncodeByte( TheImageRec.foreg );
  322. 276 EncodeByte( TheImageRec.backg );
  323. 277 EncodeByte( TheImageRec.atrb );
  324. 278 END EncodeImageRec;
  325. 279
  326. 280
  327. 281 PROCEDURE EncodeWord( VAR AnyWord: SYSTEM.WORD );
  328. 282 VAR
  329. 283 v: VariantType;
  330. 284 BEGIN
  331. 285 v.c := CARDINAL(AnyWord);
  332. 286 IF v.c > 04000H THEN
  333. 287 ErrorNames.WarningName( 'EncodErr' );
  334. 288 END;
  335. 289 IF (v.h = 0C) THEN
  336. 290 INCL( v.b, Bit15 );
  337. 291 END;
  338. 292 IF (v.l = 0C) THEN
  339. 293 INCL( v.b, Bit14 );
  340. 294 v.l := 377C;
  341. 295 END;
  342. 296 AnyWord := SYSTEM.WORD(v.c);
  343. 297 END EncodeWord;
  344. 298
  345. 299
  346. 300 PROCEDURE EntirelyVisible( TheFrame: ScrnTypes.DisplayFrame;
  347. 301 TheField: CARDINAL ): BOOLEAN;
  348. 302 (* This procedure tells you whether TheField is entirely
  349. 303 visible within TheFrame. *)
  350. 304 VAR
  351. 305 FirstVirtualColVisible, FirstVirtualRowVisible,
  352. 306 VirtualPromptRow, LastVirtualColVisible,
  353. 307 LastVirtualRowVisible, c1, r1, c2, r2: INTEGER;
  354. 308 BEGIN
  355. 309 c1 := INTEGER( VirtualFieldCol( TheFrame, TheField ) );
  356. 310 r1 := INTEGER( VirtualFieldRow( TheFrame, TheField ) );
  357. 311 c2 := c1 + INTEGER(FieldWidth( TheFrame, TheField )) - 1;
  358. 312 r2 := r1 + INTEGER(FieldHeight( TheFrame, TheField )) - 1;
  359. 313 FirstVirtualColVisible := INTEGER(TheFrame^.ColsScrolled)
  360. 314 + 1;
  361. 315 FirstVirtualRowVisible := (INTEGER(TheFrame^.RowsScrolled)
  362. 316 + 1) + INTEGER(TheFrame^.headline);
  363. 317 LastVirtualColVisible := TheFrame^.endcol -
  364. 318 TheFrame^.startcol + 1 + TheFrame^.ColsScrolled;
  365. 319 LastVirtualRowVisible := TheFrame^.endrow -
  366. 320 TheFrame^.startrow + 1 + TheFrame^.RowsScrolled;
  367. 321 IF BoxInFrame( TheFrame ) THEN
  368. 322 (*There's a box in the window, so we have to adjust our
  369. 323 numbers.*)
  370. 324 IF TheFrame^.headline = 0 THEN
  371. 325 (*But we don't have to adjust FirstVirtualRowVisible if
  372. 326 there's a headline because we've added headline
  373. 327 above, and the box takes up one of the lines in it.*)
  374. 328 INC( FirstVirtualRowVisible );
  375. 329 END;
  376. 330 INC( FirstVirtualColVisible );
  377. 331 DEC( LastVirtualRowVisible );
  378. 332 DEC( LastVirtualColVisible );
  379. 333 END;
  380. 334
  381. 335 (*First determine whether it's entirely visible along
  382. 336 its width.*)
  383. 337 IF (c1 < FirstVirtualColVisible) OR (c2 >
  384. 338 LastVirtualColVisible) THEN
  385. 339 RETURN FALSE;
  386. 340 END;
  387. 341
  388. 342 (*Then determine whether it's entirely visible along
  389. 343 its height.*)
  390. 344
  391. 345 IF UserOps.DoPrompting THEN
  392. 346 VirtualPromptRow := INTEGER(TheFrame^.RowsScrolled +
  393. 347 UserOps.PromptRow) - INTEGER(TheFrame^.startrow);
  394. 348 IF (r1 <= VirtualPromptRow) AND (r2 >= VirtualPromptRow) THEN
  395. 349 RETURN FALSE;
  396. 350 END;
  397. 351 END;
  398. 352
  399. 353 IF (r1 < FirstVirtualRowVisible) OR (r2 >
  400. 354 LastVirtualRowVisible) THEN
  401. 355 RETURN FALSE;
  402. 356 END;
  403. 357
  404. 358 RETURN TRUE;
  405. 359 END EntirelyVisible;
  406. 360
  407. 361
  408. 362 PROCEDURE FieldEntered( TheFrame: ScrnTypes.DisplayFrame;
  409. 363 TheCol, TheRow: CARDINAL ): BOOLEAN;
  410. 364 (*Scans the field list to determine whether these cursor
  411. 365 coordinates are inside any field. If so, sets
  412. 366 TheFrame^.CurrentField to the number of the entered field
  413. 367 and returns TRUE.*)
  414. 368 VAR
  415. 369 cnt, ListEnd: CARDINAL;
  416. 370 BEGIN
  417. 371 cnt := 1;
  418. 372 ListEnd := FieldListTotal( TheFrame );
  419. 373 LOOP
  420. 374 IF cnt > ListEnd THEN
  421. 375 RETURN FALSE;
  422. 376 END;
  423. 377 IF CoordsInField( TheFrame, cnt, TheCol, TheRow ) THEN
  424. 378 TheFrame^.CurrentField := cnt;
  425. 379 RETURN TRUE;
  426. 380 END;
  427. 381 INC( cnt );
  428. 382 END;
  429. 383 END FieldEntered;
  430. 384
  431. 385
  432. 386 PROCEDURE FieldGroupTotal( TheFrame: ScrnTypes.DisplayFrame ):
  433. 387 CARDINAL;
  434. 388 VAR
  435. 389 ListEnd, ListCnt, GroupCnt: CARDINAL;
  436. 390 FieldPtr: ScrnTypes.InputFieldPtr;
  437. 391 BEGIN
  438. 392 ListEnd := FieldListTotal( TheFrame );
  439. 393 ListCnt := 1;
  440. 394 GroupCnt := 0;
  441. 395 WHILE ListCnt <= ListEnd DO
  442. 396 GetFieldPtr( TheFrame, ListCnt, FieldPtr );
  443. 397 IF (FieldPtr^.typ = ScrnTypes.DispCode) THEN
  444. 398 (* Do nothing *)
  445. 399 ELSIF (FieldPtr^.typ # ScrnTypes.GroupMember) THEN
  446. 400 INC( GroupCnt );
  447. 401 ELSIF NOT (FieldPtr^.GroupID > 1) THEN
  448. 402 INC( GroupCnt );
  449. 403 END;
  450. 404 INC( ListCnt );
  451. 405 END;
  452. 406 RETURN GroupCnt;
  453. 407 END FieldGroupTotal;
  454. 408
  455. 409
  456. 410 PROCEDURE FieldHeight( TheFrame: ScrnTypes.DisplayFrame;
  457. 411 TheField: CARDINAL ): CARDINAL;
  458. 412 VAR
  459. 413 FieldPtr: ScrnTypes.InputFieldPtr;
  460. 414 BEGIN
  461. 415 IF FieldType( TheFrame, TheField ) = ScrnTypes.EditorCode THEN
  462. 416 GetFieldPtr( TheFrame, TheField, FieldPtr );
  463. 417 RETURN (FieldPtr^.Row2 - VirtualFieldRow( TheFrame, TheField) ) + 1;
  464. 418 ELSE
  465. 419 RETURN 1;
  466. 420 END;
  467. 421 END FieldHeight;
  468. 422
  469. 423
  470. 424 PROCEDURE FieldImageNum( TheFrame: ScrnTypes.DisplayFrame;
  471. 425 FieldNumber: CARDINAL ): CARDINAL;
  472. 426 VAR
  473. 427 ImagePtr: ScrnTypes.InputFieldPtr;
  474. 428 BEGIN
  475. 429 GetFieldPtr( TheFrame, FieldNumber, ImagePtr );
  476. 430 RETURN ImagePtr^.ImageNum;
  477. 431 END FieldImageNum;
  478. 432
  479. 433
  480. 434 PROCEDURE FieldIsBlank( TheFrame: ScrnTypes.DisplayFrame;
  481. 435 FieldName: ARRAY OF CHAR; VAR FieldNumber: CARDINAL ):
  482. 436 BOOLEAN;
  483. 437 (*Pass this routine a DisplayFrame (normally this will be
  484. 438 MainFrame) and a FieldName that appears somewhere in that
  485. 439 frame, and it tells you whether the field is blank, and
  486. 440 what its position is in the list of fields for the frame.*)
  487. 441 VAR
  488. 442 TmpPtr: ScrnTypes.InputFieldPtr;
  489. 443 ImageRec: ScrnTypes.ImageElement;
  490. 444 BEGIN
  491. 445 IF NOT FindField( TheFrame, FieldName, TmpPtr, ImageRec ) THEN
  492. 446 RETURN FALSE;
  493. 447 END;
  494. 448 FieldNumber := FieldNum( TheFrame, FieldName );
  495. 449 RETURN PosUtils.IsBlank( ImageRec.text );
  496. 450 END FieldIsBlank;
  497. 451
  498. 452
  499. 453 PROCEDURE FieldListTotal( TheFrame: ScrnTypes.DisplayFrame ):
  500. 454 CARDINAL;
  501. 455 BEGIN
  502. 456 IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN
  503. 457 RETURN 0;
  504. 458 ELSE
  505. 459 RETURN GenLists.ListLength( TheFrame^.FieldList );
  506. 460 END;
  507. 461 END FieldListTotal;
  508. 462
  509. 463
  510. 464 PROCEDURE FieldWidth( TheFrame: ScrnTypes.DisplayFrame;
  511. 465 TheField: CARDINAL ): CARDINAL;
  512. 466 VAR
  513. 467 FieldPtr: ScrnTypes.InputFieldPtr;
  514. 468 ImagePtr: ScrnTypes.ImageElmtPtr;
  515. 469 BEGIN
  516. 470 IF FieldType( TheFrame, TheField ) = ScrnTypes.EditorCode THEN
  517. 471 GetFieldPtr( TheFrame, TheField, FieldPtr );
  518. 472 RETURN (FieldPtr^.Col2 - VirtualFieldCol( TheFrame, TheField) ) + 1;
  519. 473 ELSE
  520. 474 GetFieldImagePtr( TheFrame, TheField, ImagePtr );
  521. 475 RETURN M2Strings.Length( ImagePtr^.text );
  522. 476 END;
  523. 477 END FieldWidth;
  524. 478
  525. 479
  526. 480 PROCEDURE FieldType( TheFrame: ScrnTypes.DisplayFrame; FieldNum:
  527. 481 CARDINAL ): CHAR;
  528. 482 VAR
  529. 483 FieldPtr: ScrnTypes.InputFieldPtr;
  530. 484 BEGIN
  531. 485 GetFieldPtr( TheFrame, FieldNum, FieldPtr );
  532. 486 RETURN FieldPtr^.typ;
  533. 487 END FieldType;
  534. 488
  535. 489
  536. 490 PROCEDURE FindField( TheFrame: ScrnTypes.DisplayFrame;
  537. 491 FieldName: ARRAY OF CHAR; VAR FieldPtr:
  538. 492 ScrnTypes.InputFieldPtr; VAR ImageRec:
  539. 493 ScrnTypes.ImageElement ): BOOLEAN;
  540. 494 VAR
  541. 495 spot : CARDINAL;
  542. 496 BEGIN
  543. 497 spot := FieldNum( TheFrame, FieldName );
  544. 498 IF spot = 0 THEN
  545. 499 RETURN FALSE;
  546. 500 ELSE RETURN FindFieldNum( TheFrame, spot, FieldPtr,
  547. 501 ImageRec );
  548. 502 END;
  549. 503 END FindField;
  550. 504
  551. 505
  552. 506 PROCEDURE FindFieldNum( TheFrame: ScrnTypes.DisplayFrame;
  553. 507 FieldNum: CARDINAL; VAR FieldPtr: ScrnTypes.InputFieldPtr;
  554. 508 VAR ImageRec: ScrnTypes.ImageElement ): BOOLEAN;
  555. 509 BEGIN
  556. 510 IF FieldNum > FieldListTotal(TheFrame) THEN
  557. 511 RETURN FALSE;
  558. 512 END;
  559. 513 GetFieldPtr( TheFrame, FieldNum, FieldPtr );
  560. 514 GetImageRec( TheFrame, FieldPtr^.ImageNum, ImageRec );
  561. 515 RETURN TRUE;
  562. 516 END FindFieldNum;
  563. 517
  564. 518
  565. 519 PROCEDURE FirstMember( TheFrame: ScrnTypes.DisplayFrame;
  566. 520 TheField: CARDINAL ): CARDINAL;
  567. 521 (* Pass this routine any field number that's a GroupMember,
  568. 522 and it returns the number of the first field in the group.
  569. 523 To be called only for GroupMember fields. *)
  570. 524 VAR
  571. 525 TmpPtr: ScrnTypes.InputFieldPtr;
  572. 526 FieldNum: CARDINAL;
  573. 527 BEGIN
  574. 528 FieldNum := TheField;
  575. 529 GetFieldPtr( TheFrame, FieldNum, TmpPtr );
  576. 530 WHILE TmpPtr^.GroupID > 1 DO
  577. 531 DEC( FieldNum );
  578. 532 GetFieldPtr( TheFrame, FieldNum, TmpPtr );
  579. 533 END;
  580. 534 RETURN FieldNum;
  581. 535 END FirstMember;
  582. 536
  583. 537
  584. 538 PROCEDURE GetCardField( TheFrame: ScrnTypes.DisplayFrame;
  585. 539 TheField: CARDINAL; VAR TheCard: CARDINAL );
  586. 540 VAR
  587. 541 tmpstr: ARRAY [0..79] OF CHAR;
  588. 542 BEGIN
  589. 543 GetFieldText( TheFrame, TheField, tmpstr );
  590. 544 IF NOT StrConv.StrToCardinal( tmpstr, 0, TheCard ) THEN
  591. 545 TheCard := 0;
  592. 546 END;
  593. 547 END GetCardField;
  594. 548
  595. 549
  596. 550 PROCEDURE GetEdField( FrameRec: ScrnTypes.DisplayFrame;
  597. 551 FieldNum: CARDINAL; VAR TheList: GenLists.GenList );
  598. 552 VAR
  599. 553 TmpRec: ScrnTypes.InputFieldRecord;
  600. 554 BEGIN
  601. 555 GetFieldRec( FrameRec, FieldNum, TmpRec );
  602. 556 IF TmpRec.typ = ScrnTypes.EditorCode THEN
  603. 557 GenLists.GetChildList( FrameRec^.EdFieldList, TmpRec.EdFieldNum,
  604. 558 TheList );
  605. 559 ELSE
  606. 560 ErrorNames.WarningName( 'BadFld' );
  607. 561 END;
  608. 562 END GetEdField;
  609. 563
  610. 564
  611. 565 PROCEDURE GetEdRec( FrameRec: ScrnTypes.DisplayFrame; FieldNum:
  612. 566 CARDINAL; VAR TheList: GenLists.GenList; VAR Rec:
  613. 567 VEditor.AnEdControlRec );
  614. 568 VAR
  615. 569 FieldRec: ScrnTypes.InputFieldRecord;
  616. 570 ImageRec: ScrnTypes.ImageElement;
  617. 571 BEGIN
  618. 572 GetFieldRec( FrameRec, FieldNum, FieldRec );
  619. 573 GetFieldImageRec( FrameRec, FieldNum, ImageRec );
  620. 574 IF FieldRec.typ # ScrnTypes.EditorCode THEN
  621. 575 ErrorNames.WarningName( 'BadFld' );
  622. 576 RETURN;
  623. 577 END;
  624. 578 GenLists.GetChildList( FrameRec^.EdFieldList, FieldRec.EdFieldNum,
  625. 579 TheList );
  626. 580 VEditor.InitEdRec( Rec );
  627. 581 Rec.Col1 := ImageRec.col + FrameRec^.startcol - FrameRec^.ColsScrolled;
  628. 582 Rec.Row1 := ImageRec.row + FrameRec^.startrow - FrameRec^.RowsScrolled;
  629. 583 Rec.Col2 := FieldRec.Col2 + FrameRec^.startcol - FrameRec^.ColsScrolled;
  630. 584 Rec.Row2 := FieldRec.Row2 + FrameRec^.startrow - FrameRec^.RowsScrolled;
  631. 585 (*We adjust the col and row coordinates to absolute
  632. 586 window coordinates.*)
  633. 587 Rec.TextRow1 := FieldRec.TextRow1;
  634. 588 Rec.CursorCol := FieldRec.CursorCol;
  635. 589 Rec.CursorRow := FieldRec.CursorRow;
  636. 590 Rec.MaxLines := FieldRec.MaxLines;
  637. 591 Rec.ChangeMade := FieldRec.ChangeMade;
  638. 592 Rec.ReadOnly := FieldRec.ReadOnly;
  639. 593 Rec.FrameRec := FrameRec;
  640. 594
  641. 595 WITH FrameRec^ DO
  642. 596 (* set colors to pointer bar *)
  643. 597 Rec.EntryForeColor := pbfor;
  644. 598 Rec.EntryBackColor := pbbak;
  645. 599 Rec.EntryAttrib := pbatrb;
  646. 600 END;
  647. 601 Rec.ExitForeColor := ImageRec.foreg;
  648. 602 Rec.ExitBackColor := ImageRec.backg;
  649. 603 Rec.ExitAttrib := ImageRec.atrb;
  650. 604 Rec.EntryBox := 0;
  651. 605 Rec.ExitBox := 0;
  652. 606 Rec.DoCounting := FALSE;
  653. 607 Rec.Col2 := FieldRec.Col2 +
  654. 608 FrameRec^.startcol -FrameRec^.ColsScrolled;
  655. 609 Rec.Row2 := FieldRec.Row2 + FrameRec^.startrow -
  656. 610 FrameRec^.RowsScrolled
  657. 611 END GetEdRec;
  658. 612
  659. 613
  660. 614 PROCEDURE GetFrameLinks( FrameRec: ScrnTypes.DisplayFrame; VAR
  661. 615 FrameAbove, FrameBelow, FrameLeft, FrameRight:
  662. 616 ScrnTypes.AFrameName );
  663. 617 VAR
  664. 618 lngth : CARDINAL;
  665. 619 BEGIN
  666. 620 FrameAbove[0] := 0C;
  667. 621 FrameBelow[0] := 0C;
  668. 622 FrameLeft[0] := 0C;
  669. 623 FrameRight[0] := 0C;
  670. 624 IF NOT GenLists.Initialized( FrameRec^.LinkedFrames ) THEN
  671. 625 RETURN;
  672. 626 END;
  673. 627 lngth := GenLists.ListLength( FrameRec^.LinkedFrames );
  674. 628 IF lngth >= 1 THEN
  675. 629 ListUtils.GetStr( FrameRec^.LinkedFrames, 1, FrameAbove );
  676. 630 END;
  677. 631 IF lngth >= 2 THEN
  678. 632 ListUtils.GetStr( FrameRec^.LinkedFrames, 2, FrameBelow );
  679. 633 END;
  680. 634 IF lngth >= 3 THEN
  681. 635 ListUtils.GetStr( FrameRec^.LinkedFrames, 3, FrameLeft );
  682. 636 END;
  683. 637 IF lngth >= 4 THEN
  684. 638 ListUtils.GetStr( FrameRec^.LinkedFrames, 4, FrameRight );
  685. 639 END;
  686. 640 END GetFrameLinks;
  687. 641
  688. 642
  689. 643 PROCEDURE GetFrameLists( VAR TheFrame: ScrnTypes.DisplayFrame );
  690. 644 BEGIN
  691. 645 GenLists.GetChildList( TheFrame^.self, 5, TheFrame^.DataList );
  692. 646 GenLists.GetChildList( TheFrame^.self, 6, TheFrame^.PromptList );
  693. 647 GenLists.GetChildList( TheFrame^.self, 7, TheFrame^.HelpList );
  694. 648 GenLists.GetChildList( TheFrame^.self, 8, TheFrame^.EdFieldList );
  695. 649 GenLists.GetChildList( TheFrame^.self, 9, TheFrame^.FieldList );
  696. 650 GenLists.GetChildList( TheFrame^.self, 10, TheFrame^.ImageList );
  697. 651 GenLists.GetChildList( TheFrame^.self, 11, TheFrame^.LinkedFrames );
  698. 652 END GetFrameLists;
  699. 653
  700. 654
  701. 655 PROCEDURE GetFieldDataList( TheFrame: ScrnTypes.DisplayFrame;
  702. 656 TheField: CARDINAL; VAR FieldDataList: GenLists.GenList ): BOOLEAN;
  703. 657 VAR
  704. 658 FieldPtr: ScrnTypes.InputFieldPtr;
  705. 659 TmpList: GenLists.GenList;
  706. 660 cnt1, TypeCode : CARDINAL;
  707. 661 FieldDataListFound : BOOLEAN;
  708. 662 TmpName: ARRAY [0..79] OF CHAR;
  709. 663 BEGIN
  710. 664 GenLists.NilList( FieldDataList );
  711. 665 IF NOT GenLists.Initialized( TheFrame^.DataList ) THEN
  712. 666 RETURN FALSE;
  713. 667 END;
  714. 668 FieldDataListFound := FALSE;
  715. 669 GetFieldPtr( TheFrame, TheField, FieldPtr );
  716. 670 cnt1 := GenLists.ListLength( TheFrame^.DataList );
  717. 671 WHILE (cnt1 > 1) AND (NOT FieldDataListFound) DO
  718. 672 IF ListUtils.TypeCheck(TheFrame^.DataList,cnt1)=GenLists.ListCode THEN
  719. 673 GenLists.GetElmt( TheFrame^.DataList, cnt1 - 1, TmpName, TypeCode );
  720. 674 IF PosUtils.Equal( TmpName, FieldPtr^.fnam ) THEN
  721. 675 GenLists.GetChildList( TheFrame^.DataList, cnt1, FieldDataList );
  722. 676 FieldDataListFound := TRUE;
  723. 677 DEC( cnt1 );
  724. 678 (* skip over the field name *)
  725. 679 END;
  726. 680 END;
  727. 681 DEC( cnt1 );
  728. 682 END;
  729. 683 RETURN FieldDataListFound;
  730. 684 END GetFieldDataList;
  731. 685
  732. 686
  733. 687 PROCEDURE GetFieldImagePtr( TheFrame: ScrnTypes.DisplayFrame;
  734. 688 TheField: CARDINAL; VAR ImagePtr: ScrnTypes.ImageElmtPtr );
  735. 689 VAR
  736. 690 FieldPtr: ScrnTypes.InputFieldPtr;
  737. 691 BEGIN
  738. 692 GetFieldPtr( TheFrame, TheField, FieldPtr );
  739. 693 GetImagePtr( TheFrame, FieldPtr^.ImageNum, ImagePtr );
  740. 694 END GetFieldImagePtr;
  741. 695
  742. 696
  743. 697 PROCEDURE GetFieldImageRec( TheFrame: ScrnTypes.DisplayFrame;
  744. 698 TheField: CARDINAL; VAR ImageRec: ScrnTypes.ImageElement );
  745. 699 VAR
  746. 700 FieldPtr: ScrnTypes.InputFieldPtr;
  747. 701 BEGIN
  748. 702 GetFieldPtr( TheFrame, TheField, FieldPtr );
  749. 703 GetImageRec( TheFrame, FieldPtr^.ImageNum, ImageRec );
  750. 704 END GetFieldImageRec;
  751. 705
  752. 706
  753. 707 PROCEDURE GetFieldPtr( TheFrame: ScrnTypes.DisplayFrame;
  754. 708 TheField: CARDINAL; VAR FieldPtr: ScrnTypes.InputFieldPtr );
  755. 709 VAR
  756. 710 TmpSize, TypeCode: CARDINAL;
  757. 711 BEGIN
  758. 712 GenLists.GetElmtAdr( TheFrame^.FieldList, TheField,
  759. 713 FieldPtr, TmpSize, TypeCode );
  760. 714 END GetFieldPtr;
  761. 715
  762. 716
  763. 717 PROCEDURE GetFieldRec( TheFrame: ScrnTypes.DisplayFrame;
  764. 718 TheField: CARDINAL; VAR FieldRec:
  765. 719 ScrnTypes.InputFieldRecord );
  766. 720 VAR
  767. 721 TypeCode: CARDINAL;
  768. 722 BEGIN
  769. 723 GenLists.GetElmt( TheFrame^.FieldList, TheField,
  770. 724 FieldRec, TypeCode );
  771. 725 END GetFieldRec;
  772. 726
  773. 727
  774. 728 PROCEDURE GetFieldText( TheFrame: ScrnTypes.DisplayFrame;
  775. 729 TheField: CARDINAL; VAR TheText: ARRAY OF CHAR );
  776. 730 VAR
  777. 731 ImagePtr: ScrnTypes.ImageElmtPtr;
  778. 732 BEGIN
  779. 733 GetFieldImagePtr( TheFrame, TheField, ImagePtr );
  780. 734 M2Strings.Assign( ImagePtr^.text, TheText );
  781. 735 END GetFieldText;
  782. 736
  783. 737
  784. 738 PROCEDURE GetImagePtr( TheFrame: ScrnTypes.DisplayFrame;
  785. 739 ImageNum: CARDINAL; VAR ImagePtr: ScrnTypes.ImageElmtPtr );
  786. 740 VAR
  787. 741 TmpSize, TypeCode: CARDINAL;
  788. 742 BEGIN
  789. 743 GenLists.GetElmtAdr( TheFrame^.ImageList, ImageNum,
  790. 744 ImagePtr, TmpSize, TypeCode );
  791. 745 END GetImagePtr;
  792. 746
  793. 747
  794. 748 PROCEDURE GetImageRec( TheFrame: ScrnTypes.DisplayFrame;
  795. 749 ImageNum: CARDINAL; VAR ImageRec: ScrnTypes.ImageElement );
  796. 750 VAR
  797. 751 TypeCode: CARDINAL;
  798. 752 BEGIN
  799. 753 GenLists.GetElmt( TheFrame^.ImageList, ImageNum,
  800. 754 ImageRec, TypeCode );
  801. 755 DecodeImageRec( ImageRec );
  802. 756 END GetImageRec;
  803. 757
  804. 758
  805. 759 PROCEDURE GetIntField( TheFrame: ScrnTypes.DisplayFrame;
  806. 760 TheField: CARDINAL; VAR TheInt: INTEGER );
  807. 761 VAR
  808. 762 tmpstr: ARRAY [0..79] OF CHAR;
  809. 763 BEGIN
  810. 764 GetFieldText( TheFrame, TheField, tmpstr );
  811. 765 IF NOT StrConv.StrToInteger( tmpstr, 0, TheInt ) THEN
  812. 766 TheInt := 0;
  813. 767 END;
  814. 768 END GetIntField;
  815. 769
  816. 770
  817. 771 PROCEDURE GetLongIntField( TheFrame: ScrnTypes.DisplayFrame;
  818. 772 TheField: CARDINAL; VAR TheLongInt: LONGINT );
  819. 773 VAR
  820. 774 tmpstr: ARRAY [0..79] OF CHAR;
  821. 775 BEGIN
  822. 776 GetFieldText( TheFrame, TheField, tmpstr );
  823. 777 IF NOT StrConv.StrToLongInteger( tmpstr, 0, TheLongInt ) THEN
  824. 778 TheLongInt := NumTypes.L0;
  825. 779 END;
  826. 780 END GetLongIntField;
  827. 781
  828. 782
  829. 783 PROCEDURE GetVisibleArea( TheFrame: ScrnTypes.DisplayFrame; VAR
  830. 784 VisibleArea: Rectangles.ARectangle );
  831. 785 (* Gets physical screen coordinates of visible part of frame. *)
  832. 786 BEGIN
  833. 787 Rectangles.DefineRectangle( VisibleArea,
  834. 788 TheFrame^.startcol, TheFrame^.startrow,
  835. 789 TheFrame^.endcol, TheFrame^.endrow );
  836. 790 INC( VisibleArea.col1 );
  837. 791 INC( VisibleArea.row1 );
  838. 792 INC( VisibleArea.col2 );
  839. 793 INC( VisibleArea.row2 );
  840. 794 IF BoxInFrame( TheFrame ) THEN
  841. 795 INC( VisibleArea.col1 );
  842. 796 INC( VisibleArea.row1 );
  843. 797 DEC( VisibleArea.col2 );
  844. 798 DEC( VisibleArea.row2 );
  845. 799 END;
  846. 800 IF UserOps.DoPrompting AND ((INTEGER(UserOps.PromptRow) =
  847. 801 VisibleArea.row2) OR (INTEGER(UserOps.PromptRow) =
  848. 802 VisibleArea.row2 - 1)) THEN
  849. 803 VisibleArea.row2 := UserOps.PromptRow - 1;
  850. 804 END;
  851. 805 END GetVisibleArea;
  852. 806
  853. 807
  854. 808 PROCEDURE InputFieldsAbove( TheFrame: ScrnTypes.DisplayFrame;
  855. 809 TheField: CARDINAL ): BOOLEAN;
  856. 810 (*We use this to determine whether a scrolling window
  857. 811 ought to be scrolled all the way to the top of the
  858. 812 frame--it should if there are no input fields above
  859. 813 it.*)
  860. 814 VAR
  861. 815 SavedRow: CARDINAL;
  862. 816 BEGIN
  863. 817 SavedRow := VirtualFieldRow( TheFrame, TheField );
  864. 818 DEC( TheField );
  865. 819 LOOP
  866. 820 IF TheField = 0 THEN
  867. 821 RETURN FALSE;
  868. 822 ELSIF SavedRow > VirtualFieldRow( TheFrame, TheField ) THEN
  869. 823 IF FieldType( TheFrame, TheField ) # ScrnTypes.DispCode THEN
  870. 824 RETURN TRUE;
  871. 825 END;
  872. 826 END;
  873. 827 DEC( TheField );
  874. 828 END;
  875. 829 END InputFieldsAbove;
  876. 830
  877. 831
  878. 832 PROCEDURE InputFieldsBelow( TheFrame: ScrnTypes.DisplayFrame;
  879. 833 TheField: CARDINAL ): BOOLEAN;
  880. 834 VAR
  881. 835 ListEnd, SavedRow : CARDINAL;
  882. 836 BEGIN
  883. 837 SavedRow := VirtualFieldRow( TheFrame, TheField );
  884. 838 ListEnd := FieldListTotal( TheFrame );
  885. 839 INC( TheField );
  886. 840 LOOP
  887. 841 IF TheField > ListEnd THEN
  888. 842 RETURN FALSE;
  889. 843 ELSIF SavedRow < VirtualFieldRow( TheFrame, TheField ) THEN
  890. 844 IF FieldType( TheFrame, TheField ) # ScrnTypes.DispCode THEN
  891. 845 RETURN TRUE;
  892. 846 END;
  893. 847 END;
  894. 848 INC( TheField );
  895. 849 END;
  896. 850 END InputFieldsBelow;
  897. 851
  898. 852
  899. 853 PROCEDURE InputFieldsToLeft( TheFrame: ScrnTypes.DisplayFrame;
  900. 854 TheField: CARDINAL ): BOOLEAN;
  901. 855 VAR
  902. 856 SavedCol : CARDINAL;
  903. 857 BEGIN
  904. 858 SavedCol := VirtualFieldCol( TheFrame, TheField );
  905. 859 DEC( TheField );
  906. 860 LOOP
  907. 861 IF TheField = 0 THEN
  908. 862 RETURN FALSE;
  909. 863 ELSIF SavedCol > VirtualFieldCol( TheFrame, TheField ) THEN
  910. 864 IF FieldType( TheFrame, TheField ) # ScrnTypes.DispCode THEN
  911. 865 RETURN TRUE;
  912. 866 END;
  913. 867 END;
  914. 868 DEC( TheField );
  915. 869 END;
  916. 870 END InputFieldsToLeft;
  917. 871
  918. 872
  919. 873 PROCEDURE InputFieldsToRight( TheFrame: ScrnTypes.DisplayFrame;
  920. 874 TheField: CARDINAL ): BOOLEAN;
  921. 875 VAR
  922. 876 ListEnd, SavedCol : CARDINAL;
  923. 877 BEGIN
  924. 878 SavedCol := VirtualFieldCol( TheFrame, TheField );
  925. 879 ListEnd := FieldListTotal( TheFrame );
  926. 880 INC( TheField );
  927. 881 LOOP
  928. 882 IF TheField > ListEnd THEN
  929. 883 RETURN FALSE;
  930. 884 ELSIF SavedCol < VirtualFieldCol( TheFrame, TheField ) THEN
  931. 885 IF FieldType( TheFrame, TheField ) # ScrnTypes.DispCode THEN
  932. 886 RETURN TRUE;
  933. 887 END;
  934. 888 END;
  935. 889 INC( TheField );
  936. 890 END;
  937. 891 END InputFieldsToRight;
  938. 892
  939. 893
  940. 894 PROCEDURE ListFromEdField( TheFrame: ScrnTypes.DisplayFrame;
  941. 895 TheField: CARDINAL; VAR TheList: GenLists.GenList ):
  942. 896 BOOLEAN;
  943. 897 VAR
  944. 898 FieldRec: ScrnTypes.InputFieldRecord;
  945. 899 BEGIN
  946. 900 GetFieldRec( TheFrame, TheField, FieldRec );
  947. 901 IF (FieldRec.typ = ScrnTypes.EditorCode) AND
  948. 902 (FieldRec.EdFieldNum > 0) THEN
  949. 903 GenLists.GetChildList( TheFrame^.EdFieldList, FieldRec.EdFieldNum,
  950. 904 TheList );
  951. 905 RETURN GenLists.Initialized( TheList);
  952. 906 ELSE
  953. 907 RETURN FALSE;
  954. 908 END;
  955. 909 END ListFromEdField;
  956. 910
  957. 911
  958. 912 PROCEDURE ListToEdField( TheList: GenLists.GenList; TheFrame:
  959. 913 ScrnTypes.DisplayFrame; TheField: CARDINAL ): BOOLEAN;
  960. 914 VAR
  961. 915 FieldRec: ScrnTypes.InputFieldRecord;
  962. 916 BEGIN
  963. 917 GetFieldRec( TheFrame, TheField, FieldRec );
  964. 918 IF (FieldRec.typ = ScrnTypes.EditorCode) AND
  965. 919 (FieldRec.EdFieldNum > 0) THEN
  966. 920 GenLists.ListReplace( TheList, GenLists.ListCode,
  967. 921 TheFrame^.EdFieldList, FieldRec.EdFieldNum );
  968. 922 RETURN TRUE;
  969. 923 ELSE
  970. 924 RETURN FALSE;
  971. 925 END;
  972. 926 END ListToEdField;
  973. 927
  974. 928
  975. 929 PROCEDURE MakeFieldDataList( TheFrame: ScrnTypes.DisplayFrame;
  976. 930 TheField: CARDINAL; FieldDataList: GenLists.GenList );
  977. 931 VAR
  978. 932 TmpList: GenLists.GenList;
  979. 933 FieldPtr: ScrnTypes.InputFieldPtr;
  980. 934 BEGIN
  981. 935 IF NOT GetFieldDataList( TheFrame, TheField, TmpList ) THEN
  982. 936 GetFieldPtr( TheFrame, TheField, FieldPtr );
  983. 937 GenLists.ListInsert( FieldPtr^.fnam, GenLists.StrCode,
  984. 938 TheFrame^.DataList, AfterLastElmt );
  985. 939 GenLists.ListInsert( FieldDataList, GenLists.ListCode,
  986. 940 TheFrame^.DataList, AfterLastElmt );
  987. 941 END;
  988. 942 END MakeFieldDataList;
  989. 943
  990. 944
  991. 945 PROCEDURE NumberOfChoices( TheFrame: ScrnTypes.DisplayFrame;
  992. 946 TheField: CARDINAL ): CARDINAL;
  993. 947 VAR
  994. 948 FieldPtr: ScrnTypes.InputFieldPtr;
  995. 949 BEGIN
  996. 950 GetFieldPtr( TheFrame, TheField, FieldPtr );
  997. 951 RETURN FieldPtr^.GroupSize;
  998. 952 END NumberOfChoices;
  999. 953
  1000. 954
  1001. 955 PROCEDURE NumberOfImages( TheFrame: ScrnTypes.DisplayFrame ):
  1002. 956 CARDINAL;
  1003. 957 BEGIN
  1004. 958 IF NOT GenLists.Initialized( TheFrame^.ImageList ) THEN
  1005. 959 RETURN 0;
  1006. 960 ELSE
  1007. 961 RETURN GenLists.ListLength( TheFrame^.ImageList );
  1008. 962 END;
  1009. 963 END NumberOfImages;
  1010. 964
  1011. 965
  1012. 966 PROCEDURE FieldNum( TheFrame: ScrnTypes.DisplayFrame; FieldName:
  1013. 967 ARRAY OF CHAR ): CARDINAL;
  1014. 968 (*Takes a field name and returns its number; 0 means name
  1015. 969 not found.*)
  1016. 970 VAR
  1017. 971 ListEnd, cnt : CARDINAL;
  1018. 972 msg: ARRAY [0..79] OF CHAR;
  1019. 973 TmpPtr: ScrnTypes.InputFieldPtr;
  1020. 974 BEGIN
  1021. 975 StrEdit.CAPstr(FieldName);
  1022. 976 (* make search case-insensitive *)
  1023. 977 StrEdit.DeleteChar( ' ', FieldName );
  1024. 978 (*Delete all blanks from FieldName--ScreenCompile deletes
  1025. 979 them from the actual field names.*)
  1026. 980 cnt := 1;
  1027. 981 ListEnd := FieldListTotal( TheFrame );
  1028. 982 WHILE cnt <= ListEnd DO
  1029. 983 GetFieldPtr( TheFrame, cnt, TmpPtr );
  1030. 984 IF PosUtils.Equal( FieldName, TmpPtr^.fnam ) THEN
  1031. 985 TheFrame^.CurrentField := cnt;
  1032. 986 RETURN cnt;
  1033. 987 ELSE
  1034. 988 INC( cnt );
  1035. 989 END;
  1036. 990 END;
  1037. 991 (*
  1038. 992
  1039. 993 Commented out on 6 Dec 88.
  1040. 994
  1041. 995 StrEdit.AssignStr( ' is not a field in frame ', msg );
  1042. 996 StrEdit.Append( msg, TheFrame^.ThisFrame );
  1043. 997 M2Strings.Insert( FieldName, msg, 0 );
  1044. 998 IF TheFrame^.FromFile # NIL THEN
  1045. 999 StrEdit.Append( msg, ' of file ' );
  1046. 1000 StrEdit.Append( msg, TheFrame^.FromFile^.name );
  1047. 1001 END;
  1048. 1002 ErrorManager.WARN( msg );
  1049. 1003 *)
  1050. 1004 RETURN 0;
  1051. 1005 END FieldNum;
  1052. 1006
  1053. 1007
  1054. 1008 PROCEDURE PartOutside( FrameRec: ScrnTypes.DisplayFrame; VAR
  1055. 1009 VisibleArea: Rectangles.ARectangle; direction:
  1056. 1010 VWindows.Compass ): CARDINAL;
  1057. 1011 VAR
  1058. 1012 height, width, VHeight : CARDINAL;
  1059. 1013 BEGIN
  1060. 1014 height := (VisibleArea.row2 - VisibleArea.row1) + 1;
  1061. 1015 width := (VisibleArea.col2 - VisibleArea.col1) + 1;
  1062. 1016 CASE direction OF
  1063. 1017 VWindows.South:
  1064. 1018 WITH FrameRec^ DO
  1065. 1019 IF NOT BoxInFrame(FrameRec) THEN
  1066. 1020 VHeight := VirtualHeight - headline
  1067. 1021 ELSIF headline = 0 THEN
  1068. 1022 (* compensate for bottom line of box *)
  1069. 1023 VHeight := VirtualHeight - 1;
  1070. 1024 ELSE
  1071. 1025 (* compensation for top and bottom lines of box cancel *)
  1072. 1026 VHeight := VirtualHeight - headline;
  1073. 1027 END (* if no box *);
  1074. 1028 IF (VHeight - RowsScrolled) <= height THEN
  1075. 1029 RETURN 0;
  1076. 1030 ELSE
  1077. 1031 RETURN (VHeight - height) - RowsScrolled;
  1078. 1032 END;
  1079. 1033 END (* with FrameRec^ *);
  1080. 1034 | VWindows.North:
  1081. 1035 RETURN FrameRec^.RowsScrolled;
  1082. 1036 | VWindows.East:
  1083. 1037 IF (FrameRec^.VirtualWidth - FrameRec^.ColsScrolled) <= width THEN
  1084. 1038 RETURN 0;
  1085. 1039 END;
  1086. 1040 RETURN (FrameRec^.VirtualWidth - width) - FrameRec^.ColsScrolled;
  1087. 1041 | VWindows.West:
  1088. 1042 RETURN FrameRec^.ColsScrolled;
  1089. 1043 END;
  1090. 1044 RETURN 0;
  1091. 1045 END PartOutside;
  1092. 1046
  1093. 1047
  1094. 1048 PROCEDURE PutEdRec( FrameRec: ScrnTypes.DisplayFrame; FieldNum:
  1095. 1049 CARDINAL; VAR TheList: GenLists.GenList; VAR Rec:
  1096. 1050 VEditor.AnEdControlRec );
  1097. 1051 (*Note that this does not update the column and row
  1098. 1052 coordinates stored in the field list and image list.
  1099. 1053 That's intentional. The EdControlRec has to have absolute
  1100. 1054 window coordinates, not frame-relative coordinates.*)
  1101. 1055 VAR
  1102. 1056 FieldRec: ScrnTypes.InputFieldRecord;
  1103. 1057 BEGIN
  1104. 1058 GetFieldRec( FrameRec, FieldNum, FieldRec );
  1105. 1059 IF FieldRec.typ # ScrnTypes.EditorCode THEN
  1106. 1060 ErrorNames.WarningName( 'BadFld' );
  1107. 1061 RETURN;
  1108. 1062 END;
  1109. 1063 GenLists.ListReplace( TheList, GenLists.ListCode,
  1110. 1064 FrameRec^.EdFieldList, FieldRec.EdFieldNum );
  1111. 1065 FieldRec.TextRow1 := Rec.TextRow1;
  1112. 1066 FieldRec.CursorCol := Rec.CursorCol;
  1113. 1067 FieldRec.CursorRow := Rec.CursorRow;
  1114. 1068 FieldRec.MaxLines := Rec.MaxLines;
  1115. 1069 FieldRec.ChangeMade := Rec.ChangeMade;
  1116. 1070 FieldRec.ReadOnly := Rec.ReadOnly;
  1117. 1071 PutFieldRec( FieldRec, FrameRec, FieldNum );
  1118. 1072 END PutEdRec;
  1119. 1073
  1120. 1074
  1121. 1075 PROCEDURE PutFieldImageRec( ImageRec:
  1122. 1076 ScrnTypes.ImageElement; VAR TheFrame:
  1123. 1077 ScrnTypes.DisplayFrame; TheField: CARDINAL );
  1124. 1078 BEGIN
  1125. 1079 EncodeImageRec( ImageRec );
  1126. 1080 GenLists.ListReplace( ImageRec, GenLists.StrCode, TheFrame^.ImageList,
  1127. 1081 FieldImageNum(TheFrame, TheField) );
  1128. 1082 END PutFieldImageRec;
  1129. 1083
  1130. 1084
  1131. 1085 PROCEDURE PutFieldRec( VAR FieldRec:
  1132. 1086 ScrnTypes.InputFieldRecord; VAR TheFrame:
  1133. 1087 ScrnTypes.DisplayFrame; TheField: CARDINAL );
  1134. 1088 VAR
  1135. 1089 cnt, ImageListEnd: CARDINAL;
  1136. 1090 ImageRec: ScrnTypes.ImageElement;
  1137. 1091 BEGIN
  1138. 1092 IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN
  1139. 1093 GenLists.NewList( TheFrame^.FieldList );
  1140. 1094 PutFrameLists( TheFrame );
  1141. 1095 (* Make sure the new FieldList gets inserted into
  1142. 1096 TheFrame's .self list. *)
  1143. 1097 END;
  1144. 1098 IF TheField <= GenLists.ListLength( TheFrame^.FieldList ) THEN
  1145. 1099 GenLists.ListReplace( FieldRec, ScrnTypes.FieldTypeCode,
  1146. 1100 TheFrame^.FieldList, TheField );
  1147. 1101 ELSE
  1148. 1102 GenLists.ListInsert( FieldRec, ScrnTypes.FieldTypeCode,
  1149. 1103 TheFrame^.FieldList, TheField );
  1150. 1104 (* Now everything in the ImageList with a FieldNum
  1151. 1105 greater than or equal to TheField has to have its
  1152. 1106 field number incremented. *)
  1153. 1107 ImageListEnd := NumberOfImages( TheFrame );
  1154. 1108 FOR cnt := 1 TO ImageListEnd DO
  1155. 1109 GetImageRec( TheFrame, cnt, ImageRec );
  1156. 1110 IF ImageRec.field > TheField THEN
  1157. 1111 INC( ImageRec.field );
  1158. 1112 EncodeImageRec( ImageRec );
  1159. 1113 GenLists.ListReplace( ImageRec, GenLists.StrCode,
  1160. 1114 TheFrame^.ImageList, cnt );
  1161. 1115 END;
  1162. 1116 END;
  1163. 1117 END;
  1164. 1118 END PutFieldRec;
  1165. 1119
  1166. 1120
  1167. 1121 PROCEDURE PutFrameLists( VAR TheFrame: ScrnTypes.DisplayFrame );
  1168. 1122 BEGIN
  1169. 1123 GenLists.ListReplace( TheFrame^.DataList,
  1170. 1124 GenLists.ListCode, TheFrame^.self, 5 );
  1171. 1125 GenLists.ListReplace( TheFrame^.PromptList,
  1172. 1126 GenLists.ListCode, TheFrame^.self, 6 );
  1173. 1127 GenLists.ListReplace( TheFrame^.HelpList,
  1174. 1128 GenLists.ListCode, TheFrame^.self, 7 );
  1175. 1129 GenLists.ListReplace( TheFrame^.EdFieldList,
  1176. 1130 GenLists.ListCode, TheFrame^.self, 8 );
  1177. 1131 GenLists.ListReplace( TheFrame^.FieldList,
  1178. 1132 GenLists.ListCode, TheFrame^.self, 9 );
  1179. 1133 GenLists.ListReplace( TheFrame^.ImageList,
  1180. 1134 GenLists.ListCode, TheFrame^.self, 10 );
  1181. 1135 GenLists.ListReplace( TheFrame^.LinkedFrames,
  1182. 1136 GenLists.ListCode, TheFrame^.self, 11 );
  1183. 1137 END PutFrameLists;
  1184. 1138
  1185. 1139
  1186. 1140 PROCEDURE RelativeFieldCol( TheFrame: ScrnTypes.DisplayFrame;
  1187. 1141 FieldNum: CARDINAL ): CARDINAL;
  1188. 1142 VAR
  1189. 1143 vcol : CARDINAL;
  1190. 1144 BEGIN
  1191. 1145 vcol := VirtualFieldCol( TheFrame, FieldNum );
  1192. 1146 (*
  1193. 1147 IF vcol < TheFrame^.ColsScrolled THEN
  1194. 1148 Diagnostics.diagC( 'Scrolling error. vcol', vcol );
  1195. 1149 END;
  1196. 1150 *)
  1197. 1151 RETURN vcol - TheFrame^.ColsScrolled;
  1198. 1152 END RelativeFieldCol;
  1199. 1153
  1200. 1154
  1201. 1155 PROCEDURE RelativeFieldRow( TheFrame: ScrnTypes.DisplayFrame;
  1202. 1156 FieldNum: CARDINAL ): CARDINAL;
  1203. 1157 VAR
  1204. 1158 vrow : CARDINAL;
  1205. 1159 BEGIN
  1206. 1160 vrow := VirtualFieldRow( TheFrame, FieldNum );
  1207. 1161 (*
  1208. 1162 IF vrow < TheFrame^.RowsScrolled THEN
  1209. 1163 Diagnostics.diagC( 'Scrolling error. RowsScrolled', TheFrame^.RowsScrolled );
  1210. 1164 Diagnostics.diagC( 'Scrolling error. vrow', vrow );
  1211. 1165 END;
  1212. 1166 *)
  1213. 1167 RETURN vrow - TheFrame^.RowsScrolled;
  1214. 1168 END RelativeFieldRow;
  1215. 1169
  1216. 1170
  1217. 1171 PROCEDURE ResetFieldPtr( VAR TheFrame: ScrnTypes.DisplayFrame);
  1218. 1172 VAR
  1219. 1173 dumptr: ScrnTypes.InputFieldPtr;
  1220. 1174 BEGIN
  1221. 1175 TheFrame^.CurrentField := 0;
  1222. 1176 GetFieldPtr( TheFrame, 1, dumptr );
  1223. 1177 END ResetFieldPtr;
  1224. 1178
  1225. 1179
  1226. 1180 PROCEDURE SelectedChar( TheFrame: ScrnTypes.DisplayFrame ):
  1227. 1181 CHAR;
  1228. 1182 VAR
  1229. 1183 FieldRec: ScrnTypes.InputFieldRecord;
  1230. 1184 BEGIN
  1231. 1185 GetFieldRec( TheFrame, TheFrame^.CurrentField, FieldRec );
  1232. 1186 IF FieldRec.typ = ScrnTypes.GotoCode THEN
  1233. 1187 IF FieldRec.MenuKey <= 255 THEN
  1234. 1188 RETURN CHR(FieldRec.MenuKey);
  1235. 1189 END;
  1236. 1190 ELSIF FieldRec.typ = ScrnTypes.GroupMember THEN
  1237. 1191 IF FieldRec.ChoiceKey <= 255 THEN
  1238. 1192 RETURN CHR(FieldRec.ChoiceKey);
  1239. 1193 END;
  1240. 1194 END;
  1241. 1195 RETURN 0C;
  1242. 1196 END SelectedChar;
  1243. 1197
  1244. 1198
  1245. 1199 PROCEDURE SetBorderColors( TheFrame: ScrnTypes.DisplayFrame );
  1246. 1200 BEGIN
  1247. 1201 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1248. 1202 TheFrame^.bordfor );
  1249. 1203 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1250. 1204 TheFrame^.bordbak );
  1251. 1205 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1252. 1206 TheFrame^.bordatrb );
  1253. 1207 END SetBorderColors;
  1254. 1208
  1255. 1209
  1256. 1210 PROCEDURE SetCurrentField( VAR TheFrame: ScrnTypes.DisplayFrame;
  1257. 1211 FieldNum: CARDINAL );
  1258. 1212 VAR
  1259. 1213 ImagePtr: ScrnTypes.ImageElmtPtr;
  1260. 1214 BEGIN
  1261. 1215 IF (FieldNum < 1) OR (FieldNum > FieldListTotal(TheFrame)) THEN
  1262. 1216 RETURN;
  1263. 1217 END;
  1264. 1218 GetFieldImagePtr( TheFrame, FieldNum, ImagePtr );
  1265. 1219 (*Make sure the list pointers are correct.*)
  1266. 1220 TheFrame^.CurrentField := FieldNum;
  1267. 1221 END SetCurrentField;
  1268. 1222
  1269. 1223
  1270. 1224 PROCEDURE SetFieldColors( TheFrame: ScrnTypes.DisplayFrame;
  1271. 1225 FieldNum: CARDINAL );
  1272. 1226 VAR
  1273. 1227 ImageRec: ScrnTypes.ImageElement;
  1274. 1228 BEGIN
  1275. 1229 GetFieldImageRec( TheFrame, FieldNum, ImageRec );
  1276. 1230 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1277. 1231 ImageRec.foreg );
  1278. 1232 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1279. 1233 ImageRec.backg );
  1280. 1234 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1281. 1235 ImageRec.atrb );
  1282. 1236 END SetFieldColors;
  1283. 1237
  1284. 1238
  1285. 1239 PROCEDURE SetMessageColors( TheFrame: ScrnTypes.DisplayFrame );
  1286. 1240 BEGIN
  1287. 1241 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1288. 1242 TheFrame^.msgfor );
  1289. 1243 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1290. 1244 TheFrame^.msgbak );
  1291. 1245 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1292. 1246 TheFrame^.msgatrb );
  1293. 1247 END SetMessageColors;
  1294. 1248
  1295. 1249
  1296. 1250 PROCEDURE SetNormalColors( TheFrame: ScrnTypes.DisplayFrame );
  1297. 1251 BEGIN
  1298. 1252 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1299. 1253 TheFrame^.normfor );
  1300. 1254 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1301. 1255 TheFrame^.normbak );
  1302. 1256 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1303. 1257 TheFrame^.normatrb );
  1304. 1258 END SetNormalColors;
  1305. 1259
  1306. 1260
  1307. 1261 PROCEDURE SetPointerBarColors( TheFrame: ScrnTypes.DisplayFrame
  1308. 1262 );
  1309. 1263 BEGIN
  1310. 1264 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1311. 1265 TheFrame^.pbfor );
  1312. 1266 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1313. 1267 TheFrame^.pbbak );
  1314. 1268 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1315. 1269 TheFrame^.pbatrb );
  1316. 1270 END SetPointerBarColors;
  1317. 1271
  1318. 1272
  1319. 1273 PROCEDURE SetPromptColors( TheFrame: ScrnTypes.DisplayFrame );
  1320. 1274 BEGIN
  1321. 1275 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1322. 1276 TheFrame^.promfor );
  1323. 1277 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1324. 1278 TheFrame^.prombak );
  1325. 1279 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1326. 1280 TheFrame^.promatrb );
  1327. 1281 END SetPromptColors;
  1328. 1282
  1329. 1283
  1330. 1284 PROCEDURE SetSelCharColors( TheFrame: ScrnTypes.DisplayFrame;
  1331. 1285 FieldNum: CARDINAL );
  1332. 1286 VAR
  1333. 1287 fore : MsColors.AColor;
  1334. 1288 attr : MsColors.AMonoAttribute;
  1335. 1289 ImageRec: ScrnTypes.ImageElement;
  1336. 1290 BEGIN
  1337. 1291 GetFieldImageRec( TheFrame, FieldNum, ImageRec );
  1338. 1292 CASE ORD(ImageRec.foreg) OF
  1339. 1293 0, 3 :
  1340. 1294 fore := MsColors.red;
  1341. 1295 | 1, 2, 4..7 :
  1342. 1296 fore := MsColors.AColor( CHR(ORD(ImageRec.foreg) + 8) );
  1343. 1297 | 8..15:
  1344. 1298 fore := MsColors.AColor( CHR(ORD(ImageRec.foreg) - 1) );
  1345. 1299 END;
  1346. 1300 IF ImageRec.atrb # MsColors.bold THEN
  1347. 1301 attr := MsColors.bold;
  1348. 1302 ELSE
  1349. 1303 attr := MsColors.plain;
  1350. 1304 END;
  1351. 1305 IF fore = TheFrame^.pbbak THEN
  1352. 1306 IF fore <= 2C THEN
  1353. 1307 fore := CHR( ORD(fore) + 3 );
  1354. 1308 ELSE
  1355. 1309 fore := CHR( ORD(fore) - 3 );
  1356. 1310 END;
  1357. 1311 END;
  1358. 1312 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1359. 1313 fore );
  1360. 1314 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1361. 1315 ImageRec.backg );
  1362. 1316 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1363. 1317 attr );
  1364. 1318 END SetSelCharColors;
  1365. 1319
  1366. 1320
  1367. 1321 PROCEDURE SetSelectionColors( TheFrame: ScrnTypes.DisplayFrame
  1368. 1322 );
  1369. 1323 BEGIN
  1370. 1324 VWindows.SetForeColor( TheFrame^.WindowHandle,
  1371. 1325 TheFrame^.selfor );
  1372. 1326 VWindows.SetBackColor( TheFrame^.WindowHandle,
  1373. 1327 TheFrame^.selbak );
  1374. 1328 VWindows.SetMonoAttr( TheFrame^.WindowHandle,
  1375. 1329 TheFrame^.selatrb );
  1376. 1330 END SetSelectionColors;
  1377. 1331
  1378. 1332
  1379. 1333 PROCEDURE VirtualFieldCol( TheFrame: ScrnTypes.DisplayFrame;
  1380. 1334 FieldNum: CARDINAL ): CARDINAL;
  1381. 1335 VAR
  1382. 1336 tmp: CARDINAL;
  1383. 1337 ImagePtr: ScrnTypes.ImageElmtPtr;
  1384. 1338 BEGIN
  1385. 1339 GetFieldImagePtr( TheFrame, FieldNum, ImagePtr );
  1386. 1340 tmp := ImagePtr^.col;
  1387. 1341 DecodeWord( tmp );
  1388. 1342 RETURN tmp;
  1389. 1343 END VirtualFieldCol;
  1390. 1344
  1391. 1345
  1392. 1346 PROCEDURE VirtualFieldRow( TheFrame: ScrnTypes.DisplayFrame;
  1393. 1347 FieldNum: CARDINAL ): CARDINAL;
  1394. 1348 VAR
  1395. 1349 tmp: CARDINAL;
  1396. 1350 ImagePtr: ScrnTypes.ImageElmtPtr;
  1397. 1351 BEGIN
  1398. 1352 GetFieldImagePtr( TheFrame, FieldNum, ImagePtr );
  1399. 1353 tmp := ImagePtr^.row;
  1400. 1354 DecodeWord( tmp );
  1401. 1355 RETURN tmp;
  1402. 1356 END VirtualFieldRow;
  1403. 1357
  1404. 1358
  1405. 1359 PROCEDURE VirtualImageCol( TheFrame: ScrnTypes.DisplayFrame;
  1406. 1360 ImageNum: CARDINAL ): CARDINAL;
  1407. 1361 VAR
  1408. 1362 tmp: CARDINAL;
  1409. 1363 ImagePtr: ScrnTypes.ImageElmtPtr;
  1410. 1364 BEGIN
  1411. 1365 GetImagePtr( TheFrame, ImageNum, ImagePtr );
  1412. 1366 tmp := ImagePtr^.col;
  1413. 1367 DecodeWord( tmp );
  1414. 1368 RETURN tmp;
  1415. 1369 END VirtualImageCol;
  1416. 1370
  1417. 1371
  1418. 1372 PROCEDURE VirtualImageRow( TheFrame: ScrnTypes.DisplayFrame;
  1419. 1373 ImageNum: CARDINAL ): CARDINAL;
  1420. 1374 VAR
  1421. 1375 tmp: CARDINAL;
  1422. 1376 ImagePtr: ScrnTypes.ImageElmtPtr;
  1423. 1377 BEGIN
  1424. 1378 GetImagePtr( TheFrame, ImageNum, ImagePtr );
  1425. 1379 tmp := ImagePtr^.row;
  1426. 1380 DecodeWord( tmp );
  1427. 1381 RETURN tmp;
  1428. 1382 END VirtualImageRow;
  1429. 1383
  1430. 1384
  1431. 1385 PROCEDURE WhichChoiceKey( TheFrame: ScrnTypes.DisplayFrame;
  1432. 1386 OneOfTheFields: CARDINAL ): CARDINAL;
  1433. 1387 VAR
  1434. 1388 TmpPtr: ScrnTypes.InputFieldPtr;
  1435. 1389 FieldNum: CARDINAL;
  1436. 1390 BEGIN
  1437. 1391 IF FieldType(TheFrame, OneOfTheFields) # ScrnTypes.GroupMember THEN
  1438. 1392 RETURN 0;
  1439. 1393 END;
  1440. 1394 FieldNum := FirstMember( TheFrame, OneOfTheFields );
  1441. 1395 REPEAT
  1442. 1396 GetFieldPtr( TheFrame, FieldNum, TmpPtr );
  1443. 1397 IF TmpPtr^.selected THEN
  1444. 1398 RETURN TmpPtr^.ChoiceKey;
  1445. 1399 ELSE
  1446. 1400 INC( FieldNum );
  1447. 1401 END;
  1448. 1402 UNTIL TmpPtr^.GroupID = TmpPtr^.GroupSize;
  1449. 1403 RETURN 0;
  1450. 1404 END WhichChoiceKey;
  1451. 1405
  1452. 1406
  1453. 1407 PROCEDURE WhichChoiceNum( TheFrame: ScrnTypes.DisplayFrame;
  1454. 1408 OneOfTheFields: CARDINAL ): CARDINAL;
  1455. 1409 VAR
  1456. 1410 TmpPtr: ScrnTypes.InputFieldPtr;
  1457. 1411 FieldNum: CARDINAL;
  1458. 1412 BEGIN
  1459. 1413 IF FieldType(TheFrame, OneOfTheFields) # ScrnTypes.GroupMember THEN
  1460. 1414 RETURN 0;
  1461. 1415 END;
  1462. 1416 FieldNum := FirstMember( TheFrame, OneOfTheFields );
  1463. 1417 REPEAT
  1464. 1418 GetFieldPtr( TheFrame, FieldNum, TmpPtr );
  1465. 1419 IF TmpPtr^.selected THEN
  1466. 1420 RETURN TmpPtr^.GroupID;
  1467. 1421 ELSE
  1468. 1422 INC( FieldNum );
  1469. 1423 END;
  1470. 1424 UNTIL TmpPtr^.GroupID = TmpPtr^.GroupSize;
  1471. 1425 RETURN FirstMember( TheFrame, OneOfTheFields );
  1472. 1426 END WhichChoiceNum;
  1473. 1427
  1474. 1428
  1475. 1429 PROCEDURE WriteBetween( TheWindow: VWindows.AWindowHandle;
  1476. 1430 TheStr: ARRAY OF CHAR; col1, row1, col2, row2: CARDINAL );
  1477. 1431 (*Used for writing centered captions on frame borders.*)
  1478. 1432 VAR
  1479. 1433 lngth, width: CARDINAL;
  1480. 1434 BEGIN
  1481. 1435 lngth := M2Strings.Length( TheStr );
  1482. 1436 width := (col2 - col1) - 1;
  1483. 1437 IF lngth > width THEN
  1484. 1438 StrEdit.SetLength( TheStr, width );
  1485. 1439 lngth := width;
  1486. 1440 END;
  1487. 1441 VWindows.DrawStr( TheWindow, col1 + ((width - lngth) DIV 2) + 1,
  1488. 1442 row1, SYSTEM.ADR(TheStr), lngth );
  1489. 1443 END WriteBetween;
  1490. 1444
  1491. 1445
  1492. 1446 PROCEDURE WriteScrollMarks( TheFrame: ScrnTypes.DisplayFrame );
  1493. 1447 BEGIN
  1494. 1448 WITH TheFrame^ DO
  1495. 1449 IF NOT BoxInFrame( TheFrame ) THEN
  1496. 1450 (*There's no box around the window, so we don't have
  1497. 1451 any place to put our scroll marks.*)
  1498. 1452 RETURN;
  1499. 1453 END;
  1500. 1454 IF (VirtualHeight > (endrow - startrow) + 1) THEN
  1501. 1455 VWindows.SetScrollRange( TheFrame^.WindowHandle,
  1502. 1456 VWindows.SbVert, TheFrame^.startrow + 1,
  1503. 1457 TheFrame^.endrow + 1 );
  1504. 1458 VWindows.SetScrollPos( TheFrame^.WindowHandle,
  1505. 1459 VWindows.SbVert, TheFrame^.RowsScrolled );
  1506. 1460 END;
  1507. 1461 IF (VirtualWidth > (endcol - startcol) + 1) THEN
  1508. 1462 VWindows.SetScrollRange( TheFrame^.WindowHandle,
  1509. 1463 VWindows.SbHorz, TheFrame^.startcol + 1,
  1510. 1464 TheFrame^.endcol + 1 );
  1511. 1465 VWindows.SetScrollPos( TheFrame^.WindowHandle,
  1512. 1466 VWindows.SbHorz, TheFrame^.ColsScrolled );
  1513. 1467 END;
  1514. 1468 (*If neither of the two preceding IF's were
  1515. 1469 executed, the frame fits entirely within the
  1516. 1470 window; no need to write scroll marks.*)
  1517. 1471 END;
  1518. 1472 END WriteScrollMarks;
  1519. 1473
  1520. 1474
  1521. 1475 BEGIN
  1522. 1476 Initialized := FALSE;
  1523. 1477 Init();
  1524. 1478 END ScrnUtl1.
  1525. 45 errors