IMPLEMENTATION MODULE ControlUtils; (* * REPERTOIRE * Release 1.6 * By Charles Bradford and Cole Brecheen * (c) Copyright 1985-1992 PMI * Green Bay, Wisconsin * All rights reserved * (414) 468-6040 * * $Header: D:/logfiles/mods/controlu.mov 1.5 10 Mar 1991 15:25:34 coleb $ * *) IMPORT DspFiles; IMPORT ErrorManager; IMPORT ErrorNames; IMPORT FrameManager; IMPORT FramePainter; IMPORT GenLists; IMPORT InputManager; IMPORT LowLevel; IMPORT M2Strings; IMPORT MsColors; IMPORT NdxBones; IMPORT Numbers; IMPORT PosUtils; IMPORT Rectangles; IMPORT ScrnTypes; IMPORT ScrnUtl1; IMPORT ScrnUtl2; IMPORT StrConv; IMPORT StrEdit; IMPORT SYSTEM; IMPORT VEditor; IMPORT VWindows; VAR Initialized : BOOLEAN; PROCEDURE Init(); BEGIN IF Initialized THEN RETURN; ELSE Initialized := TRUE; END; DspFiles.Init(); ErrorManager.Init(); ErrorNames.Init(); FrameManager.Init(); FramePainter.Init(); GenLists.Init(); InputManager.Init(); LowLevel.Init(); M2Strings.Init(); MsColors.Init(); NdxBones.Init(); Numbers.Init(); PosUtils.Init(); Rectangles.Init(); ScrnTypes.Init(); ScrnUtl1.Init(); ScrnUtl2.Init(); StrConv.Init(); StrEdit.Init(); VEditor.Init(); VWindows.Init(); END Init; CONST AfterLastElmt = 65535; PROCEDURE NotFieldWarning( FieldName, FrameName: ARRAY OF CHAR ); VAR dumstr1: ARRAY [0..79] OF CHAR; BEGIN StrEdit.AssignStr( ' is not a field in frame ', dumstr1 ); M2Strings.Insert( FieldName, dumstr1, 0 ); StrEdit.Append( dumstr1, FrameName ); ErrorManager.WARN( dumstr1 ); END NotFieldWarning; PROCEDURE AddEditorField(VAR TheFrame : ScrnTypes.DisplayFrame; VAR TheList: GenLists.GenList; VAR ControlRec: VEditor.AnEdControlRec ); VAR ImageNum: CARDINAL; TmpRec: ScrnTypes.ImageElement; FieldRec: ScrnTypes.InputFieldRecord; dumstr : ARRAY [0..1] OF CHAR; AreaInBox : Rectangles.ARectangle; BEGIN ControlRec.FrameRec := TheFrame; IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN GenLists.NewList( TheFrame^.FieldList ); ScrnUtl1.PutFrameLists( TheFrame ); (*Make sure the new FieldList gets inserted into TheFrame's .self list. *) END; IF NOT GenLists.Initialized( TheFrame^.EdFieldList ) THEN GenLists.NewList( TheFrame^.EdFieldList ); ScrnUtl1.PutFrameLists( TheFrame ); (*Make sure the new EdFieldList gets inserted into TheFrame's .self list. *) END; dumstr[0] := 0C; dumstr[1] := 0C; Rectangles.DefineRectangle( AreaInBox, ControlRec.Col1, ControlRec.Row1, ControlRec.Col2, ControlRec.Row2 ); IF ControlRec.EntryBox > 0 THEN Rectangles.ShrinkRect( AreaInBox ); END; ScrnUtl2.CreateImageElement( TmpRec, AreaInBox.col1, AreaInBox.row1, TheFrame^.normfor, TheFrame^.normbak, TheFrame^.normatrb, GenLists.ListLength( TheFrame^.FieldList ) + 1, dumstr ); ScrnUtl2.AddImageElement( TheFrame, TmpRec, ImageNum ); ScrnTypes.InitField( FieldRec ); FieldRec.ImageNum := ImageNum; FieldRec.typ := ScrnTypes.EditorCode; FieldRec.req := FALSE; FieldRec.EdFieldNum := GenLists.ListLength( TheFrame^.EdFieldList ) + 1; GenLists.ListInsert( TheList, GenLists.ListCode, TheFrame^.EdFieldList, FieldRec.EdFieldNum ); FieldRec.Col2 := AreaInBox.col2; FieldRec.Row2 := AreaInBox.row2; FieldRec.TextRow1 := ControlRec.TextRow1; FieldRec.CursorCol := ControlRec.CursorCol; FieldRec.CursorRow := ControlRec.CursorRow; FieldRec.MaxLines := ControlRec.MaxLines; FieldRec.ReadOnly := ControlRec.ReadOnly; ScrnUtl1.PutFieldRec( FieldRec, TheFrame, AfterLastElmt ); IF TheFrame^.action = 'W' THEN TheFrame^.action := 'I'; END; (* The action char is lower case while the frame is active. *) IF TheFrame^.action = 'w' THEN TheFrame^.action := 'i'; END; END AddEditorField; PROCEDURE AddStrField(VAR TheFrame : ScrnTypes.DisplayFrame; Col, Row : CARDINAL; text : ARRAY OF CHAR; width: CARDINAL ); VAR ImageNum: CARDINAL; TmpRec: ScrnTypes.ImageElement; FieldRec: ScrnTypes.InputFieldRecord; BEGIN IF M2Strings.Length(text) # width THEN StrEdit.LeftJustify( text, width ); END; IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN GenLists.NewList( TheFrame^.FieldList ); ScrnUtl1.PutFrameLists( TheFrame ); (*Make sure the new FieldList gets inserted into TheFrame's .self list. *) END; ScrnUtl2.CreateImageElement( TmpRec, Col, Row, TheFrame^.normfor, TheFrame^.normbak, TheFrame^.normatrb, GenLists.ListLength( TheFrame^.FieldList ) + 1, text ); ScrnUtl2.AddImageElement( TheFrame, TmpRec, ImageNum ); ScrnTypes.InitField( FieldRec ); FieldRec.ImageNum := ImageNum; FieldRec.typ := ScrnTypes.StringCode; FieldRec.req := FALSE; ScrnUtl1.PutFieldRec( FieldRec, TheFrame, AfterLastElmt ); IF TheFrame^.action = 'W' THEN TheFrame^.action := 'I'; END; (* The action char is lower case while the frame is active. *) IF TheFrame^.action = 'w' THEN TheFrame^.action := 'i'; END; END AddStrField; PROCEDURE AddMenuItem( VAR TheFrame : ScrnTypes.DisplayFrame; Col, Row : CARDINAL; text : ARRAY OF CHAR; width, MenuKey: CARDINAL; ReturnVal : ARRAY OF CHAR ); VAR FieldRec: ScrnTypes.InputFieldRecord; BEGIN AddStrField( TheFrame, Col, Row, text, width ); ScrnUtl1.GetFieldRec( TheFrame, ScrnUtl1.FieldListTotal(TheFrame), FieldRec ); FieldRec.typ := ScrnTypes.GotoCode; FieldRec.MenuKey := MenuKey; M2Strings.Assign( ReturnVal, FieldRec.ReturnVal ); ScrnUtl1.PutFieldRec( FieldRec, TheFrame, ScrnUtl1.FieldListTotal(TheFrame) ); IF TheFrame^.action = 'W' THEN TheFrame^.action := 'I'; END; (* The action char is lower case while the frame is active. *) IF TheFrame^.action = 'w' THEN TheFrame^.action := 'i'; END; END AddMenuItem; PROCEDURE ListBox( TheDspFile: ScrnTypes.DisplayFile; FormFrameName: ARRAY OF CHAR; TheList: GenLists.GenList; VAR ItemChosen: ARRAY OF CHAR; VAR NextFrame: ScrnTypes.AFrameName ): BOOLEAN; VAR TmpFrame: ScrnTypes.DisplayFrame; AnItemWasChosen: BOOLEAN; BEGIN ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow ); DspFiles.ReadFrame( TheDspFile, TmpFrame, FormFrameName ); ScrnUtl2.ChoiceListToFrame( TheList, TmpFrame ); FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TmpFrame, 0, '', FALSE, NextFrame ); AnItemWasChosen := (NextFrame[0] = 0C); (* Dangerous. We are relying here on knowlegde that ChoiceListToFrame makes '' the return value for each choice. *) ScrnUtl1.GetFieldText( TmpFrame, TmpFrame^.CurrentField, ItemChosen ); ScrnUtl2.CloseDisplayFrame( TmpFrame ); RETURN AnItemWasChosen; END ListBox; PROCEDURE ChangeField(VAR TheFrame : ScrnTypes.DisplayFrame; TheStr : ARRAY OF CHAR; FieldName : ARRAY OF CHAR; PreserveLength: BOOLEAN); VAR padding: ARRAY [0..79] OF CHAR; OldLngth, NewLngth: CARDINAL; FieldPtr : ScrnTypes.InputFieldPtr; ImageRec: ScrnTypes.ImageElement; BEGIN IF NOT ScrnUtl1.FindField( TheFrame, FieldName, FieldPtr, ImageRec ) THEN NotFieldWarning( FieldName, TheFrame^.ThisFrame ); END; FieldPtr^.ChangeMade := TRUE; IF PreserveLength THEN LowLevel.Fill( SYSTEM.ADR(padding), HIGH(padding) + 1, ' ' ); OldLngth := M2Strings.Length( ImageRec.text ); NewLngth := M2Strings.Length( TheStr ); M2Strings.Assign(TheStr, ImageRec.text ); IF OldLngth > NewLngth THEN StrEdit.SetLength( padding, OldLngth - NewLngth ); StrEdit.Append( ImageRec.text, padding ); ELSE StrEdit.SetLength( ImageRec.text, OldLngth ); END; ELSE M2Strings.Assign(TheStr, ImageRec.text); END; ScrnUtl1.PutFieldImageRec( ImageRec, TheFrame, ImageRec.field ); END ChangeField; PROCEDURE CheckFieldName( TheFrame: ScrnTypes.DisplayFrame; FieldName: ARRAY OF CHAR ); (*Displays a warning message if it can't find FieldName in TheFrame.*) VAR FieldPtr: ScrnTypes.InputFieldPtr; ImageRec: ScrnTypes.ImageElement; BEGIN IF NOT ScrnUtl1.FindField( TheFrame, FieldName, FieldPtr, ImageRec ) THEN NotFieldWarning( FieldName, TheFrame^.ThisFrame ); END; END CheckFieldName; PROCEDURE Control( TheFrame: ScrnTypes.DisplayFrame ); VAR FrameName : ScrnTypes.AFrameName; (*This gets thrown away.*) BEGIN InputManager.ControlFrame( TheFrame, 0, '', FALSE, FrameName ); END Control; PROCEDURE FrameListSpot( FrameName: ARRAY OF CHAR; FrameList: GenLists.GenList ): CARDINAL; VAR TypeCode, cnt, ListEnd: CARDINAL; TmpFrame: ScrnTypes.DisplayFrameRec; BEGIN cnt := 1; ListEnd := GenLists.ListLength( FrameList ); WHILE cnt < ListEnd DO GenLists.GetElmt( FrameList, cnt, TmpFrame, TypeCode ); IF PosUtils.Equal( TmpFrame.ThisFrame, FrameName ) THEN RETURN cnt; END; cnt := cnt + 2; END; RETURN 0; END FrameListSpot; PROCEDURE AddToFrameList( TheFrame: ScrnTypes.DisplayFrame; VAR FrameList: GenLists.GenList ); VAR TmpList: GenLists.GenList; spot: CARDINAL; SavedFlag : BOOLEAN; BEGIN spot := FrameListSpot( TheFrame^.ThisFrame, FrameList ); IF spot > 0 THEN (*A frame of this name is already in the FrameList. We can't just delete it and add the new copy because they probably share lists; look at how GetFrameFromList gives the gotten frame pointers directly into its own sublists.*) RETURN; END; TheFrame^.CurrentField := 1; SavedFlag := TheFrame^.SelfSharedWithFile; (* Added this SavedFlag thing on 2 Nov 88 at suggestion of John McMonagle to prevent memory loss problems. *) TheFrame^.SelfSharedWithFile := TRUE; (* We're using this to prevent ReadFrame from disposing of the .self list next time. *) GenLists.ListInsert( TheFrame^, 0, FrameList, AfterLastElmt ); TheFrame^.SelfSharedWithFile := SavedFlag; GenLists.CopyList( TheFrame^.self, TmpList ); (*We copy the self list so it won't go away when the ListBuf changes.*) GenLists.ListInsert( TmpList, GenLists.ListCode, FrameList, AfterLastElmt ); END AddToFrameList; PROCEDURE DisposeFrameList( VAR FrameList: GenLists.GenList ); VAR ListEnd, cnt, dumc, TypeCode: CARDINAL; TmpFrame: ScrnTypes.DisplayFrame; BEGIN ListEnd := GenLists.ListLength( FrameList ); cnt := 1; WHILE cnt < ListEnd DO GenLists.GetElmtAdr( FrameList, cnt, TmpFrame, dumc, TypeCode ); FrameManager.FrameDeactivated( TmpFrame ); cnt := cnt + 2; END; GenLists.DisposeList( FrameList ); END DisposeFrameList; PROCEDURE DeleteFrom( VAR TheFrame: ScrnTypes.DisplayFrame; VAR FrameList: GenLists.GenList ); VAR TmpList: GenLists.GenList; spot: CARDINAL; BEGIN spot := FrameListSpot( TheFrame^.ThisFrame, FrameList ); IF spot > 0 THEN GenLists.GetChildList( FrameList, spot + 1, TmpList ); IF GenLists.SameList( TmpList, TheFrame^.self ) THEN (*We're going to confuse the hell out of the programmer who deletes a frame from a FrameList after retrieving it but before using it. We leave some tracks to make it easier to find the problem.*) StrEdit.AssignStr( 'DeleteFrom', TheFrame^.ThisFrame ); GenLists.NilList( TheFrame^.self ); GenLists.NilList( TheFrame^.ImageList ); GenLists.NilList( TheFrame^.FieldList ); END; GenLists.ListDelete( FrameList, spot, 2 ); END; END DeleteFrom; PROCEDURE PointFrameAtList( FrameList: GenLists.GenList; FrameName: ARRAY OF CHAR; VAR TheFrame: ScrnTypes.DisplayFrame ): BOOLEAN; (* The difference between this and GetFrameFromList is that PointFrameAtList forces TheFrame to point at the DisplayFrameRec which is stored in the list; GetFrameFromList copies the DisplayFrameRec out into whatever TheFrame happens to be pointing at. *) VAR dumc, spot, TypeCode: CARDINAL; BEGIN spot := FrameListSpot( FrameName, FrameList ); IF spot = 0 THEN RETURN FALSE; END; GenLists.GetElmtAdr( FrameList, spot, TheFrame, dumc, TypeCode ); GenLists.GetChildList( FrameList, spot + 1, TheFrame^.self ); ScrnUtl1.GetFrameLists( TheFrame ); TheFrame^.CurrentField := GenLists.ElmtNow(TheFrame^.FieldList); (*ElmtNow returns 0 if the list is NIL.*) RETURN TRUE; END PointFrameAtList; PROCEDURE GetFrameFromList( FrameList: GenLists.GenList; FrameName: ARRAY OF CHAR; VAR TheFrame: ScrnTypes.DisplayFrame ): BOOLEAN; VAR spot, TypeCode: CARDINAL; BEGIN spot := FrameListSpot( FrameName, FrameList ); IF spot = 0 THEN RETURN FALSE; END; IF GenLists.SameList( TheFrame^.self, TheFrame^.FromFile^.ListBuf ) THEN (*Make sure the NdxFile system doesn't think it is still managing this frame.*) GenLists.DisposeList( TheFrame^.FromFile^.ListBuf ); TheFrame^.FromFile^.BufRecName[0] := 0C; END; (*Note that we don't dispose of TheFrame's self list if it's not part of the list buffer because it may be part of the FrameList. Means someone else has to be in charge of disposing of the self list if it was created by CopyList.*) GenLists.GetElmt( FrameList, spot, TheFrame^, TypeCode ); GenLists.GetChildList( FrameList, spot + 1, TheFrame^.self ); ScrnUtl1.GetFrameLists( TheFrame ); TheFrame^.CurrentField := GenLists.ElmtNow(TheFrame^.FieldList); (*ElmtNow returns 0 if the list is NIL.*) RETURN TRUE; END GetFrameFromList; PROCEDURE LoadFrameList( dfile: ScrnTypes.DisplayFile; StartFrame: ARRAY OF CHAR; VAR FrameList: GenLists.GenList ); VAR TmpFrame: ScrnTypes.DisplayFrame; FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName; BEGIN IF NOT FrameExists( dfile, StartFrame ) THEN RETURN; END; IF FrameListSpot( StartFrame, FrameList ) > 0 THEN (*StartFrame is already in FrameList *) RETURN; END; ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow ); DspFiles.ReadFrameFast( dfile, TmpFrame, StartFrame ); (* It's okay here to use ReadFrameFast, which does not copy the file's listbuf, because AddToFrameList is about to make a copy anyway. *) AddToFrameList( TmpFrame, FrameList ); ScrnUtl1.GetFrameLinks( TmpFrame, FrameAbove, FrameBelow, FrameLeft, FrameRight ); ScrnUtl2.CloseDisplayFrame( TmpFrame ); IF FrameAbove[0] # 0C THEN LoadFrameList( dfile, FrameAbove, FrameList ); END; IF FrameBelow[0] # 0C THEN LoadFrameList( dfile, FrameBelow, FrameList ); END; IF FrameLeft[0] # 0C THEN LoadFrameList( dfile, FrameLeft, FrameList ); END; IF FrameRight[0] # 0C THEN LoadFrameList( dfile, FrameRight, FrameList ); END; END LoadFrameList; PROCEDURE ControlSeparately( FrameList: GenLists.GenList; VAR NextFrame: ScrnTypes.AFrameName; VAR SelectedChar: CHAR; VAR EndingFrame: ScrnTypes.AFrameName ); VAR FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName; TmpFrame: ScrnTypes.DisplayFrame; BEGIN (* Notice that we don't initialize TmpFrame because we are forcing it to point into the FrameList. *) LOOP IF NOT PointFrameAtList( FrameList, NextFrame, TmpFrame ) THEN EXIT; END; M2Strings.Assign( NextFrame, EndingFrame ); ScrnUtl1.GetFrameLinks( TmpFrame, FrameAbove, FrameBelow, FrameLeft, FrameRight ); FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TmpFrame, TmpFrame^.CurrentField, '', FALSE, NextFrame ); SelectedChar := ScrnUtl1.SelectedChar( TmpFrame ); END; END ControlSeparately; PROCEDURE ControlFrameList( FrameList: GenLists.GenList; TheFrame: ScrnTypes.DisplayFrame; VAR NextFrame: ScrnTypes.AFrameName; VAR SelectedChar: CHAR; VAR EndingFrame: ScrnTypes.AFrameName ); VAR FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName; BEGIN LOOP IF NOT GetFrameFromList( FrameList, NextFrame, TheFrame ) THEN EXIT; END; M2Strings.Assign( NextFrame, EndingFrame ); ScrnUtl1.GetFrameLinks( TheFrame, FrameAbove, FrameBelow, FrameLeft, FrameRight ); FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TheFrame, TheFrame^.CurrentField, '', FALSE, NextFrame ); SelectedChar := ScrnUtl1.SelectedChar( TheFrame ); END; END ControlFrameList; PROCEDURE ControlFrameGroup( TheFrame: ScrnTypes.DisplayFrame; VAR NextFrame: ScrnTypes.AFrameName; VAR SelectedChar: CHAR; VAR EndingFrame: ScrnTypes.AFrameName ); VAR FrameList : GenLists.GenList; BEGIN GenLists.NewList( FrameList ); LoadFrameList( TheFrame^.FromFile, NextFrame, FrameList ); ControlFrameList( FrameList, TheFrame, NextFrame, SelectedChar, EndingFrame ); DisposeFrameList( FrameList ); END ControlFrameGroup; PROCEDURE FrameExists( TheScreenFile: ScrnTypes.DisplayFile; FrameName: ARRAY OF CHAR ): BOOLEAN; VAR duml: LONGINT; dumc: CARDINAL; BEGIN StrEdit.CrunchBlanks( FrameName ); RETURN NdxBones.FindRecord( TheScreenFile, FrameName, duml, dumc, dumc ); END FrameExists; PROCEDURE FrameSequence( TheFrame: ScrnTypes.DisplayFrame; VAR StartFrame: ScrnTypes.AFrameName ); BEGIN ScrnUtl2.PushFrame( TheFrame ); FrameSeqReturn( TheFrame, StartFrame); ScrnUtl2.PopFrame( TheFrame ); InputManager.ReconstructFrame( TheFrame ); END FrameSequence; PROCEDURE FrameSeqReturn( TheFrame : ScrnTypes.DisplayFrame; VAR StartFrame : ScrnTypes.AFrameName ); VAR CheckFrame: ScrnTypes.AFrameName; SavedHeight: CARDINAL; BEGIN IF NOT FrameExists( TheFrame^.FromFile, StartFrame ) THEN RETURN; END; SavedHeight := VWindows.GetCursorHeight( TheFrame^.WindowHandle ); VWindows.SetCursorHeight( TheFrame^.WindowHandle, 0 ); CheckFrame := TheFrame^.ThisFrame; LOOP DspFiles.ReadFrame( TheFrame^.FromFile, TheFrame, StartFrame ); FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TheFrame, 0, '', FALSE, StartFrame ); IF PosUtils.Equal( StartFrame, ScrnTypes.ProgramExit ) THEN EXIT; END; IF PosUtils.Equal( StartFrame, CheckFrame ) THEN ErrorNames.WarningName('CircSeq'); EXIT; END; IF NOT FrameExists( TheFrame^.FromFile, StartFrame ) THEN EXIT; END; END; VWindows.SetCursorHeight( TheFrame^.WindowHandle, SavedHeight ); END FrameSeqReturn; PROCEDURE FrameSeq2( TheFile : ScrnTypes.DisplayFile; CheckFrame: ARRAY OF CHAR; VAR StartFrame : ARRAY OF CHAR ); VAR NextFrame, DummyName: ScrnTypes.AFrameName; TmpFrame: ScrnTypes.DisplayFrame; FrameAbove, FrameBelow, FrameRight, FrameLeft: ScrnTypes.AFrameName; FrameList : GenLists.GenList; dumc: CHAR; BEGIN IF NOT FrameExists( TheFile, StartFrame ) THEN RETURN; END; M2Strings.Assign( StartFrame, NextFrame ); ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow ); LOOP DspFiles.ReadFrame( TheFile, TmpFrame, NextFrame ); ScrnUtl1.GetFrameLinks( TmpFrame, FrameAbove, FrameBelow, FrameLeft, FrameRight ); IF (FrameAbove[0] # 0C) OR (FrameBelow[0] # 0C) OR (FrameLeft[0] # 0C) OR (FrameRight[0] # 0C) THEN GenLists.NewList( FrameList ); LoadFrameList( TheFile, NextFrame, FrameList ); ControlSeparately( FrameList, NextFrame, dumc, DummyName ); DisposeFrameList( FrameList ); ELSE FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TmpFrame, 0, '', FALSE, NextFrame ); END; IF PosUtils.Equal( NextFrame, ScrnTypes.ProgramExit ) THEN EXIT; END; IF PosUtils.Equal( NextFrame, CheckFrame ) THEN ErrorNames.WarningName('CircSeq'); EXIT; END; IF NOT FrameExists( TheFile, NextFrame ) THEN EXIT; END; END; M2Strings.Assign( NextFrame, StartFrame ); ScrnUtl2.CloseDisplayFrame( TmpFrame ); END FrameSeq2; PROCEDURE FindNextField( TheFrame: ScrnTypes.DisplayFrame; typ: CHAR; VAR spot: CARDINAL; VAR FieldPtr: ScrnTypes.InputFieldPtr ): BOOLEAN; VAR found: BOOLEAN; ListEnd: CARDINAL; BEGIN ListEnd := ScrnUtl1.FieldListTotal( TheFrame ); FieldPtr := NIL; found := FALSE; WHILE (spot <= ListEnd) AND (NOT found) DO ScrnUtl1.GetFieldPtr( TheFrame, spot, FieldPtr ); IF (typ = 0C) OR (FieldPtr^.typ = typ) THEN found := TRUE; ELSE INC( spot ); END; END; RETURN found; END FindNextField; PROCEDURE GetStrResponse( TheFile: ScrnTypes.DisplayFile; FrameName, Default: ARRAY OF CHAR; VAR TheStr: ARRAY OF CHAR ): BOOLEAN; VAR MsgFrame: ScrnTypes.DisplayFrame; fnum : CARDINAL; FieldPtr: ScrnTypes.InputFieldPtr; result: BOOLEAN; NextFrame: ScrnTypes.AFrameName; TmpFrame: ScrnTypes.DisplayFrame; BEGIN ScrnTypes.InitDisplayFrame( MsgFrame, VWindows.CurrentWindow ); DspFiles.ReadFrame( TheFile, MsgFrame, FrameName ); fnum := 1; IF NOT FindNextField( MsgFrame, ScrnTypes.StringCode, fnum, FieldPtr ) THEN result := FALSE; ELSE ChangeField( MsgFrame, Default, FieldPtr^.fnam, TRUE ); FramePainter.ShowDisplayFrame( MsgFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( MsgFrame, 1, '', FALSE, NextFrame ); IF PosUtils.Equal( MsgFrame^.parent, NextFrame ) THEN result := FALSE; ELSE result := TRUE; END; ReadInput( MsgFrame, TheStr, FieldPtr^.fnam ); END; StrEdit.CrunchBlanks( TheStr ); ScrnUtl2.CloseDisplayFrame( MsgFrame ); RETURN result; END GetStrResponse; PROCEDURE ReadShowAndCntrl( TheFile: ScrnTypes.DisplayFile; TheFrame: ScrnTypes.DisplayFrame; VAR FrameName : ScrnTypes.AFrameName ); BEGIN DspFiles.ReadFrame( TheFile, TheFrame, FrameName ); FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TheFrame, 1, '', FALSE, FrameName ); END ReadShowAndCntrl; PROCEDURE RdShwAndCntrlConst( TheFile: ScrnTypes.DisplayFile; TheFrame: ScrnTypes.DisplayFrame; FrameName : ARRAY OF CHAR ); VAR TmpName: ScrnTypes.AFrameName; BEGIN M2Strings.Assign( FrameName, TmpName ); ReadShowAndCntrl( TheFile, TheFrame, TmpName ); END RdShwAndCntrlConst; PROCEDURE Input( TheFrame: ScrnTypes.DisplayFrame; VAR FrameName : ScrnTypes.AFrameName ); BEGIN DspFiles.ReadFrame( TheFrame^.FromFile, TheFrame, FrameName ); FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TheFrame, 1, '', FALSE, FrameName ); END Input; PROCEDURE InputConst( TheFrame: ScrnTypes.DisplayFrame; FrameName : ARRAY OF CHAR ); VAR TmpName: ScrnTypes.AFrameName; BEGIN M2Strings.Assign( FrameName, TmpName ); DspFiles.ReadFrame( TheFrame^.FromFile, TheFrame, TmpName ); FramePainter.ShowDisplayFrame( TheFrame, 0, 0, 0, 0 ); InputManager.ControlFrame( TheFrame, 0, '', FALSE, TmpName ); END InputConst; PROCEDURE ReadInput(VAR TheFrame : ScrnTypes.DisplayFrame; VAR TheStr : ARRAY OF CHAR; FieldName : ARRAY OF CHAR); VAR FieldPtr : ScrnTypes.InputFieldPtr; ImageRec: ScrnTypes.ImageElement; BEGIN IF NOT ScrnUtl1.FindField( TheFrame, FieldName, FieldPtr, ImageRec ) THEN NotFieldWarning( FieldName, TheFrame^.ThisFrame ); END; M2Strings.Assign(ImageRec.text, TheStr); END ReadInput; PROCEDURE ReadNextField(VAR TheFrame : ScrnTypes.DisplayFrame; VAR TheStr : ARRAY OF CHAR; skip : CARDINAL); (* will skip first field if it is input field *) VAR i : CARDINAL; ImagePtr: ScrnTypes.ImageElmtPtr; BEGIN IF (skip + TheFrame^.CurrentField) > GenLists.ListLength(TheFrame^.FieldList) THEN ErrorNames.WarningName('EndFld'); END; FOR i := 0 TO skip DO INC( TheFrame^.CurrentField ); END; END ReadNextField; PROCEDURE ReadNextInput(VAR TheFrame : ScrnTypes.DisplayFrame; VAR TheStr : ARRAY OF CHAR; skip : CARDINAL); (* will skip first field if it is input field *) VAR MaxField, i : CARDINAL; ImagePtr: ScrnTypes.ImageElmtPtr; BEGIN (* This version of ReadNextInput added at suggestion of Douglas Wrege on 27 Dec 89 to make ReadNextInput skip Display fields, as it did in release 1.4. ReadNextField, above, reads every field, display or not. *) MaxField := GenLists.ListLength( TheFrame^.FieldList ); FOR i := 0 TO skip DO IF TheFrame^.CurrentField < MaxField THEN INC( TheFrame^.CurrentField ); ELSE ErrorNames.WarningName( 'EndFld' ); END; WHILE (TheFrame^.CurrentField < MaxField) AND (ScrnUtl1.FieldType(TheFrame,TheFrame^.CurrentField) = ScrnTypes.DispCode) DO INC( TheFrame^.CurrentField ); END; END; ScrnUtl1.GetFieldImagePtr( TheFrame, TheFrame^.CurrentField, ImagePtr ); M2Strings.Assign( ImagePtr^.text, TheStr ); END ReadNextInput; BEGIN Initialized := FALSE; Init(); END ControlUtils.