home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* M2IDE.PAS *)
- (* Integrierte Entwickleroberfläche für FST Modula 2 *)
- (* (c) 1992 Wolfhard Rinke & DMV-Verlag *)
- (* Portions Copyright (c) Borland International *)
- (* ------------------------------------------------- *)
- PROGRAM M2IDE;
-
- {$X+,S-}
-
- {$M 16384,32675,655360}
-
- USES Dos, Objects, Memory, App, Views, Menus, Dialogs,
- StdDlg, Drivers, MsgBox, Browser, TxEdit, Buffers,
- HelpFile, M2Help, Context;
-
- (* ------------------------------------------------- *)
- (* IDE Commands *)
-
- CONST
- cmBuild = 100;
- cmGenMake = 101;
- cmCompile = 103;
- cmLink = 104;
- cmDosShell = 105;
- cmMapFile = 106;
- cmPrepTD = 107;
- cmBrowse = 108;
- cmFileOpen = 109;
- cmChangeDir = 110;
- cmPrimFile = 111;
- cmSaveOpts = 112;
- cmLoadOpts = 113;
- cmRunTD = 114;
- cmDevelop = 115; (* Menu Switch TRUE/FALSE *)
- cmAbout = 116;
- cmDirect = 117;
- cmEraseBat = 118; (* Menu Switch TRUE/FALSE *)
- cmEditBak = 119; (* Menu Switch TRUE/FALSE *)
- cmChDir = 120;
- cmFileNew = 121;
- cmShowClip = 122;
- cmTile = 123;
- cmCascade = 124;
- cmDefaultExt = 125; (* Menu Switch .MOD /.DEF *)
- cmHelpIndex = 126;
-
- (* ------------------------------------------------- *)
- (* Zeigt den ID String des Desktop am rechten Rand *)
- (* des Menübalkens an. Wird in »tModula.Init« *)
- (* initialisiert und un »tModula.InitMenuBar« *)
- (* aufgesetzt. *)
- (* ------------------------------------------------- *)
-
- CONST
- DesktopID : STRING = 'DTX FST Modula 2 IDE';
- VersionID : STRING = 'Version 1.0 (30.01.92)';
- ConfigFile : PathStr = 'M2IDE.CFG';
-
- HeapSize = 32 * (1024 DIV 16);
-
- TYPE
- pTitleText = ^tTitleText;
- tTitleText = OBJECT (tStaticText)
- FUNCTION GetPalette : pPalette; VIRTUAL;
- END;
-
- FUNCTION tTitleText.GetPalette : pPalette;
- CONST
- P : STRING [Length(cStatusLine)] = cStatusLine;
- BEGIN
- GetPalette := @P;
- END;
-
- (* ------------------------------------------------- *)
-
- TYPE
- pModEditWindow = ^tModEditWindow;
- tModEditWindow = OBJECT (tEditWindow)
- CONSTRUCTOR Init(VAR Bounds : tRect;
- FileName : FNameStr);
- PROCEDURE EditBak(Backup : BOOLEAN);
- END;
-
- CONSTRUCTOR tModEditWindow.Init(VAR Bounds : tRect;
- FileName : FNameStr);
- CONST
- WindNo : INTEGER = 0;
- BEGIN
- tEditWindow.Init(Bounds, FileName, WindNo);
- INC(WindNo);
- END;
-
- PROCEDURE tModEditWindow.EditBak(Backup : BOOLEAN);
- BEGIN
- IF Backup THEN
- EditorFlags := (EditorFlags OR efBackupFiles)
- ELSE
- EditorFlags := (EditorFlags AND
- (NOT efBackupFiles));
- END;
-
- VAR
- ClipWindow : pModEditWindow;
- Editor : pModEditWindow;
-
- (* ------------------------------------------------- *)
- (* Main Application Object *)
-
- TYPE
- pModula = ^tModula;
- tModula = OBJECT (tApplication)
- UtilPath : PathStr;
- (* M2 - .EXE files *)
- LibPath : PathStr;
- (* M2 - .DEF, .MOD, .M2o, .BIN *)
- Compiler : PathStr;
- (* M2COMP.EXE *)
- Linker : PathStr;
- (* M2LINK.EXE *)
- PrimFile : PathStr;
- (* Primary file (Main Module) *)
- WorkFile : PathStr;
- (* Current Edit file *)
- GenMake : PathStr;
- (* GENMAKE.EXE *)
- DbgToMap : PathStr;
- (* DBG2MAP.EXE *)
- TDMap : PathStr;
- (* TDMAP.EXE (Borland Utility) *)
- TD : PathStr;
- (* Turbo Debugger *)
- TheHelp : PathStr;
- (* Help file *)
-
- CONSTRUCTOR Init;
- DESTRUCTOR Done; VIRTUAL;
- PROCEDURE InitMenuBar; VIRTUAL;
- PROCEDURE InitStatusLine; VIRTUAL;
- PROCEDURE GetEvent(VAR Event : tEvent); VIRTUAL;
- PROCEDURE HandleEvent(VAR Event : tEvent);
- VIRTUAL;
- FUNCTION GetPalette : pPalette; VIRTUAL;
- PROCEDURE OutOfMemory; VIRTUAL;
-
- PROCEDURE ShutSystem; (* ... to Dos.Exec *)
- PROCEDURE ReInitSystem; (* ... from Dos.Exec *)
- PROCEDURE RetrieveOptions;
- (* ... to ConfigFile *)
- PROCEDURE SaveOptions; (* ... from ConfigFile *)
- PROCEDURE AboutBox; (* my Copyright ... *)
-
- PRIVATE
- Develop : BOOLEAN;
- (* FALSE for release version *)
- ShutVideo : BOOLEAN;
- (* If FALSE leave the IDE untouched *)
- (* while external calls via Dos.Exec *)
- DelBatch : BOOLEAN;
- (* Erase the generated Batch files. *)
- (* Don't erase TODEBUG.BAT *)
- EditBak : BOOLEAN;
- (* cause Editor to create .BAK files *)
- DefaultExt : PathStr;
- (* *.DEF sometimes more important *)
-
- PROCEDURE Build;
- (* run M2COMP with /M(ake) option *)
- PROCEDURE DoGenMake;
- (* run GENMAKE to prepare MakeFile *)
- PROCEDURE DoLink;
- (* run M2Link with /L(ine Numbers) *)
- PROCEDURE MapFile;
- (* generate .MAP-File from .DBG *)
- PROCEDURE PrepTD;
- (* TDMAP appends symbolics to .EXE *)
- PROCEDURE RunTD;
- (* start Turbo Debugger *)
- PROCEDURE Browse(FName : PathStr; Open : BOOLEAN);
- PROCEDURE SelectPrimFile;
- (* Dialog to select the primary file *)
- PROCEDURE Directories;
- (* Dialog to edit the startup paths *)
- PROCEDURE DoCompile;
- (* run M2COMP to compile WorkFile *)
- (* w/o /M-Option *)
- FUNCTION OpenEditor(FileName : PathStr;
- Visible : BOOLEAN) : pModEditWindow;
- FUNCTION CheckInstalled(FName: PathStr) : BOOLEAN;
- END;
-
- VAR
- Modula : tModula;
-
- (* ------------------------------------------------- *)
-
- FUNCTION tModula.GetPalette : pPalette;
- (* Colors for Help Context *)
- CONST
- cNewColor = cColor + cHelpColor;
- cNewBW = cBlackWhite + cHelpBlackWhite;
- cNewMono = cMonochrome + cHelpMonochrome;
-
- P : ARRAY [apColor..apMonochrome] OF
- STRING[Length(cNewColor)] =
- (cNewColor, cNewBW, cNewMono);
- BEGIN
- GetPalette := @P[AppPalette];
- END;
-
- (* ------------------------------------------------- *)
- (* Get cmHelp and Init the Help Stream. *)
- (* HelpFile must be in Utils Directory. *)
-
- PROCEDURE tModula.GetEvent(VAR Event : tEvent);
- VAR
- W : pWindow;
- HelpFile : pHelpFile;
- HelpStrm : pDosStream;
- CONST
- HelpInUse : BOOLEAN = FALSE;
- BEGIN
- tApplication.GetEvent(Event);
- IF (Event.What = evCommand) AND
- (Event.Command = cmHelp) AND
- NOT HelpInUse THEN BEGIN
- HelpStrm := New(pDosStream,
- Init(TheHelp, stOpenRead));
- HelpFile := New(pHelpFile, Init(HelpStrm));
- IF (HelpStrm^.Status <> stOk) THEN BEGIN
- MessageBox('Hilfe-Datei nicht gefunden.' + #13+
- 'Bitte prüfen Sie die Installation',
- NIL, mfError + mfOkButton);
- Dispose(HelpFile, Done);
- END ELSE BEGIN
- HelpInUse := TRUE;
- W := New(pHelpWindow,
- Init(HelpFile, GetHelpCtx));
- IF ValidView(W) <> NIL THEN BEGIN
- ExecView(W);
- Dispose(W, Done);
- END;
- HelpInUse := FALSE;
- ClearEvent(Event);
- END;
- END;
- END;
-
- (* ------------------------------------------------- *)
-
- DESTRUCTOR tModula.Done;
- BEGIN
- tApplication.Done;
- DoneBuffers;
- END;
-
- (* ------------------------------------------------- *)
- (* Set Options from Config file *)
-
- PROCEDURE tModula.RetrieveOptions;
- VAR
- f : TEXT;
- BEGIN
- Assign(f, ConfigFile);
- {$i-}
- Reset(f);
- {$i+}
- IF IOResult <> 0 THEN Exit;
-
- ReadLn(f, UtilPath);
- ReadLn(f, LibPath );
- ReadLn(f, TDMap );
- ReadLn(f, TD );
- ReadLn(f, PrimFile);
- ReadLn(f, WorkFile);
- ReadLn(f, TheHelp);
-
- Compiler := UtilPath + 'M2COMP.EXE';
- GenMake := UtilPath + 'GENMAKE.EXE';
- Linker := UtilPath + 'M2LINK.EXE';
- DbgToMap := UtilPath + 'DBG2MAP.EXE';
- TheHelp := UtilPath + 'M2HELP.HLP';
-
- Close(f);
- END;
-
- (* ---------------------------------------------------- *)
- (* Store Options to Config File *)
-
- PROCEDURE tModula.SaveOptions;
- VAR
- f : TEXT;
- BEGIN
- Assign(f, ConfigFile);
- Rewrite(f);
-
- WriteLn(f, UtilPath);
- WriteLn(f, LibPath );
- WriteLn(f, TDMap );
- WriteLn(f, TD );
- WriteLn(f, PrimFile);
- WriteLn(f, WorkFile);
- WriteLn(f, TheHelp);
-
- Close(f);
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.InitMenuBar;
- VAR
- R : tRect;
- BEGIN
- GetExtent(R);
- R.B.Y := R.A.Y + 1;
- MenuBar := New(pMenuBar, Init(R, NewMenu(
- NewSubMenu('~≡~', hcMySystem, NewMenu(
- NewItem('~A~bout...', '', kbNoKey,
- cmAbout, hcAbout,
- NewItem('~W~ord context', 'Ctrl-F1', kbCtrlF1,
- cmGetWord, hcContext,
- NewItem('~H~elp Index', 'Shift-F1', kbShiftF1,
- cmHelpIndex, hcIndex,
- NIL)))),
- NewSubMenu('~F~iles', hcMyFiles, NewMenu(
- NewItem('~O~pen...', 'F3', kbF3,
- cmFileOpen, hcFOpen,
- NewItem('~N~ew', '', kbNoKey,
- cmFileNew, hcFNew,
- NewItem('~S~ave', 'F2', kbF2,
- cmSave, hcFSave,
- NewItem('Save ~a~s...', 'Alt-F2', kbAltF2,
- cmSaveAs, hcFSaveAs,
- NewLine(
- NewItem('~C~hange Dir...', '', kbNoKey,
- cmChDir, hcFChDir,
- NewItem('~D~os Shell', '', kbNoKey,
- cmDosShell, hcFDosShell,
- NewItem('E~x~it', 'Alt-X', kbAltX,
- cmQuit, hcFQuit,
- NIL))))))))),
- NewSubMenu('~E~dit', hcEdit, NewMenu(
- NewItem('~U~ndo', '', kbNoKey, cmUndo, hcEUndo,
- NewLine(
- NewItem('Cu~t~', 'Shift-Del', kbShiftDel,
- cmCut, hcECut,
- NewItem('~C~opy', 'Ctrl-Ins', kbCtrlIns,
- cmCopy, hcECopy,
- NewItem('~P~aste', 'Shift-Ins', kbShiftIns,
- cmPaste, hcEPaste,
- NewItem('~S~how clipboard', '', kbNoKey,
- cmShowClip, hcEShowClip,
- NewLine(
- NewItem('~C~lear', 'Ctrl-Del', kbCtrlDel,
- cmClear, hcEClear,
- NIL))))))))),
- NewSubMenu('~S~earch', hcSearch, NewMenu(
- NewItem('~F~ind...', '', kbNoKey,
- cmFind, hcSFind,
- NewItem('~R~eplace...', '', kbNoKey,
- cmReplace, hcSReplace,
- NewItem('~S~earch again', '', kbNoKey,
- cmSearchAgain, hcSSearchAgain,
- NewLine(
- NewItem('~G~oto...', 'Alt-F6', kbAltF6,
- cmGoto, hcSGoto,
- NIL)))))),
- NewSubMenu('~M~ake', hcMake, NewMenu(
- NewItem('~C~ompile', 'Alt-F9', kbAltF9,
- cmCompile, hcMCompile,
- NewItem('~P~rimary File...', '', kbNoKey,
- cmPrimFile, hcMPrimFile,
- NewLine(
- NewItem('~G~enMake', '', kbNoKey,
- cmGenMake, hcMGenMake,
- NewItem('~B~uild', 'F9', kbF9,
- cmBuild, hcMBuild,
- NewItem('~L~ink', 'Shift-F9', kbShiftF9,
- cmLink, hcMLink,
- NewLine(
- NewItem('~E~rr Browser...', 'Ctrl-F9',
- kbCtrlF9, cmBrowse, hcMBrowse,
- NIL))))))))),
- NewSubMenu('~D~ebug', hcDebug, NewMenu(
- NewItem('Create ~M~ap File', '', kbNoKey,
- cmMapFile, hcDMapFile,
- NewItem('~P~repare debugging', '', kbNoKey,
- cmPrepTD, hcDPrepTD,
- NewLine(
- NewItem('~R~un Debugger', '', kbNoKey,
- cmRunTD, hcDRunTD,
- NIL))))),
- NewSubMenu('~O~ptions', hcOptions, NewMenu(
- NewItem('De~f~ault Extension', '.MOD', kbNoKey,
- cmDefaultExt, hcODefaultExt,
- NewItem('~D~evelop', '√', kbNoKey,
- cmDevelop, hcODevelop,
- NewItem('Erase ~B~atches', ' ', kbNoKey,
- cmEraseBat, hcOEraseBat,
- NewItem('~C~reate Backup', '√', kbNoKey,
- cmEditBak, hcOEditBak,
- NewLine(
- NewItem('~E~nvironment...', '', kbNoKey,
- cmDirect, hcODirect,
- NewLine(
- NewItem('~S~ave Options', '', kbNoKey,
- cmSaveOpts, hcOSaveOpts,
- NewItem('~L~oad Options', '', kbNoKey,
- cmLoadOpts, hcOLoadOpts,
- NIL)))))))))),
- NewSubMenu('~W~indows', hcMyWindows, NewMenu(
- NewItem('~S~ize/Move', 'Ctrl-F5', kbCtrlF5,
- cmResize, hcWResize,
- NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcWZoom,
- NewItem('~T~ile', '', kbNoKey, cmTile, hcWTile,
- NewItem('C~a~scade', '', kbNoKey,
- cmCascade, hcWCascade,
- NewItem('~N~ext', 'F6', kbF6, cmNext, hcWNext,
- NewItem('~P~revious', 'Shift-F6', kbShiftF6,
- cmPrev, hcWPrev,
- NewItem('~C~lose', 'Alt-F3', kbAltF3,
- cmClose, hcWClose,
- NIL)))))))),
- NIL)))))))))));
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.InitStatusLine;
- VAR
- R : tRect;
- BEGIN
- GetExtent(R);
- R.A.Y := R.B.Y - 1;
- StatusLine := New(pStatusLine, Init(R,
- NewStatusDef(0, $FFFF,
- NewStatusKey('~F1~ Help', kbF1, cmHelp,
- NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
- NewStatusKey('~F2~ Save', kbF2, cmSave,
- NewStatusKey('~Alt-F3~ Close', kbAltF3,
- cmClose,
- NewStatusKey('~F6~ Next', kbF6, cmNext,
- NewStatusKey('~F9~ Build', kbF9, cmBuild,
- NewStatusKey('~Shift-F9~ Link', kbShiftF9,
- cmLink,
- NewStatusKey('', kbF10, cmMenu,
- NIL)))))))),
- NIL)));
- END;
-
- (* ------------------------------------------------- *)
- (* Schließen der Applikation für ein »DOS.Exec«. *)
- (* Wenn die PRIVATE Variable »ShutVideo« TRUE ist, *)
- (* wird das Video-System geschlossen und nach dem *)
- (* »Exec« wieder hochgefahren. Für Programme, die *)
- (* nichts auf den Bildschirm ausgeben, muß die Va- *)
- (* riable auf FALSE gesetzt. *)
-
- PROCEDURE tModula.ShutSystem;
- BEGIN
- DoneSysError;
- DoneEvents;
- IF ShutVideo THEN DoneVideo;
- DoneMemory;
- SetMemTop(Ptr(BufHeapPtr, 0));
- SwapVectors;
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.ReInitSystem;
- BEGIN
- SwapVectors;
- SetMemTop(Ptr(BufHeapEnd, 0));
- InitMemory;
- IF ShutVideo THEN InitVideo;
- InitEvents;
- InitSysError;
- Redraw;
- END;
-
- (* ------------------------------------------------- *)
- (* Bahandlung der meisten Dialogboxen. Setzt und *)
- (* erhält Daten über einen Pointer auf alle Daten- *)
- (* typen. *)
-
- FUNCTION ExecDialog(P : pDialog;
- Data : Pointer) : WORD;
- VAR
- Result : WORD;
- BEGIN
- Result := cmCancel;
- P := pDialog(Application^.ValidView(P));
- IF P <> NIL THEN BEGIN
- IF Data <> NIL THEN P^.SetData(Data^);
- Result := Desktop^.ExecView(P);
- IF (Result <> cmCancel) AND (Data <> NIL) THEN
- P^.GetData(Data^);
- Dispose(P, Done);
- END;
- ExecDialog := Result;
- END;
-
- (* ------------------------------------------------- *)
- (* Suchen und Ersetzen *)
-
- FUNCTION CreateFindDialog : pDialog;
- VAR
- D : pDialog;
- Control : pView;
- R : tRect;
- BEGIN
- R.Assign(0, 0, 38, 12);
- D := New(pDialog, Init(R, 'Find'));
- WITH D^ DO BEGIN
- Options := Options OR ofCentered;
-
- R.Assign(3, 3, 32, 4);
- Control := New(pInputLine, Init(R, 80));
- Insert(Control);
- R.Assign(2, 2, 15, 3);
- Insert(New(pLabel, Init(R, '~T~ext to find',
- Control)));
- R.Assign(32, 3, 35, 4);
- Insert(New(pHistory, Init(R,
- pInputLine(Control), 10)));
-
- R.Assign(3, 5, 35, 7);
- Insert(New(pCheckBoxes, Init(R,
- NewSItem('~C~ase sensitive',
- NewSItem('~W~hole words only',
- NIL)))));
-
- R.Assign(14, 9, 24, 11);
- Insert(New(pButton, Init(R, 'O~k~',
- cmOk, bfDefault)));
- INC(R.A.X, 12); INC(R.B.X, 12);
- Insert(New(pButton, Init(R, 'Cancel',
- cmCancel, bfNormal)));
-
- SelectNext(FALSE);
- END;
- CreateFindDialog := D;
- END;
-
- (* ------------------------------------------------- *)
-
- FUNCTION CreateReplaceDialog : pDialog;
- VAR
- D : pDialog;
- Control : pView;
- R : tRect;
- BEGIN
- R.Assign(0, 0, 40, 16);
- D := New(pDialog, Init(R, 'Replace'));
- WITH D^ DO BEGIN
- Options := Options OR ofCentered;
-
- R.Assign(3, 3, 34, 4);
- Control := New(pInputLine, Init(R, 80));
- Insert(Control);
- R.Assign(2, 2, 15, 3);
- Insert(New(pLabel, Init(R, '~T~ext to find',
- Control)));
- R.Assign(34, 3, 37, 4);
- Insert(New(pHistory, Init(R,
- pInputLine(Control), 10)));
-
- R.Assign(3, 6, 34, 7);
- Control := New(pInputLine, Init(R, 80));
- Insert(Control);
- R.Assign(2, 5, 12, 6);
- Insert(New(pLabel, Init(R, '~N~ew text',
- Control)));
- R.Assign(34, 6, 37, 7);
- Insert(New(pHistory, Init(R,
- pInputLine(Control), 11)));
-
- R.Assign(3, 8, 37, 12);
- Insert(New(pCheckBoxes, Init(R,
- NewSItem('~C~ase sensitive',
- NewSItem('~W~hole words only',
- NewSItem('~P~rompt on replace',
- NewSItem('~R~eplace all',
- NIL)))))));
-
- R.Assign(17, 13, 27, 15);
- Insert(New(pButton, Init(R, 'O~k~', cmOk,
- bfDefault)));
- INC(R.A.X, 12); INC(R.B.X, 12);
- Insert(New(pButton, Init(R, 'Cancel',
- cmCancel, bfNormal)));
-
- SelectNext(FALSE);
- END;
- CreateReplaceDialog := D;
- END;
-
- (* ------------------------------------------------- *)
- (* Resource für Directory Editor *)
- (* *)
- (* Das Verzeichnis »Utilities« enthält die EXE- *)
- (* Programme des Compilers (M2COMP.EXE, GENMAKE.EXE,*)
- (* M2LINK.EXE und DBG2MAP.EXE. *)
- (* *)
- (* Das Verzeichnis »Libraries« sollte so aussehen *)
- (* wie die Pfad-Spezifikation für M2LIB (siehe auch *)
- (* MODULA.DOC auf den FST-Disketten). Compiler und *)
- (* Linker suchen diesen Pfad nach Source- und *)
- (* Objektdateien ab. *)
- (* *)
- (* »TDMap« und »Debugger« enthalten den Pfad der *)
- (* Borland-Utilities. *)
- (* ------------------------------------------------- *)
-
- FUNCTION CreateDirDialog : pDialog;
- VAR
- D : pDialog;
- Control : pView;
- R : tRect;
- BEGIN
- R.Assign(0, 0, 50, 15);
- D := New(pDialog,
- Init(R, 'Edit Directory Configuration'));
- WITH D^ DO BEGIN
- Options := Options OR ofCentered;
-
- R.Assign(3, 3, 47, 4);
- Control := New(pInputLine, Init(R, 79));
- Insert(Control);
- R.Assign(2, 2, 15, 3);
- Insert(New(pLabel, Init(R, '~U~tilities',
- Control)));
-
- R.Assign(3, 5, 47, 6);
- Control := New(pInputLine, Init(R, 79));
- Insert(Control);
- R.Assign(2, 4, 25, 5);
- Insert(New(pLabel, Init(R, '~L~ibraries (M2LIB)',
- Control)));
-
- R.Assign(3, 7, 47, 8);
- Control := New(pInputLine, Init(R, 79));
- Insert(Control);
- R.Assign(2, 6, 15, 7);
- Insert(New(pLabel, Init(R, 'TD~M~ap', Control)));
-
- R.Assign(3, 9, 47, 10);
- Control := New(pInputLine, Init(R, 79));
- Insert(Control);
- R.Assign(2, 8, 15, 9);
- Insert(New(pLabel, Init(R, '~D~ebugger',
- Control)));
-
- R.Assign(15, 12, 25, 14);
- Insert(New(pButton, Init(R, 'O~K~',
- cmOk, bfDefault)));
- INC(R.A.X, 12); INC(R.B.X, 12);
- Insert(New(pButton, Init(R, 'Cancel',
- cmCancel, bfNormal)));
- END;
- CreateDirDialog := D;
- END;
-
- PROCEDURE tModula.Directories;
- TYPE
- DirInfoRec = RECORD
- UtilPath : PathStr;
- LibPath : PathStr;
- TDMap : PathStr;
- TD : PathStr;
- END;
- VAR
- DirInfo : DirInfoRec;
- BEGIN
- DirInfo.UtilPath := UtilPath;
- DirInfo.LibPath := LibPath;
- DirInfo.TDMap := TDMap;
- DirInfo.TD := TD;
-
- ExecDialog(CreateDirDialog, @DirInfo);
-
- UtilPath := DirInfo.UtilPath;
- LibPath := DirInfo.LibPath;
- TDMap := DirInfo.TDMap;
- TD := DirInfo.TD;
-
- Compiler := UtilPath + 'M2COMP.EXE';
- GenMake := UtilPath + 'GENMAKE.EXE';
- Linker := UtilPath + 'M2LINK.EXE';
- DbgToMap := UtilPath + 'DBG2MAP.EXE';
- END;
-
- (* ------------------------------------------------- *)
- (* Resource für AboutBox *)
-
- FUNCTION CreateAboutDialog : pDialog;
- VAR
- D : pDialog;
- Control : pView;
- R : tRect;
- BEGIN
- R.Assign(0, 0, 40, 11);
- D := New(pDialog, Init(R, 'About'));
- WITH D^ DO BEGIN
- Options := Options OR ofCentered;
-
- R.Grow(-1, -1);
- Dec(R.B.Y, 3);
- Insert(New(pStaticText, Init(R,
- #13 +
- ^C + DesktopID + #13 +
- ^C + 'Copyright (c) 1991 ' + #13 +
- ^C + ' Wolfhard Rinke & Jörg Braun' + #13 +
- ^C + 'DMV Software, Eschwege' + #13 +
- ^C + VersionID)));
-
- R.Assign(15, 8, 25, 10);
- Insert(New(pButton, Init(R, 'O~K~',
- cmOk, bfDefault)));
- END;
- CreateAboutDialog := D;
- END;
-
- PROCEDURE tModula.AboutBox;
- BEGIN
- ExecDialog(CreateAboutDialog, NIL);
- END;
-
- (* ------------------------------------------------- *)
- (* Auswahl des »Primary File« (Hauptmodul) für den *)
- (* Make-Lauf. Per Default ist der Dateiname nicht *)
- (* gesetzt, wenn er nicht in der Konfigurations- *)
- (* datei angegeben wurde. »PrimFile« wird initiali- *)
- (* siert in »tModula.Init« und erfährt ein update *)
- (* von »tModula.RetrieveOptions«. *)
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.SelectPrimFile;
- VAR
- D : pFileDialog;
- FileName : PathStr;
- Control : WORD;
- BEGIN
- IF PrimFile <> '' THEN
- FileName := PrimFile
- ELSE
- FileName := DefaultExt;
- (* Setup for file input line *)
-
- D := pFileDialog(ValidView(New(pFileDialog,
- Init(DefaultExt,
- 'Select primary file',
- '~N~ame',
- fdOpenButton + fdClearButton,
- 100))));
-
- Control := ExecDialog(D, @FileName);
-
- IF Control = cmFileClear THEN
- PrimFile := ''
- ELSE IF Control <> cmCancel THEN
- PrimFile := FileName;
- END;
-
- (* ------------------------------------------------- *)
- (* FileView (tScroller) utility. *)
-
- PROCEDURE tModula.Browse(FName : PathStr;
- Open : BOOLEAN);
- VAR
- D : pFileDialog;
- FileName : PathStr;
- W : pWindow;
- R : tRect;
- BEGIN
- FileName := FName;
- IF (FName = '') OR NOT Open THEN BEGIN
- (* kein Dateiname angegeben *)
- D := pFileDialog(ValidView(New(pFileDialog,
- Init(FName, 'Browse a file',
- '~N~ame', fdOpenButton,
- 100))));
-
- IF ExecDialog(D,@FileName) <> cmCancel THEN BEGIN
- R. Assign(0, 0, 80, 10);
- W := pWindow(ValidView(New(pFileWindow,
- Init(R, FileName))));
- IF W <> NIL THEN Desktop^.Insert(W);
- END;
- END ELSE BEGIN (* Open = TRUE *)
- R. Assign(0, 0, 80, 10);
- W := pWindow(ValidView(New(pFileWindow,
- Init(R, FileName))));
- IF W <> NIL THEN Desktop^.Insert(W);
- END;
- END;
-
- (* ------------------------------------------------- *)
- (* Um Programme (hier: M2COMP) zu »betrügen«, die *)
- (* Texte über den INT 10h ausgeben, wird der Ori- *)
- (* ginalvektor auf eine Routine gesetzt, die nur *)
- (* eine IRET-Anweisung enthält. *)
- (* ------------------------------------------------- *)
-
- PROCEDURE NewInt10; ASSEMBLER;
- ASM
- IRET
- END;
-
- (* ------------------------------------------------- *)
-
- FUNCTION Exists(FileName : PathStr) : BOOLEAN;
- VAR
- SR : SearchRec;
- BEGIN
- FindFirst(FileName, AnyFile, SR);
- Exists := DosError = 0;
- END;
-
- PROCEDURE Kill(FileName : PathStr);
- VAR
- f : File;
- BEGIN
- Assign(f, FileName);
- IF Exists(FileName) THEN Erase(f);
- END;
-
- FUNCTION SetDefaultExt(FileName : PathStr;
- DefExt : ExtStr) : PathStr;
- VAR
- Dir : DirStr;
- Name : NameStr;
- Ext : ExtStr;
- BEGIN
- FSplit(FileName, Dir, Name, Ext);
- SetDefaultExt := Dir + Name + DefExt;
- END;
-
- FUNCTION tModula.CheckInstalled
- (FName : PathStr) : BOOLEAN;
- BEGIN
- IF NOT Exists(FName) THEN BEGIN
- MessageBox(FName + ' not installed correctly',
- NIL, mfError + mfOkButton);
- CheckInstalled := FALSE;
- END ELSE
- CheckInstalled := TRUE;
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.DoCompile;
- VAR
- f : TEXT;
- RetCode : STRING;
- Info : WORD;
- BEGIN
- IF WorkFile = '' THEN BEGIN
- MessageBox(^C'No work module specified...' + #13+
- ^C'Load a file first (F3)',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- (* --- Check installation -------------------- *)
-
- IF NOT CheckInstalled(Compiler) THEN Exit;
-
- (* --- Create the batch file ----------------- *)
-
- Assign(f, 'COMPILE.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, 'SET M2LIB=' + LibPath);
- WriteLn(f, Compiler + ' ' + WorkFile +
- ' > COMPILE.ERR');
- Close(f);
-
- ShutVideo := FALSE; ShutSystem;
-
- Exec(GetEnv('COMSPEC'), '/C COMPILE.BAT');
- Str(DosExitCode, RetCode);
-
- ReInitSystem; ShutVideo := TRUE;
-
- MessageBox(^C'Compilation completed.' + #13 +
- ^C'Return Code: ' + RetCode,
- NIL, mfInformation + mfOkButton);
-
- IF RetCode <> '0' THEN Browse('COMPILE.ERR', TRUE);
-
- IF DelBatch THEN Kill('COMPILE.BAT');
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.Build;
- VAR
- f : TEXT;
- OldInt10 : Pointer; (* ClrScr in M2COMP *)
- RetCode : STRING;
- Event : tEvent;
- BEGIN
- IF PrimFile = '' THEN BEGIN
- MessageBox(^C'No main module specified...',
- NIL, mfError + mfOkButton);
- Exit;
- END;
- IF NOT Exists(SetDefaultExt(PrimFile,
- '.MAK')) THEN BEGIN
- MessageBox(^C + SetDefaultExt(PrimFile, '.MAK') +
- ' not found.' + #13 +
- ^C'Run GenMake first...',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- (* --- Check installation -------------------- *)
-
- IF NOT CheckInstalled(Compiler) THEN Exit;
-
- (* --- Create the batch file ----------------- *)
-
- Assign(f, 'BUILD.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, 'SET M2LIB=' + LibPath);
- WriteLn(f, Compiler + ' ' +
- SetDefaultExt(PrimFile, '') +
- ' /m > BUILD.ERR');
- Close(f);
-
- ShutVideo := FALSE; ShutSystem;
-
- GetIntVec($10, OldInt10);
- SetIntvec($10, @NewInt10);
-
- Exec(GetEnv('COMSPEC'), '/C BUILD.BAT');
- Str(DosExitCode, RetCode);
-
- SetIntVec($10, OldInt10);
-
- ReInitSystem; ShutVideo := TRUE;
-
- MessageBox(^C'Build completed.' + #13 +
- ^C'Return Code: ' + RetCode,
- NIL, mfInformation + mfOkButton);
-
- IF RetCode <> '0' THEN Browse('BUILD.ERR', TRUE);
-
- IF DelBatch THEN Kill('BUILD.BAT');
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.DoGenMake;
- VAR
- f : TEXT;
- RetCode : STRING;
- BEGIN
- IF PrimFile = '' THEN BEGIN
- MessageBox(^C'No main module specified...',
- NIL, mfError + mfOkButton);
- Exit;
- END;
- IF NOT Exists(PrimFile) THEN BEGIN
- MessageBox(^C + PrimFile + ' not found.',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- (* --- Check installation -------------------- *)
-
- IF NOT CheckInstalled(GenMake) THEN Exit;
-
- (* --- generate the Batch -------------------- *)
-
- Assign(f, 'DOMAKE.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, 'SET M2LIB=' + LibPath);
- IF Develop THEN
- WriteLn(f, GenMake + ' ' +
- SetDefaultExt(PrimFile, '') +
- ' /L > GENMAKE.ERR')
- (* LINNUM information für TD *)
- ELSE
- WriteLn(f, GenMake + ' ' +
- SetDefaultExt(PrimFile, '') +
- ' > GENMAKE.ERR');
- Close(f);
-
- ShutVideo := FALSE; ShutSystem;
-
- Exec(GetEnv('COMSPEC'), '/C DOMAKE.BAT');
- Str(DosExitCode, RetCode);
-
- ReInitSystem; ShutVideo := TRUE;
-
- IF Exists(SetDefaultExt(PrimFile, '.MAK')) THEN
- MessageBox(^C'Make file generated. ' + #13 +
- ^C'Return Code: ' + RetCode,
- NIL, mfInformation + mfOkButton)
- ELSE BEGIN
- MessageBox(^C'Couldn''t generate Make file.'
- + #13 + ^C'Return Code: ' + RetCode,
- NIL, mfError + mfOkButton);
- Browse('GENMAKE.ERR', TRUE);
- END;
-
- IF RetCode <> '0' THEN Browse('GENMAKE.ERR', TRUE);
-
- IF DelBatch THEN Kill('DOMAKE.BAT');
- END;
-
- (* ------------------------------------------------- *)
- (* Call M2LINK. *)
-
- PROCEDURE tModula.DoLink;
- VAR
- f : TEXT;
- RetCode : STRING;
- BEGIN
- IF PrimFile = '' THEN BEGIN
- MessageBox(^C'No main module specified...',
- NIL, mfError + mfOkButton);
- Exit;
- END;
- IF NOT Exists(SetDefaultExt(PrimFile,
- '.M2O')) THEN BEGIN
- MessageBox('Object file not found.',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- (* --- Check installation -------------------- *)
-
- IF NOT CheckInstalled(Linker) THEN Exit;
-
- (* --- Create the Batch ---------------------- *)
-
- Assign(f, 'DOLINK.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, 'SET M2LIB=' + LibPath);
- IF Develop THEN
- WriteLn(f, Linker + ' ' +
- SetDefaultExt(PrimFile, '') + ' /L' +
- ' > LINK.ERR')
- (* LINNUM info für TD *)
- ELSE
- WriteLn(f, Linker + ' ' +
- SetDefaultExt(PrimFile, '') +
- ' > LINK.ERR');
- Close(f);
-
- ShutVideo := FALSE; ShutSystem;
-
- Exec(GetEnv('COMSPEC'), '/C DOLINK.BAT');
- Str(DosExitCode, RetCode);
-
- ReInitSystem; ShutVideo := TRUE;
-
- MessageBox(^C'Executable file generated.' + #13 +
- ^C'Return Code: ' + RetCode,
- NIL, mfInformation + mfOkButton);
-
- IF Retcode <> '0' THEN Browse('LINK.ERR', TRUE);
-
- IF DelBatch THEN Kill('DOLINK.BAT');
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.MapFile;
- VAR
- f : TEXT;
- RetCode : STRING;
- BEGIN
- IF PrimFile = '' THEN BEGIN
- MessageBox(^C'No main module specified',
- NIL, mfError + mfOkButton);
- Exit;
- END;
- IF NOT Exists(SetDefaultExt(PrimFile,
- '.DBG')) THEN BEGIN
- MessageBox(^C'Debug file not found.',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- (* --- Check installation -------------------- *)
-
- IF NOT CheckInstalled(DbgToMap) THEN Exit;
-
- (* --- Create the batch ---------------------- *)
-
- Assign(f, 'DODBG.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, DbgToMap + ' ' +
- SetDefaultExt(PrimFile, '') +
- ' > DEBUG.ERR');
- Close(f);
-
- ShutVideo := FALSE; ShutSystem;
-
- Exec(GetEnv('COMSPEC'), '/C DODBG.BAT');
- Str(DosExitCode, RetCode);
-
- ReInitSystem; ShutVideo := TRUE;
-
- MessageBox(^C'Map file generated.' + #13 +
- ^C'Return Code: ' + RetCode,
- NIL, mfInformation + mfOkButton);
-
- IF Retcode <> '0' THEN Browse('DEBUG.ERR', TRUE);
-
- IF DelBatch THEN BEGIN
- Kill('DODBG.BAT');
- Kill(SetDefaultExt(PrimFile, '.DBG'));
- END;
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.PrepTD;
- VAR
- f : TEXT;
- RetCode : STRING;
- Dir : DirStr;
- Name : NameStr;
- Ext : ExtStr;
- BEGIN
- IF NOT Develop THEN Exit;
-
- IF PrimFile = '' THEN BEGIN
- MessageBox(^C'No Primary File specified',
- NIL, mfError + mfOkButton);
- Exit;
- END;
- IF NOT Exists(SetDefaultExt(PrimFile,
- '.MAP')) THEN BEGIN
- MessageBox(^C'Map file not found.',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- (* --- Check installation -------------------- *)
-
- IF NOT CheckInstalled(TDMap) THEN Exit;
- IF NOT CheckInstalled(TD) THEN Exit;
-
- (* --- generate the batch -------------------- *)
-
- Assign(f, 'DOMAP.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, TDMap + ' ' +
- SetDefaultExt(PrimFile, '') + ' /Emod' +
- ' > TDMAP.ERR');
- Close(f);
-
- ShutVideo := FALSE; ShutSystem;
-
- Exec(GetEnv('COMSPEC'), '/C DOMAP.BAT');
- Str(DosExitCode, RetCode);
-
- ReInitSystem; ShutVideo := TRUE;
-
- FSplit(PrimFile, Dir, Name, Ext);
-
- Assign(f, 'TODEBUG.BAT');
- Rewrite(f);
- WriteLn(f, '@ECHO OFF');
- WriteLn(f, TD + ' -sd' + Dir + ' ' +
- SetDefaultExt(PrimFile, '.EXE'));
- WriteLn(f, 'EXIT');
- Close(f);
-
- MessageBox(^C'File prepared. Return Code: ' +
- RetCode + #13 +
- ^C'TODEBUG.BAT generated',
- NIL, mfInformation + mfOkButton);
-
- IF Retcode <> '0' THEN Browse('TDMAP.ERR', TRUE);
-
- IF DelBatch THEN Kill('DOMAP.BAT');
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.RunTD;
- VAR
- f : TEXT;
- RetCode : STRING;
- BEGIN
- IF NOT Exists('TODEBUG.BAT') THEN BEGIN
- MessageBox(^C'TODEBUG.BAT not found.' + #13 +
- ^C'Set Develop Flag and redo project.',
- NIL, mfError + mfOkButton);
- Exit;
- END;
-
- ShutVideo := TRUE; ShutSystem;
-
- Exec(GetEnv('COMSPEC'), '/C TODEBUG.BAT');
- Str(DosError, RetCode);
-
- ReInitSystem; ShutVideo := TRUE;
-
- IF RetCode = '8' THEN OutOfMemory;
- END;
-
- (* ------------------------------------------------- *)
-
- FUNCTION tModula.OpenEditor(FileName : PathStr;
- Visible : BOOLEAN) : pModEditWindow;
- VAR
- P : pView;
- R : tRect;
- BEGIN
- Desktop^.GetExtent(R);
- P := Application^.ValidView(New(pModEditWindow,
- Init(r, FileName)));
- IF NOT Visible THEN P^.Hide;
- Desktop^.Insert(P);
- OpenEditor := pModEditWindow(P);
- END;
-
- (* ------------------------------------------------- *)
- (* Standard Event Handling *)
-
- PROCEDURE tModula.HandleEvent(VAR Event : tEvent);
-
- PROCEDURE DosShell;
- BEGIN
- ShutVideo := TRUE;
- ShutSystem;
- PrintStr('Type <Exit> to return to ' +
- DesktopID + '...');
- Exec(GetEnv('COMSPEC'), '');
- ReInitSystem;
- END;
-
- PROCEDURE Toggle(Command : Word);
- (* Menü-Schalter *)
- (* *)
- (* Für »Develop« ist die Default-Einstellung *)
- (* »√«, weil die Compilation aller Module die *)
- (* Compilerschalter erfordert. Wenn das Pro- *)
- (* gramm fertig ist, kann der Schalter umge- *)
- (* setzt und das Hauptmodul recompiliert *)
- (* werden. Die Compilierung ohne symbolische *)
- (* Debug-Informationen macht das lauffähige *)
- (* Programm um etwa 50% kleiner! *)
- (* *)
- (* Der Schalter »Erase Batches« wird gesetzt, *)
- (* wenn die Batch-Dateien nach jedem Lauf ge- *)
- (* löscht werden sollen. *)
- VAR
- P : pMenuItem;
-
- FUNCTION FindMenuItem(Command : WORD): pMenuItem;
- (* Get the pointer to the specified MenuItem *)
- VAR
- P : pMenuItem;
- M : pMenu;
- BEGIN
- IF MenuBar <> NIL THEN BEGIN
- M := MenuBar^.Menu;
- P := M^.Default;
- WHILE (P <> NIL) AND
- (P^.Command <> Command) DO BEGIN
- IF P^.Command = 0 THEN BEGIN
- M := P^.SubMenu;
- P := M^.Default;
- END ELSE
- P := NIL;
- END;
- END;
- FindMenuItem := P;
- END;
-
- BEGIN
- IF Command = cmDevelop THEN BEGIN
- P := FindMenuItem(cmDevelop);
- IF P <> NIL THEN BEGIN
- IF P^.Param^ = '√' THEN BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr(' ');
- Develop := FALSE;
- END ELSE BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr('√');
- Develop := TRUE;
- END;
- END;
- END ELSE IF Command = cmEraseBat THEN BEGIN
- P := FindMenuItem(cmEraseBat);
- IF P <> NIL THEN BEGIN
- IF P^.Param^ = '√' THEN BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr(' ');
- DelBatch := FALSE;
- END ELSE BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr('√');
- DelBatch := TRUE;
- END;
- END;
- END ELSE IF Command = cmEditBak THEN BEGIN
- P := FindMenuItem(cmEditBak);
- IF P <> NIL THEN BEGIN
- IF P^.Param^ = '√' THEN BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr(' ');
- Editor^.EditBak(FALSE);
- END ELSE BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr('√');
- Editor^.EditBak(TRUE);
- END;
- END;
- END ELSE IF Command = cmDefaultExt THEN BEGIN
- P := FindMenuItem(cmDefaultExt);
- IF P <> NIL THEN BEGIN
- IF P^.Param^ = '.MOD' THEN BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr('.DEF');
- DefaultExt := '*.DEF';
- END ELSE BEGIN
- DisposeStr(P^.Param);
- P^.Param := NewStr('.MOD');
- DefaultExt := '*.MOD';
- END;
- END;
- END;
- END;
-
- PROCEDURE ChangeDir;
- BEGIN
- ExecDialog(New(pChDirDialog,
- Init(cdNormal, 0)), NIL);
- END;
-
- PROCEDURE FileOpen;
- VAR
- FileName : PathStr;
- BEGIN
- FileName := DefaultExt;
- IF ExecDialog(New(pFileDialog,
- Init(DefaultExt, 'Open file',
- '~N~ame',
- fdOpenButton, 101)),
- @FileName) <> cmCancel THEN BEGIN
- WorkFile := FileName;
- OpenEditor(FileName, TRUE);
- END;
- END;
-
- PROCEDURE FileNew;
- BEGIN
- WorkFile := '';
- OpenEditor('', TRUE);
- END;
-
- PROCEDURE ShowClip;
- BEGIN
- ClipWindow^.Select;
- ClipWindow^.Show;
- END;
-
- PROCEDURE Tile;
- VAR
- R : tRect;
- BEGIN
- Desktop^.GetExtent(R);
- Desktop^.Tile(R);
- END;
-
- PROCEDURE Cascade;
- VAR
- R : tRect;
- BEGIN
- Desktop^.GetExtent(R);
- Desktop^.Cascade(R);
- END;
-
- PROCEDURE HelpIndex;
- VAR
- W : pWindow;
- HelpFile : pHelpFile;
- HelpStrm : pDosStream;
- CONST
- HelpInUse : BOOLEAN = FALSE;
- BEGIN
- HelpStrm := New(pDosStream,
- Init(Modula.TheHelp, stOpenRead));
- HelpFile := New(pHelpFile, Init(HelpStrm));
- IF (HelpStrm^.Status <> stOk) THEN BEGIN
- MessageBox('Hilfe-Datei nicht gefunden.' + #13+
- 'Bitte prüfen Sie die Installation',
- NIL, mfError + mfOkButton);
- Dispose(HelpFile, Done);
- END ELSE BEGIN
- HelpInUse := TRUE;
- W := New(pHelpWindow, Init(HelpFile, hcIndex));
- IF Modula.ValidView(W) <> NIL THEN BEGIN
- Modula.ExecView(W);
- Dispose(W, Done);
- END;
- HelpInUse := FALSE;
- END;
- END;
-
- BEGIN
- tApplication.HandleEvent(Event);
- CASE Event.What OF
- evCommand :
- BEGIN
- CASE Event.Command OF
- cmBuild : Build;
- cmGenMake : DoGenMake;
- cmLink : DoLink;
- cmDosShell : DosShell;
- cmMapFile : MapFile;
- cmPrepTD : PrepTD;
- cmRunTD : RunTD;
- cmBrowse : Browse('*.ERR', FALSE);
- cmPrimFile : SelectPrimFile;
- cmLoadOpts : RetrieveOptions;
- cmSaveOpts : SaveOptions;
- cmDevelop : Toggle(cmDevelop);
- cmEraseBat : Toggle(cmEraseBat);
- cmEditBak : Toggle(cmEditBak);
- cmDefaultExt : Toggle(cmDefaultExt);
- cmAbout : AboutBox;
- cmDirect : Directories;
- cmCompile : DoCompile;
- cmChDir : ChangeDir;
- cmFileOpen : FileOpen;
- cmFileNew : FileNew;
- cmShowClip : ShowClip;
- cmTile : Tile;
- cmCascade : Cascade;
- cmHelpIndex : HelpIndex;
- ELSE
- Exit;
- END;
- ClearEvent(Event);
- END;
- END;
- END;
-
- (* ------------------------------------------------- *)
-
- FUNCTION CreateGotoDialog : pDialog;
- VAR
- D : pDialog;
- Control : pView;
- R : tRect;
- BEGIN
- R.Assign(0, 0, 28, 8);
- D := New(pDialog, Init(R, 'Goto Position'));
- WITH D^ DO BEGIN
- Options := Options OR ofCentered;
-
- R.Assign(3, 3, 10, 4);
- Control := New(pInputLine, Init(R, 5));
- Insert(Control);
- R.Assign(2, 2, 15, 3);
- Insert(New(pLabel, Init(R, '~L~ine', Control)));
-
- R.Assign(13, 3, 20, 4);
- Control := New(pInputLine, Init(R, 5));
- Insert(Control);
- R.Assign(12, 2, 25, 3);
- Insert(New(pLabel, Init(R, '~C~olumn',
- Control)));
- R.Assign(4, 5, 14, 7);
- Insert(New(pButton, Init(R, 'O~K~',
- cmOk, bfDefault)));
- INC(R.A.X, 12); INC(R.B.X, 12);
- Insert(New(pButton, Init(R, 'Cancel',
- cmCancel, bfNormal)));
-
- SelectNext(FALSE);
- END;
- CreateGotoDialog := D;
- END;
-
- (* ------------------------------------------------- *)
-
- FUNCTION DoEditDialog(Dialog : INTEGER;
- Info : Pointer) : WORD; FAR;
- VAR
- R : tRect;
- T : tPoint;
- Ctx : STRING;
- ThisCtx : INTEGER;
- tc : STRING;
- W : pWindow;
- HelpFile : pHelpFile;
- HelpStrm : pDosStream;
- CONST
- HelpInUse : BOOLEAN = FALSE;
-
- FUNCTION CtxString(p : Pointer) : STRING;
- (* Very, very tricky ... *)
- VAR
- u : STRING;
- s : pString ABSOLUTE p;
- i : INTEGER;
- Len : BYTE;
- BEGIN
- (* u := '';
- Len := BYTE(p^);
- FOR i := 1 TO Len DO u := u + UpCase(s^[i]);
- CtxString := u;
- *)
- CtxString := s^; (* Case sensitive *)
- END;
-
- BEGIN
- CASE Dialog OF
- edOutOfMemory :
- DoEditDialog :=
- MessageBox('Not enough memory for this operation.',
- NIL, mfError + mfOkButton);
- edReadError :
- DoEditDialog :=
- MessageBox('Error reading file %s.',
- @Info, mfError + mfOkButton);
- edWriteError :
- DoEditDialog :=
- MessageBox('Error writing file %s.',
- @Info, mfError + mfOkButton);
- edCreateError :
- DoEditDialog :=
- MessageBox('Error creating file %s.',
- @Info, mfError + mfOkButton);
- edSaveModify :
- DoEditDialog :=
- MessageBox('%s has been modified. Save?',
- @Info, mfInformation + mfYesNoCancel);
- edSaveUntitled :
- DoEditDialog :=
- MessageBox('Save untitled file?',
- NIL, mfInformation + mfYesNoCancel);
- edSaveAs :
- DoEditDialog :=
- ExecDialog(New(pFileDialog,
- Init('*.*',
- 'Save file as',
- '~N~ame',
- fdOkButton, 101)), Info);
- edFind :
- DoEditDialog :=
- ExecDialog(CreateFindDialog, Info);
- edGoto :
- DoEditDialog :=
- ExecDialog(CreateGotoDialog, Info);
- edGetWord :
- BEGIN
- Ctx := CtxString(Info);
-
- ThisCtx := GetContext(Ctx);
- (* Unit Context *)
-
- (* Str(ThisCtx, tc);
- MessageBox(Ctx + ' ' + tc, NIL, mfOkButton);
- *)
- HelpStrm := New(pDosStream,
- Init(Modula.TheHelp, stOpenRead));
- HelpFile := New(pHelpFile, Init(HelpStrm));
- IF (HelpStrm^.Status <> stOk) THEN BEGIN
- MessageBox('Hilfe-Datei nicht gefunden.'
- + #13 +
- 'Bitte prüfen Sie die Installation',
- NIL, mfError + mfOkButton);
- Dispose(HelpFile, Done);
- END ELSE BEGIN
- HelpInUse := TRUE;
- W := New(pHelpWindow,
- Init(HelpFile, ThisCtx));
- IF Modula.ValidView(W) <> NIL THEN BEGIN
- Modula.ExecView(W);
- Dispose(W, Done);
- END;
- HelpInUse := FALSE;
- END;
- END;
- edSearchFailed :
- DoEditDialog :=
- MessageBox('Search string not found.',
- NIL, mfError + mfOkButton);
- edReplace :
- DoEditDialog :=
- ExecDialog(CreateReplaceDialog, Info);
- edReplacePrompt :
- BEGIN
- { Avoid placing the dialog on
- the same line as the cursor }
- R.Assign(0, 1, 40, 8);
- R.Move((Desktop^.Size.X-R.B.X) DIV 2, 0);
- Desktop^.MakeGlobal(R.B, T);
- INC(T.Y);
- IF TPoint(Info).Y <= T.Y THEN
- R.Move(0, Desktop^.Size.Y-R.B.Y-2);
- DoEditDialog :=
- MessageBoxRect(R, 'Replace this occurence?',
- NIL, mfYesNoCancel + mfInformation);
- END;
- END;
- END;
-
- (* ------------------------------------------------- *)
-
- CONSTRUCTOR tModula.Init;
- VAR
- R : tRect;
- Path : PathStr;
- D : DirStr;
- N : NameStr;
- E : ExtStr;
- Heap : WORD;
- BEGIN
- (* Editor Stuff *)
- Heap := PtrRec(HeapEnd).Seg - PtrRec(HeapPtr).Seg;
- IF Heap > HeapSize THEN
- BufHeapSize := Heap - HeapSize
- ELSE
- BufHeapSize := 0;
-
- InitBuffers;
-
- (* ------------------------------------------- *)
- tApplication.Init;
-
- RegisterHelpFile;
-
- DisableCommands([cmSave, cmSaveAs, cmCut,
- cmCopy, cmPaste, cmClear, cmUndo,
- cmFind, cmReplace, cmSearchAgain]);
-
- EditorDialog := DoEditDialog;
- ClipWindow := OpenEditor('', FALSE);
- IF ClipWindow <> NIL THEN BEGIN
- Clipboard := ClipWindow^.Editor;
- Clipboard^.CanUndo := FALSE;
- END;
-
- (* Prepares Desktop ID for pMenuBar *)
- GetExtent(R);
- R.A.X := R.B.X - Length(DesktopID) - 1;
- R.B.Y := R.A.Y + 1;
- Insert(New(pTitleText, Init(R, DesktopID)));
-
- (* Close/Redraw IDE Screens while in Dos.Exec *)
- ShutVideo := TRUE;
-
- DelBatch := FALSE;
- (* For debugging purposes ... *)
- Develop := TRUE;
- (* If TRUE, do generate *)
- (* LINNUM or symbolic info *)
- (* Also needed to recompile *)
- (* all modules. *)
- EditBak := TRUE;
- (* Cause Editor to create .BAK *)
-
- DefaultExt := '*.MOD';
- (* DefaultExt appears in the *)
- (* File Select Boxes ... *)
-
- (* Set Defaults if ConfigFile is not available *)
- IF NOT Exists(ConfigFile) THEN BEGIN
-
- Path := ParamStr(0);
- (* same Dir as M2IDE.EXE ?? *)
- FSplit(Path, D, N, E);
- IF NOT Exists(D + ConfigFile) THEN BEGIN
-
- (* Default installation -- same as in INSTALL *)
- UtilPath := 'C:\FST\BIN';
- IF UtilPath[Length(UtilPath)] <> '\' THEN
- UtilPath := UtilPath + '\';
-
- LibPath := 'C:\FST;C:\FST\DEF;C:\FST\SOURCE';
- TDMap := 'C:\TURBO\UTILS\TDMAP.EXE';
- TD := 'C:\TURBO\UTILS\TD.EXE';
-
- PrimFile := '';
- WorkFile := '';
-
- END ELSE
- RetrieveOptions; (* CFG in StartDir ... *)
- END ELSE
- RetrieveOptions; (* Read the ConfigFile *)
-
- IF UtilPath[Length(UtilPath)] <> '\' THEN
- UtilPath := UtilPath + '\';
-
- Compiler := UtilPath + 'M2COMP.EXE';
- GenMake := UtilPath + 'GENMAKE.EXE';
- Linker := UtilPath + 'M2LINK.EXE';
- DbgToMap := UtilPath + 'DBG2MAP.EXE';
- TheHelp := 'M2HELP.HLP';
-
- IF ParamCount = 1 THEN BEGIN
- WorkFile := ParamStr(1);
- IF Pos('.', WorkFile) = 0 THEN
- WorkFile := SetDefaultExt(WorkFile, '.MOD');
- WorkFile := FExpand(WorkFile);
- OpenEditor(WorkFile, TRUE);
- END;
-
- IF (WorkFile = '') OR
- NOT Exists(WorkFile) THEN BEGIN
- AboutBox;
- OpenEditor('', TRUE);
- END ELSE BEGIN
- OpenEditor(WorkFile, TRUE);
- END;
- END;
-
- (* ------------------------------------------------- *)
-
- PROCEDURE tModula.OutOfMemory;
- VAR
- D : pDialog;
- R : tRect;
- C : WORD;
- BEGIN
- MessageBox(^C'Not enough memory to complete ' +
- 'operation.' + #13 +
- ^C'Close some desktop window and retry.',
- NIL, mfError + mfOkButton);
- END;
-
- (* ------------------------------------------------- *)
-
- BEGIN
- Modula.Init;
- Modula.Run;
- Modula.Done;
- END.
- (* ------------------------------------------------- *)
- (* Ende von M2IDE.PAS *)
-