CONTROLU.MOD 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. IMPLEMENTATION MODULE ControlUtils;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/controlu.mov 1.5 10 Mar 1991 15:25:34 coleb $
  12. *
  13. *)
  14. IMPORT DspFiles;
  15. IMPORT ErrorManager;
  16. IMPORT ErrorNames;
  17. IMPORT FrameManager;
  18. IMPORT FramePainter;
  19. IMPORT GenLists;
  20. IMPORT InputManager;
  21. IMPORT LowLevel;
  22. IMPORT M2Strings;
  23. IMPORT MsColors;
  24. IMPORT NdxBones;
  25. IMPORT Numbers;
  26. IMPORT PosUtils;
  27. IMPORT Rectangles;
  28. IMPORT ScrnTypes;
  29. IMPORT ScrnUtl1;
  30. IMPORT ScrnUtl2;
  31. IMPORT StrConv;
  32. IMPORT StrEdit;
  33. IMPORT SYSTEM;
  34. IMPORT VEditor;
  35. IMPORT VWindows;
  36. VAR
  37. Initialized : BOOLEAN;
  38. PROCEDURE Init();
  39. BEGIN
  40. IF Initialized THEN
  41. RETURN;
  42. ELSE
  43. Initialized := TRUE;
  44. END;
  45. DspFiles.Init();
  46. ErrorManager.Init();
  47. ErrorNames.Init();
  48. FrameManager.Init();
  49. FramePainter.Init();
  50. GenLists.Init();
  51. InputManager.Init();
  52. LowLevel.Init();
  53. M2Strings.Init();
  54. MsColors.Init();
  55. NdxBones.Init();
  56. Numbers.Init();
  57. PosUtils.Init();
  58. Rectangles.Init();
  59. ScrnTypes.Init();
  60. ScrnUtl1.Init();
  61. ScrnUtl2.Init();
  62. StrConv.Init();
  63. StrEdit.Init();
  64. VEditor.Init();
  65. VWindows.Init();
  66. END Init;
  67. CONST
  68. AfterLastElmt = 65535;
  69. PROCEDURE NotFieldWarning( FieldName, FrameName: ARRAY OF CHAR );
  70. VAR
  71. dumstr1: ARRAY [0..79] OF CHAR;
  72. BEGIN
  73. StrEdit.AssignStr( ' is not a field in frame ', dumstr1 );
  74. M2Strings.Insert( FieldName, dumstr1, 0 );
  75. StrEdit.Append( dumstr1, FrameName );
  76. ErrorManager.WARN( dumstr1 );
  77. END NotFieldWarning;
  78. PROCEDURE AddEditorField(VAR TheFrame : ScrnTypes.DisplayFrame;
  79. VAR TheList: GenLists.GenList; VAR ControlRec:
  80. VEditor.AnEdControlRec );
  81. VAR
  82. ImageNum: CARDINAL;
  83. TmpRec: ScrnTypes.ImageElement;
  84. FieldRec: ScrnTypes.InputFieldRecord;
  85. dumstr : ARRAY [0..1] OF CHAR;
  86. AreaInBox : Rectangles.ARectangle;
  87. BEGIN
  88. ControlRec.FrameRec := TheFrame;
  89. IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN
  90. GenLists.NewList( TheFrame^.FieldList );
  91. ScrnUtl1.PutFrameLists( TheFrame );
  92. (*Make sure the new FieldList gets inserted into
  93. TheFrame's .self list. *)
  94. END;
  95. IF NOT GenLists.Initialized( TheFrame^.EdFieldList ) THEN
  96. GenLists.NewList( TheFrame^.EdFieldList );
  97. ScrnUtl1.PutFrameLists( TheFrame );
  98. (*Make sure the new EdFieldList gets inserted into
  99. TheFrame's .self list. *)
  100. END;
  101. dumstr[0] := 0C;
  102. dumstr[1] := 0C;
  103. Rectangles.DefineRectangle( AreaInBox, ControlRec.Col1,
  104. ControlRec.Row1, ControlRec.Col2, ControlRec.Row2 );
  105. IF ControlRec.EntryBox > 0 THEN
  106. Rectangles.ShrinkRect( AreaInBox );
  107. END;
  108. ScrnUtl2.CreateImageElement( TmpRec, AreaInBox.col1,
  109. AreaInBox.row1, TheFrame^.normfor, TheFrame^.normbak,
  110. TheFrame^.normatrb, GenLists.ListLength(
  111. TheFrame^.FieldList ) + 1, dumstr );
  112. ScrnUtl2.AddImageElement( TheFrame, TmpRec, ImageNum );
  113. ScrnTypes.InitField( FieldRec );
  114. FieldRec.ImageNum := ImageNum;
  115. FieldRec.typ := ScrnTypes.EditorCode;
  116. FieldRec.req := FALSE;
  117. FieldRec.EdFieldNum := GenLists.ListLength( TheFrame^.EdFieldList ) + 1;
  118. GenLists.ListInsert( TheList, GenLists.ListCode, TheFrame^.EdFieldList,
  119. FieldRec.EdFieldNum );
  120. FieldRec.Col2 := AreaInBox.col2;
  121. FieldRec.Row2 := AreaInBox.row2;
  122. FieldRec.TextRow1 := ControlRec.TextRow1;
  123. FieldRec.CursorCol := ControlRec.CursorCol;
  124. FieldRec.CursorRow := ControlRec.CursorRow;
  125. FieldRec.MaxLines := ControlRec.MaxLines;
  126. FieldRec.ReadOnly := ControlRec.ReadOnly;
  127. ScrnUtl1.PutFieldRec( FieldRec, TheFrame, AfterLastElmt );
  128. IF TheFrame^.action = 'W' THEN
  129. TheFrame^.action := 'I';
  130. END;
  131. (* The action char is lower case while the frame is
  132. active. *)
  133. IF TheFrame^.action = 'w' THEN
  134. TheFrame^.action := 'i';
  135. END;
  136. END AddEditorField;
  137. PROCEDURE AddStrField(VAR TheFrame : ScrnTypes.DisplayFrame;
  138. Col, Row : CARDINAL; text : ARRAY OF CHAR; width: CARDINAL );
  139. VAR
  140. ImageNum: CARDINAL;
  141. TmpRec: ScrnTypes.ImageElement;
  142. FieldRec: ScrnTypes.InputFieldRecord;
  143. BEGIN
  144. IF M2Strings.Length(text) # width THEN
  145. StrEdit.LeftJustify( text, width );
  146. END;
  147. IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN
  148. GenLists.NewList( TheFrame^.FieldList );
  149. ScrnUtl1.PutFrameLists( TheFrame );
  150. (*Make sure the new FieldList gets inserted into
  151. TheFrame's .self list. *)
  152. END;
  153. ScrnUtl2.CreateImageElement( TmpRec, Col, Row, TheFrame^.normfor,
  154. TheFrame^.normbak, TheFrame^.normatrb, GenLists.ListLength(
  155. TheFrame^.FieldList ) + 1, text );
  156. ScrnUtl2.AddImageElement( TheFrame, TmpRec, ImageNum );
  157. ScrnTypes.InitField( FieldRec );
  158. FieldRec.ImageNum := ImageNum;
  159. FieldRec.typ := ScrnTypes.StringCode;
  160. FieldRec.req := FALSE;
  161. ScrnUtl1.PutFieldRec( FieldRec, TheFrame, AfterLastElmt );
  162. IF TheFrame^.action = 'W' THEN
  163. TheFrame^.action := 'I';
  164. END;
  165. (* The action char is lower case while the frame is
  166. active. *)
  167. IF TheFrame^.action = 'w' THEN
  168. TheFrame^.action := 'i';
  169. END;
  170. END AddStrField;
  171. PROCEDURE AddMenuItem( VAR TheFrame : ScrnTypes.DisplayFrame;
  172. Col, Row : CARDINAL; text : ARRAY OF CHAR; width, MenuKey: CARDINAL;
  173. ReturnVal : ARRAY OF CHAR );
  174. VAR
  175. FieldRec: ScrnTypes.InputFieldRecord;
  176. BEGIN
  177. AddStrField( TheFrame, Col, Row, text, width );
  178. ScrnUtl1.GetFieldRec( TheFrame, ScrnUtl1.FieldListTotal(TheFrame),
  179. FieldRec );
  180. FieldRec.typ := ScrnTypes.GotoCode;
  181. FieldRec.MenuKey := MenuKey;
  182. M2Strings.Assign( ReturnVal, FieldRec.ReturnVal );
  183. ScrnUtl1.PutFieldRec( FieldRec, TheFrame,
  184. ScrnUtl1.FieldListTotal(TheFrame) );
  185. IF TheFrame^.action = 'W' THEN
  186. TheFrame^.action := 'I';
  187. END;
  188. (* The action char is lower case while the frame is
  189. active. *)
  190. IF TheFrame^.action = 'w' THEN
  191. TheFrame^.action := 'i';
  192. END;
  193. END AddMenuItem;
  194. PROCEDURE ListBox( TheDspFile: ScrnTypes.DisplayFile;
  195. FormFrameName: ARRAY OF CHAR; TheList: GenLists.GenList;
  196. VAR ItemChosen: ARRAY OF CHAR; VAR NextFrame:
  197. ScrnTypes.AFrameName ): BOOLEAN;
  198. VAR
  199. TmpFrame: ScrnTypes.DisplayFrame;
  200. AnItemWasChosen: BOOLEAN;
  201. BEGIN
  202. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  203. DspFiles.ReadFrame( TheDspFile, TmpFrame, FormFrameName );
  204. ScrnUtl2.ChoiceListToFrame( TheList, TmpFrame );
  205. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  206. InputManager.ControlFrame( TmpFrame, 0, '', FALSE, NextFrame );
  207. AnItemWasChosen := (NextFrame[0] = 0C);
  208. (* Dangerous. We are relying here on knowlegde that
  209. ChoiceListToFrame makes '' the return value for each
  210. choice. *)
  211. ScrnUtl1.GetFieldText( TmpFrame,
  212. TmpFrame^.CurrentField, ItemChosen );
  213. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  214. RETURN AnItemWasChosen;
  215. END ListBox;
  216. PROCEDURE ChangeField(VAR TheFrame : ScrnTypes.DisplayFrame;
  217. TheStr : ARRAY OF CHAR; FieldName : ARRAY OF
  218. CHAR; PreserveLength: BOOLEAN);
  219. VAR
  220. padding: ARRAY [0..79] OF CHAR;
  221. OldLngth, NewLngth: CARDINAL;
  222. FieldPtr : ScrnTypes.InputFieldPtr;
  223. ImageRec: ScrnTypes.ImageElement;
  224. BEGIN
  225. IF NOT ScrnUtl1.FindField( TheFrame, FieldName,
  226. FieldPtr, ImageRec ) THEN
  227. NotFieldWarning( FieldName, TheFrame^.ThisFrame );
  228. END;
  229. FieldPtr^.ChangeMade := TRUE;
  230. IF PreserveLength THEN
  231. LowLevel.Fill( SYSTEM.ADR(padding), HIGH(padding) + 1, ' ' );
  232. OldLngth := M2Strings.Length( ImageRec.text );
  233. NewLngth := M2Strings.Length( TheStr );
  234. M2Strings.Assign(TheStr, ImageRec.text );
  235. IF OldLngth > NewLngth THEN
  236. StrEdit.SetLength( padding, OldLngth - NewLngth );
  237. StrEdit.Append( ImageRec.text, padding );
  238. ELSE
  239. StrEdit.SetLength( ImageRec.text, OldLngth );
  240. END;
  241. ELSE
  242. M2Strings.Assign(TheStr, ImageRec.text);
  243. END;
  244. ScrnUtl1.PutFieldImageRec( ImageRec, TheFrame, ImageRec.field );
  245. END ChangeField;
  246. PROCEDURE CheckFieldName( TheFrame: ScrnTypes.DisplayFrame; FieldName:
  247. ARRAY OF CHAR );
  248. (*Displays a warning message if it can't find FieldName in TheFrame.*)
  249. VAR
  250. FieldPtr: ScrnTypes.InputFieldPtr;
  251. ImageRec: ScrnTypes.ImageElement;
  252. BEGIN
  253. IF NOT ScrnUtl1.FindField( TheFrame, FieldName, FieldPtr, ImageRec ) THEN
  254. NotFieldWarning( FieldName, TheFrame^.ThisFrame );
  255. END;
  256. END CheckFieldName;
  257. PROCEDURE Control( TheFrame: ScrnTypes.DisplayFrame );
  258. VAR
  259. FrameName : ScrnTypes.AFrameName;
  260. (*This gets thrown away.*)
  261. BEGIN
  262. InputManager.ControlFrame( TheFrame, 0, '', FALSE, FrameName );
  263. END Control;
  264. PROCEDURE FrameListSpot( FrameName: ARRAY OF CHAR;
  265. FrameList: GenLists.GenList ): CARDINAL;
  266. VAR
  267. TypeCode, cnt, ListEnd: CARDINAL;
  268. TmpFrame: ScrnTypes.DisplayFrameRec;
  269. BEGIN
  270. cnt := 1;
  271. ListEnd := GenLists.ListLength( FrameList );
  272. WHILE cnt < ListEnd DO
  273. GenLists.GetElmt( FrameList, cnt, TmpFrame, TypeCode );
  274. IF PosUtils.Equal( TmpFrame.ThisFrame, FrameName ) THEN
  275. RETURN cnt;
  276. END;
  277. cnt := cnt + 2;
  278. END;
  279. RETURN 0;
  280. END FrameListSpot;
  281. PROCEDURE AddToFrameList( TheFrame: ScrnTypes.DisplayFrame;
  282. VAR FrameList: GenLists.GenList );
  283. VAR
  284. TmpList: GenLists.GenList;
  285. spot: CARDINAL;
  286. SavedFlag : BOOLEAN;
  287. BEGIN
  288. spot := FrameListSpot( TheFrame^.ThisFrame, FrameList );
  289. IF spot > 0 THEN
  290. (*A frame of this name is already in the FrameList. We can't just
  291. delete it and add the new copy because they probably share lists;
  292. look at how GetFrameFromList gives the gotten frame pointers
  293. directly into its own sublists.*)
  294. RETURN;
  295. END;
  296. TheFrame^.CurrentField := 1;
  297. SavedFlag := TheFrame^.SelfSharedWithFile;
  298. (* Added this SavedFlag thing on 2 Nov 88 at suggestion
  299. of John McMonagle to prevent memory loss problems. *)
  300. TheFrame^.SelfSharedWithFile := TRUE;
  301. (* We're using this to prevent ReadFrame from
  302. disposing of the .self list next time. *)
  303. GenLists.ListInsert( TheFrame^, 0, FrameList, AfterLastElmt );
  304. TheFrame^.SelfSharedWithFile := SavedFlag;
  305. GenLists.CopyList( TheFrame^.self, TmpList );
  306. (*We copy the self list so it won't go away when the
  307. ListBuf changes.*)
  308. GenLists.ListInsert( TmpList, GenLists.ListCode,
  309. FrameList, AfterLastElmt );
  310. END AddToFrameList;
  311. PROCEDURE DisposeFrameList( VAR FrameList: GenLists.GenList );
  312. VAR
  313. ListEnd, cnt, dumc, TypeCode: CARDINAL;
  314. TmpFrame: ScrnTypes.DisplayFrame;
  315. BEGIN
  316. ListEnd := GenLists.ListLength( FrameList );
  317. cnt := 1;
  318. WHILE cnt < ListEnd DO
  319. GenLists.GetElmtAdr( FrameList, cnt, TmpFrame, dumc, TypeCode );
  320. FrameManager.FrameDeactivated( TmpFrame );
  321. cnt := cnt + 2;
  322. END;
  323. GenLists.DisposeList( FrameList );
  324. END DisposeFrameList;
  325. PROCEDURE DeleteFrom( VAR TheFrame: ScrnTypes.DisplayFrame;
  326. VAR FrameList: GenLists.GenList );
  327. VAR
  328. TmpList: GenLists.GenList;
  329. spot: CARDINAL;
  330. BEGIN
  331. spot := FrameListSpot( TheFrame^.ThisFrame, FrameList );
  332. IF spot > 0 THEN
  333. GenLists.GetChildList( FrameList, spot + 1, TmpList );
  334. IF GenLists.SameList( TmpList, TheFrame^.self ) THEN
  335. (*We're going to confuse the hell out of the programmer
  336. who deletes a frame from a FrameList after retrieving it
  337. but before using it. We leave some tracks to make it
  338. easier to find the problem.*)
  339. StrEdit.AssignStr( 'DeleteFrom', TheFrame^.ThisFrame );
  340. GenLists.NilList( TheFrame^.self );
  341. GenLists.NilList( TheFrame^.ImageList );
  342. GenLists.NilList( TheFrame^.FieldList );
  343. END;
  344. GenLists.ListDelete( FrameList, spot, 2 );
  345. END;
  346. END DeleteFrom;
  347. PROCEDURE PointFrameAtList( FrameList: GenLists.GenList;
  348. FrameName: ARRAY OF CHAR; VAR TheFrame:
  349. ScrnTypes.DisplayFrame ): BOOLEAN;
  350. (* The difference between this and GetFrameFromList is that
  351. PointFrameAtList forces TheFrame to point at the DisplayFrameRec
  352. which is stored in the list; GetFrameFromList copies the
  353. DisplayFrameRec out into whatever TheFrame happens to be
  354. pointing at. *)
  355. VAR
  356. dumc, spot, TypeCode: CARDINAL;
  357. BEGIN
  358. spot := FrameListSpot( FrameName, FrameList );
  359. IF spot = 0 THEN
  360. RETURN FALSE;
  361. END;
  362. GenLists.GetElmtAdr( FrameList, spot, TheFrame, dumc, TypeCode );
  363. GenLists.GetChildList( FrameList, spot + 1, TheFrame^.self );
  364. ScrnUtl1.GetFrameLists( TheFrame );
  365. TheFrame^.CurrentField := GenLists.ElmtNow(TheFrame^.FieldList);
  366. (*ElmtNow returns 0 if the list is NIL.*)
  367. RETURN TRUE;
  368. END PointFrameAtList;
  369. PROCEDURE GetFrameFromList( FrameList: GenLists.GenList;
  370. FrameName: ARRAY OF CHAR; VAR TheFrame:
  371. ScrnTypes.DisplayFrame ): BOOLEAN;
  372. VAR
  373. spot, TypeCode: CARDINAL;
  374. BEGIN
  375. spot := FrameListSpot( FrameName, FrameList );
  376. IF spot = 0 THEN
  377. RETURN FALSE;
  378. END;
  379. IF GenLists.SameList( TheFrame^.self,
  380. TheFrame^.FromFile^.ListBuf ) THEN
  381. (*Make sure the NdxFile system doesn't think it is still
  382. managing this frame.*)
  383. GenLists.DisposeList( TheFrame^.FromFile^.ListBuf );
  384. TheFrame^.FromFile^.BufRecName[0] := 0C;
  385. END;
  386. (*Note that we don't dispose of TheFrame's self list if
  387. it's not part of the list buffer because it may be part
  388. of the FrameList. Means someone else has to be in charge
  389. of disposing of the self list if it was created by CopyList.*)
  390. GenLists.GetElmt( FrameList, spot, TheFrame^, TypeCode );
  391. GenLists.GetChildList( FrameList, spot + 1, TheFrame^.self );
  392. ScrnUtl1.GetFrameLists( TheFrame );
  393. TheFrame^.CurrentField := GenLists.ElmtNow(TheFrame^.FieldList);
  394. (*ElmtNow returns 0 if the list is NIL.*)
  395. RETURN TRUE;
  396. END GetFrameFromList;
  397. PROCEDURE LoadFrameList( dfile: ScrnTypes.DisplayFile;
  398. StartFrame: ARRAY OF CHAR; VAR FrameList: GenLists.GenList );
  399. VAR
  400. TmpFrame: ScrnTypes.DisplayFrame;
  401. FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName;
  402. BEGIN
  403. IF NOT FrameExists( dfile, StartFrame ) THEN
  404. RETURN;
  405. END;
  406. IF FrameListSpot( StartFrame, FrameList ) > 0 THEN
  407. (*StartFrame is already in FrameList *)
  408. RETURN;
  409. END;
  410. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  411. DspFiles.ReadFrameFast( dfile, TmpFrame, StartFrame );
  412. (* It's okay here to use ReadFrameFast, which does not
  413. copy the file's listbuf, because AddToFrameList is
  414. about to make a copy anyway. *)
  415. AddToFrameList( TmpFrame, FrameList );
  416. ScrnUtl1.GetFrameLinks( TmpFrame, FrameAbove, FrameBelow,
  417. FrameLeft, FrameRight );
  418. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  419. IF FrameAbove[0] # 0C THEN
  420. LoadFrameList( dfile, FrameAbove, FrameList );
  421. END;
  422. IF FrameBelow[0] # 0C THEN
  423. LoadFrameList( dfile, FrameBelow, FrameList );
  424. END;
  425. IF FrameLeft[0] # 0C THEN
  426. LoadFrameList( dfile, FrameLeft, FrameList );
  427. END;
  428. IF FrameRight[0] # 0C THEN
  429. LoadFrameList( dfile, FrameRight, FrameList );
  430. END;
  431. END LoadFrameList;
  432. PROCEDURE ControlSeparately( FrameList: GenLists.GenList;
  433. VAR NextFrame: ScrnTypes.AFrameName; VAR SelectedChar:
  434. CHAR; VAR EndingFrame: ScrnTypes.AFrameName );
  435. VAR
  436. FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName;
  437. TmpFrame: ScrnTypes.DisplayFrame;
  438. BEGIN
  439. (* Notice that we don't initialize TmpFrame because we are
  440. forcing it to point into the FrameList. *)
  441. LOOP
  442. IF NOT PointFrameAtList( FrameList, NextFrame, TmpFrame ) THEN
  443. EXIT;
  444. END;
  445. M2Strings.Assign( NextFrame, EndingFrame );
  446. ScrnUtl1.GetFrameLinks( TmpFrame, FrameAbove, FrameBelow,
  447. FrameLeft, FrameRight );
  448. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  449. InputManager.ControlFrame( TmpFrame, TmpFrame^.CurrentField, '',
  450. FALSE, NextFrame );
  451. SelectedChar := ScrnUtl1.SelectedChar( TmpFrame );
  452. END;
  453. END ControlSeparately;
  454. PROCEDURE ControlFrameList( FrameList: GenLists.GenList;
  455. TheFrame: ScrnTypes.DisplayFrame; VAR NextFrame:
  456. ScrnTypes.AFrameName; VAR SelectedChar: CHAR; VAR
  457. EndingFrame: ScrnTypes.AFrameName );
  458. VAR
  459. FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName;
  460. BEGIN
  461. LOOP
  462. IF NOT GetFrameFromList( FrameList, NextFrame, TheFrame ) THEN
  463. EXIT;
  464. END;
  465. M2Strings.Assign( NextFrame, EndingFrame );
  466. ScrnUtl1.GetFrameLinks( TheFrame, FrameAbove, FrameBelow,
  467. FrameLeft, FrameRight );
  468. FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 );
  469. InputManager.ControlFrame( TheFrame, TheFrame^.CurrentField, '',
  470. FALSE, NextFrame );
  471. SelectedChar := ScrnUtl1.SelectedChar( TheFrame );
  472. END;
  473. END ControlFrameList;
  474. PROCEDURE ControlFrameGroup( TheFrame: ScrnTypes.DisplayFrame;
  475. VAR NextFrame: ScrnTypes.AFrameName; VAR SelectedChar: CHAR;
  476. VAR EndingFrame: ScrnTypes.AFrameName );
  477. VAR
  478. FrameList : GenLists.GenList;
  479. BEGIN
  480. GenLists.NewList( FrameList );
  481. LoadFrameList( TheFrame^.FromFile, NextFrame, FrameList );
  482. ControlFrameList( FrameList, TheFrame, NextFrame, SelectedChar,
  483. EndingFrame );
  484. DisposeFrameList( FrameList );
  485. END ControlFrameGroup;
  486. PROCEDURE FrameExists( TheScreenFile: ScrnTypes.DisplayFile;
  487. FrameName: ARRAY OF CHAR ): BOOLEAN;
  488. VAR
  489. duml: LONGINT;
  490. dumc: CARDINAL;
  491. BEGIN
  492. StrEdit.CrunchBlanks( FrameName );
  493. RETURN NdxBones.FindRecord( TheScreenFile, FrameName, duml,
  494. dumc, dumc );
  495. END FrameExists;
  496. PROCEDURE FrameSequence( TheFrame: ScrnTypes.DisplayFrame;
  497. VAR StartFrame: ScrnTypes.AFrameName );
  498. BEGIN
  499. ScrnUtl2.PushFrame( TheFrame );
  500. FrameSeqReturn( TheFrame, StartFrame);
  501. ScrnUtl2.PopFrame( TheFrame );
  502. InputManager.ReconstructFrame( TheFrame );
  503. END FrameSequence;
  504. PROCEDURE FrameSeqReturn( TheFrame : ScrnTypes.DisplayFrame;
  505. VAR StartFrame : ScrnTypes.AFrameName );
  506. VAR
  507. CheckFrame: ScrnTypes.AFrameName;
  508. SavedHeight: CARDINAL;
  509. BEGIN
  510. IF NOT FrameExists( TheFrame^.FromFile, StartFrame ) THEN
  511. RETURN;
  512. END;
  513. SavedHeight := VWindows.GetCursorHeight( TheFrame^.WindowHandle );
  514. VWindows.SetCursorHeight( TheFrame^.WindowHandle, 0 );
  515. CheckFrame := TheFrame^.ThisFrame;
  516. LOOP
  517. DspFiles.ReadFrame( TheFrame^.FromFile, TheFrame,
  518. StartFrame );
  519. FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 );
  520. InputManager.ControlFrame( TheFrame, 0, '', FALSE, StartFrame );
  521. IF PosUtils.Equal( StartFrame, ScrnTypes.ProgramExit ) THEN
  522. EXIT;
  523. END;
  524. IF PosUtils.Equal( StartFrame, CheckFrame ) THEN
  525. ErrorNames.WarningName('CircSeq');
  526. EXIT;
  527. END;
  528. IF NOT FrameExists( TheFrame^.FromFile, StartFrame ) THEN
  529. EXIT;
  530. END;
  531. END;
  532. VWindows.SetCursorHeight( TheFrame^.WindowHandle, SavedHeight );
  533. END FrameSeqReturn;
  534. PROCEDURE FrameSeq2( TheFile : ScrnTypes.DisplayFile;
  535. CheckFrame: ARRAY OF CHAR; VAR StartFrame : ARRAY OF CHAR );
  536. VAR
  537. NextFrame, DummyName: ScrnTypes.AFrameName;
  538. TmpFrame: ScrnTypes.DisplayFrame;
  539. FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName;
  540. FrameList : GenLists.GenList;
  541. dumc: CHAR;
  542. BEGIN
  543. IF NOT FrameExists( TheFile, StartFrame ) THEN
  544. RETURN;
  545. END;
  546. M2Strings.Assign( StartFrame, NextFrame );
  547. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  548. LOOP
  549. DspFiles.ReadFrame( TheFile, TmpFrame, NextFrame );
  550. ScrnUtl1.GetFrameLinks( TmpFrame, FrameAbove, FrameBelow,
  551. FrameLeft, FrameRight );
  552. IF (FrameAbove[0] # 0C) OR (FrameBelow[0] # 0C) OR
  553. (FrameLeft[0] # 0C) OR (FrameRight[0] # 0C) THEN
  554. GenLists.NewList( FrameList );
  555. LoadFrameList( TheFile, NextFrame, FrameList );
  556. ControlSeparately( FrameList, NextFrame, dumc,
  557. DummyName );
  558. DisposeFrameList( FrameList );
  559. ELSE
  560. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  561. InputManager.ControlFrame( TmpFrame, 0, '', FALSE, NextFrame );
  562. END;
  563. IF PosUtils.Equal( NextFrame, ScrnTypes.ProgramExit ) THEN
  564. EXIT;
  565. END;
  566. IF PosUtils.Equal( NextFrame, CheckFrame ) THEN
  567. ErrorNames.WarningName('CircSeq');
  568. EXIT;
  569. END;
  570. IF NOT FrameExists( TheFile, NextFrame ) THEN
  571. EXIT;
  572. END;
  573. END;
  574. M2Strings.Assign( NextFrame, StartFrame );
  575. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  576. END FrameSeq2;
  577. PROCEDURE FindNextField( TheFrame: ScrnTypes.DisplayFrame; typ:
  578. CHAR; VAR spot: CARDINAL; VAR FieldPtr:
  579. ScrnTypes.InputFieldPtr ): BOOLEAN;
  580. VAR
  581. found: BOOLEAN;
  582. ListEnd: CARDINAL;
  583. BEGIN
  584. ListEnd := ScrnUtl1.FieldListTotal( TheFrame );
  585. FieldPtr := NIL;
  586. found := FALSE;
  587. WHILE (spot <= ListEnd) AND (NOT found) DO
  588. ScrnUtl1.GetFieldPtr( TheFrame, spot, FieldPtr );
  589. IF (typ = 0C) OR (FieldPtr^.typ = typ) THEN
  590. found := TRUE;
  591. ELSE
  592. INC( spot );
  593. END;
  594. END;
  595. RETURN found;
  596. END FindNextField;
  597. PROCEDURE GetStrResponse( TheFile:
  598. ScrnTypes.DisplayFile; FrameName, Default: ARRAY
  599. OF CHAR; VAR TheStr: ARRAY OF CHAR ): BOOLEAN;
  600. VAR
  601. MsgFrame: ScrnTypes.DisplayFrame;
  602. fnum : CARDINAL;
  603. FieldPtr: ScrnTypes.InputFieldPtr;
  604. result: BOOLEAN;
  605. NextFrame: ScrnTypes.AFrameName;
  606. TmpFrame: ScrnTypes.DisplayFrame;
  607. BEGIN
  608. ScrnTypes.InitDisplayFrame( MsgFrame, VWindows.CurrentWindow );
  609. DspFiles.ReadFrame( TheFile, MsgFrame, FrameName );
  610. fnum := 1;
  611. IF NOT FindNextField( MsgFrame, ScrnTypes.StringCode, fnum,
  612. FieldPtr ) THEN
  613. result := FALSE;
  614. ELSE
  615. ChangeField( MsgFrame, Default, FieldPtr^.fnam, TRUE );
  616. FramePainter.ShowDisplayFrame( MsgFrame, 0, 0, 0, 0 );
  617. InputManager.ControlFrame( MsgFrame, 1, '', FALSE, NextFrame );
  618. IF PosUtils.Equal( MsgFrame^.parent, NextFrame ) THEN
  619. result := FALSE;
  620. ELSE
  621. result := TRUE;
  622. END;
  623. ReadInput( MsgFrame, TheStr, FieldPtr^.fnam );
  624. END;
  625. StrEdit.CrunchBlanks( TheStr );
  626. ScrnUtl2.CloseDisplayFrame( MsgFrame );
  627. RETURN result;
  628. END GetStrResponse;
  629. PROCEDURE ReadShowAndCntrl( TheFile: ScrnTypes.DisplayFile;
  630. TheFrame: ScrnTypes.DisplayFrame; VAR FrameName :
  631. ScrnTypes.AFrameName );
  632. BEGIN
  633. DspFiles.ReadFrame( TheFile, TheFrame, FrameName );
  634. FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 );
  635. InputManager.ControlFrame( TheFrame, 1, '', FALSE, FrameName );
  636. END ReadShowAndCntrl;
  637. PROCEDURE RdShwAndCntrlConst( TheFile: ScrnTypes.DisplayFile;
  638. TheFrame: ScrnTypes.DisplayFrame; FrameName : ARRAY OF CHAR );
  639. VAR
  640. TmpName: ScrnTypes.AFrameName;
  641. BEGIN
  642. M2Strings.Assign( FrameName, TmpName );
  643. ReadShowAndCntrl( TheFile, TheFrame, TmpName );
  644. END RdShwAndCntrlConst;
  645. PROCEDURE Input( TheFrame: ScrnTypes.DisplayFrame; VAR
  646. FrameName : ScrnTypes.AFrameName );
  647. BEGIN
  648. DspFiles.ReadFrame( TheFrame^.FromFile, TheFrame,
  649. FrameName );
  650. FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 );
  651. InputManager.ControlFrame( TheFrame, 1, '', FALSE, FrameName );
  652. END Input;
  653. PROCEDURE InputConst( TheFrame: ScrnTypes.DisplayFrame;
  654. FrameName : ARRAY OF CHAR );
  655. VAR
  656. TmpName: ScrnTypes.AFrameName;
  657. BEGIN
  658. M2Strings.Assign( FrameName, TmpName );
  659. DspFiles.ReadFrame( TheFrame^.FromFile, TheFrame,
  660. TmpName );
  661. FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 );
  662. InputManager.ControlFrame( TheFrame, 0, '', FALSE, TmpName );
  663. END InputConst;
  664. PROCEDURE ReadInput(VAR TheFrame : ScrnTypes.DisplayFrame; VAR TheStr :
  665. ARRAY OF CHAR; FieldName : ARRAY OF CHAR);
  666. VAR
  667. FieldPtr : ScrnTypes.InputFieldPtr;
  668. ImageRec: ScrnTypes.ImageElement;
  669. BEGIN
  670. IF NOT ScrnUtl1.FindField( TheFrame, FieldName, FieldPtr, ImageRec ) THEN
  671. NotFieldWarning( FieldName, TheFrame^.ThisFrame );
  672. END;
  673. M2Strings.Assign(ImageRec.text, TheStr);
  674. END ReadInput;
  675. PROCEDURE ReadNextField(VAR TheFrame : ScrnTypes.DisplayFrame;
  676. VAR TheStr : ARRAY OF CHAR; skip : CARDINAL);
  677. (* will skip first field if it is input field *)
  678. VAR
  679. i : CARDINAL;
  680. ImagePtr: ScrnTypes.ImageElmtPtr;
  681. BEGIN
  682. IF (skip + TheFrame^.CurrentField) >
  683. GenLists.ListLength(TheFrame^.FieldList) THEN
  684. ErrorNames.WarningName('EndFld');
  685. END;
  686. FOR i := 0 TO skip DO
  687. INC( TheFrame^.CurrentField );
  688. END;
  689. END ReadNextField;
  690. PROCEDURE ReadNextInput(VAR TheFrame : ScrnTypes.DisplayFrame;
  691. VAR TheStr : ARRAY OF CHAR; skip : CARDINAL);
  692. (* will skip first field if it is input field *)
  693. VAR
  694. MaxField, i : CARDINAL;
  695. ImagePtr: ScrnTypes.ImageElmtPtr;
  696. BEGIN
  697. (*
  698. This version of ReadNextInput added at suggestion of Douglas Wrege
  699. on 27 Dec 89 to make ReadNextInput skip Display fields, as it did
  700. in release 1.4. ReadNextField, above, reads every field, display
  701. or not.
  702. *)
  703. MaxField := GenLists.ListLength( TheFrame^.FieldList );
  704. FOR i := 0 TO skip DO
  705. IF TheFrame^.CurrentField < MaxField THEN
  706. INC( TheFrame^.CurrentField );
  707. ELSE
  708. ErrorNames.WarningName( 'EndFld' );
  709. END;
  710. WHILE (TheFrame^.CurrentField < MaxField) AND
  711. (ScrnUtl1.FieldType(TheFrame,TheFrame^.CurrentField)
  712. = ScrnTypes.DispCode) DO
  713. INC( TheFrame^.CurrentField );
  714. END;
  715. END;
  716. ScrnUtl1.GetFieldImagePtr( TheFrame, TheFrame^.CurrentField, ImagePtr );
  717. M2Strings.Assign( ImagePtr^.text, TheStr );
  718. END ReadNextInput;
  719. BEGIN
  720. Initialized := FALSE;
  721. Init();
  722. END ControlUtils.