MODULE ScrnCompile; (* * REPERTOIRE * Release 1.6 * By Charles Bradford and Cole Brecheen * (c) Copyright 1985-1990 PMI * Green Bay, WI * All rights reserved * (414) 468-6040 * *) IMPORT BigSets; IMPORT ControlUtils; IMPORT DspFiles; IMPORT EnvironUtils; IMPORT ErrorManager; IMPORT HandleIO; IMPORT FrameManager; IMPORT FramePainter; IMPORT GenLists; IMPORT InputManager; IMPORT KbdInput; IMPORT ListUtils; IMPORT LowLevel; IMPORT M2Strings; IMPORT MakeFrame; IMPORT MsColors; IMPORT NdxBones; IMPORT NdxFiles; IMPORT NdxTypes; IMPORT NdxUtils; IMPORT PosUtils; IMPORT PrtFrame; IMPORT ScrnTypes; IMPORT ScrnUtl1; IMPORT ScrnUtl2; IMPORT StrConv; IMPORT StrEdit; IMPORT StringIO; IMPORT SYSTEM; IMPORT UserOps; IMPORT VEditor; IMPORT VWindows; IMPORT InitCompilerMods; TYPE ASyntaxChoice = (unknown, old, new); VAR LastFileName, LastFrameName, EdtFileName, DspFileName: ARRAY [0..80] OF CHAR; TopMenuList, FileList, CurrentFrameList, OutFrameList: GenLists.GenList; ErrStr: ARRAY [0..255] OF CHAR; FrameName, StartFrame, EndingFrame, NextFrame: ScrnTypes.AFrameName; ScrnCompDsp, CurrentDspFile: ScrnTypes.DisplayFile; ParamsRead, SavedCursorHeight, FileListLine, BadLine: CARDINAL; syntax : ASyntaxChoice; (*Determines the syntax rule in effect for the current .EDT file.*) CmdLineVersion, AtEndOfList, ListChanged: BOOLEAN; MovementKeys: KbdInput.KeyNumSet; SelChar: CHAR; (* These two new forms of the Input procedure will eventually be moved to ControlUtils. *) PROCEDURE Input2( TheFile: ScrnTypes.DisplayFile; VAR FrameName : ScrnTypes.AFrameName ); VAR TmpFrame: ScrnTypes.DisplayFrame; BEGIN ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow ); DspFiles.ReadFrame( TheFile, TmpFrame, FrameName ); FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TmpFrame, 1, '', FALSE, FrameName ); ScrnUtl2.CloseDisplayFrame( TmpFrame ); END Input2; PROCEDURE InputConst2( TheFile: ScrnTypes.DisplayFile; FrameName : ARRAY OF CHAR ); VAR TmpName: ScrnTypes.AFrameName; TmpFrame: ScrnTypes.DisplayFrame; BEGIN ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow ); M2Strings.Assign( FrameName, TmpName ); DspFiles.ReadFrame( TheFile, TmpFrame, TmpName ); FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TmpFrame, 0, '', FALSE, TmpName ); ScrnUtl2.CloseDisplayFrame( TmpFrame ); END InputConst2; PROCEDURE UpdateStatus( StatusFrame: ScrnTypes.DisplayFrame; FieldName, NewStatus: ARRAY OF CHAR ); VAR width, TmpFieldNum: CARDINAL; TmpStr: ARRAY [0..79] OF CHAR; BEGIN TmpFieldNum := ScrnUtl1.FieldNum(StatusFrame, FieldName ); width := ScrnUtl1.FieldWidth( StatusFrame, TmpFieldNum ); StrEdit.AssignStr( NewStatus, TmpStr ); StrEdit.Center( TmpStr, width ); ControlUtils.ChangeField( StatusFrame, TmpStr, FieldName, TRUE ); FramePainter.RedrawField( StatusFrame, TmpFieldNum, FALSE ); END UpdateStatus; PROCEDURE CommandLineSwitch(): BOOLEAN; VAR lngth: CARDINAL; ParamStr: ARRAY [0..127] OF CHAR; BEGIN EnvironUtils.GetProgParams( ParamStr ); StrEdit.CrunchBlanks( ParamStr ); lngth := M2Strings.Length( ParamStr ); IF lngth < 2 THEN RETURN FALSE; END; IF (ParamStr[ lngth - 2 ] = '/') AND (CAP(ParamStr[ lngth - 1 ]) = 'C') THEN RETURN TRUE; ELSE RETURN FALSE; END; END CommandLineSwitch; PROCEDURE AddExtension( VAR FileName: ARRAY OF CHAR; Extension: ARRAY OF CHAR ); BEGIN IF NOT PosUtils.Present( ".", FileName) THEN StrEdit.Append( FileName, Extension ); END; END AddExtension; PROCEDURE AddMovementKeys( VAR TheKeySet: KbdInput.KeyNumSet ); BEGIN BigSets.SetUnion( TheKeySet, MovementKeys, TheKeySet ); END AddMovementKeys; PROCEDURE RemoveMovementKeys( VAR TheKeySet: KbdInput.KeyNumSet ); BEGIN BigSets.SetDifference( TheKeySet, MovementKeys, TheKeySet ); END RemoveMovementKeys; PROCEDURE CallEditor( VAR TheList: GenLists.GenList; VAR ControlRec: VEditor.AnEdControlRec ); VAR TmpFrame: ScrnTypes.DisplayFrame; BEGIN ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow ); ControlUtils.AddEditorField( TmpFrame, TheList, ControlRec ); FrameManager.FrameActivated( TmpFrame ); UserOps.DoPrompting := FALSE; RemoveMovementKeys( UserOps.FieldExitKeySet ); VEditor.TheEditor( TheList, ControlRec ); AddMovementKeys( UserOps.FieldExitKeySet ); UserOps.DoPrompting := TRUE; GenLists.NilList( TmpFrame^.EdFieldList ); GenLists.DisconnectLists( TheList, TmpFrame^.self ); (* We have to disconnect TheList because it has become a sublist of TmpFrame's .self list, which is about to be disposed of. *) ScrnUtl2.CloseDisplayFrame( TmpFrame ); VWindows.SetForeColor( VWindows.CurrentWindow, MsColors.lightgrey ); VWindows.SetBackColor( VWindows.CurrentWindow, MsColors.black ); VWindows.SetMonoAttr( VWindows.CurrentWindow, MsColors.plain ); VWindows.ClearPart( VWindows.CurrentWindow, 1,1, VWindows.EndCol(VWindows.CurrentWindow), VWindows.EndRow(VWindows.CurrentWindow) ); END CallEditor; PROCEDURE CloseCurrentDsp(); BEGIN IF (CurrentDspFile # NIL) THEN NdxUtils.CrunchNdxFile( CurrentDspFile ); NdxFiles.CloseNdxFile( CurrentDspFile ); END; END CloseCurrentDsp; PROCEDURE Yes( Prompt: ARRAY OF CHAR ): BOOLEAN; BEGIN IF CmdLineVersion THEN StringIO.WriteEol( StringIO.outp, '' ); StringIO.WriteStr( StringIO.outp, Prompt ); StringIO.WriteStr( StringIO.outp, ' (Y/N): ' ); RETURN KbdInput.CAPkey( KbdInput.KeyHit( KbdInput.YorN ) ) = ORD('Y'); ELSE M2Strings.Assign( Prompt, NextFrame ); ControlUtils.Input( DspFiles.MainFrame, NextFrame ); RETURN CAP( ScrnUtl1.SelectedChar(DspFiles.MainFrame) ) = 'Y'; END; END Yes; PROCEDURE NamesToFrame( DspFile: ScrnTypes.DisplayFile; VAR TheFrame: ScrnTypes.DisplayFrame ); VAR NdxRec: NdxTypes.NdxElement; lngth, cnt, TypeCode: CARDINAL; BEGIN lngth := GenLists.ListLength( DspFile^.Ndx ); FOR cnt := 1 TO lngth DO GenLists.GetElmt( DspFile^.Ndx, cnt, NdxRec, TypeCode ); IF NdxRec.RecName[0] # 0C THEN IF NOT (PosUtils.Pos( 'RepVers', NdxRec.RecName ) = 0) THEN (* We don't want to write out the name of the version check record. *) ControlUtils.AddMenuItem( TheFrame, 2, 1 + cnt, NdxRec.RecName, 20, 0, NdxRec.RecName ); END; END; END; END NamesToFrame; PROCEDURE InsertCommandDelims( VAR TheList: GenLists.GenList ); VAR TmpStr: ARRAY [0..127] OF CHAR; BEGIN IF GenLists.ListLength( TheList ) = 0 THEN (*Get em started--command area delimiters are tedious to type in.*) LowLevel.Fill( SYSTEM.ADR(TmpStr), 80, '=' ); GenLists.ListInsert( TmpStr, GenLists.StrCode, TheList, 1 ); LowLevel.Fill( SYSTEM.ADR(TmpStr), 80, '-' ); GenLists.ListInsert( ':[insert name here]', GenLists.StrCode, TheList, 2 ); GenLists.ListInsert( TmpStr, GenLists.StrCode, TheList, 3 ); END; END InsertCommandDelims; PROCEDURE GetStrResponse( Prompt, Default: ARRAY OF CHAR; VAR TheStr: ARRAY OF CHAR ): BOOLEAN; BEGIN IF CmdLineVersion THEN IF EnvironUtils.ParsedParam( ParamsRead + 1, TheStr ) THEN IF TheStr[0] # '/' THEN IF PosUtils.Present( '/c', TheStr ) OR PosUtils.Present( '/C', TheStr ) THEN M2Strings.Delete( TheStr, M2Strings.Length(TheStr) - 2, 2 ); StrEdit.CrunchBlanks( TheStr ); END; INC( ParamsRead ); RETURN TRUE; END; END; StringIO.WriteStr( StringIO.outp, Prompt ); StringIO.WriteStr( StringIO.outp, ': ' ); StringIO.ReadStr( StringIO.inp, TheStr ); IF TheStr[0] # 0C THEN RETURN TRUE; ELSE RETURN FALSE; END; END; M2Strings.Assign( Prompt, NextFrame ); DspFiles.ReadDisplayFrame( ScrnCompDsp, DspFiles.MainFrame, NextFrame ); ControlUtils.ChangeField( DspFiles.MainFrame, Default, 'TheStr', TRUE ); FramePainter.ShowDisplayFrame( DspFiles.MainFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( DspFiles.MainFrame, 1, '', FALSE, NextFrame ); IF PosUtils.Equal( DspFiles.MainFrame^.parent, NextFrame ) THEN RETURN FALSE; END; ControlUtils.ReadInput( DspFiles.MainFrame, TheStr, 'TheStr' ); StrEdit.CrunchBlanks( TheStr ); RETURN TRUE; END GetStrResponse; PROCEDURE ReadNewEdtFile(): BOOLEAN; BEGIN IF GenLists.Initialized( FileList ) THEN IF Yes('SaveEdt') THEN IF NOT GetStrResponse( 'EdtName', EdtFileName, EdtFileName ) THEN RETURN FALSE; END; AddExtension( EdtFileName, '.EDT' ); IF StringIO.NoError # ListUtils.TextListToFile( FileList, EdtFileName ) THEN RETURN FALSE; END; END; GenLists.DisposeList( FileList ); END; LOOP IF NOT GetStrResponse( 'EdtName', LastFileName, EdtFileName ) THEN RETURN FALSE; END; M2Strings.Assign( EdtFileName, LastFileName ); AddExtension( EdtFileName, '.EDT' ); GenLists.NewList( FileList ); IF ListUtils.TextFileToList( EdtFileName, FileList) = StringIO.NoError THEN ListUtils.DeTabList( FileList, ListChanged ); EXIT; ELSIF Yes( 'CreateQ' ) THEN GenLists.DisposeList( FileList ); GenLists.CopyList( CurrentFrameList, FileList ); InsertCommandDelims( FileList ); (*Won't do anything if there's already something in CurrentFrameList.*) ELSE GenLists.DisposeList( FileList ); IF NOT CmdLineVersion THEN InputConst2( ScrnCompDsp, 'FileError' ); END; RETURN FALSE; END; END; FileListLine := 1; RETURN TRUE; END ReadNewEdtFile; PROCEDURE RightVersion( VAR dfile: ScrnTypes.DisplayFile ): BOOLEAN; VAR TypeCode: CARDINAL; tmpstr: ScrnTypes.AFrameName; BEGIN IF NdxBones.InitBuffer( dfile, 'RepVers' ) THEN GenLists.GetElmt( dfile^.ListBuf, 1, tmpstr, TypeCode ); IF PosUtils.Equal( '1.5c', tmpstr ) THEN RETURN TRUE; ELSE DspFiles.CloseDisplayFile( dfile ); RETURN FALSE; END; ELSE DspFiles.CloseDisplayFile( dfile ); RETURN FALSE; END; END RightVersion; PROCEDURE OpenNewDspFile(): BOOLEAN; BEGIN IF CurrentDspFile # NIL THEN DspFiles.CloseDisplayFile( CurrentDspFile ); END; LOOP IF NOT GetStrResponse( 'DspName', LastFileName, DspFileName ) THEN RETURN FALSE; END; M2Strings.Assign( DspFileName, LastFileName ); AddExtension( DspFileName, ".DSP" ); IF DspFiles.OpenDisplayFile( CurrentDspFile, DspFileName ) AND RightVersion(CurrentDspFile) THEN (*Don't let them open a .DSP file created by an incompatible version of the screen compiler. Make them start over.*) EXIT; ELSIF CmdLineVersion THEN NdxFiles.CreateNdxFile( CurrentDspFile, DspFileName, "" ); IF NdxFiles.PutField( CurrentDspFile, 'RepVers', 'RECORD', GenLists.StrCode, '1.5c' ) AND NdxFiles.WriteRecord( CurrentDspFile, 'RepVers' ) THEN EXIT; END ELSE IF Yes( 'CreateQ' ) THEN NdxFiles.CreateNdxFile( CurrentDspFile, DspFileName, "" ); IF NdxFiles.PutField( CurrentDspFile, 'RepVers', 'RECORD', GenLists.StrCode, '1.5c' ) AND NdxFiles.WriteRecord( CurrentDspFile, 'RepVers' ) THEN EXIT; END ELSE CurrentDspFile := NIL; RETURN FALSE; END; END; END; ErrorManager.AddTermProc( CloseCurrentDsp ); RETURN TRUE; END OpenNewDspFile; PROCEDURE FrameStart( VAR str: ARRAY OF CHAR ): BOOLEAN; BEGIN IF (M2Strings.Length(str) = 0) THEN RETURN FALSE; END; IF (PosUtils.Present( MakeFrame.CommandBeginStr, str)) THEN IF (syntax = new) THEN RETURN TRUE; END; IF (syntax = unknown) THEN syntax := new; RETURN TRUE; END; END; IF (str[0] = ":") THEN IF (syntax = old) THEN RETURN TRUE; END; IF (syntax = unknown) THEN syntax := old; RETURN TRUE; END; END; RETURN FALSE; END FrameStart; PROCEDURE GetNextFrame( FileList: GenLists.GenList; VAR FrameList: GenLists.GenList; VAR StartLine: CARDINAL ): BOOLEAN; (* Gets next frame list out of file list.*) VAR text: ARRAY [0..255] OF CHAR; type: CARDINAL; BEGIN syntax := unknown; GenLists.DisposeList( FrameList); GenLists.NewList( FrameList); (* first, skip until we get to CommandBeginStr or a colon in column one *) REPEAT IF StartLine > GenLists.ListLength( FileList) THEN RETURN FALSE; END; GenLists.GetElmt( FileList, StartLine, text, type); INC( StartLine); UNTIL FrameStart(text); (* now copy elements until another FrameStart*) REPEAT GenLists.ListInsert( text, type, FrameList, 65535); (* insert in frame *) IF StartLine > GenLists.ListLength( FileList) THEN RETURN FALSE; END; GenLists.GetElmt( FileList, StartLine, text, type); INC( StartLine); UNTIL FrameStart( text ); DEC( StartLine); RETURN TRUE; END GetNextFrame; PROCEDURE FindFrame( FileList: GenLists.GenList; FrameName: ARRAY OF CHAR; VAR StartLine: CARDINAL ): BOOLEAN; VAR text: ARRAY [0..255] OF CHAR; FoundSpot, type: CARDINAL; TmpName: ScrnTypes.AFrameName; BEGIN IF NOT GenLists.Initialized( FileList ) THEN RETURN FALSE; END; M2Strings.Assign( FrameName, TmpName ); M2Strings.Assign( FrameName, LastFrameName ); IF TmpName[0] # ':' THEN M2Strings.Insert( ':', TmpName, 0 ); END; StartLine := 0; REPEAT (*This is John McMonagle's fix for a problem that was causing FindFrame to return FALSE when frame names appeared by accident in other parts of the frame.*) StartLine := GenLists.ScanList( TmpName, FileList, StartLine + 1, GenLists.ListLength(FileList), FoundSpot ); IF (StartLine = 0) THEN RETURN FALSE; END; UNTIL FoundSpot = 0; syntax := unknown; GenLists.GetElmt( FileList, StartLine + 1, text, type); IF FrameStart( text ) THEN (* The name was outside the frame. *) syntax := old; RETURN TRUE; ELSE (* Back up until we get to CommandBeginStr or a colon in column one.*) syntax := new; REPEAT DEC( StartLine ); IF StartLine = 0 THEN RETURN FALSE; END; GenLists.GetElmt( FileList, StartLine, text, type ); UNTIL FrameStart(text); RETURN TRUE; END; END FindFrame; PROCEDURE GetSpecificFrame( FileList: GenLists.GenList; FrameName: ARRAY OF CHAR; VAR FrameList: GenLists.GenList): BOOLEAN; VAR StartLine: CARDINAL; BEGIN IF NOT FindFrame( FileList, FrameName, StartLine ) THEN RETURN FALSE; END; IF NOT GetNextFrame( FileList, FrameList, StartLine ) THEN (*It was probably the last frame in the FileList, but we don't care about that.*) END; RETURN TRUE; END GetSpecificFrame; PROCEDURE DeleteFrame( FileList: GenLists.GenList; FrameName: ARRAY OF CHAR; VAR EndLine: CARDINAL ): BOOLEAN; VAR type: CARDINAL; text: ARRAY [0..255] OF CHAR; BEGIN IF NOT FindFrame( FileList, FrameName, EndLine ) THEN RETURN FALSE; END; LOOP GenLists.ListDelete( FileList, EndLine, 1 ); IF (EndLine > GenLists.ListLength(FileList)) THEN EXIT; END; GenLists.GetElmt( FileList, EndLine, text, type); IF FrameStart( text ) THEN EXIT; END; END; RETURN TRUE; END DeleteFrame; PROCEDURE ShowError( FrameList: GenLists.GenList; FrameName, ErrStr: ARRAY OF CHAR; BadLine: CARDINAL); VAR text: ARRAY [0..255] OF CHAR; caption, numstr: ARRAY [0..15] OF CHAR; dumc: CARDINAL; BEGIN text := "Frame: "; IF M2Strings.Length( FrameName) = 0 THEN StrEdit.Append( text, "Unknown" ); ELSE StrEdit.Append( text, FrameName ); END; StrEdit.Append( text, ", Line: " ); StrConv.CardinalToStr( BadLine, 0, numstr); StrEdit.Append( text, numstr ); StrEdit.Append( text, '.' ); StrEdit.Append( text, ErrStr ); caption := 'Error'; dumc := VWindows.MessageBox( VWindows.CurrentWindow, SYSTEM.ADR(text), SYSTEM.ADR(caption), 0 ); END ShowError; PROCEDURE AddToFile( VAR file: NdxTypes.NdxFileType; OutList: GenLists.GenList; name: ScrnTypes.AFrameName); VAR ErrStr: ARRAY [0..80] OF CHAR; BEGIN IF (NOT NdxFiles.PutField( file, name, "RECORD", GenLists.ListCode, OutList)) OR (NOT NdxFiles.WriteRecord( file, name)) THEN StrEdit.AssignStr( "Can't add to file frame: ", ErrStr); StrEdit.Append( ErrStr, name); ErrorManager.WARN( ErrStr); END; END AddToFile; PROCEDURE DoFileMenu( SelectedChar: CHAR ); BEGIN CASE CAP(SelectedChar) OF 'E': IF NOT ReadNewEdtFile() THEN END; | 'D': IF NOT OpenNewDspFile() THEN END; | 'F': IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN LOOP M2Strings.Assign( FrameName, LastFrameName ); IF NOT ControlUtils.FrameExists( CurrentDspFile, FrameName ) THEN IF NOT GetStrResponse( 'NewEntry', FrameName, FrameName ) THEN EXIT END; ELSE IF NdxFiles.DeleteRecord( CurrentDspFile, FrameName ) THEN EXIT; END; END; END; END; | 'C': IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; NdxUtils.CrunchNdxFile( CurrentDspFile ); END; END DoFileMenu; PROCEDURE DoEditMenu( SelectedChar: CHAR ); VAR TmpRec: VEditor.AnEdControlRec; FrameName: ScrnTypes.AFrameName; FileName: ARRAY [0..79] OF CHAR; LineTotalStr: ARRAY [0..15] OF CHAR; TmpList: GenLists.GenList; EndLine, BadLine: CARDINAL; WorkFrame: ScrnTypes.DisplayFrame; StatusFrame: ScrnTypes.DisplayFrame; SavedMessage: CARDINAL; BEGIN VEditor.InitEdRec( TmpRec ); TmpRec.DoCounting := FALSE; CASE CAP(SelectedChar) OF 'E': IF NOT GenLists.Initialized( FileList ) THEN IF NOT ReadNewEdtFile() THEN RETURN; END; END; CallEditor( FileList, TmpRec ); IF TmpRec.ChangeMade THEN IF Yes( 'SaveQ' ) THEN IF StringIO.NoError # ListUtils.TextListToFile( FileList, EdtFileName ) THEN InputConst2( ScrnCompDsp, 'FileError' ); END; END; END; | 'S': IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN M2Strings.Assign( FrameName, LastFrameName ); IF GetSpecificFrame( FileList, FrameName, CurrentFrameList ) THEN CallEditor( CurrentFrameList, TmpRec ); IF TmpRec.ChangeMade THEN IF DeleteFrame( FileList, FrameName, EndLine ) THEN ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535, FileList, EndLine ); END; IF Yes( 'DisplayQ' ) THEN ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow ); WorkFrame^.FromFile := CurrentDspFile; MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); M2Strings.Assign( FrameName, LastFrameName ); IF BadLine = 0 THEN DspFiles.GetFrameFromList( OutFrameList, WorkFrame ); FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame ); ELSE ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); END; ScrnUtl2.CloseDisplayFrame( WorkFrame ); END; IF Yes( 'SaveQ' ) THEN IF StringIO.NoError # ListUtils.TextListToFile( FileList, EdtFileName ) THEN InputConst2( ScrnCompDsp, 'FileError' ); END; END; END; END; END; | 'F': IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow ); WorkFrame^.FromFile := CurrentDspFile; LOOP InsertCommandDelims( CurrentFrameList ); CallEditor( CurrentFrameList, TmpRec ); IF TmpRec.ChangeMade THEN IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535, FileList, EndLine ); END; END; IF NOT Yes( 'DisplayQ' ) THEN EXIT; END; MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); M2Strings.Assign( FrameName, LastFrameName ); IF BadLine = 0 THEN DspFiles.GetFrameFromList( OutFrameList, WorkFrame ); FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame ); ELSE ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); END; END; IF Yes( 'SaveQ' ) THEN IF StringIO.NoError # ListUtils.TextListToFile( FileList, EdtFileName ) THEN InputConst2( ScrnCompDsp, 'FileError' ); END; END; ScrnUtl2.CloseDisplayFrame( WorkFrame ); | 'A': IF GetStrResponse( 'FileName', LastFileName, FileName ) THEN M2Strings.Assign( FileName, LastFileName ); GenLists.NewList( TmpList ); SavedMessage := ListUtils.TextFileToList( FileName, TmpList ); IF (SavedMessage # StringIO.NoError) AND (SavedMessage # StringIO.FileNotFound) THEN InputConst2( ScrnCompDsp, 'FileError' ); ELSE IF SavedMessage = StringIO.FileNotFound THEN IF NOT Yes( 'CreateQ' ) THEN RETURN; END; END; ListUtils.DeTabList( TmpList, ListChanged ); CallEditor( TmpList, TmpRec ); IF TmpRec.ChangeMade THEN IF Yes( 'SaveQ' ) THEN ScrnTypes.InitDisplayFrame( StatusFrame, VWindows.CurrentWindow ); ScrnUtl2.ReadAndShow( ScrnCompDsp, StatusFrame, 'StatusFrame' ); UpdateStatus( StatusFrame, 'line1', 'Writing' ); StrConv.CardinalToStr( GenLists.ListLength(TmpList), 0, LineTotalStr ); UpdateStatus( StatusFrame, 'line2', LineTotalStr ); UpdateStatus( StatusFrame, 'line3', 'lines.' ); IF StringIO.NoError # ListUtils.TextListToFile( TmpList, FileName ) THEN InputConst2( ScrnCompDsp, 'FileError' ); END; FrameManager.EraseFrame( StatusFrame ); ScrnUtl2.CloseDisplayFrame( StatusFrame ); END; END; END; GenLists.DisposeList( TmpList ); END; END; END DoEditMenu; PROCEDURE DoCompMenu( SelectedChar: CHAR ); VAR TmpRec: VEditor.AnEdControlRec; ChangeMade : BOOLEAN; EndLine: CARDINAL; StatusFrame: ScrnTypes.DisplayFrame; BEGIN IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; VEditor.InitEdRec( TmpRec ); TmpRec.DoCounting := FALSE; ChangeMade := FALSE; CASE CAP(SelectedChar) OF 'E' : IF NOT GenLists.Initialized( FileList ) THEN IF NOT ReadNewEdtFile() THEN RETURN; END; END; AtEndOfList := FALSE; FileListLine := 1; ScrnTypes.InitDisplayFrame( StatusFrame, VWindows.CurrentWindow ); ScrnUtl2.ReadAndShow( ScrnCompDsp, StatusFrame, 'StatusFrame' ); UpdateStatus( StatusFrame, 'line1', 'Processing' ); WHILE NOT AtEndOfList DO AtEndOfList := NOT GetNextFrame( FileList, CurrentFrameList, FileListLine ); IF GenLists.ListLength( CurrentFrameList) > 0 THEN BadLine := 1; WHILE BadLine # 0 DO MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); M2Strings.Assign( FrameName, LastFrameName ); UpdateStatus( StatusFrame, 'line2', FrameName ); IF BadLine # 0 THEN ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); IF Yes( 'EditQ' ) THEN TmpRec.CursorRow := BadLine; CallEditor( CurrentFrameList, TmpRec ); IF TmpRec.ChangeMade THEN IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535, FileList, EndLine ); END; END; BadLine := 0; IF TmpRec.ChangeMade THEN ChangeMade := TRUE; END; END; ELSE AddToFile( CurrentDspFile, OutFrameList, FrameName); END; END; END; END; FrameManager.EraseFrame( StatusFrame ); ScrnUtl2.CloseDisplayFrame( StatusFrame ); IF ChangeMade THEN IF Yes( 'SaveQ' ) THEN IF StringIO.NoError # ListUtils.TextListToFile( FileList, EdtFileName ) THEN InputConst2( ScrnCompDsp, 'FileError' ); END; END; END; | 'S' : IF NOT GenLists.Initialized( FileList ) THEN IF NOT ReadNewEdtFile() THEN RETURN; END; END; IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN M2Strings.Assign( FrameName, LastFrameName ); IF GetSpecificFrame( FileList, FrameName, CurrentFrameList ) THEN MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); M2Strings.Assign( FrameName, LastFrameName ); IF BadLine = 0 THEN IF Yes( 'StoreQ' ) THEN AddToFile( CurrentDspFile, OutFrameList, FrameName); END; ELSE ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); IF Yes( 'EditQ' ) THEN TmpRec.CursorRow := BadLine; CallEditor( CurrentFrameList, TmpRec ); IF TmpRec.ChangeMade THEN IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535, FileList, EndLine ); END; END; END; END; END; END; | 'C' : IF GenLists.ListLength( CurrentFrameList ) = 0 THEN InputConst2( ScrnCompDsp, 'NoCurrent' ); RETURN; END; MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); M2Strings.Assign( FrameName, LastFrameName ); IF BadLine = 0 THEN IF Yes( 'StoreQ' ) THEN AddToFile( CurrentDspFile, OutFrameList, FrameName); END; ELSE ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); IF Yes( 'EditQ' ) THEN TmpRec.CursorRow := BadLine; CallEditor( CurrentFrameList, TmpRec ); IF TmpRec.ChangeMade THEN IF DeleteFrame( FileList, LastFrameName, EndLine ) THEN ListUtils.InsertElmtsOf( CurrentFrameList, 1, 65535, FileList, EndLine ); END; END; END; END; END; END DoCompMenu; PROCEDURE DoDisplayMenu( SelectedChar: CHAR ); VAR WorkFrame, ListFrame: ScrnTypes.DisplayFrame; BEGIN IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow ); WorkFrame^.FromFile := CurrentDspFile; CASE CAP(SelectedChar) OF 'C' : IF GenLists.Initialized( OutFrameList ) THEN DspFiles.GetFrameFromList( OutFrameList, WorkFrame ); FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame ); ELSIF GenLists.ListLength( CurrentFrameList ) > 0 THEN MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); M2Strings.Assign( FrameName, LastFrameName ); IF BadLine = 0 THEN DspFiles.GetFrameFromList( OutFrameList, WorkFrame ); FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( WorkFrame, 1, '', FALSE, NextFrame ); ELSE ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); END; ELSE InputConst2( ScrnCompDsp, 'NoCurrent' ); END; | 'S' : IF GetStrResponse( 'FramePrompt', LastFrameName, FrameName ) THEN M2Strings.Assign( FrameName, LastFrameName ); IF ControlUtils.FrameExists( CurrentDspFile, FrameName ) THEN ControlUtils.Input( WorkFrame, FrameName ); END; END; | 'L' : ScrnTypes.InitDisplayFrame( ListFrame, VWindows.CurrentWindow ); DspFiles.ReadDisplayFrame( ScrnCompDsp, ListFrame, 'ListBox' ); ScrnUtl1.SetNormalColors( ListFrame ); NamesToFrame( CurrentDspFile, ListFrame ); FramePainter.ShowDisplayFrame( ListFrame, 0, 0, 0, 0 ); IF ScrnUtl1.FieldListTotal( ListFrame ) > 0 THEN InputManager.ControlFrame( ListFrame, 1, '', FALSE, NextFrame ); ScrnUtl1.GetFieldText( ListFrame, ListFrame^.CurrentField, LastFrameName ); END; ScrnUtl2.CloseDisplayFrame( ListFrame ); END; ScrnUtl2.CloseDisplayFrame( WorkFrame ); END DoDisplayMenu; PROCEDURE DoPrintDialog(); VAR WorkFrame, ListFrame: ScrnTypes.DisplayFrame; FrameName: ScrnTypes.AFrameName; DeviceName: ARRAY [0..79] OF CHAR; TmpHandle: CARDINAL; BEGIN IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow ); WorkFrame^.FromFile := CurrentDspFile; LOOP DspFiles.ReadDisplayFrame( ScrnCompDsp, WorkFrame, 'PrintDialog' ); ControlUtils.ChangeField( WorkFrame, LastFrameName, 'FrameName', TRUE ); FramePainter.ShowDisplayFrame( WorkFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( WorkFrame, 1, '', FALSE, FrameName ); IF PosUtils.Equal( FrameName, WorkFrame^.parent ) THEN EXIT; END; ControlUtils.ReadInput( WorkFrame, FrameName, 'FrameName' ); ControlUtils.ReadInput( WorkFrame, DeviceName, 'DeviceName' ); StrEdit.CrunchBlanks( FrameName ); StrEdit.CrunchBlanks( DeviceName ); IF ControlUtils.FrameExists( CurrentDspFile, FrameName ) THEN DspFiles.ReadDisplayFrame( CurrentDspFile, WorkFrame, FrameName ); HandleIO.OpenForAppending( DeviceName, TmpHandle ); PrtFrame.PrintDisplayFrame( WorkFrame, TmpHandle, 0 ); IF StringIO.NoError # HandleIO.CloseHandle( TmpHandle ) THEN EXIT; END; END; M2Strings.Assign( FrameName, LastFrameName ); END; ScrnUtl2.CloseDisplayFrame( WorkFrame ); END DoPrintDialog; PROCEDURE DoFrameSeq(); VAR WorkFrame: ScrnTypes.DisplayFrame; EntryFrame: ScrnTypes.AFrameName; BEGIN IF CurrentDspFile = NIL THEN IF NOT OpenNewDspFile() THEN RETURN; END; END; IF GetStrResponse( 'EntryPrompt', LastFrameName, EntryFrame ) THEN M2Strings.Assign( EntryFrame, LastFrameName ); IF NOT ControlUtils.FrameExists( CurrentDspFile, EntryFrame ) THEN IF NOT GetStrResponse( 'NewEntry', EntryFrame, EntryFrame ) THEN RETURN; END; END; ScrnTypes.InitDisplayFrame( WorkFrame, VWindows.CurrentWindow ); WorkFrame^.FromFile := CurrentDspFile; LOOP ControlUtils.FrameSeq2( CurrentDspFile, 'QNOCHECKQ', EntryFrame ); (* We don't want any checking for circular sequences at this level, so we use a value for the CheckFrame parameter that we hope you will never need as a frame name. *) IF NOT PosUtils.Equal( EntryFrame, ScrnTypes.ProgramExit ) THEN (*We exited from FrameSequence prematurely because of an unfound frame name.*) IF NOT GetStrResponse( 'NewEntry', EntryFrame, EntryFrame ) THEN EXIT; END; ELSE EXIT; END; END; ScrnUtl2.CloseDisplayFrame( WorkFrame ); END; END DoFrameSeq; PROCEDURE RestoreDisplay(); BEGIN VWindows.SetForeColor( VWindows.CurrentWindow, MsColors.lightgrey ); VWindows.SetBackColor( VWindows.CurrentWindow, MsColors.black ); VWindows.SetMonoAttr( VWindows.CurrentWindow, MsColors.plain ); VWindows.ClearPart( VWindows.CurrentWindow, 1, 1, VWindows.EndCol(VWindows.CurrentWindow), VWindows.EndRow(VWindows.CurrentWindow) ); VWindows.SetCursorHeight( VWindows.CurrentWindow, SavedCursorHeight ); END RestoreDisplay; BEGIN (* ScrnCompile *) MakeFrame.Init(); (* We initialize MakeFrame explicitly because there are cases where we could reference its global data without first calling one of its functions. Our new initialization scheme is triggered only when a function is called. *) GenLists.NilList( FileList ); GenLists.NilList( OutFrameList ); GenLists.NewList( CurrentFrameList ); CurrentDspFile := NIL; AtEndOfList := FALSE; LastFileName := ''; LastFrameName := ''; CmdLineVersion := FALSE; FileListLine := 1; BigSets.InitSet( MovementKeys ); BigSets.AppendSet( MovementKeys, '{9, 271, 328, 331, 333, 336, 329, 337}' ); (*Arrow keys plus tab, backtab, PgUp, and PgDn*) IF CommandLineSwitch() OR (NOT DspFiles.OpenDisplayFile( ScrnCompDsp, 'ScrnComp.dsp' )) THEN CmdLineVersion := TRUE; ParamsRead := 0; IF NOT ReadNewEdtFile() THEN RETURN; END; IF NOT OpenNewDspFile() THEN RETURN; END; WHILE NOT AtEndOfList DO AtEndOfList := NOT GetNextFrame( FileList, CurrentFrameList, FileListLine ); IF GenLists.ListLength( CurrentFrameList) > 0 THEN MakeFrame.CompileFrame( CurrentFrameList, OutFrameList, FrameName, ErrStr, BadLine); IF BadLine # 0 THEN ShowError( CurrentFrameList, FrameName, ErrStr, BadLine); END; AddToFile( CurrentDspFile, OutFrameList, FrameName); StrEdit.RightJustify( FrameName, 20 ); StringIO.WriteStr( StringIO.outp, FrameName ); StringIO.WriteStr( StringIO.outp, ' added to ' ); StringIO.WriteStr( StringIO.outp, DspFileName ); StringIO.WriteEol( StringIO.outp, '.' ); END; END; RETURN; END; SavedCursorHeight := VWindows.GetCursorHeight( VWindows.CurrentWindow ); VWindows.SetCursorHeight( VWindows.CurrentWindow, 0 ); ErrorManager.AddTermProc( RestoreDisplay ); GenLists.NewList( TopMenuList ); ControlUtils.LoadFrameList( ScrnCompDsp, 'TopMenu', TopMenuList ); (*This keeps the TopMenu in memory.*) UserOps.DoPrompting := FALSE; ControlUtils.InputConst( DspFiles.MainFrame, 'Banner' ); UserOps.DoPrompting := TRUE; UserOps.PromptRow := VWindows.EndRow(VWindows.CurrentWindow) - 1; ScrnUtl2.Display( DspFiles.MainFrame, 'BlankScreen' ); LOOP NextFrame := 'TopMenu'; ControlUtils.ControlSeparately( TopMenuList, NextFrame, SelChar, EndingFrame ); IF PosUtils.Equal( ScrnTypes.ProgramExit, NextFrame ) THEN EXIT; ELSIF PosUtils.Equal( EndingFrame, 'FileMenu' ) THEN (*User has made a selection from the FileMenu.*) DoFileMenu( SelChar ); ELSIF PosUtils.Equal( EndingFrame, 'EditMenu' ) THEN DoEditMenu( SelChar ); ELSIF PosUtils.Equal( EndingFrame, 'CompMenu' ) THEN DoCompMenu( SelChar ); ELSIF PosUtils.Equal( EndingFrame, 'DispMenu' ) THEN DoDisplayMenu( SelChar ); ELSIF PosUtils.Equal( EndingFrame, 'TopMenu' ) THEN IF (NOT PosUtils.Equal(NextFrame, ScrnTypes.ProgramExit)) AND (NOT PosUtils.Equal(NextFrame, 'Banner') ) THEN CASE SelChar OF 'R': DoFrameSeq(); | 'x': EXIT; | 'P': DoPrintDialog(); | 's': ScrnUtl2.Display( DspFiles.MainFrame, 'BlankScreen' ); ELSE (*fall through*) END; END; ELSE ErrorManager.WARN('Error in TopMenu loop logic'); END; END; GenLists.DisposeList( TopMenuList ); DspFiles.CloseDisplayFile( ScrnCompDsp ); ErrorManager.DoTermProcs(); END ScrnCompile.