SCRNCOMP.MOD 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  1. MODULE ScrnCompile;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1990 PMI
  7. * Green Bay, WI
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. *)
  12. IMPORT BigSets;
  13. IMPORT ControlUtils;
  14. IMPORT DspFiles;
  15. IMPORT EnvironUtils;
  16. IMPORT ErrorManager;
  17. IMPORT HandleIO;
  18. IMPORT FrameManager;
  19. IMPORT FramePainter;
  20. IMPORT GenLists;
  21. IMPORT InputManager;
  22. IMPORT KbdInput;
  23. IMPORT ListUtils;
  24. IMPORT LowLevel;
  25. IMPORT M2Strings;
  26. IMPORT MakeFrame;
  27. IMPORT MsColors;
  28. IMPORT NdxBones;
  29. IMPORT NdxFiles;
  30. IMPORT NdxTypes;
  31. IMPORT NdxUtils;
  32. IMPORT PosUtils;
  33. IMPORT PrtFrame;
  34. IMPORT ScrnTypes;
  35. IMPORT ScrnUtl1;
  36. IMPORT ScrnUtl2;
  37. IMPORT StrConv;
  38. IMPORT StrEdit;
  39. IMPORT StringIO;
  40. IMPORT SYSTEM;
  41. IMPORT UserOps;
  42. IMPORT VEditor;
  43. IMPORT VWindows;
  44. IMPORT InitCompilerMods;
  45. TYPE
  46. ASyntaxChoice = (unknown, old, new);
  47. VAR
  48. LastFileName, LastFrameName, EdtFileName,
  49. DspFileName: ARRAY [0..80] OF CHAR;
  50. TopMenuList, FileList, CurrentFrameList, OutFrameList:
  51. GenLists.GenList;
  52. ErrStr: ARRAY [0..255] OF CHAR;
  53. FrameName, StartFrame, EndingFrame, NextFrame:
  54. ScrnTypes.AFrameName;
  55. ScrnCompDsp, CurrentDspFile: ScrnTypes.DisplayFile;
  56. ParamsRead, SavedCursorHeight, FileListLine, BadLine:
  57. CARDINAL;
  58. syntax : ASyntaxChoice;
  59. (*Determines the syntax rule in effect for the current .EDT
  60. file.*)
  61. CmdLineVersion, AtEndOfList, ListChanged: BOOLEAN;
  62. MovementKeys: KbdInput.KeyNumSet;
  63. SelChar: CHAR;
  64. (* These two new forms of the Input procedure will eventually be
  65. moved to ControlUtils. *)
  66. PROCEDURE Input2( TheFile: ScrnTypes.DisplayFile; VAR
  67. FrameName : ScrnTypes.AFrameName );
  68. VAR
  69. TmpFrame: ScrnTypes.DisplayFrame;
  70. BEGIN
  71. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  72. DspFiles.ReadFrame( TheFile, TmpFrame,
  73. FrameName );
  74. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  75. InputManager.ControlFrame( TmpFrame, 1, '', FALSE, FrameName );
  76. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  77. END Input2;
  78. PROCEDURE InputConst2( TheFile: ScrnTypes.DisplayFile;
  79. FrameName : ARRAY OF CHAR );
  80. VAR
  81. TmpName: ScrnTypes.AFrameName;
  82. TmpFrame: ScrnTypes.DisplayFrame;
  83. BEGIN
  84. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  85. M2Strings.Assign( FrameName, TmpName );
  86. DspFiles.ReadFrame( TheFile, TmpFrame,
  87. TmpName );
  88. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  89. InputManager.ControlFrame( TmpFrame, 0, '', FALSE, TmpName );
  90. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  91. END InputConst2;
  92. PROCEDURE UpdateStatus( StatusFrame: ScrnTypes.DisplayFrame;
  93. FieldName, NewStatus: ARRAY OF CHAR );
  94. VAR
  95. width, TmpFieldNum: CARDINAL;
  96. TmpStr: ARRAY [0..79] OF CHAR;
  97. BEGIN
  98. TmpFieldNum := ScrnUtl1.FieldNum(StatusFrame, FieldName );
  99. width := ScrnUtl1.FieldWidth( StatusFrame, TmpFieldNum );
  100. StrEdit.AssignStr( NewStatus, TmpStr );
  101. StrEdit.Center( TmpStr, width );
  102. ControlUtils.ChangeField( StatusFrame, TmpStr, FieldName, TRUE );
  103. FramePainter.RedrawField( StatusFrame, TmpFieldNum, FALSE );
  104. END UpdateStatus;
  105. PROCEDURE CommandLineSwitch(): BOOLEAN;
  106. VAR
  107. lngth: CARDINAL;
  108. ParamStr: ARRAY [0..127] OF CHAR;
  109. BEGIN
  110. EnvironUtils.GetProgParams( ParamStr );
  111. StrEdit.CrunchBlanks( ParamStr );
  112. lngth := M2Strings.Length( ParamStr );
  113. IF lngth < 2 THEN
  114. RETURN FALSE;
  115. END;
  116. IF (ParamStr[ lngth - 2 ] = '/') AND
  117. (CAP(ParamStr[ lngth - 1 ]) = 'C') THEN
  118. RETURN TRUE;
  119. ELSE
  120. RETURN FALSE;
  121. END;
  122. END CommandLineSwitch;
  123. PROCEDURE AddExtension( VAR FileName: ARRAY OF CHAR;
  124. Extension: ARRAY OF CHAR );
  125. BEGIN
  126. IF NOT PosUtils.Present( ".", FileName) THEN
  127. StrEdit.Append( FileName, Extension );
  128. END;
  129. END AddExtension;
  130. PROCEDURE AddMovementKeys( VAR TheKeySet: KbdInput.KeyNumSet );
  131. BEGIN
  132. BigSets.SetUnion( TheKeySet, MovementKeys, TheKeySet );
  133. END AddMovementKeys;
  134. PROCEDURE RemoveMovementKeys( VAR TheKeySet: KbdInput.KeyNumSet );
  135. BEGIN
  136. BigSets.SetDifference( TheKeySet, MovementKeys, TheKeySet );
  137. END RemoveMovementKeys;
  138. PROCEDURE CallEditor( VAR TheList: GenLists.GenList;
  139. VAR ControlRec: VEditor.AnEdControlRec );
  140. VAR
  141. TmpFrame: ScrnTypes.DisplayFrame;
  142. BEGIN
  143. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  144. ControlUtils.AddEditorField( TmpFrame, TheList, ControlRec );
  145. FrameManager.FrameActivated( TmpFrame );
  146. UserOps.DoPrompting := FALSE;
  147. RemoveMovementKeys( UserOps.FieldExitKeySet );
  148. VEditor.TheEditor( TheList, ControlRec );
  149. AddMovementKeys( UserOps.FieldExitKeySet );
  150. UserOps.DoPrompting := TRUE;
  151. GenLists.NilList( TmpFrame^.EdFieldList );
  152. GenLists.DisconnectLists( TheList, TmpFrame^.self );
  153. (* We have to disconnect TheList because it has become a sublist
  154. of TmpFrame's .self list, which is about to be disposed of. *)
  155. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  156. VWindows.SetForeColor( VWindows.CurrentWindow, MsColors.lightgrey );
  157. VWindows.SetBackColor( VWindows.CurrentWindow, MsColors.black );
  158. VWindows.SetMonoAttr( VWindows.CurrentWindow, MsColors.plain );
  159. VWindows.ClearPart( VWindows.CurrentWindow, 1,1,
  160. VWindows.EndCol(VWindows.CurrentWindow),
  161. VWindows.EndRow(VWindows.CurrentWindow) );
  162. END CallEditor;
  163. PROCEDURE CloseCurrentDsp();
  164. BEGIN
  165. IF (CurrentDspFile # NIL) THEN
  166. NdxUtils.CrunchNdxFile( CurrentDspFile );
  167. NdxFiles.CloseNdxFile( CurrentDspFile );
  168. END;
  169. END CloseCurrentDsp;
  170. PROCEDURE Yes( Prompt: ARRAY OF CHAR ): BOOLEAN;
  171. BEGIN
  172. IF CmdLineVersion THEN
  173. StringIO.WriteEol( StringIO.outp, '' );
  174. StringIO.WriteStr( StringIO.outp, Prompt );
  175. StringIO.WriteStr( StringIO.outp, ' (Y/N): ' );
  176. RETURN KbdInput.CAPkey( KbdInput.KeyHit( KbdInput.YorN ) ) = ORD('Y');
  177. ELSE
  178. M2Strings.Assign( Prompt, NextFrame );
  179. ControlUtils.Input( DspFiles.MainFrame, NextFrame );
  180. RETURN CAP( ScrnUtl1.SelectedChar(DspFiles.MainFrame) ) = 'Y';
  181. END;
  182. END Yes;
  183. PROCEDURE NamesToFrame( DspFile: ScrnTypes.DisplayFile;
  184. VAR TheFrame: ScrnTypes.DisplayFrame );
  185. VAR
  186. NdxRec: NdxTypes.NdxElement;
  187. lngth, cnt, TypeCode: CARDINAL;
  188. BEGIN
  189. lngth := GenLists.ListLength( DspFile^.Ndx );
  190. FOR cnt := 1 TO lngth DO
  191. GenLists.GetElmt( DspFile^.Ndx, cnt, NdxRec, TypeCode );
  192. IF NdxRec.RecName[0] # 0C THEN
  193. IF NOT (PosUtils.Pos( 'RepVers', NdxRec.RecName ) = 0) THEN
  194. (* We don't want to write out the name of the version
  195. check record. *)
  196. ControlUtils.AddMenuItem( TheFrame, 2, 1 + cnt,
  197. NdxRec.RecName, 20, 0, NdxRec.RecName );
  198. END;
  199. END;
  200. END;
  201. END NamesToFrame;
  202. PROCEDURE InsertCommandDelims( VAR TheList: GenLists.GenList );
  203. VAR
  204. TmpStr: ARRAY [0..127] OF CHAR;
  205. BEGIN
  206. IF GenLists.ListLength( TheList ) = 0 THEN
  207. (*Get em started--command area delimiters are tedious to
  208. type in.*)
  209. LowLevel.Fill( SYSTEM.ADR(TmpStr), 80, '=' );
  210. GenLists.ListInsert( TmpStr, GenLists.StrCode,
  211. TheList, 1 );
  212. LowLevel.Fill( SYSTEM.ADR(TmpStr), 80, '-' );
  213. GenLists.ListInsert( ':[insert name here]',
  214. GenLists.StrCode, TheList, 2 );
  215. GenLists.ListInsert( TmpStr, GenLists.StrCode,
  216. TheList, 3 );
  217. END;
  218. END InsertCommandDelims;
  219. PROCEDURE GetStrResponse( Prompt, Default: ARRAY OF CHAR;
  220. VAR TheStr: ARRAY OF CHAR ): BOOLEAN;
  221. BEGIN
  222. IF CmdLineVersion THEN
  223. IF EnvironUtils.ParsedParam( ParamsRead + 1, TheStr ) THEN
  224. IF TheStr[0] # '/' THEN
  225. IF PosUtils.Present( '/c', TheStr ) OR
  226. PosUtils.Present( '/C', TheStr ) THEN
  227. M2Strings.Delete( TheStr, M2Strings.Length(TheStr) - 2, 2 );
  228. StrEdit.CrunchBlanks( TheStr );
  229. END;
  230. INC( ParamsRead );
  231. RETURN TRUE;
  232. END;
  233. END;
  234. StringIO.WriteStr( StringIO.outp, Prompt );
  235. StringIO.WriteStr( StringIO.outp, ': ' );
  236. StringIO.ReadStr( StringIO.inp, TheStr );
  237. IF TheStr[0] # 0C THEN
  238. RETURN TRUE;
  239. ELSE
  240. RETURN FALSE;
  241. END;
  242. END;
  243. M2Strings.Assign( Prompt, NextFrame );
  244. DspFiles.ReadDisplayFrame( ScrnCompDsp, DspFiles.MainFrame, NextFrame );
  245. ControlUtils.ChangeField( DspFiles.MainFrame, Default, 'TheStr', TRUE );
  246. FramePainter.ShowDisplayFrame( DspFiles.MainFrame, 0, 0, 0, 0 );
  247. InputManager.ControlFrame( DspFiles.MainFrame, 1, '', FALSE, NextFrame );
  248. IF PosUtils.Equal( DspFiles.MainFrame^.parent, NextFrame ) THEN
  249. RETURN FALSE;
  250. END;
  251. ControlUtils.ReadInput( DspFiles.MainFrame, TheStr, 'TheStr' );
  252. StrEdit.CrunchBlanks( TheStr );
  253. RETURN TRUE;
  254. END GetStrResponse;
  255. PROCEDURE ReadNewEdtFile(): BOOLEAN;
  256. BEGIN
  257. IF GenLists.Initialized( FileList ) THEN
  258. IF Yes('SaveEdt') THEN
  259. IF NOT GetStrResponse( 'EdtName', EdtFileName, EdtFileName ) THEN
  260. RETURN FALSE;
  261. END;
  262. AddExtension( EdtFileName, '.EDT' );
  263. IF StringIO.NoError # ListUtils.TextListToFile( FileList,
  264. EdtFileName ) THEN
  265. RETURN FALSE;
  266. END;
  267. END;
  268. GenLists.DisposeList( FileList );
  269. END;
  270. LOOP
  271. IF NOT GetStrResponse( 'EdtName', LastFileName, EdtFileName ) THEN
  272. RETURN FALSE;
  273. END;
  274. M2Strings.Assign( EdtFileName, LastFileName );
  275. AddExtension( EdtFileName, '.EDT' );
  276. GenLists.NewList( FileList );
  277. IF ListUtils.TextFileToList( EdtFileName, FileList)
  278. = StringIO.NoError THEN
  279. ListUtils.DeTabList( FileList, ListChanged );
  280. EXIT;
  281. ELSIF Yes( 'CreateQ' ) THEN
  282. GenLists.DisposeList( FileList );
  283. GenLists.CopyList( CurrentFrameList, FileList );
  284. InsertCommandDelims( FileList );
  285. (*Won't do anything if there's already something in
  286. CurrentFrameList.*)
  287. ELSE
  288. GenLists.DisposeList( FileList );
  289. IF NOT CmdLineVersion THEN
  290. InputConst2( ScrnCompDsp, 'FileError' );
  291. END;
  292. RETURN FALSE;
  293. END;
  294. END;
  295. FileListLine := 1;
  296. RETURN TRUE;
  297. END ReadNewEdtFile;
  298. PROCEDURE RightVersion( VAR dfile: ScrnTypes.DisplayFile ): BOOLEAN;
  299. VAR
  300. TypeCode: CARDINAL;
  301. tmpstr: ScrnTypes.AFrameName;
  302. BEGIN
  303. IF NdxBones.InitBuffer( dfile, 'RepVers' ) THEN
  304. GenLists.GetElmt( dfile^.ListBuf, 1, tmpstr, TypeCode );
  305. IF PosUtils.Equal( '1.5c', tmpstr ) THEN
  306. RETURN TRUE;
  307. ELSE
  308. DspFiles.CloseDisplayFile( dfile );
  309. RETURN FALSE;
  310. END;
  311. ELSE
  312. DspFiles.CloseDisplayFile( dfile );
  313. RETURN FALSE;
  314. END;
  315. END RightVersion;
  316. PROCEDURE OpenNewDspFile(): BOOLEAN;
  317. BEGIN
  318. IF CurrentDspFile # NIL THEN
  319. DspFiles.CloseDisplayFile( CurrentDspFile );
  320. END;
  321. LOOP
  322. IF NOT GetStrResponse( 'DspName', LastFileName, DspFileName ) THEN
  323. RETURN FALSE;
  324. END;
  325. M2Strings.Assign( DspFileName, LastFileName );
  326. AddExtension( DspFileName, ".DSP" );
  327. IF DspFiles.OpenDisplayFile( CurrentDspFile, DspFileName )
  328. AND RightVersion(CurrentDspFile) THEN
  329. (*Don't let them open a .DSP file created by an
  330. incompatible version of the screen compiler. Make them
  331. start over.*)
  332. EXIT;
  333. ELSIF CmdLineVersion THEN
  334. NdxFiles.CreateNdxFile( CurrentDspFile, DspFileName, "" );
  335. IF NdxFiles.PutField( CurrentDspFile, 'RepVers',
  336. 'RECORD', GenLists.StrCode, '1.5c' ) AND
  337. NdxFiles.WriteRecord( CurrentDspFile, 'RepVers' ) THEN
  338. EXIT;
  339. END
  340. ELSE
  341. IF Yes( 'CreateQ' ) THEN
  342. NdxFiles.CreateNdxFile( CurrentDspFile, DspFileName, "" );
  343. IF NdxFiles.PutField( CurrentDspFile, 'RepVers',
  344. 'RECORD', GenLists.StrCode, '1.5c' ) AND
  345. NdxFiles.WriteRecord( CurrentDspFile, 'RepVers' ) THEN
  346. EXIT;
  347. END
  348. ELSE
  349. CurrentDspFile := NIL;
  350. RETURN FALSE;
  351. END;
  352. END;
  353. END;
  354. ErrorManager.AddTermProc( CloseCurrentDsp );
  355. RETURN TRUE;
  356. END OpenNewDspFile;
  357. PROCEDURE FrameStart( VAR str: ARRAY OF CHAR ): BOOLEAN;
  358. BEGIN
  359. IF (M2Strings.Length(str) = 0) THEN
  360. RETURN FALSE;
  361. END;
  362. IF (PosUtils.Present( MakeFrame.CommandBeginStr, str)) THEN
  363. IF (syntax = new) THEN
  364. RETURN TRUE;
  365. END;
  366. IF (syntax = unknown) THEN
  367. syntax := new;
  368. RETURN TRUE;
  369. END;
  370. END;
  371. IF (str[0] = ":") THEN
  372. IF (syntax = old) THEN
  373. RETURN TRUE;
  374. END;
  375. IF (syntax = unknown) THEN
  376. syntax := old;
  377. RETURN TRUE;
  378. END;
  379. END;
  380. RETURN FALSE;
  381. END FrameStart;
  382. PROCEDURE GetNextFrame( FileList: GenLists.GenList; VAR FrameList:
  383. GenLists.GenList; VAR StartLine: CARDINAL ): BOOLEAN;
  384. (* Gets next frame list out of file list.*)
  385. VAR
  386. text: ARRAY [0..255] OF CHAR;
  387. type: CARDINAL;
  388. BEGIN
  389. syntax := unknown;
  390. GenLists.DisposeList( FrameList);
  391. GenLists.NewList( FrameList);
  392. (* first, skip until we get to CommandBeginStr or a colon in
  393. column one *)
  394. REPEAT
  395. IF StartLine > GenLists.ListLength( FileList) THEN
  396. RETURN FALSE;
  397. END;
  398. GenLists.GetElmt( FileList, StartLine, text, type);
  399. INC( StartLine);
  400. UNTIL FrameStart(text);
  401. (* now copy elements until another FrameStart*)
  402. REPEAT
  403. GenLists.ListInsert( text, type, FrameList, 65535);
  404. (* insert in frame *)
  405. IF StartLine > GenLists.ListLength( FileList) THEN
  406. RETURN FALSE;
  407. END;
  408. GenLists.GetElmt( FileList, StartLine, text, type);
  409. INC( StartLine);
  410. UNTIL FrameStart( text );
  411. DEC( StartLine);
  412. RETURN TRUE;
  413. END GetNextFrame;
  414. PROCEDURE FindFrame( FileList: GenLists.GenList;
  415. FrameName: ARRAY OF CHAR; VAR StartLine: CARDINAL ): BOOLEAN;
  416. VAR
  417. text: ARRAY [0..255] OF CHAR;
  418. FoundSpot, type: CARDINAL;
  419. TmpName: ScrnTypes.AFrameName;
  420. BEGIN
  421. IF NOT GenLists.Initialized( FileList ) THEN
  422. RETURN FALSE;
  423. END;
  424. M2Strings.Assign( FrameName, TmpName );
  425. M2Strings.Assign( FrameName, LastFrameName );
  426. IF TmpName[0] # ':' THEN
  427. M2Strings.Insert( ':', TmpName, 0 );
  428. END;
  429. StartLine := 0;
  430. REPEAT
  431. (*This is John McMonagle's fix for a problem that was
  432. causing FindFrame to return FALSE when frame names
  433. appeared by accident in other parts of the frame.*)
  434. StartLine := GenLists.ScanList( TmpName, FileList, StartLine + 1,
  435. GenLists.ListLength(FileList), FoundSpot );
  436. IF (StartLine = 0) THEN
  437. RETURN FALSE;
  438. END;
  439. UNTIL FoundSpot = 0;
  440. syntax := unknown;
  441. GenLists.GetElmt( FileList, StartLine + 1, text, type);
  442. IF FrameStart( text ) THEN
  443. (* The name was outside the frame. *)
  444. syntax := old;
  445. RETURN TRUE;
  446. ELSE
  447. (* Back up until we get to CommandBeginStr or a colon in
  448. column one.*)
  449. syntax := new;
  450. REPEAT
  451. DEC( StartLine );
  452. IF StartLine = 0 THEN
  453. RETURN FALSE;
  454. END;
  455. GenLists.GetElmt( FileList, StartLine, text, type );
  456. UNTIL FrameStart(text);
  457. RETURN TRUE;
  458. END;
  459. END FindFrame;
  460. PROCEDURE GetSpecificFrame( FileList: GenLists.GenList;
  461. FrameName: ARRAY OF CHAR; VAR FrameList: GenLists.GenList): BOOLEAN;
  462. VAR
  463. StartLine: CARDINAL;
  464. BEGIN
  465. IF NOT FindFrame( FileList, FrameName, StartLine ) THEN
  466. RETURN FALSE;
  467. END;
  468. IF NOT GetNextFrame( FileList, FrameList, StartLine ) THEN
  469. (*It was probably the last frame in the FileList, but we
  470. don't care about that.*)
  471. END;
  472. RETURN TRUE;
  473. END GetSpecificFrame;
  474. PROCEDURE DeleteFrame( FileList: GenLists.GenList;
  475. FrameName: ARRAY OF CHAR; VAR EndLine: CARDINAL ): BOOLEAN;
  476. VAR
  477. type: CARDINAL;
  478. text: ARRAY [0..255] OF CHAR;
  479. BEGIN
  480. IF NOT FindFrame( FileList, FrameName, EndLine ) THEN
  481. RETURN FALSE;
  482. END;
  483. LOOP
  484. GenLists.ListDelete( FileList, EndLine, 1 );
  485. IF (EndLine > GenLists.ListLength(FileList)) THEN
  486. EXIT;
  487. END;
  488. GenLists.GetElmt( FileList, EndLine, text, type);
  489. IF FrameStart( text ) THEN
  490. EXIT;
  491. END;
  492. END;
  493. RETURN TRUE;
  494. END DeleteFrame;
  495. PROCEDURE ShowError( FrameList: GenLists.GenList;
  496. FrameName, ErrStr: ARRAY OF CHAR; BadLine: CARDINAL);
  497. VAR
  498. text: ARRAY [0..255] OF CHAR;
  499. caption, numstr: ARRAY [0..15] OF CHAR;
  500. dumc: CARDINAL;
  501. BEGIN
  502. text := "Frame: ";
  503. IF M2Strings.Length( FrameName) = 0 THEN
  504. StrEdit.Append( text, "Unknown" );
  505. ELSE
  506. StrEdit.Append( text, FrameName );
  507. END;
  508. StrEdit.Append( text, ", Line: " );
  509. StrConv.CardinalToStr( BadLine, 0, numstr);
  510. StrEdit.Append( text, numstr );
  511. StrEdit.Append( text, '.' );
  512. StrEdit.Append( text, ErrStr );
  513. caption := 'Error';
  514. dumc := VWindows.MessageBox( VWindows.CurrentWindow, SYSTEM.ADR(text),
  515. SYSTEM.ADR(caption), 0 );
  516. END ShowError;
  517. PROCEDURE AddToFile( VAR file: NdxTypes.NdxFileType; OutList: GenLists.GenList;
  518. name: ScrnTypes.AFrameName);
  519. VAR
  520. ErrStr: ARRAY [0..80] OF CHAR;
  521. BEGIN
  522. IF (NOT NdxFiles.PutField( file, name, "RECORD", GenLists.ListCode,
  523. OutList)) OR
  524. (NOT NdxFiles.WriteRecord( file, name)) THEN
  525. StrEdit.AssignStr( "Can't add to file frame: ", ErrStr);
  526. StrEdit.Append( ErrStr, name);
  527. ErrorManager.WARN( ErrStr);
  528. END;
  529. END AddToFile;
  530. PROCEDURE DoFileMenu( SelectedChar: CHAR );
  531. BEGIN
  532. CASE CAP(SelectedChar) OF
  533. 'E':
  534. IF NOT ReadNewEdtFile() THEN END;
  535. | 'D':
  536. IF NOT OpenNewDspFile() THEN END;
  537. | 'F':
  538. IF CurrentDspFile = NIL THEN
  539. IF NOT OpenNewDspFile() THEN
  540. RETURN;
  541. END;
  542. END;
  543. IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN
  544. LOOP
  545. M2Strings.Assign( FrameName, LastFrameName );
  546. IF NOT ControlUtils.FrameExists( CurrentDspFile, FrameName ) THEN
  547. IF NOT GetStrResponse( 'NewEntry', FrameName, FrameName ) THEN
  548. EXIT
  549. END;
  550. ELSE
  551. IF NdxFiles.DeleteRecord( CurrentDspFile, FrameName ) THEN
  552. EXIT;
  553. END;
  554. END;
  555. END;
  556. END;
  557. | 'C':
  558. IF CurrentDspFile = NIL THEN
  559. IF NOT OpenNewDspFile() THEN
  560. RETURN;
  561. END;
  562. END;
  563. NdxUtils.CrunchNdxFile( CurrentDspFile );
  564. END;
  565. END DoFileMenu;
  566. PROCEDURE DoEditMenu( SelectedChar: CHAR );
  567. VAR
  568. TmpRec: VEditor.AnEdControlRec;
  569. FrameName: ScrnTypes.AFrameName;
  570. FileName: ARRAY [0..79] OF CHAR;
  571. LineTotalStr: ARRAY [0..15] OF CHAR;
  572. TmpList: GenLists.GenList;
  573. EndLine, BadLine: CARDINAL;
  574. WorkFrame: ScrnTypes.DisplayFrame;
  575. StatusFrame: ScrnTypes.DisplayFrame;
  576. SavedMessage: CARDINAL;
  577. BEGIN
  578. VEditor.InitEdRec( TmpRec );
  579. TmpRec.DoCounting := FALSE;
  580. CASE CAP(SelectedChar) OF
  581. 'E':
  582. IF NOT GenLists.Initialized( FileList ) THEN
  583. IF NOT ReadNewEdtFile() THEN
  584. RETURN;
  585. END;
  586. END;
  587. CallEditor( FileList, TmpRec );
  588. IF TmpRec.ChangeMade THEN
  589. IF Yes( 'SaveQ' ) THEN
  590. IF StringIO.NoError # ListUtils.TextListToFile( FileList,
  591. EdtFileName ) THEN
  592. InputConst2( ScrnCompDsp, 'FileError' );
  593. END;
  594. END;
  595. END;
  596. | 'S':
  597. IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN
  598. M2Strings.Assign( FrameName, LastFrameName );
  599. IF GetSpecificFrame( FileList, FrameName, CurrentFrameList ) THEN
  600. CallEditor( CurrentFrameList, TmpRec );
  601. IF TmpRec.ChangeMade THEN
  602. IF DeleteFrame( FileList, FrameName, EndLine ) THEN
  603. ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535,
  604. FileList, EndLine );
  605. END;
  606. IF Yes( 'DisplayQ' ) THEN
  607. ScrnTypes.InitDisplayFrame( WorkFrame,
  608. VWindows.CurrentWindow );
  609. WorkFrame^.FromFile := CurrentDspFile;
  610. MakeFrame.CompileFrame( CurrentFrameList,
  611. OutFrameList, FrameName, ErrStr, BadLine);
  612. M2Strings.Assign( FrameName, LastFrameName );
  613. IF BadLine = 0 THEN
  614. DspFiles.GetFrameFromList( OutFrameList, WorkFrame );
  615. FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 );
  616. InputManager.ControlFrame( WorkFrame, 1, '',
  617. FALSE, NextFrame );
  618. ELSE
  619. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  620. END;
  621. ScrnUtl2.CloseDisplayFrame( WorkFrame );
  622. END;
  623. IF Yes( 'SaveQ' ) THEN
  624. IF StringIO.NoError # ListUtils.TextListToFile( FileList,
  625. EdtFileName ) THEN
  626. InputConst2( ScrnCompDsp, 'FileError' );
  627. END;
  628. END;
  629. END;
  630. END;
  631. END;
  632. | 'F':
  633. IF CurrentDspFile = NIL THEN
  634. IF NOT OpenNewDspFile() THEN
  635. RETURN;
  636. END;
  637. END;
  638. ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow );
  639. WorkFrame^.FromFile := CurrentDspFile;
  640. LOOP
  641. InsertCommandDelims( CurrentFrameList );
  642. CallEditor( CurrentFrameList, TmpRec );
  643. IF TmpRec.ChangeMade THEN
  644. IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN
  645. ListUtils.InsertElmtsOf( CurrentFrameList, 1,
  646. 65535, FileList, EndLine );
  647. END;
  648. END;
  649. IF NOT Yes( 'DisplayQ' ) THEN
  650. EXIT;
  651. END;
  652. MakeFrame.CompileFrame( CurrentFrameList,
  653. OutFrameList, FrameName, ErrStr, BadLine);
  654. M2Strings.Assign( FrameName, LastFrameName );
  655. IF BadLine = 0 THEN
  656. DspFiles.GetFrameFromList( OutFrameList, WorkFrame );
  657. FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 );
  658. InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame );
  659. ELSE
  660. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  661. END;
  662. END;
  663. IF Yes( 'SaveQ' ) THEN
  664. IF StringIO.NoError # ListUtils.TextListToFile( FileList,
  665. EdtFileName ) THEN
  666. InputConst2( ScrnCompDsp, 'FileError' );
  667. END;
  668. END;
  669. ScrnUtl2.CloseDisplayFrame( WorkFrame );
  670. | 'A':
  671. IF GetStrResponse( 'FileName', LastFileName, FileName ) THEN
  672. M2Strings.Assign( FileName, LastFileName );
  673. GenLists.NewList( TmpList );
  674. SavedMessage := ListUtils.TextFileToList( FileName,
  675. TmpList );
  676. IF (SavedMessage # StringIO.NoError) AND
  677. (SavedMessage # StringIO.FileNotFound) THEN
  678. InputConst2( ScrnCompDsp, 'FileError' );
  679. ELSE
  680. IF SavedMessage = StringIO.FileNotFound THEN
  681. IF NOT Yes( 'CreateQ' ) THEN
  682. RETURN;
  683. END;
  684. END;
  685. ListUtils.DeTabList( TmpList, ListChanged );
  686. CallEditor( TmpList, TmpRec );
  687. IF TmpRec.ChangeMade THEN
  688. IF Yes( 'SaveQ' ) THEN
  689. ScrnTypes.InitDisplayFrame( StatusFrame,
  690. VWindows.CurrentWindow );
  691. ScrnUtl2.ReadAndShow( ScrnCompDsp, StatusFrame,
  692. 'StatusFrame' );
  693. UpdateStatus( StatusFrame, 'line1',
  694. 'Writing' );
  695. StrConv.CardinalToStr(
  696. GenLists.ListLength(TmpList), 0,
  697. LineTotalStr );
  698. UpdateStatus( StatusFrame, 'line2',
  699. LineTotalStr );
  700. UpdateStatus( StatusFrame, 'line3',
  701. 'lines.' );
  702. IF StringIO.NoError # ListUtils.TextListToFile(
  703. TmpList, FileName ) THEN
  704. InputConst2( ScrnCompDsp, 'FileError' );
  705. END;
  706. FrameManager.EraseFrame( StatusFrame );
  707. ScrnUtl2.CloseDisplayFrame( StatusFrame );
  708. END;
  709. END;
  710. END;
  711. GenLists.DisposeList( TmpList );
  712. END;
  713. END;
  714. END DoEditMenu;
  715. PROCEDURE DoCompMenu( SelectedChar: CHAR );
  716. VAR
  717. TmpRec: VEditor.AnEdControlRec;
  718. ChangeMade : BOOLEAN;
  719. EndLine: CARDINAL;
  720. StatusFrame: ScrnTypes.DisplayFrame;
  721. BEGIN
  722. IF CurrentDspFile = NIL THEN
  723. IF NOT OpenNewDspFile() THEN
  724. RETURN;
  725. END;
  726. END;
  727. VEditor.InitEdRec( TmpRec );
  728. TmpRec.DoCounting := FALSE;
  729. ChangeMade := FALSE;
  730. CASE CAP(SelectedChar) OF
  731. 'E' :
  732. IF NOT GenLists.Initialized( FileList ) THEN
  733. IF NOT ReadNewEdtFile() THEN
  734. RETURN;
  735. END;
  736. END;
  737. AtEndOfList := FALSE;
  738. FileListLine := 1;
  739. ScrnTypes.InitDisplayFrame( StatusFrame, VWindows.CurrentWindow );
  740. ScrnUtl2.ReadAndShow( ScrnCompDsp, StatusFrame, 'StatusFrame' );
  741. UpdateStatus( StatusFrame, 'line1', 'Processing' );
  742. WHILE NOT AtEndOfList DO
  743. AtEndOfList := NOT GetNextFrame( FileList,
  744. CurrentFrameList, FileListLine );
  745. IF GenLists.ListLength( CurrentFrameList) > 0 THEN
  746. BadLine := 1;
  747. WHILE BadLine # 0 DO
  748. MakeFrame.CompileFrame( CurrentFrameList,
  749. OutFrameList, FrameName, ErrStr, BadLine);
  750. M2Strings.Assign( FrameName, LastFrameName );
  751. UpdateStatus( StatusFrame, 'line2', FrameName );
  752. IF BadLine # 0 THEN
  753. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  754. IF Yes( 'EditQ' ) THEN
  755. TmpRec.CursorRow := BadLine;
  756. CallEditor( CurrentFrameList, TmpRec );
  757. IF TmpRec.ChangeMade THEN
  758. IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN
  759. ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535,
  760. FileList, EndLine );
  761. END;
  762. END;
  763. BadLine := 0;
  764. IF TmpRec.ChangeMade THEN
  765. ChangeMade := TRUE;
  766. END;
  767. END;
  768. ELSE
  769. AddToFile( CurrentDspFile, OutFrameList, FrameName);
  770. END;
  771. END;
  772. END;
  773. END;
  774. FrameManager.EraseFrame( StatusFrame );
  775. ScrnUtl2.CloseDisplayFrame( StatusFrame );
  776. IF ChangeMade THEN
  777. IF Yes( 'SaveQ' ) THEN
  778. IF StringIO.NoError # ListUtils.TextListToFile( FileList,
  779. EdtFileName ) THEN
  780. InputConst2( ScrnCompDsp, 'FileError' );
  781. END;
  782. END;
  783. END;
  784. | 'S' :
  785. IF NOT GenLists.Initialized( FileList ) THEN
  786. IF NOT ReadNewEdtFile() THEN
  787. RETURN;
  788. END;
  789. END;
  790. IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN
  791. M2Strings.Assign( FrameName, LastFrameName );
  792. IF GetSpecificFrame( FileList, FrameName, CurrentFrameList ) THEN
  793. MakeFrame.CompileFrame( CurrentFrameList,
  794. OutFrameList, FrameName, ErrStr, BadLine);
  795. M2Strings.Assign( FrameName, LastFrameName );
  796. IF BadLine = 0 THEN
  797. IF Yes( 'StoreQ' ) THEN
  798. AddToFile( CurrentDspFile, OutFrameList, FrameName);
  799. END;
  800. ELSE
  801. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  802. IF Yes( 'EditQ' ) THEN
  803. TmpRec.CursorRow := BadLine;
  804. CallEditor( CurrentFrameList, TmpRec );
  805. IF TmpRec.ChangeMade THEN
  806. IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN
  807. ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535,
  808. FileList, EndLine );
  809. END;
  810. END;
  811. END;
  812. END;
  813. END;
  814. END;
  815. | 'C' :
  816. IF GenLists.ListLength( CurrentFrameList ) = 0 THEN
  817. InputConst2( ScrnCompDsp, 'NoCurrent' );
  818. RETURN;
  819. END;
  820. MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName,
  821. ErrStr, BadLine);
  822. M2Strings.Assign( FrameName, LastFrameName );
  823. IF BadLine = 0 THEN
  824. IF Yes( 'StoreQ' ) THEN
  825. AddToFile( CurrentDspFile, OutFrameList, FrameName);
  826. END;
  827. ELSE
  828. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  829. IF Yes( 'EditQ' ) THEN
  830. TmpRec.CursorRow := BadLine;
  831. CallEditor( CurrentFrameList, TmpRec );
  832. IF TmpRec.ChangeMade THEN
  833. IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN
  834. ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535,
  835. FileList, EndLine );
  836. END;
  837. END;
  838. END;
  839. END;
  840. END;
  841. END DoCompMenu;
  842. PROCEDURE DoDisplayMenu( SelectedChar: CHAR );
  843. VAR
  844. WorkFrame, ListFrame: ScrnTypes.DisplayFrame;
  845. BEGIN
  846. IF CurrentDspFile = NIL THEN
  847. IF NOT OpenNewDspFile() THEN
  848. RETURN;
  849. END;
  850. END;
  851. ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow );
  852. WorkFrame^.FromFile := CurrentDspFile;
  853. CASE CAP(SelectedChar) OF
  854. 'C' :
  855. IF GenLists.Initialized( OutFrameList ) THEN
  856. DspFiles.GetFrameFromList( OutFrameList, WorkFrame );
  857. FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 );
  858. InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame );
  859. ELSIF GenLists.ListLength( CurrentFrameList ) > 0 THEN
  860. MakeFrame.CompileFrame( CurrentFrameList,
  861. OutFrameList, FrameName, ErrStr, BadLine);
  862. M2Strings.Assign( FrameName, LastFrameName );
  863. IF BadLine = 0 THEN
  864. DspFiles.GetFrameFromList( OutFrameList, WorkFrame );
  865. FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 );
  866. InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame );
  867. ELSE
  868. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  869. END;
  870. ELSE
  871. InputConst2( ScrnCompDsp, 'NoCurrent' );
  872. END;
  873. | 'S' :
  874. IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN
  875. M2Strings.Assign( FrameName, LastFrameName );
  876. IF ControlUtils.FrameExists( CurrentDspFile, FrameName ) THEN
  877. ControlUtils.Input( WorkFrame, FrameName );
  878. END;
  879. END;
  880. | 'L' :
  881. ScrnTypes.InitDisplayFrame( ListFrame, VWindows.CurrentWindow );
  882. DspFiles.ReadDisplayFrame( ScrnCompDsp, ListFrame,
  883. 'ListBox' );
  884. ScrnUtl1.SetNormalColors( ListFrame );
  885. NamesToFrame( CurrentDspFile, ListFrame );
  886. FramePainter.ShowDisplayFrame( ListFrame, 0, 0, 0, 0 );
  887. IF ScrnUtl1.FieldListTotal( ListFrame ) > 0 THEN
  888. InputManager.ControlFrame( ListFrame, 1, '', FALSE,
  889. NextFrame );
  890. ScrnUtl1.GetFieldText( ListFrame,
  891. ListFrame^.CurrentField, LastFrameName );
  892. END;
  893. ScrnUtl2.CloseDisplayFrame( ListFrame );
  894. END;
  895. ScrnUtl2.CloseDisplayFrame( WorkFrame );
  896. END DoDisplayMenu;
  897. PROCEDURE DoPrintDialog();
  898. VAR
  899. WorkFrame, ListFrame: ScrnTypes.DisplayFrame;
  900. FrameName: ScrnTypes.AFrameName;
  901. DeviceName: ARRAY [0..79] OF CHAR;
  902. TmpHandle: CARDINAL;
  903. BEGIN
  904. IF CurrentDspFile = NIL THEN
  905. IF NOT OpenNewDspFile() THEN
  906. RETURN;
  907. END;
  908. END;
  909. ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow );
  910. WorkFrame^.FromFile := CurrentDspFile;
  911. LOOP
  912. DspFiles.ReadDisplayFrame( ScrnCompDsp, WorkFrame, 'PrintDialog' );
  913. ControlUtils.ChangeField( WorkFrame, LastFrameName, 'FrameName', TRUE );
  914. FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 );
  915. InputManager.ControlFrame( WorkFrame, 1, '', FALSE, FrameName );
  916. IF PosUtils.Equal( FrameName, WorkFrame^.parent ) THEN
  917. EXIT;
  918. END;
  919. ControlUtils.ReadInput( WorkFrame, FrameName, 'FrameName' );
  920. ControlUtils.ReadInput( WorkFrame, DeviceName, 'DeviceName' );
  921. StrEdit.CrunchBlanks( FrameName );
  922. StrEdit.CrunchBlanks( DeviceName );
  923. IF ControlUtils.FrameExists( CurrentDspFile, FrameName ) THEN
  924. DspFiles.ReadDisplayFrame( CurrentDspFile, WorkFrame, FrameName );
  925. HandleIO.OpenForAppending( DeviceName, TmpHandle );
  926. PrtFrame.PrintDisplayFrame( WorkFrame, TmpHandle, 0 );
  927. IF StringIO.NoError # HandleIO.CloseHandle( TmpHandle ) THEN
  928. EXIT;
  929. END;
  930. END;
  931. M2Strings.Assign( FrameName, LastFrameName );
  932. END;
  933. ScrnUtl2.CloseDisplayFrame( WorkFrame );
  934. END DoPrintDialog;
  935. PROCEDURE DoFrameSeq();
  936. VAR
  937. WorkFrame: ScrnTypes.DisplayFrame;
  938. EntryFrame: ScrnTypes.AFrameName;
  939. BEGIN
  940. IF CurrentDspFile = NIL THEN
  941. IF NOT OpenNewDspFile() THEN
  942. RETURN;
  943. END;
  944. END;
  945. IF GetStrResponse( 'EntryPrompt', LastFrameName, EntryFrame ) THEN
  946. M2Strings.Assign( EntryFrame, LastFrameName );
  947. IF NOT ControlUtils.FrameExists( CurrentDspFile, EntryFrame ) THEN
  948. IF NOT GetStrResponse( 'NewEntry', EntryFrame, EntryFrame ) THEN
  949. RETURN;
  950. END;
  951. END;
  952. ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow );
  953. WorkFrame^.FromFile := CurrentDspFile;
  954. LOOP
  955. ControlUtils.FrameSeq2( CurrentDspFile, 'QNOCHECKQ', EntryFrame );
  956. (* We don't want any checking for circular sequences
  957. at this level, so we use a value for the
  958. CheckFrame parameter that we hope you will never
  959. need as a frame name. *)
  960. IF NOT PosUtils.Equal( EntryFrame, ScrnTypes.ProgramExit ) THEN
  961. (*We exited from FrameSequence prematurely because of an
  962. unfound frame name.*)
  963. IF NOT GetStrResponse( 'NewEntry', EntryFrame, EntryFrame ) THEN
  964. EXIT;
  965. END;
  966. ELSE
  967. EXIT;
  968. END;
  969. END;
  970. ScrnUtl2.CloseDisplayFrame( WorkFrame );
  971. END;
  972. END DoFrameSeq;
  973. PROCEDURE RestoreDisplay();
  974. BEGIN
  975. VWindows.SetForeColor( VWindows.CurrentWindow, MsColors.lightgrey );
  976. VWindows.SetBackColor( VWindows.CurrentWindow, MsColors.black );
  977. VWindows.SetMonoAttr( VWindows.CurrentWindow, MsColors.plain );
  978. VWindows.ClearPart( VWindows.CurrentWindow, 1, 1,
  979. VWindows.EndCol(VWindows.CurrentWindow),
  980. VWindows.EndRow(VWindows.CurrentWindow) );
  981. VWindows.SetCursorHeight( VWindows.CurrentWindow, SavedCursorHeight );
  982. END RestoreDisplay;
  983. BEGIN
  984. (* ScrnCompile *)
  985. MakeFrame.Init();
  986. (* We initialize MakeFrame explicitly because there are cases where
  987. we could reference its global data without first calling one of
  988. its functions. Our new initialization scheme is triggered only
  989. when a function is called. *)
  990. GenLists.NilList( FileList );
  991. GenLists.NilList( OutFrameList );
  992. GenLists.NewList( CurrentFrameList );
  993. CurrentDspFile := NIL;
  994. AtEndOfList := FALSE;
  995. LastFileName := '';
  996. LastFrameName := '';
  997. CmdLineVersion := FALSE;
  998. FileListLine := 1;
  999. BigSets.InitSet( MovementKeys );
  1000. BigSets.AppendSet( MovementKeys, '{9, 271, 328, 331, 333, 336, 329, 337}' );
  1001. (*Arrow keys plus tab, backtab, PgUp, and PgDn*)
  1002. IF CommandLineSwitch() OR
  1003. (NOT DspFiles.OpenDisplayFile( ScrnCompDsp, 'ScrnComp.dsp' )) THEN
  1004. CmdLineVersion := TRUE;
  1005. ParamsRead := 0;
  1006. IF NOT ReadNewEdtFile() THEN
  1007. RETURN;
  1008. END;
  1009. IF NOT OpenNewDspFile() THEN
  1010. RETURN;
  1011. END;
  1012. WHILE NOT AtEndOfList DO
  1013. AtEndOfList := NOT GetNextFrame( FileList,
  1014. CurrentFrameList, FileListLine );
  1015. IF GenLists.ListLength( CurrentFrameList) > 0 THEN
  1016. MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName,
  1017. ErrStr, BadLine);
  1018. IF BadLine # 0 THEN
  1019. ShowError( CurrentFrameList, FrameName, ErrStr, BadLine);
  1020. END;
  1021. AddToFile( CurrentDspFile, OutFrameList, FrameName);
  1022. StrEdit.RightJustify( FrameName, 20 );
  1023. StringIO.WriteStr( StringIO.outp, FrameName );
  1024. StringIO.WriteStr( StringIO.outp, ' added to ' );
  1025. StringIO.WriteStr( StringIO.outp, DspFileName );
  1026. StringIO.WriteEol( StringIO.outp, '.' );
  1027. END;
  1028. END;
  1029. RETURN;
  1030. END;
  1031. SavedCursorHeight := VWindows.GetCursorHeight( VWindows.CurrentWindow );
  1032. VWindows.SetCursorHeight( VWindows.CurrentWindow, 0 );
  1033. ErrorManager.AddTermProc( RestoreDisplay );
  1034. GenLists.NewList( TopMenuList );
  1035. ControlUtils.LoadFrameList( ScrnCompDsp, 'TopMenu', TopMenuList );
  1036. (*This keeps the TopMenu in memory.*)
  1037. UserOps.DoPrompting := FALSE;
  1038. ControlUtils.InputConst( DspFiles.MainFrame, 'Banner' );
  1039. UserOps.DoPrompting := TRUE;
  1040. UserOps.PromptRow := VWindows.EndRow(VWindows.CurrentWindow) - 1;
  1041. ScrnUtl2.Display( DspFiles.MainFrame, 'BlankScreen' );
  1042. LOOP
  1043. NextFrame := 'TopMenu';
  1044. ControlUtils.ControlSeparately( TopMenuList,
  1045. NextFrame, SelChar, EndingFrame );
  1046. IF PosUtils.Equal( ScrnTypes.ProgramExit, NextFrame ) THEN
  1047. EXIT;
  1048. ELSIF PosUtils.Equal( EndingFrame, 'FileMenu' ) THEN
  1049. (*User has made a selection from the FileMenu.*)
  1050. DoFileMenu( SelChar );
  1051. ELSIF PosUtils.Equal( EndingFrame, 'EditMenu' ) THEN
  1052. DoEditMenu( SelChar );
  1053. ELSIF PosUtils.Equal( EndingFrame, 'CompMenu' ) THEN
  1054. DoCompMenu( SelChar );
  1055. ELSIF PosUtils.Equal( EndingFrame, 'DispMenu' ) THEN
  1056. DoDisplayMenu( SelChar );
  1057. ELSIF PosUtils.Equal( EndingFrame, 'TopMenu' ) THEN
  1058. IF (NOT PosUtils.Equal(NextFrame, ScrnTypes.ProgramExit)) AND
  1059. (NOT PosUtils.Equal(NextFrame, 'Banner') ) THEN
  1060. CASE SelChar OF
  1061. 'R': DoFrameSeq();
  1062. | 'x': EXIT;
  1063. | 'P': DoPrintDialog();
  1064. | 's': ScrnUtl2.Display( DspFiles.MainFrame, 'BlankScreen' );
  1065. ELSE
  1066. (*fall through*)
  1067. END;
  1068. END;
  1069. ELSE
  1070. ErrorManager.WARN('Error in TopMenu loop logic');
  1071. END;
  1072. END;
  1073. GenLists.DisposeList( TopMenuList );
  1074. DspFiles.CloseDisplayFile( ScrnCompDsp );
  1075. ErrorManager.DoTermProcs();
  1076. END ScrnCompile.
  1077.