IMPLEMENTATION MODULE DspFiles; (* * 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/dspfiles.mov 1.7 10 Mar 1991 15:26:32 coleb $ * *) (*EntryDiag: IMPORT Diagnostics; :EntryDiag*) IMPORT ErrorManager; IMPORT ErrorNames; IMPORT HandleIO; IMPORT GenLists; IMPORT M2Strings; IMPORT MsColors; IMPORT NdxBones; IMPORT NdxTypes; IMPORT PosUtils; IMPORT ScrnTypes; IMPORT ScrnUtl1; IMPORT StrEdit; IMPORT StringIO; IMPORT SYSTEM; IMPORT VStorage; IMPORT VWindows; VAR Initialized : BOOLEAN; PROCEDURE Init(); BEGIN IF Initialized THEN RETURN; ELSE Initialized := TRUE; END; (*EntryDiag: Diagnostics.Init(); :EntryDiag*) ErrorManager.Init(); ErrorNames.Init(); HandleIO.Init(); GenLists.Init(); M2Strings.Init(); MsColors.Init(); NdxTypes.Init(); NdxBones.Init(); PosUtils.Init(); ScrnTypes.Init(); ScrnUtl1.Init(); StrEdit.Init(); StringIO.Init(); VStorage.Init(); VWindows.Init(); (*EntryDiag: Diagnostics.diagS( 'Entering DspFiles', '' ); :EntryDiag*) MainFrame := NIL; (*EntryDiag: Diagnostics.diagS( 'Exiting DspFiles', '' ); :EntryDiag*) END Init; PROCEDURE ReMapCol( TheFrame: ScrnTypes.DisplayFrame; DspFileCol: CARDINAL ): CARDINAL; VAR diff: CARDINAL; BEGIN IF DspFileCol > VWindows.EndCol(TheFrame^.WindowHandle) THEN IF DspFileCol <= 128 THEN RETURN VWindows.EndCol(TheFrame^.WindowHandle) - 1; ELSIF DspFileCol <= 256 THEN diff := 256 - DspFileCol; IF diff <= VWindows.EndCol(TheFrame^.WindowHandle) THEN RETURN VWindows.EndCol(TheFrame^.WindowHandle) - diff - 1; END; END; ErrorNames.WarningName( 'InvCrd' ); END; RETURN DspFileCol; END ReMapCol; PROCEDURE ReMapRow( TheFrame: ScrnTypes.DisplayFrame; DspFileRow: CARDINAL ): CARDINAL; VAR diff: CARDINAL; BEGIN IF DspFileRow > VWindows.EndRow(TheFrame^.WindowHandle) THEN IF DspFileRow <= 128 THEN (* Some sort of mistake. Force it into acceptable range. *) RETURN VWindows.EndRow(TheFrame^.WindowHandle) - 1; ELSIF DspFileRow <= 256 THEN (* They're trying to tell us to use EndRow, whatever it happens to be. *) diff := 256 - DspFileRow; IF diff <= VWindows.EndRow(TheFrame^.WindowHandle) THEN RETURN VWindows.EndRow(TheFrame^.WindowHandle) - diff - 1; END; END; ErrorNames.WarningName( 'InvCrd' ); END; RETURN DspFileRow; END ReMapRow; PROCEDURE OpenDisplayFile(VAR TheDspFile : ScrnTypes.DisplayFile; fname : ARRAY OF CHAR): BOOLEAN; VAR tmpstr: ScrnTypes.AFrameName; RightVersion : BOOLEAN; TypeCode: CARDINAL; BEGIN (*OpenDisplayFile*) IF (MainFrame = NIL) THEN ScrnTypes.InitDisplayFrame( MainFrame, VWindows.CurrentWindow ); END; (* find and open the file if it exists *) IF NOT NdxBones.OpenNdxFile( TheDspFile, fname ) THEN RETURN FALSE; END; IF NdxBones.InitBuffer( TheDspFile, 'RepVers' ) THEN GenLists.GetElmt( TheDspFile^.ListBuf, 1, tmpstr, TypeCode ); IF PosUtils.Equal( '1.5c', tmpstr ) THEN RightVersion := TRUE; ELSE RightVersion := FALSE; END; ELSE RightVersion := FALSE; END; IF NOT RightVersion THEN ErrorNames.WarningName( 'RecompileDsp' ); END; IF (MainFrame^.FromFile = NIL) THEN MainFrame^.FromFile := TheDspFile; END; RETURN TRUE; END OpenDisplayFile; PROCEDURE CloseDisplayFile(VAR TheDspFile : ScrnTypes.DisplayFile); BEGIN IF TheDspFile # NIL THEN WITH TheDspFile^ DO (*Note that we don't call CloseNdxFile here because it pulls in code that updates the file's ndx if it's been changed. Since we don't write to NdxFile's in the basic screen system, we can avoid linking all that code in by doing a few extra deallocations here.*) GenLists.DisposeList( ListBuf); GenLists.DisposeList( StructLst); GenLists.DisposeList( Ndx ); GenLists.DisposeList( AltKeys ); (*Note that we don't dispose of the FileBufPtr because it should always have been absorbed into the ListBuf.*) IF handle # 0 THEN (*handle may be 0 if the NdxFile record was initialized but never passed to OpenNdxFile.*) StringIO.PrintMessage( HandleIO.CloseHandle( handle) ); END; END; VStorage.DosDealloc( TheDspFile, SYSTEM.TSIZE(NdxTypes.NdxRecord) ); END; END CloseDisplayFile; PROCEDURE UnPackFrame( PackedRec: ScrnTypes.PackedFrame; VAR FrameRec: ScrnTypes.DisplayFrame); BEGIN WITH FrameRec^ DO (* PushedFrame := NIL; DO NOT set PushedFrame to NIL because we have to preserve FrameRec's linked to any frames that may be pushed underneath it. *) CurrentField := 1; RowsScrolled := 0; ColsScrolled := 0; FrameChanged := FALSE; ClearFirst := PackedRec^.ClearFirst; ClearAfter := PackedRec^.ClearAfter; EntryBox := PackedRec^.EntryBox; ExitBox := PackedRec^.ExitBox; M2Strings.Assign( PackedRec^.Caption, Caption ); VirtualWidth := PackedRec^.VirtualWidth; VirtualHeight := PackedRec^.VirtualHeight; headline := PackedRec^.headline; startcol := PackedRec^.startcol; endcol := ReMapCol( FrameRec, PackedRec^.endcol ); startrow := PackedRec^.startrow; endrow := ReMapRow( FrameRec, PackedRec^.endrow ); action := PackedRec^.action; pbfor := PackedRec^.pbfor; pbbak := PackedRec^.pbbak; selfor := PackedRec^.selfor; selbak := PackedRec^.selbak; normfor := PackedRec^.normfor; normbak := PackedRec^.normbak; bordfor := PackedRec^.bordfor; bordbak := PackedRec^.bordbak; msgfor := PackedRec^.msgfor; msgbak := PackedRec^.msgbak; promfor := PackedRec^.promfor; prombak := PackedRec^.prombak; pbatrb := PackedRec^.pbatrb; selatrb := PackedRec^.selatrb; normatrb := PackedRec^.normatrb; bordatrb := PackedRec^.bordatrb; msgatrb := PackedRec^.msgatrb; promatrb := PackedRec^.promatrb; END; END UnPackFrame; PROCEDURE GetFrameFromList( TheList: GenLists.GenList; VAR FrameRec: ScrnTypes.DisplayFrame ); VAR TypeCode, size: CARDINAL; PackedRec: ScrnTypes.PackedFrame; BEGIN FrameRec^.self := TheList; GenLists.GetElmt( FrameRec^.self, 1, FrameRec^.HelpFrame, TypeCode ); GenLists.GetElmt( FrameRec^.self, 2, FrameRec^.parent, TypeCode ); GenLists.GetElmt( FrameRec^.self, 3, FrameRec^.normlnext, TypeCode ); GenLists.GetElmtAdr( FrameRec^.self, 4, PackedRec, size, TypeCode ); UnPackFrame( PackedRec, FrameRec); ScrnUtl1.GetFrameLists( FrameRec ); END GetFrameFromList; PROCEDURE InitEdFields( VAR TheFrame: ScrnTypes.DisplayFrame ); VAR ListEnd, cnt: CARDINAL; TmpList1, TmpList2: GenLists.GenList; BEGIN IF NOT GenLists.Initialized( TheFrame^.FieldList ) THEN RETURN; END; ListEnd := GenLists.ListLength( TheFrame^.FieldList ); FOR cnt := 1 TO ListEnd DO IF ScrnUtl1.FieldType( TheFrame, cnt ) = ScrnTypes.EditorCode THEN IF ScrnUtl1.GetFieldDataList( TheFrame, cnt, TmpList1 ) THEN GenLists.CopyList( TmpList1, TmpList2 ); IF NOT ScrnUtl1.ListToEdField( TmpList2, TheFrame, cnt ) THEN (* no response *) END; END; END; END; END InitEdFields; PROCEDURE ReadFrame(VAR TheDspFile: ScrnTypes.DisplayFile; VAR FrameRec: ScrnTypes.DisplayFrame; FrameName: ARRAY OF CHAR ); (* Reads screen FrameName from TheDspFile, into frame record FrameRec. Differs from ReadFrameFast in that it disconnects FrameRec's lists from TheDspFile, so they will not be disposed of the next time something is read from TheDspFile. They will be disposed of the next time we call ReadFrame, or when the frame is closed. Safer, but a little slower, than ReadFrameFast.*) VAR TmpMsg: ARRAY [0..79] OF CHAR; BEGIN (* ReadFrame *) IF (TheDspFile = NIL) OR (TheDspFile^.InitCheck # 46102) THEN (* Temporary measure -- NdxTypes needs to export a version of CheckInit that returns a boolean so we don't have to know what the private InitKey value is. *) ErrorManager.WARN( "Attempt to use unopened .DSP file" ); END; StrEdit.SetLength( TheDspFile^.BufRecName, 0 ); IF NOT NdxBones.InitBuffer( TheDspFile, FrameName ) THEN StrEdit.AssignStr( 'Unable to load frame ', TmpMsg ); StrEdit.Append( TmpMsg, FrameName ); StrEdit.Append( TmpMsg, ' from file ' ); StrEdit.Append( TmpMsg, TheDspFile^.name ); ErrorManager.WARN( TmpMsg ); END; M2Strings.Assign( FrameName, FrameRec^.ThisFrame ); IF NOT FrameRec^.SelfSharedWithFile THEN GenLists.DisposeList( FrameRec^.self ); ELSE GenLists.NilList( FrameRec^.self ); (* Useless, but it gives us something to look for in the RTD. *) END; GenLists.CopyList( TheDspFile^.ListBuf, FrameRec^.self ); GetFrameFromList( FrameRec^.self, FrameRec ); FrameRec^.FromFile := TheDspFile; FrameRec^.SelfSharedWithFile := FALSE; InitEdFields( FrameRec ); END ReadFrame; PROCEDURE ReadDisplayFrame(VAR TheDspFile: ScrnTypes.DisplayFile; VAR FrameRec: ScrnTypes.DisplayFrame; FrameName: ARRAY OF CHAR ); BEGIN ReadFrame( TheDspFile, FrameRec, FrameName ); END ReadDisplayFrame; PROCEDURE ReadFrameFast(VAR TheDspFile: ScrnTypes.DisplayFile; VAR FrameRec: ScrnTypes.DisplayFrame; FrameName: ARRAY OF CHAR ); (* Reads screen FrameName from TheDspFile, into frame record FrameRec.*) VAR TmpMsg: ARRAY [0..79] OF CHAR; BEGIN (* ReadFrameFast *) IF (TheDspFile = NIL) OR (TheDspFile^.InitCheck # 46102) THEN (* Temporary measure -- NdxTypes needs to export a version of CheckInit that returns a boolean so we don't have to know what the private InitKey value is. *) ErrorManager.WARN( "Attempt to use unopened .DSP file" ); END; StrEdit.SetLength( TheDspFile^.BufRecName, 0 ); (*Makes sure repeated reads of same frame dispose of old frame each time.*) IF NOT NdxBones.InitBuffer( TheDspFile, FrameName ) THEN StrEdit.AssignStr( 'Unable to load frame ', TmpMsg ); StrEdit.Append( TmpMsg, FrameName ); StrEdit.Append( TmpMsg, ' from file ' ); StrEdit.Append( TmpMsg, TheDspFile^.name ); ErrorManager.WARN( TmpMsg ); END; M2Strings.Assign( FrameName, FrameRec^.ThisFrame ); IF NOT FrameRec^.SelfSharedWithFile THEN GenLists.DisposeList( FrameRec^.self ); END; GetFrameFromList( TheDspFile^.ListBuf, FrameRec ); FrameRec^.FromFile := TheDspFile; FrameRec^.SelfSharedWithFile := TRUE; END ReadFrameFast; BEGIN Initialized := FALSE; Init(); END DspFiles.