home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / extra18 / ide / m2ide.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-01-30  |  51.8 KB  |  1,752 lines

  1. (* ------------------------------------------------- *)
  2. (*                    M2IDE.PAS                      *)
  3. (* Integrierte Entwickleroberfläche für FST Modula 2 *)
  4. (*       (c) 1992 Wolfhard Rinke & DMV-Verlag        *)
  5. (*   Portions Copyright (c) Borland International    *)
  6. (* ------------------------------------------------- *)
  7. PROGRAM M2IDE;
  8.  
  9. {$X+,S-}
  10.  
  11. {$M 16384,32675,655360}
  12.  
  13. USES Dos, Objects, Memory, App, Views, Menus, Dialogs,
  14.      StdDlg, Drivers, MsgBox, Browser, TxEdit, Buffers,
  15.      HelpFile, M2Help, Context;
  16.  
  17. (* ------------------------------------------------- *)
  18. (*  IDE Commands                                     *)
  19.  
  20. CONST
  21.   cmBuild        = 100;
  22.   cmGenMake      = 101;
  23.   cmCompile      = 103;
  24.   cmLink         = 104;
  25.   cmDosShell     = 105;
  26.   cmMapFile      = 106;
  27.   cmPrepTD       = 107;
  28.   cmBrowse       = 108;
  29.   cmFileOpen     = 109;
  30.   cmChangeDir    = 110;
  31.   cmPrimFile     = 111;
  32.   cmSaveOpts     = 112;
  33.   cmLoadOpts     = 113;
  34.   cmRunTD        = 114;
  35.   cmDevelop      = 115;    (* Menu Switch TRUE/FALSE *)
  36.   cmAbout        = 116;
  37.   cmDirect       = 117;
  38.   cmEraseBat     = 118;    (* Menu Switch TRUE/FALSE *)
  39.   cmEditBak      = 119;    (* Menu Switch TRUE/FALSE *)
  40.   cmChDir        = 120;
  41.   cmFileNew      = 121;
  42.   cmShowClip     = 122;
  43.   cmTile         = 123;
  44.   cmCascade      = 124;
  45.   cmDefaultExt   = 125;    (* Menu Switch .MOD /.DEF *)
  46.   cmHelpIndex    = 126;
  47.  
  48. (* ------------------------------------------------- *)
  49. (*  Zeigt den ID String des Desktop am rechten Rand  *)
  50. (*  des Menübalkens an. Wird in »tModula.Init«       *)
  51. (*  initialisiert und un »tModula.InitMenuBar«       *)
  52. (*  aufgesetzt.                                      *)
  53. (* ------------------------------------------------- *)
  54.  
  55. CONST
  56.   DesktopID    : STRING  = 'DTX FST Modula 2 IDE';
  57.   VersionID    : STRING  = 'Version 1.0 (30.01.92)';
  58.   ConfigFile   : PathStr = 'M2IDE.CFG';
  59.  
  60.   HeapSize   = 32 * (1024 DIV 16);
  61.  
  62. TYPE
  63.   pTitleText = ^tTitleText;
  64.   tTitleText = OBJECT (tStaticText)
  65.     FUNCTION GetPalette : pPalette;  VIRTUAL;
  66.   END;
  67.  
  68.   FUNCTION tTitleText.GetPalette : pPalette;
  69.   CONST
  70.     P : STRING [Length(cStatusLine)] = cStatusLine;
  71.   BEGIN
  72.     GetPalette := @P;
  73.   END;
  74.  
  75. (* ------------------------------------------------- *)
  76.  
  77. TYPE
  78.   pModEditWindow = ^tModEditWindow;
  79.   tModEditWindow = OBJECT (tEditWindow)
  80.     CONSTRUCTOR Init(VAR Bounds   : tRect;
  81.                          FileName : FNameStr);
  82.     PROCEDURE   EditBak(Backup : BOOLEAN);
  83.   END;
  84.  
  85.   CONSTRUCTOR tModEditWindow.Init(VAR Bounds   : tRect;
  86.                                   FileName : FNameStr);
  87.   CONST
  88.     WindNo : INTEGER = 0;
  89.   BEGIN
  90.     tEditWindow.Init(Bounds, FileName, WindNo);
  91.     INC(WindNo);
  92.   END;
  93.  
  94.   PROCEDURE tModEditWindow.EditBak(Backup : BOOLEAN);
  95.   BEGIN
  96.     IF Backup THEN
  97.       EditorFlags := (EditorFlags OR efBackupFiles)
  98.     ELSE
  99.       EditorFlags := (EditorFlags AND
  100.                      (NOT efBackupFiles));
  101.   END;
  102.  
  103. VAR
  104.   ClipWindow : pModEditWindow;
  105.   Editor     : pModEditWindow;
  106.  
  107. (* ------------------------------------------------- *)
  108. (*  Main Application Object                          *)
  109.  
  110. TYPE
  111.   pModula = ^tModula;
  112.   tModula = OBJECT (tApplication)
  113.     UtilPath   : PathStr;
  114.                       (* M2 - .EXE files             *)
  115.     LibPath    : PathStr;
  116.                       (* M2 - .DEF, .MOD, .M2o, .BIN *)
  117.     Compiler   : PathStr;
  118.                       (* M2COMP.EXE                  *)
  119.     Linker     : PathStr;
  120.                       (* M2LINK.EXE                  *)
  121.     PrimFile   : PathStr;
  122.                       (* Primary file (Main Module)  *)
  123.     WorkFile   : PathStr;
  124.                       (* Current Edit file           *)
  125.     GenMake    : PathStr;
  126.                       (* GENMAKE.EXE                 *)
  127.     DbgToMap   : PathStr;
  128.                       (* DBG2MAP.EXE                 *)
  129.     TDMap      : PathStr;
  130.                       (* TDMAP.EXE (Borland Utility) *)
  131.     TD         : PathStr;
  132.                       (* Turbo Debugger              *)
  133.     TheHelp    : PathStr;
  134.                       (* Help file                   *)
  135.  
  136.     CONSTRUCTOR Init;
  137.     DESTRUCTOR  Done;                          VIRTUAL;
  138.     PROCEDURE   InitMenuBar;                   VIRTUAL;
  139.     PROCEDURE   InitStatusLine;                VIRTUAL;
  140.     PROCEDURE   GetEvent(VAR Event : tEvent);  VIRTUAL;
  141.     PROCEDURE   HandleEvent(VAR Event : tEvent);
  142.                                                VIRTUAL;
  143.     FUNCTION    GetPalette : pPalette;         VIRTUAL;
  144.     PROCEDURE   OutOfMemory;                   VIRTUAL;
  145.  
  146.     PROCEDURE   ShutSystem;   (* ... to   Dos.Exec   *)
  147.     PROCEDURE   ReInitSystem; (* ... from Dos.Exec   *)
  148.     PROCEDURE   RetrieveOptions;
  149.                               (* ... to   ConfigFile *)
  150.     PROCEDURE   SaveOptions;  (* ... from ConfigFile *)
  151.     PROCEDURE   AboutBox;     (* my Copyright ...    *)
  152.  
  153.   PRIVATE
  154.     Develop    : BOOLEAN;
  155.                (* FALSE for release version          *)
  156.     ShutVideo  : BOOLEAN;
  157.                (* If FALSE leave the IDE untouched   *)
  158.                (* while external calls via Dos.Exec  *)
  159.     DelBatch   : BOOLEAN;
  160.                (* Erase the generated Batch files.   *)
  161.                (* Don't erase TODEBUG.BAT            *)
  162.     EditBak    : BOOLEAN;
  163.                (* cause Editor to create .BAK files  *)
  164.     DefaultExt : PathStr;
  165.                (* *.DEF sometimes more important     *)
  166.  
  167.     PROCEDURE Build;
  168.                (* run M2COMP with /M(ake) option     *)
  169.     PROCEDURE DoGenMake;
  170.                (* run GENMAKE to prepare MakeFile    *)
  171.     PROCEDURE DoLink;
  172.                (* run M2Link with /L(ine Numbers)    *)
  173.     PROCEDURE MapFile;
  174.                (* generate .MAP-File from .DBG       *)
  175.     PROCEDURE PrepTD;
  176.                (* TDMAP appends symbolics to .EXE    *)
  177.     PROCEDURE RunTD;
  178.                (* start Turbo Debugger               *)
  179.     PROCEDURE Browse(FName : PathStr; Open : BOOLEAN);
  180.     PROCEDURE SelectPrimFile;
  181.                (* Dialog to select the primary file  *)
  182.     PROCEDURE Directories;
  183.                (* Dialog to edit the startup paths   *)
  184.     PROCEDURE DoCompile;
  185.                (* run M2COMP to compile WorkFile     *)
  186.                (* w/o /M-Option                      *)
  187.     FUNCTION  OpenEditor(FileName : PathStr;
  188.                   Visible  : BOOLEAN) : pModEditWindow;
  189.     FUNCTION  CheckInstalled(FName: PathStr) : BOOLEAN;
  190.   END;
  191.  
  192. VAR
  193.   Modula  : tModula;
  194.  
  195. (* ------------------------------------------------- *)
  196.  
  197.   FUNCTION tModula.GetPalette : pPalette;
  198.     (* Colors for Help Context *)
  199.   CONST
  200.     cNewColor = cColor      + cHelpColor;
  201.     cNewBW    = cBlackWhite + cHelpBlackWhite;
  202.     cNewMono  = cMonochrome + cHelpMonochrome;
  203.  
  204.     P : ARRAY [apColor..apMonochrome] OF
  205.         STRING[Length(cNewColor)] =
  206.       (cNewColor, cNewBW, cNewMono);
  207.   BEGIN
  208.     GetPalette := @P[AppPalette];
  209.   END;
  210.  
  211. (* ------------------------------------------------- *)
  212. (*  Get cmHelp and Init the Help Stream.             *)
  213. (*  HelpFile must be in Utils Directory.             *)
  214.  
  215.   PROCEDURE tModula.GetEvent(VAR Event : tEvent);
  216.   VAR
  217.     W        : pWindow;
  218.     HelpFile : pHelpFile;
  219.     HelpStrm : pDosStream;
  220.   CONST
  221.     HelpInUse : BOOLEAN = FALSE;
  222.   BEGIN
  223.     tApplication.GetEvent(Event);
  224.     IF (Event.What = evCommand) AND
  225.        (Event.Command = cmHelp) AND
  226.         NOT HelpInUse THEN BEGIN
  227.       HelpStrm := New(pDosStream,
  228.                       Init(TheHelp, stOpenRead));
  229.       HelpFile := New(pHelpFile, Init(HelpStrm));
  230.       IF (HelpStrm^.Status <> stOk) THEN BEGIN
  231.         MessageBox('Hilfe-Datei nicht gefunden.' + #13+
  232.                    'Bitte prüfen Sie die Installation',
  233.                    NIL, mfError + mfOkButton);
  234.         Dispose(HelpFile, Done);
  235.       END ELSE BEGIN
  236.         HelpInUse := TRUE;
  237.         W := New(pHelpWindow,
  238.                  Init(HelpFile, GetHelpCtx));
  239.         IF ValidView(W) <> NIL THEN BEGIN
  240.           ExecView(W);
  241.           Dispose(W, Done);
  242.         END;
  243.         HelpInUse := FALSE;
  244.         ClearEvent(Event);
  245.       END;
  246.     END;
  247.   END;
  248.  
  249. (* ------------------------------------------------- *)
  250.  
  251.   DESTRUCTOR tModula.Done;
  252.   BEGIN
  253.     tApplication.Done;
  254.     DoneBuffers;
  255.   END;
  256.  
  257. (* ------------------------------------------------- *)
  258. (*  Set Options from Config file                     *)
  259.  
  260.   PROCEDURE tModula.RetrieveOptions;
  261.   VAR
  262.     f : TEXT;
  263.   BEGIN
  264.     Assign(f, ConfigFile);
  265.     {$i-}
  266.     Reset(f);
  267.     {$i+}
  268.     IF IOResult <> 0 THEN Exit;
  269.  
  270.     ReadLn(f, UtilPath);
  271.     ReadLn(f, LibPath );
  272.     ReadLn(f, TDMap   );
  273.     ReadLn(f, TD      );
  274.     ReadLn(f, PrimFile);
  275.     ReadLn(f, WorkFile);
  276.     ReadLn(f, TheHelp);
  277.  
  278.     Compiler   := UtilPath + 'M2COMP.EXE';
  279.     GenMake    := UtilPath + 'GENMAKE.EXE';
  280.     Linker     := UtilPath + 'M2LINK.EXE';
  281.     DbgToMap   := UtilPath + 'DBG2MAP.EXE';
  282.     TheHelp    := UtilPath + 'M2HELP.HLP';
  283.  
  284.     Close(f);
  285.   END;
  286.  
  287. (* ---------------------------------------------------- *)
  288. (*  Store Options to Config File                        *)
  289.  
  290.   PROCEDURE tModula.SaveOptions;
  291.   VAR
  292.     f : TEXT;
  293.   BEGIN
  294.     Assign(f, ConfigFile);
  295.     Rewrite(f);
  296.  
  297.     WriteLn(f, UtilPath);
  298.     WriteLn(f, LibPath );
  299.     WriteLn(f, TDMap   );
  300.     WriteLn(f, TD      );
  301.     WriteLn(f, PrimFile);
  302.     WriteLn(f, WorkFile);
  303.     WriteLn(f, TheHelp);
  304.  
  305.     Close(f);
  306.   END;
  307.  
  308. (* ------------------------------------------------- *)
  309.  
  310.   PROCEDURE tModula.InitMenuBar;
  311.   VAR
  312.     R : tRect;
  313.   BEGIN
  314.     GetExtent(R);
  315.     R.B.Y := R.A.Y + 1;
  316.     MenuBar := New(pMenuBar, Init(R, NewMenu(
  317.       NewSubMenu('~≡~', hcMySystem, NewMenu(
  318.         NewItem('~A~bout...', '', kbNoKey,
  319.                 cmAbout, hcAbout,
  320.         NewItem('~W~ord context', 'Ctrl-F1', kbCtrlF1,
  321.                 cmGetWord, hcContext,
  322.         NewItem('~H~elp Index', 'Shift-F1', kbShiftF1,
  323.                 cmHelpIndex, hcIndex,
  324.         NIL)))),
  325.       NewSubMenu('~F~iles', hcMyFiles, NewMenu(
  326.         NewItem('~O~pen...', 'F3', kbF3,
  327.                 cmFileOpen, hcFOpen,
  328.         NewItem('~N~ew', '', kbNoKey,
  329.                 cmFileNew, hcFNew,
  330.         NewItem('~S~ave', 'F2', kbF2,
  331.                 cmSave, hcFSave,
  332.         NewItem('Save ~a~s...', 'Alt-F2', kbAltF2,
  333.                 cmSaveAs, hcFSaveAs,
  334.         NewLine(
  335.         NewItem('~C~hange Dir...', '', kbNoKey,
  336.                 cmChDir, hcFChDir,
  337.         NewItem('~D~os Shell', '', kbNoKey,
  338.                 cmDosShell, hcFDosShell,
  339.         NewItem('E~x~it', 'Alt-X', kbAltX,
  340.                 cmQuit, hcFQuit,
  341.         NIL))))))))),
  342.       NewSubMenu('~E~dit', hcEdit, NewMenu(
  343.         NewItem('~U~ndo', '', kbNoKey, cmUndo, hcEUndo,
  344.         NewLine(
  345.         NewItem('Cu~t~', 'Shift-Del', kbShiftDel,
  346.                 cmCut, hcECut,
  347.         NewItem('~C~opy', 'Ctrl-Ins', kbCtrlIns,
  348.                 cmCopy, hcECopy,
  349.         NewItem('~P~aste', 'Shift-Ins', kbShiftIns,
  350.                 cmPaste, hcEPaste,
  351.         NewItem('~S~how clipboard', '', kbNoKey,
  352.                 cmShowClip, hcEShowClip,
  353.         NewLine(
  354.         NewItem('~C~lear', 'Ctrl-Del', kbCtrlDel,
  355.                 cmClear, hcEClear,
  356.         NIL))))))))),
  357.       NewSubMenu('~S~earch', hcSearch, NewMenu(
  358.         NewItem('~F~ind...', '', kbNoKey,
  359.                 cmFind, hcSFind,
  360.         NewItem('~R~eplace...', '', kbNoKey,
  361.                 cmReplace, hcSReplace,
  362.         NewItem('~S~earch again', '', kbNoKey,
  363.                 cmSearchAgain, hcSSearchAgain,
  364.         NewLine(
  365.         NewItem('~G~oto...', 'Alt-F6', kbAltF6,
  366.                 cmGoto, hcSGoto,
  367.         NIL)))))),
  368.       NewSubMenu('~M~ake', hcMake, NewMenu(
  369.         NewItem('~C~ompile', 'Alt-F9', kbAltF9,
  370.                 cmCompile, hcMCompile,
  371.         NewItem('~P~rimary File...', '', kbNoKey,
  372.                 cmPrimFile, hcMPrimFile,
  373.         NewLine(
  374.         NewItem('~G~enMake', '', kbNoKey,
  375.                 cmGenMake, hcMGenMake,
  376.         NewItem('~B~uild', 'F9', kbF9,
  377.                 cmBuild, hcMBuild,
  378.         NewItem('~L~ink', 'Shift-F9', kbShiftF9,
  379.                 cmLink, hcMLink,
  380.         NewLine(
  381.         NewItem('~E~rr Browser...', 'Ctrl-F9',
  382.                 kbCtrlF9, cmBrowse, hcMBrowse,
  383.         NIL))))))))),
  384.       NewSubMenu('~D~ebug', hcDebug, NewMenu(
  385.         NewItem('Create ~M~ap File', '', kbNoKey,
  386.                 cmMapFile, hcDMapFile,
  387.         NewItem('~P~repare debugging', '', kbNoKey,
  388.                 cmPrepTD, hcDPrepTD,
  389.         NewLine(
  390.         NewItem('~R~un Debugger', '', kbNoKey,
  391.                 cmRunTD, hcDRunTD,
  392.         NIL))))),
  393.       NewSubMenu('~O~ptions', hcOptions, NewMenu(
  394.         NewItem('De~f~ault Extension', '.MOD', kbNoKey,
  395.                 cmDefaultExt, hcODefaultExt,
  396.         NewItem('~D~evelop', '√', kbNoKey,
  397.                 cmDevelop, hcODevelop,
  398.         NewItem('Erase ~B~atches', ' ', kbNoKey,
  399.                 cmEraseBat, hcOEraseBat,
  400.         NewItem('~C~reate Backup', '√', kbNoKey,
  401.                 cmEditBak, hcOEditBak,
  402.         NewLine(
  403.         NewItem('~E~nvironment...', '', kbNoKey,
  404.                 cmDirect, hcODirect,
  405.         NewLine(
  406.         NewItem('~S~ave Options', '', kbNoKey,
  407.                 cmSaveOpts, hcOSaveOpts,
  408.         NewItem('~L~oad Options', '', kbNoKey,
  409.                 cmLoadOpts, hcOLoadOpts,
  410.         NIL)))))))))),
  411.       NewSubMenu('~W~indows', hcMyWindows, NewMenu(
  412.         NewItem('~S~ize/Move', 'Ctrl-F5', kbCtrlF5,
  413.                 cmResize, hcWResize,
  414.         NewItem('~Z~oom', 'F5', kbF5, cmZoom,  hcWZoom,
  415.         NewItem('~T~ile', '', kbNoKey, cmTile, hcWTile,
  416.         NewItem('C~a~scade', '', kbNoKey,
  417.                 cmCascade, hcWCascade,
  418.         NewItem('~N~ext', 'F6', kbF6, cmNext, hcWNext,
  419.         NewItem('~P~revious', 'Shift-F6', kbShiftF6,
  420.                 cmPrev, hcWPrev,
  421.         NewItem('~C~lose', 'Alt-F3', kbAltF3,
  422.                 cmClose, hcWClose,
  423.         NIL)))))))),
  424.       NIL)))))))))));
  425.   END;
  426.  
  427. (* ------------------------------------------------- *)
  428.  
  429.   PROCEDURE tModula.InitStatusLine;
  430.   VAR
  431.     R : tRect;
  432.   BEGIN
  433.     GetExtent(R);
  434.     R.A.Y := R.B.Y - 1;
  435.     StatusLine := New(pStatusLine, Init(R,
  436.       NewStatusDef(0, $FFFF,
  437.         NewStatusKey('~F1~ Help', kbF1, cmHelp,
  438.         NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
  439.         NewStatusKey('~F2~ Save', kbF2, cmSave,
  440.         NewStatusKey('~Alt-F3~ Close', kbAltF3,
  441.                      cmClose,
  442.         NewStatusKey('~F6~ Next', kbF6, cmNext,
  443.         NewStatusKey('~F9~ Build', kbF9, cmBuild,
  444.         NewStatusKey('~Shift-F9~ Link', kbShiftF9,
  445.                      cmLink,
  446.         NewStatusKey('', kbF10, cmMenu,
  447.         NIL)))))))),
  448.      NIL)));
  449.    END;
  450.  
  451. (* ------------------------------------------------- *)
  452. (*  Schließen der Applikation für ein »DOS.Exec«.    *)
  453. (*  Wenn die PRIVATE Variable »ShutVideo« TRUE ist,  *)
  454. (*  wird das Video-System geschlossen und nach dem   *)
  455. (*  »Exec« wieder hochgefahren. Für Programme, die   *)
  456. (*  nichts auf den Bildschirm ausgeben, muß die Va-  *)
  457. (*  riable auf FALSE gesetzt.                        *)
  458.  
  459.   PROCEDURE tModula.ShutSystem;
  460.   BEGIN
  461.     DoneSysError;
  462.     DoneEvents;
  463.     IF ShutVideo THEN DoneVideo;
  464.     DoneMemory;
  465.     SetMemTop(Ptr(BufHeapPtr, 0));
  466.     SwapVectors;
  467.   END;
  468.  
  469. (* ------------------------------------------------- *)
  470.  
  471.   PROCEDURE tModula.ReInitSystem;
  472.   BEGIN
  473.     SwapVectors;
  474.     SetMemTop(Ptr(BufHeapEnd, 0));
  475.     InitMemory;
  476.     IF ShutVideo THEN InitVideo;
  477.     InitEvents;
  478.     InitSysError;
  479.     Redraw;
  480.   END;
  481.  
  482. (* ------------------------------------------------- *)
  483. (* Bahandlung der meisten Dialogboxen. Setzt und     *)
  484. (* erhält Daten über einen Pointer auf alle Daten-   *)
  485. (* typen.                                            *)
  486.  
  487.   FUNCTION ExecDialog(P    : pDialog;
  488.                       Data : Pointer) : WORD;
  489.   VAR
  490.     Result : WORD;
  491.   BEGIN
  492.     Result := cmCancel;
  493.     P := pDialog(Application^.ValidView(P));
  494.     IF P <> NIL THEN BEGIN
  495.       IF Data <> NIL THEN P^.SetData(Data^);
  496.       Result := Desktop^.ExecView(P);
  497.       IF (Result <> cmCancel) AND (Data <> NIL) THEN
  498.         P^.GetData(Data^);
  499.       Dispose(P, Done);
  500.     END;
  501.     ExecDialog := Result;
  502.   END;
  503.  
  504. (* ------------------------------------------------- *)
  505. (*  Suchen und Ersetzen                              *)
  506.  
  507.   FUNCTION CreateFindDialog : pDialog;
  508.   VAR
  509.     D       : pDialog;
  510.     Control : pView;
  511.     R       : tRect;
  512.   BEGIN
  513.     R.Assign(0, 0, 38, 12);
  514.     D := New(pDialog, Init(R, 'Find'));
  515.     WITH D^ DO BEGIN
  516.       Options := Options OR ofCentered;
  517.  
  518.       R.Assign(3, 3, 32, 4);
  519.       Control := New(pInputLine, Init(R, 80));
  520.       Insert(Control);
  521.       R.Assign(2, 2, 15, 3);
  522.       Insert(New(pLabel, Init(R, '~T~ext to find',
  523.                               Control)));
  524.       R.Assign(32, 3, 35, 4);
  525.       Insert(New(pHistory, Init(R,
  526.                            pInputLine(Control), 10)));
  527.  
  528.       R.Assign(3, 5, 35, 7);
  529.       Insert(New(pCheckBoxes, Init(R,
  530.         NewSItem('~C~ase sensitive',
  531.         NewSItem('~W~hole words only',
  532.         NIL)))));
  533.  
  534.       R.Assign(14, 9, 24, 11);
  535.       Insert(New(pButton, Init(R, 'O~k~',
  536.                                cmOk, bfDefault)));
  537.       INC(R.A.X, 12);  INC(R.B.X, 12);
  538.       Insert(New(pButton, Init(R, 'Cancel',
  539.                                cmCancel, bfNormal)));
  540.  
  541.       SelectNext(FALSE);
  542.     END;
  543.     CreateFindDialog := D;
  544.   END;
  545.  
  546. (* ------------------------------------------------- *)
  547.  
  548.   FUNCTION CreateReplaceDialog : pDialog;
  549.   VAR
  550.     D       : pDialog;
  551.     Control : pView;
  552.     R       : tRect;
  553.   BEGIN
  554.     R.Assign(0, 0, 40, 16);
  555.     D := New(pDialog, Init(R, 'Replace'));
  556.     WITH D^ DO BEGIN
  557.       Options := Options OR ofCentered;
  558.  
  559.       R.Assign(3, 3, 34, 4);
  560.       Control := New(pInputLine, Init(R, 80));
  561.       Insert(Control);
  562.       R.Assign(2, 2, 15, 3);
  563.       Insert(New(pLabel, Init(R, '~T~ext to find',
  564.                               Control)));
  565.       R.Assign(34, 3, 37, 4);
  566.       Insert(New(pHistory, Init(R,
  567.                  pInputLine(Control), 10)));
  568.  
  569.       R.Assign(3, 6, 34, 7);
  570.       Control := New(pInputLine, Init(R, 80));
  571.       Insert(Control);
  572.       R.Assign(2, 5, 12, 6);
  573.       Insert(New(pLabel, Init(R, '~N~ew text',
  574.                               Control)));
  575.       R.Assign(34, 6, 37, 7);
  576.       Insert(New(pHistory, Init(R,
  577.                  pInputLine(Control), 11)));
  578.  
  579.       R.Assign(3, 8, 37, 12);
  580.       Insert(New(pCheckBoxes, Init(R,
  581.         NewSItem('~C~ase sensitive',
  582.         NewSItem('~W~hole words only',
  583.         NewSItem('~P~rompt on replace',
  584.         NewSItem('~R~eplace all',
  585.         NIL)))))));
  586.  
  587.       R.Assign(17, 13, 27, 15);
  588.       Insert(New(pButton, Init(R, 'O~k~', cmOk,
  589.                                bfDefault)));
  590.       INC(R.A.X, 12);  INC(R.B.X, 12);
  591.       Insert(New(pButton, Init(R, 'Cancel',
  592.                  cmCancel, bfNormal)));
  593.  
  594.       SelectNext(FALSE);
  595.     END;
  596.     CreateReplaceDialog := D;
  597.   END;
  598.  
  599. (* ------------------------------------------------- *)
  600. (*  Resource für Directory Editor                    *)
  601. (*                                                   *)
  602. (*  Das Verzeichnis »Utilities« enthält die EXE-     *)
  603. (*  Programme des Compilers (M2COMP.EXE, GENMAKE.EXE,*)
  604. (*  M2LINK.EXE und DBG2MAP.EXE.                      *)
  605. (*                                                   *)
  606. (*  Das Verzeichnis »Libraries« sollte so aussehen   *)
  607. (*  wie die Pfad-Spezifikation für M2LIB (siehe auch *)
  608. (*  MODULA.DOC auf den FST-Disketten). Compiler und  *)
  609. (*  Linker suchen diesen Pfad nach Source- und       *)
  610. (*  Objektdateien ab.                                *)
  611. (*                                                   *)
  612. (*  »TDMap« und »Debugger« enthalten den Pfad der    *)
  613. (*  Borland-Utilities.                               *)
  614. (* ------------------------------------------------- *)
  615.  
  616.   FUNCTION CreateDirDialog : pDialog;
  617.   VAR
  618.     D       : pDialog;
  619.     Control : pView;
  620.     R       : tRect;
  621.   BEGIN
  622.     R.Assign(0, 0, 50, 15);
  623.     D := New(pDialog,
  624.              Init(R, 'Edit Directory Configuration'));
  625.     WITH D^ DO BEGIN
  626.       Options := Options OR ofCentered;
  627.  
  628.       R.Assign(3, 3, 47, 4);
  629.       Control := New(pInputLine, Init(R, 79));
  630.       Insert(Control);
  631.       R.Assign(2, 2, 15, 3);
  632.       Insert(New(pLabel, Init(R, '~U~tilities',
  633.                               Control)));
  634.  
  635.       R.Assign(3, 5, 47, 6);
  636.       Control := New(pInputLine, Init(R, 79));
  637.       Insert(Control);
  638.       R.Assign(2, 4, 25, 5);
  639.       Insert(New(pLabel, Init(R, '~L~ibraries (M2LIB)',
  640.                               Control)));
  641.  
  642.       R.Assign(3, 7, 47, 8);
  643.       Control := New(pInputLine, Init(R, 79));
  644.       Insert(Control);
  645.       R.Assign(2, 6, 15, 7);
  646.       Insert(New(pLabel, Init(R, 'TD~M~ap', Control)));
  647.  
  648.       R.Assign(3, 9, 47, 10);
  649.       Control := New(pInputLine, Init(R, 79));
  650.       Insert(Control);
  651.       R.Assign(2, 8, 15, 9);
  652.       Insert(New(pLabel, Init(R, '~D~ebugger',
  653.                  Control)));
  654.  
  655.       R.Assign(15, 12, 25, 14);
  656.       Insert(New(pButton, Init(R, 'O~K~',
  657.                                cmOk, bfDefault)));
  658.       INC(R.A.X, 12);  INC(R.B.X, 12);
  659.       Insert(New(pButton, Init(R, 'Cancel',
  660.                                cmCancel, bfNormal)));
  661.     END;
  662.     CreateDirDialog := D;
  663.   END;
  664.  
  665.   PROCEDURE tModula.Directories;
  666.   TYPE
  667.     DirInfoRec = RECORD
  668.                    UtilPath : PathStr;
  669.                    LibPath  : PathStr;
  670.                    TDMap    : PathStr;
  671.                    TD       : PathStr;
  672.                  END;
  673.   VAR
  674.     DirInfo : DirInfoRec;
  675.   BEGIN
  676.     DirInfo.UtilPath := UtilPath;
  677.     DirInfo.LibPath  := LibPath;
  678.     DirInfo.TDMap    := TDMap;
  679.     DirInfo.TD       := TD;
  680.  
  681.     ExecDialog(CreateDirDialog, @DirInfo);
  682.  
  683.     UtilPath := DirInfo.UtilPath;
  684.     LibPath  := DirInfo.LibPath;
  685.     TDMap    := DirInfo.TDMap;
  686.     TD       := DirInfo.TD;
  687.  
  688.     Compiler := UtilPath + 'M2COMP.EXE';
  689.     GenMake  := UtilPath + 'GENMAKE.EXE';
  690.     Linker   := UtilPath + 'M2LINK.EXE';
  691.     DbgToMap := UtilPath + 'DBG2MAP.EXE';
  692.   END;
  693.  
  694. (* ------------------------------------------------- *)
  695. (*  Resource für AboutBox                            *)
  696.  
  697.   FUNCTION CreateAboutDialog : pDialog;
  698.   VAR
  699.     D       : pDialog;
  700.     Control : pView;
  701.     R       : tRect;
  702.   BEGIN
  703.     R.Assign(0, 0, 40, 11);
  704.     D := New(pDialog, Init(R, 'About'));
  705.     WITH D^ DO BEGIN
  706.       Options := Options OR ofCentered;
  707.  
  708.       R.Grow(-1, -1);
  709.       Dec(R.B.Y, 3);
  710.       Insert(New(pStaticText, Init(R,
  711.         #13 +
  712.         ^C + DesktopID + #13 +
  713.         ^C + 'Copyright (c) 1991 ' + #13 +
  714.         ^C + ' Wolfhard Rinke & Jörg Braun' + #13 +
  715.         ^C + 'DMV Software, Eschwege' + #13 +
  716.         ^C + VersionID)));
  717.  
  718.       R.Assign(15, 8, 25, 10);
  719.       Insert(New(pButton, Init(R, 'O~K~',
  720.                                cmOk, bfDefault)));
  721.     END;
  722.     CreateAboutDialog := D;
  723.   END;
  724.  
  725.   PROCEDURE tModula.AboutBox;
  726.   BEGIN
  727.     ExecDialog(CreateAboutDialog, NIL);
  728.   END;
  729.  
  730. (* ------------------------------------------------- *)
  731. (* Auswahl des »Primary File« (Hauptmodul) für den   *)
  732. (* Make-Lauf. Per Default ist der Dateiname nicht    *)
  733. (* gesetzt, wenn er nicht in der Konfigurations-     *)
  734. (* datei angegeben wurde. »PrimFile« wird initiali-  *)
  735. (* siert in »tModula.Init« und erfährt ein update    *)
  736. (* von »tModula.RetrieveOptions«.                    *)
  737. (* ------------------------------------------------- *)
  738.  
  739.   PROCEDURE tModula.SelectPrimFile;
  740.   VAR
  741.     D        : pFileDialog;
  742.     FileName : PathStr;
  743.     Control  : WORD;
  744.   BEGIN
  745.     IF PrimFile <> '' THEN
  746.       FileName := PrimFile
  747.     ELSE
  748.       FileName := DefaultExt;
  749.                         (* Setup for file input line *)
  750.  
  751.     D := pFileDialog(ValidView(New(pFileDialog,
  752.                      Init(DefaultExt,
  753.                           'Select primary file',
  754.                           '~N~ame',
  755.                           fdOpenButton + fdClearButton,
  756.                           100))));
  757.  
  758.     Control := ExecDialog(D, @FileName);
  759.  
  760.      IF Control = cmFileClear THEN
  761.        PrimFile := ''
  762.      ELSE IF Control <> cmCancel THEN
  763.        PrimFile := FileName;
  764.   END;
  765.  
  766. (* ------------------------------------------------- *)
  767. (*  FileView (tScroller) utility.                    *)
  768.  
  769.   PROCEDURE tModula.Browse(FName : PathStr;
  770.                            Open  : BOOLEAN);
  771.   VAR
  772.     D        : pFileDialog;
  773.     FileName : PathStr;
  774.     W        : pWindow;
  775.     R        : tRect;
  776.   BEGIN
  777.     FileName := FName;
  778.     IF (FName = '') OR NOT Open THEN BEGIN
  779.                          (* kein Dateiname angegeben *)
  780.       D := pFileDialog(ValidView(New(pFileDialog,
  781.                        Init(FName, 'Browse a file',
  782.                             '~N~ame', fdOpenButton,
  783.                             100))));
  784.  
  785.       IF ExecDialog(D,@FileName) <> cmCancel THEN BEGIN
  786.         R. Assign(0, 0, 80, 10);
  787.         W := pWindow(ValidView(New(pFileWindow,
  788.                                Init(R, FileName))));
  789.         IF W <> NIL THEN Desktop^.Insert(W);
  790.       END;
  791.     END ELSE BEGIN                    (* Open = TRUE *)
  792.       R. Assign(0, 0, 80, 10);
  793.       W := pWindow(ValidView(New(pFileWindow,
  794.                              Init(R, FileName))));
  795.       IF W <> NIL THEN Desktop^.Insert(W);
  796.     END;
  797.   END;
  798.  
  799. (* ------------------------------------------------- *)
  800. (*  Um Programme (hier: M2COMP) zu »betrügen«, die   *)
  801. (*  Texte über den INT 10h ausgeben, wird der Ori-   *)
  802. (*  ginalvektor auf eine Routine gesetzt, die nur    *)
  803. (*  eine IRET-Anweisung enthält.                     *)
  804. (* ------------------------------------------------- *)
  805.  
  806.   PROCEDURE NewInt10;  ASSEMBLER;
  807.   ASM
  808.     IRET
  809.   END;
  810.  
  811. (* ------------------------------------------------- *)
  812.  
  813.   FUNCTION Exists(FileName : PathStr) : BOOLEAN;
  814.   VAR
  815.     SR : SearchRec;
  816.   BEGIN
  817.     FindFirst(FileName, AnyFile, SR);
  818.     Exists := DosError = 0;
  819.   END;
  820.  
  821.   PROCEDURE Kill(FileName : PathStr);
  822.   VAR
  823.     f : File;
  824.   BEGIN
  825.     Assign(f, FileName);
  826.     IF Exists(FileName) THEN Erase(f);
  827.   END;
  828.  
  829.   FUNCTION SetDefaultExt(FileName : PathStr;
  830.                          DefExt : ExtStr) : PathStr;
  831.   VAR
  832.     Dir  : DirStr;
  833.     Name : NameStr;
  834.     Ext  : ExtStr;
  835.   BEGIN
  836.     FSplit(FileName, Dir, Name, Ext);
  837.     SetDefaultExt := Dir + Name + DefExt;
  838.   END;
  839.  
  840.   FUNCTION tModula.CheckInstalled
  841.                            (FName : PathStr) : BOOLEAN;
  842.   BEGIN
  843.     IF NOT Exists(FName) THEN BEGIN
  844.       MessageBox(FName + ' not installed correctly',
  845.                  NIL, mfError + mfOkButton);
  846.       CheckInstalled := FALSE;
  847.     END ELSE
  848.       CheckInstalled := TRUE;
  849.   END;
  850.  
  851. (* ------------------------------------------------- *)
  852.  
  853.   PROCEDURE tModula.DoCompile;
  854.   VAR
  855.     f        : TEXT;
  856.     RetCode  : STRING;
  857.     Info     : WORD;
  858.   BEGIN
  859.     IF WorkFile = '' THEN BEGIN
  860.       MessageBox(^C'No work module specified...' + #13+
  861.                  ^C'Load a file first (F3)',
  862.                  NIL, mfError + mfOkButton);
  863.       Exit;
  864.     END;
  865.  
  866.       (* --- Check installation -------------------- *)
  867.  
  868.     IF NOT CheckInstalled(Compiler) THEN Exit;
  869.  
  870.       (* --- Create the batch file ----------------- *)
  871.  
  872.     Assign(f, 'COMPILE.BAT');
  873.     Rewrite(f);
  874.     WriteLn(f, '@ECHO OFF');
  875.     WriteLn(f, 'SET M2LIB=' + LibPath);
  876.     WriteLn(f, Compiler + ' ' + WorkFile +
  877.                           ' > COMPILE.ERR');
  878.     Close(f);
  879.  
  880.     ShutVideo := FALSE;  ShutSystem;
  881.  
  882.     Exec(GetEnv('COMSPEC'), '/C COMPILE.BAT');
  883.     Str(DosExitCode, RetCode);
  884.  
  885.     ReInitSystem;  ShutVideo := TRUE;
  886.  
  887.     MessageBox(^C'Compilation completed.' + #13 +
  888.                ^C'Return Code: ' + RetCode,
  889.                NIL, mfInformation + mfOkButton);
  890.  
  891.     IF RetCode <> '0' THEN Browse('COMPILE.ERR', TRUE);
  892.  
  893.     IF DelBatch THEN Kill('COMPILE.BAT');
  894.   END;
  895.  
  896. (* ------------------------------------------------- *)
  897.  
  898.   PROCEDURE tModula.Build;
  899.   VAR
  900.     f        : TEXT;
  901.     OldInt10 : Pointer;         (* ClrScr in M2COMP  *)
  902.     RetCode  : STRING;
  903.     Event    : tEvent;
  904.   BEGIN
  905.     IF PrimFile = '' THEN BEGIN
  906.       MessageBox(^C'No main module specified...',
  907.                  NIL, mfError + mfOkButton);
  908.       Exit;
  909.     END;
  910.     IF NOT Exists(SetDefaultExt(PrimFile,
  911.                                     '.MAK')) THEN BEGIN
  912.       MessageBox(^C + SetDefaultExt(PrimFile, '.MAK') +
  913.                  ' not found.' + #13 +
  914.                  ^C'Run GenMake first...',
  915.                  NIL, mfError + mfOkButton);
  916.       Exit;
  917.     END;
  918.  
  919.       (* --- Check installation -------------------- *)
  920.  
  921.     IF NOT CheckInstalled(Compiler) THEN Exit;
  922.  
  923.       (* --- Create the batch file ----------------- *)
  924.  
  925.     Assign(f, 'BUILD.BAT');
  926.     Rewrite(f);
  927.     WriteLn(f, '@ECHO OFF');
  928.     WriteLn(f, 'SET M2LIB=' + LibPath);
  929.     WriteLn(f, Compiler + ' ' +
  930.                SetDefaultExt(PrimFile, '') +
  931.                ' /m > BUILD.ERR');
  932.     Close(f);
  933.  
  934.     ShutVideo := FALSE;  ShutSystem;
  935.  
  936.     GetIntVec($10, OldInt10);
  937.     SetIntvec($10, @NewInt10);
  938.  
  939.     Exec(GetEnv('COMSPEC'), '/C BUILD.BAT');
  940.     Str(DosExitCode, RetCode);
  941.  
  942.     SetIntVec($10, OldInt10);
  943.  
  944.     ReInitSystem;  ShutVideo := TRUE;
  945.  
  946.     MessageBox(^C'Build completed.' + #13 +
  947.                ^C'Return Code: ' + RetCode,
  948.                NIL, mfInformation + mfOkButton);
  949.  
  950.     IF RetCode <> '0' THEN Browse('BUILD.ERR', TRUE);
  951.  
  952.     IF DelBatch THEN Kill('BUILD.BAT');
  953.   END;
  954.  
  955. (* ------------------------------------------------- *)
  956.  
  957.   PROCEDURE tModula.DoGenMake;
  958.   VAR
  959.     f       : TEXT;
  960.     RetCode : STRING;
  961.   BEGIN
  962.     IF PrimFile = '' THEN BEGIN
  963.       MessageBox(^C'No main module specified...',
  964.                  NIL, mfError + mfOkButton);
  965.       Exit;
  966.     END;
  967.     IF NOT Exists(PrimFile) THEN BEGIN
  968.       MessageBox(^C + PrimFile + ' not found.',
  969.                  NIL, mfError + mfOkButton);
  970.       Exit;
  971.     END;
  972.  
  973.       (* --- Check installation -------------------- *)
  974.  
  975.     IF NOT CheckInstalled(GenMake) THEN Exit;
  976.  
  977.       (* --- generate the Batch -------------------- *)
  978.  
  979.     Assign(f, 'DOMAKE.BAT');
  980.     Rewrite(f);
  981.     WriteLn(f, '@ECHO OFF');
  982.     WriteLn(f, 'SET M2LIB=' + LibPath);
  983.     IF Develop THEN
  984.       WriteLn(f, GenMake + ' ' +
  985.                  SetDefaultExt(PrimFile, '') +
  986.                  ' /L > GENMAKE.ERR')
  987.                         (* LINNUM information für TD *)
  988.     ELSE
  989.       WriteLn(f, GenMake + ' ' +
  990.                  SetDefaultExt(PrimFile, '') +
  991.                  ' > GENMAKE.ERR');
  992.     Close(f);
  993.  
  994.     ShutVideo := FALSE;  ShutSystem;
  995.  
  996.     Exec(GetEnv('COMSPEC'), '/C DOMAKE.BAT');
  997.     Str(DosExitCode, RetCode);
  998.  
  999.     ReInitSystem;  ShutVideo := TRUE;
  1000.  
  1001.     IF Exists(SetDefaultExt(PrimFile, '.MAK')) THEN
  1002.       MessageBox(^C'Make file generated. ' + #13 +
  1003.                  ^C'Return Code: ' + RetCode,
  1004.                  NIL, mfInformation + mfOkButton)
  1005.     ELSE BEGIN
  1006.       MessageBox(^C'Couldn''t generate Make file.'
  1007.                  + #13 + ^C'Return Code: ' + RetCode,
  1008.                  NIL, mfError + mfOkButton);
  1009.       Browse('GENMAKE.ERR', TRUE);
  1010.     END;
  1011.  
  1012.     IF RetCode <> '0' THEN Browse('GENMAKE.ERR', TRUE);
  1013.  
  1014.     IF DelBatch THEN Kill('DOMAKE.BAT');
  1015.   END;
  1016.  
  1017. (* ------------------------------------------------- *)
  1018. (*  Call M2LINK.                                     *)
  1019.  
  1020.   PROCEDURE tModula.DoLink;
  1021.   VAR
  1022.     f       : TEXT;
  1023.     RetCode : STRING;
  1024.   BEGIN
  1025.     IF PrimFile = '' THEN BEGIN
  1026.       MessageBox(^C'No main module specified...',
  1027.                  NIL, mfError + mfOkButton);
  1028.       Exit;
  1029.     END;
  1030.     IF NOT Exists(SetDefaultExt(PrimFile,
  1031.                                 '.M2O')) THEN BEGIN
  1032.       MessageBox('Object file not found.',
  1033.                  NIL, mfError + mfOkButton);
  1034.       Exit;
  1035.     END;
  1036.  
  1037.       (* --- Check installation -------------------- *)
  1038.  
  1039.     IF NOT CheckInstalled(Linker) THEN Exit;
  1040.  
  1041.       (* --- Create the Batch ---------------------- *)
  1042.  
  1043.     Assign(f, 'DOLINK.BAT');
  1044.     Rewrite(f);
  1045.     WriteLn(f, '@ECHO OFF');
  1046.     WriteLn(f, 'SET M2LIB=' + LibPath);
  1047.     IF Develop THEN
  1048.       WriteLn(f, Linker + ' ' +
  1049.                  SetDefaultExt(PrimFile, '') + ' /L' +
  1050.                  ' > LINK.ERR')
  1051.                                (* LINNUM info für TD *)
  1052.     ELSE
  1053.       WriteLn(f, Linker + ' ' +
  1054.                  SetDefaultExt(PrimFile, '') +
  1055.                  ' > LINK.ERR');
  1056.     Close(f);
  1057.  
  1058.     ShutVideo := FALSE;  ShutSystem;
  1059.  
  1060.     Exec(GetEnv('COMSPEC'), '/C DOLINK.BAT');
  1061.     Str(DosExitCode, RetCode);
  1062.  
  1063.     ReInitSystem;  ShutVideo := TRUE;
  1064.  
  1065.     MessageBox(^C'Executable file generated.' + #13 +
  1066.                ^C'Return Code: ' + RetCode,
  1067.                NIL, mfInformation + mfOkButton);
  1068.  
  1069.     IF Retcode <> '0' THEN Browse('LINK.ERR', TRUE);
  1070.  
  1071.     IF DelBatch THEN Kill('DOLINK.BAT');
  1072.   END;
  1073.  
  1074. (* ------------------------------------------------- *)
  1075.  
  1076.   PROCEDURE tModula.MapFile;
  1077.   VAR
  1078.     f       : TEXT;
  1079.     RetCode : STRING;
  1080.   BEGIN
  1081.     IF PrimFile = '' THEN BEGIN
  1082.       MessageBox(^C'No main module specified',
  1083.                  NIL, mfError + mfOkButton);
  1084.       Exit;
  1085.     END;
  1086.     IF NOT Exists(SetDefaultExt(PrimFile,
  1087.                                 '.DBG')) THEN BEGIN
  1088.       MessageBox(^C'Debug file not found.',
  1089.                  NIL, mfError + mfOkButton);
  1090.       Exit;
  1091.     END;
  1092.  
  1093.       (* --- Check installation -------------------- *)
  1094.  
  1095.     IF NOT CheckInstalled(DbgToMap) THEN Exit;
  1096.  
  1097.       (* --- Create the batch ---------------------- *)
  1098.  
  1099.     Assign(f, 'DODBG.BAT');
  1100.     Rewrite(f);
  1101.     WriteLn(f, '@ECHO OFF');
  1102.     WriteLn(f, DbgToMap + ' ' +
  1103.                SetDefaultExt(PrimFile, '') +
  1104.                ' > DEBUG.ERR');
  1105.     Close(f);
  1106.  
  1107.     ShutVideo := FALSE;  ShutSystem;
  1108.  
  1109.     Exec(GetEnv('COMSPEC'), '/C DODBG.BAT');
  1110.     Str(DosExitCode, RetCode);
  1111.  
  1112.     ReInitSystem;  ShutVideo := TRUE;
  1113.  
  1114.     MessageBox(^C'Map file generated.' + #13 +
  1115.                ^C'Return Code: ' + RetCode,
  1116.                NIL, mfInformation + mfOkButton);
  1117.  
  1118.     IF Retcode <> '0' THEN Browse('DEBUG.ERR', TRUE);
  1119.  
  1120.     IF DelBatch THEN BEGIN
  1121.       Kill('DODBG.BAT');
  1122.       Kill(SetDefaultExt(PrimFile, '.DBG'));
  1123.     END;
  1124.   END;
  1125.  
  1126. (* ------------------------------------------------- *)
  1127.  
  1128.   PROCEDURE tModula.PrepTD;
  1129.   VAR
  1130.     f        : TEXT;
  1131.     RetCode  : STRING;
  1132.     Dir      : DirStr;
  1133.     Name     : NameStr;
  1134.     Ext      : ExtStr;
  1135.   BEGIN
  1136.     IF NOT Develop THEN Exit;
  1137.  
  1138.     IF PrimFile = '' THEN BEGIN
  1139.       MessageBox(^C'No Primary File specified',
  1140.                  NIL, mfError + mfOkButton);
  1141.       Exit;
  1142.     END;
  1143.     IF NOT Exists(SetDefaultExt(PrimFile,
  1144.                                 '.MAP')) THEN BEGIN
  1145.       MessageBox(^C'Map file not found.',
  1146.                  NIL, mfError + mfOkButton);
  1147.       Exit;
  1148.     END;
  1149.  
  1150.       (* --- Check installation -------------------- *)
  1151.  
  1152.     IF NOT CheckInstalled(TDMap) THEN Exit;
  1153.     IF NOT CheckInstalled(TD)    THEN Exit;
  1154.  
  1155.       (* --- generate the batch -------------------- *)
  1156.  
  1157.     Assign(f, 'DOMAP.BAT');
  1158.     Rewrite(f);
  1159.     WriteLn(f, '@ECHO OFF');
  1160.     WriteLn(f, TDMap + ' ' +
  1161.                SetDefaultExt(PrimFile, '') + ' /Emod' +
  1162.                ' > TDMAP.ERR');
  1163.     Close(f);
  1164.  
  1165.     ShutVideo := FALSE;  ShutSystem;
  1166.  
  1167.     Exec(GetEnv('COMSPEC'), '/C DOMAP.BAT');
  1168.     Str(DosExitCode, RetCode);
  1169.  
  1170.     ReInitSystem;  ShutVideo := TRUE;
  1171.  
  1172.     FSplit(PrimFile, Dir, Name, Ext);
  1173.  
  1174.     Assign(f, 'TODEBUG.BAT');
  1175.     Rewrite(f);
  1176.     WriteLn(f, '@ECHO OFF');
  1177.     WriteLn(f, TD + ' -sd' + Dir + ' ' +
  1178.                SetDefaultExt(PrimFile, '.EXE'));
  1179.     WriteLn(f, 'EXIT');
  1180.     Close(f);
  1181.  
  1182.     MessageBox(^C'File prepared. Return Code: ' +
  1183.                   RetCode + #13 +
  1184.                ^C'TODEBUG.BAT generated',
  1185.                NIL, mfInformation + mfOkButton);
  1186.  
  1187.     IF Retcode <> '0' THEN Browse('TDMAP.ERR', TRUE);
  1188.  
  1189.     IF DelBatch THEN Kill('DOMAP.BAT');
  1190.   END;
  1191.  
  1192. (* ------------------------------------------------- *)
  1193.  
  1194.   PROCEDURE tModula.RunTD;
  1195.   VAR
  1196.     f        : TEXT;
  1197.     RetCode  : STRING;
  1198.   BEGIN
  1199.     IF NOT Exists('TODEBUG.BAT') THEN BEGIN
  1200.       MessageBox(^C'TODEBUG.BAT not found.' + #13 +
  1201.                 ^C'Set Develop Flag and redo project.',
  1202.                  NIL, mfError + mfOkButton);
  1203.       Exit;
  1204.     END;
  1205.  
  1206.     ShutVideo := TRUE;  ShutSystem;
  1207.  
  1208.     Exec(GetEnv('COMSPEC'), '/C TODEBUG.BAT');
  1209.     Str(DosError, RetCode);
  1210.  
  1211.     ReInitSystem;  ShutVideo := TRUE;
  1212.  
  1213.     IF RetCode = '8' THEN OutOfMemory;
  1214.   END;
  1215.  
  1216. (* ------------------------------------------------- *)
  1217.  
  1218.   FUNCTION tModula.OpenEditor(FileName : PathStr;
  1219.                   Visible  : BOOLEAN) : pModEditWindow;
  1220.   VAR
  1221.     P : pView;
  1222.     R : tRect;
  1223.   BEGIN
  1224.     Desktop^.GetExtent(R);
  1225.     P := Application^.ValidView(New(pModEditWindow,
  1226.                                 Init(r, FileName)));
  1227.     IF NOT Visible THEN P^.Hide;
  1228.     Desktop^.Insert(P);
  1229.     OpenEditor := pModEditWindow(P);
  1230.   END;
  1231.  
  1232. (* ------------------------------------------------- *)
  1233. (*   Standard Event Handling                         *)
  1234.  
  1235.   PROCEDURE tModula.HandleEvent(VAR Event : tEvent);
  1236.  
  1237.     PROCEDURE DosShell;
  1238.     BEGIN
  1239.       ShutVideo := TRUE;
  1240.       ShutSystem;
  1241.       PrintStr('Type <Exit> to return to ' +
  1242.                DesktopID + '...');
  1243.       Exec(GetEnv('COMSPEC'), '');
  1244.       ReInitSystem;
  1245.     END;
  1246.  
  1247.     PROCEDURE Toggle(Command : Word);
  1248.       (* Menü-Schalter                               *)
  1249.       (*                                             *)
  1250.       (* Für »Develop« ist die Default-Einstellung   *)
  1251.       (* »√«, weil die Compilation aller Module die  *)
  1252.       (* Compilerschalter erfordert. Wenn das Pro-   *)
  1253.       (* gramm fertig ist, kann der Schalter umge-   *)
  1254.       (* setzt und das Hauptmodul recompiliert       *)
  1255.       (* werden. Die Compilierung ohne symbolische   *)
  1256.       (* Debug-Informationen macht das lauffähige    *)
  1257.       (* Programm um etwa 50% kleiner!               *)
  1258.       (*                                             *)
  1259.       (* Der Schalter »Erase Batches« wird gesetzt,  *)
  1260.       (* wenn die Batch-Dateien nach jedem Lauf ge-  *)
  1261.       (* löscht werden sollen.                       *)
  1262.     VAR
  1263.       P : pMenuItem;
  1264.  
  1265.       FUNCTION FindMenuItem(Command : WORD): pMenuItem;
  1266.         (* Get the pointer to the specified MenuItem *)
  1267.       VAR
  1268.         P : pMenuItem;
  1269.         M : pMenu;
  1270.       BEGIN
  1271.         IF MenuBar <> NIL THEN BEGIN
  1272.           M := MenuBar^.Menu;
  1273.           P := M^.Default;
  1274.           WHILE (P <> NIL) AND
  1275.                 (P^.Command <> Command) DO BEGIN
  1276.             IF P^.Command = 0 THEN BEGIN
  1277.               M := P^.SubMenu;
  1278.               P := M^.Default;
  1279.             END ELSE
  1280.               P := NIL;
  1281.           END;
  1282.         END;
  1283.         FindMenuItem := P;
  1284.       END;
  1285.  
  1286.     BEGIN
  1287.       IF Command = cmDevelop THEN BEGIN
  1288.         P := FindMenuItem(cmDevelop);
  1289.         IF P <> NIL THEN BEGIN
  1290.           IF P^.Param^ = '√' THEN BEGIN
  1291.             DisposeStr(P^.Param);
  1292.             P^.Param := NewStr(' ');
  1293.             Develop  := FALSE;
  1294.           END ELSE BEGIN
  1295.             DisposeStr(P^.Param);
  1296.             P^.Param := NewStr('√');
  1297.             Develop  := TRUE;
  1298.           END;
  1299.         END;
  1300.       END ELSE IF Command = cmEraseBat THEN BEGIN
  1301.         P := FindMenuItem(cmEraseBat);
  1302.         IF P <> NIL THEN BEGIN
  1303.           IF P^.Param^ = '√' THEN BEGIN
  1304.             DisposeStr(P^.Param);
  1305.             P^.Param := NewStr(' ');
  1306.             DelBatch := FALSE;
  1307.           END ELSE BEGIN
  1308.             DisposeStr(P^.Param);
  1309.             P^.Param := NewStr('√');
  1310.             DelBatch := TRUE;
  1311.           END;
  1312.         END;
  1313.       END ELSE IF Command = cmEditBak THEN BEGIN
  1314.         P := FindMenuItem(cmEditBak);
  1315.         IF P <> NIL THEN BEGIN
  1316.           IF P^.Param^ = '√' THEN BEGIN
  1317.             DisposeStr(P^.Param);
  1318.             P^.Param := NewStr(' ');
  1319.             Editor^.EditBak(FALSE);
  1320.           END ELSE BEGIN
  1321.             DisposeStr(P^.Param);
  1322.             P^.Param := NewStr('√');
  1323.             Editor^.EditBak(TRUE);
  1324.           END;
  1325.         END;
  1326.       END ELSE IF Command = cmDefaultExt THEN BEGIN
  1327.         P := FindMenuItem(cmDefaultExt);
  1328.         IF P <> NIL THEN BEGIN
  1329.           IF P^.Param^ = '.MOD' THEN BEGIN
  1330.             DisposeStr(P^.Param);
  1331.             P^.Param := NewStr('.DEF');
  1332.             DefaultExt := '*.DEF';
  1333.           END ELSE BEGIN
  1334.             DisposeStr(P^.Param);
  1335.             P^.Param := NewStr('.MOD');
  1336.             DefaultExt := '*.MOD';
  1337.           END;
  1338.         END;
  1339.       END;
  1340.     END;
  1341.  
  1342.     PROCEDURE ChangeDir;
  1343.     BEGIN
  1344.       ExecDialog(New(pChDirDialog,
  1345.                      Init(cdNormal, 0)), NIL);
  1346.     END;
  1347.  
  1348.     PROCEDURE FileOpen;
  1349.     VAR
  1350.       FileName : PathStr;
  1351.     BEGIN
  1352.       FileName := DefaultExt;
  1353.       IF ExecDialog(New(pFileDialog,
  1354.                     Init(DefaultExt, 'Open file',
  1355.                          '~N~ame',
  1356.                     fdOpenButton, 101)),
  1357.                     @FileName) <> cmCancel THEN BEGIN
  1358.         WorkFile := FileName;
  1359.         OpenEditor(FileName, TRUE);
  1360.       END;
  1361.     END;
  1362.  
  1363.     PROCEDURE FileNew;
  1364.     BEGIN
  1365.       WorkFile := '';
  1366.       OpenEditor('', TRUE);
  1367.     END;
  1368.  
  1369.     PROCEDURE ShowClip;
  1370.     BEGIN
  1371.       ClipWindow^.Select;
  1372.       ClipWindow^.Show;
  1373.     END;
  1374.  
  1375.     PROCEDURE Tile;
  1376.     VAR
  1377.       R : tRect;
  1378.     BEGIN
  1379.       Desktop^.GetExtent(R);
  1380.       Desktop^.Tile(R);
  1381.     END;
  1382.  
  1383.     PROCEDURE Cascade;
  1384.     VAR
  1385.       R : tRect;
  1386.     BEGIN
  1387.       Desktop^.GetExtent(R);
  1388.       Desktop^.Cascade(R);
  1389.     END;
  1390.  
  1391.     PROCEDURE HelpIndex;
  1392.     VAR
  1393.       W        : pWindow;
  1394.       HelpFile : pHelpFile;
  1395.       HelpStrm : pDosStream;
  1396.     CONST
  1397.       HelpInUse : BOOLEAN = FALSE;
  1398.     BEGIN
  1399.       HelpStrm := New(pDosStream,
  1400.                      Init(Modula.TheHelp, stOpenRead));
  1401.       HelpFile := New(pHelpFile, Init(HelpStrm));
  1402.       IF (HelpStrm^.Status <> stOk) THEN BEGIN
  1403.         MessageBox('Hilfe-Datei nicht gefunden.' + #13+
  1404.                    'Bitte prüfen Sie die Installation',
  1405.                     NIL, mfError + mfOkButton);
  1406.         Dispose(HelpFile, Done);
  1407.       END ELSE BEGIN
  1408.         HelpInUse := TRUE;
  1409.         W := New(pHelpWindow, Init(HelpFile, hcIndex));
  1410.         IF Modula.ValidView(W) <> NIL THEN BEGIN
  1411.           Modula.ExecView(W);
  1412.           Dispose(W, Done);
  1413.         END;
  1414.         HelpInUse := FALSE;
  1415.       END;
  1416.     END;
  1417.  
  1418.   BEGIN
  1419.     tApplication.HandleEvent(Event);
  1420.     CASE Event.What OF
  1421.       evCommand :
  1422.         BEGIN
  1423.           CASE Event.Command OF
  1424.             cmBuild      : Build;
  1425.             cmGenMake    : DoGenMake;
  1426.             cmLink       : DoLink;
  1427.             cmDosShell   : DosShell;
  1428.             cmMapFile    : MapFile;
  1429.             cmPrepTD     : PrepTD;
  1430.             cmRunTD      : RunTD;
  1431.             cmBrowse     : Browse('*.ERR', FALSE);
  1432.             cmPrimFile   : SelectPrimFile;
  1433.             cmLoadOpts   : RetrieveOptions;
  1434.             cmSaveOpts   : SaveOptions;
  1435.             cmDevelop    : Toggle(cmDevelop);
  1436.             cmEraseBat   : Toggle(cmEraseBat);
  1437.             cmEditBak    : Toggle(cmEditBak);
  1438.             cmDefaultExt : Toggle(cmDefaultExt);
  1439.             cmAbout      : AboutBox;
  1440.             cmDirect     : Directories;
  1441.             cmCompile    : DoCompile;
  1442.             cmChDir      : ChangeDir;
  1443.             cmFileOpen   : FileOpen;
  1444.             cmFileNew    : FileNew;
  1445.             cmShowClip   : ShowClip;
  1446.             cmTile       : Tile;
  1447.             cmCascade    : Cascade;
  1448.             cmHelpIndex  : HelpIndex;
  1449.           ELSE
  1450.             Exit;
  1451.           END;
  1452.           ClearEvent(Event);
  1453.         END;
  1454.     END;
  1455.   END;
  1456.  
  1457. (* ------------------------------------------------- *)
  1458.  
  1459.   FUNCTION CreateGotoDialog : pDialog;
  1460.   VAR
  1461.     D       : pDialog;
  1462.     Control : pView;
  1463.     R       : tRect;
  1464.   BEGIN
  1465.     R.Assign(0, 0, 28, 8);
  1466.     D := New(pDialog, Init(R, 'Goto Position'));
  1467.     WITH D^ DO BEGIN
  1468.       Options := Options OR ofCentered;
  1469.  
  1470.       R.Assign(3, 3, 10, 4);
  1471.       Control := New(pInputLine, Init(R, 5));
  1472.       Insert(Control);
  1473.       R.Assign(2, 2, 15, 3);
  1474.       Insert(New(pLabel, Init(R, '~L~ine', Control)));
  1475.  
  1476.       R.Assign(13, 3, 20, 4);
  1477.       Control := New(pInputLine, Init(R, 5));
  1478.       Insert(Control);
  1479.       R.Assign(12, 2, 25, 3);
  1480.       Insert(New(pLabel, Init(R, '~C~olumn',
  1481.                               Control)));
  1482.       R.Assign(4, 5, 14, 7);
  1483.       Insert(New(pButton, Init(R, 'O~K~',
  1484.                           cmOk, bfDefault)));
  1485.       INC(R.A.X, 12);  INC(R.B.X, 12);
  1486.       Insert(New(pButton, Init(R, 'Cancel',
  1487.                           cmCancel, bfNormal)));
  1488.  
  1489.       SelectNext(FALSE);
  1490.     END;
  1491.     CreateGotoDialog := D;
  1492.   END;
  1493.  
  1494. (* ------------------------------------------------- *)
  1495.  
  1496.   FUNCTION DoEditDialog(Dialog : INTEGER;
  1497.                         Info : Pointer) : WORD;  FAR;
  1498.   VAR
  1499.     R        : tRect;
  1500.     T        : tPoint;
  1501.     Ctx      : STRING;
  1502.     ThisCtx  : INTEGER;
  1503.     tc       : STRING;
  1504.     W        : pWindow;
  1505.     HelpFile : pHelpFile;
  1506.     HelpStrm : pDosStream;
  1507.   CONST
  1508.     HelpInUse : BOOLEAN = FALSE;
  1509.  
  1510.     FUNCTION CtxString(p : Pointer) : STRING;
  1511.       (* Very, very tricky ... *)
  1512.     VAR
  1513.       u   : STRING;
  1514.       s   : pString ABSOLUTE p;
  1515.       i   : INTEGER;
  1516.       Len : BYTE;
  1517.     BEGIN
  1518. (*    u := '';
  1519.       Len := BYTE(p^);
  1520.       FOR i := 1 TO Len DO u := u + UpCase(s^[i]);
  1521.       CtxString := u;
  1522. *)
  1523.       CtxString := s^;  (* Case sensitive *)
  1524.     END;
  1525.  
  1526.   BEGIN
  1527.     CASE Dialog OF
  1528.       edOutOfMemory   :
  1529.         DoEditDialog :=
  1530.    MessageBox('Not enough memory for this operation.',
  1531.    NIL, mfError + mfOkButton);
  1532.       edReadError     :
  1533.         DoEditDialog :=
  1534.    MessageBox('Error reading file %s.',
  1535.    @Info, mfError + mfOkButton);
  1536.       edWriteError    :
  1537.         DoEditDialog :=
  1538.    MessageBox('Error writing file %s.',
  1539.    @Info, mfError + mfOkButton);
  1540.       edCreateError   :
  1541.         DoEditDialog :=
  1542.    MessageBox('Error creating file %s.',
  1543.    @Info, mfError + mfOkButton);
  1544.       edSaveModify    :
  1545.         DoEditDialog :=
  1546.    MessageBox('%s has been modified. Save?',
  1547.    @Info, mfInformation + mfYesNoCancel);
  1548.       edSaveUntitled  :
  1549.         DoEditDialog :=
  1550.    MessageBox('Save untitled file?',
  1551.    NIL, mfInformation + mfYesNoCancel);
  1552.       edSaveAs        :
  1553.         DoEditDialog :=
  1554.         ExecDialog(New(pFileDialog,
  1555.                        Init('*.*',
  1556.                        'Save file as',
  1557.                        '~N~ame',
  1558.                        fdOkButton, 101)), Info);
  1559.       edFind          :
  1560.         DoEditDialog :=
  1561.         ExecDialog(CreateFindDialog, Info);
  1562.       edGoto          :
  1563.         DoEditDialog :=
  1564.         ExecDialog(CreateGotoDialog, Info);
  1565.       edGetWord       :
  1566.         BEGIN
  1567.           Ctx := CtxString(Info);
  1568.  
  1569.           ThisCtx := GetContext(Ctx);
  1570.                      (* Unit Context *)
  1571.  
  1572. (*          Str(ThisCtx, tc);
  1573.           MessageBox(Ctx + ' ' + tc, NIL, mfOkButton);
  1574. *)
  1575.           HelpStrm := New(pDosStream,
  1576.                      Init(Modula.TheHelp, stOpenRead));
  1577.           HelpFile := New(pHelpFile, Init(HelpStrm));
  1578.           IF (HelpStrm^.Status <> stOk) THEN BEGIN
  1579.             MessageBox('Hilfe-Datei nicht gefunden.'
  1580.                        + #13 +
  1581.                    'Bitte prüfen Sie die Installation',
  1582.                        NIL, mfError + mfOkButton);
  1583.             Dispose(HelpFile, Done);
  1584.           END ELSE BEGIN
  1585.             HelpInUse := TRUE;
  1586.             W := New(pHelpWindow,
  1587.                      Init(HelpFile, ThisCtx));
  1588.             IF Modula.ValidView(W) <> NIL THEN BEGIN
  1589.               Modula.ExecView(W);
  1590.               Dispose(W, Done);
  1591.             END;
  1592.             HelpInUse := FALSE;
  1593.           END;
  1594.         END;
  1595.       edSearchFailed  :
  1596.         DoEditDialog :=
  1597.         MessageBox('Search string not found.',
  1598.         NIL, mfError + mfOkButton);
  1599.       edReplace       :
  1600.         DoEditDialog :=
  1601.         ExecDialog(CreateReplaceDialog, Info);
  1602.       edReplacePrompt :
  1603.         BEGIN
  1604.           { Avoid placing the dialog on
  1605.             the same line as the cursor }
  1606.           R.Assign(0, 1, 40, 8);
  1607.           R.Move((Desktop^.Size.X-R.B.X) DIV 2, 0);
  1608.           Desktop^.MakeGlobal(R.B, T);
  1609.           INC(T.Y);
  1610.           IF TPoint(Info).Y <= T.Y THEN
  1611.             R.Move(0, Desktop^.Size.Y-R.B.Y-2);
  1612.           DoEditDialog :=
  1613.           MessageBoxRect(R, 'Replace this occurence?',
  1614.           NIL, mfYesNoCancel + mfInformation);
  1615.         END;
  1616.     END;
  1617.   END;
  1618.  
  1619. (* ------------------------------------------------- *)
  1620.  
  1621.   CONSTRUCTOR tModula.Init;
  1622.   VAR
  1623.     R    : tRect;
  1624.     Path : PathStr;
  1625.     D    : DirStr;
  1626.     N    : NameStr;
  1627.     E    : ExtStr;
  1628.     Heap : WORD;
  1629.   BEGIN
  1630.       (* Editor Stuff *)
  1631.     Heap := PtrRec(HeapEnd).Seg - PtrRec(HeapPtr).Seg;
  1632.     IF Heap > HeapSize THEN
  1633.       BufHeapSize := Heap - HeapSize
  1634.     ELSE
  1635.       BufHeapSize := 0;
  1636.  
  1637.     InitBuffers;
  1638.  
  1639.       (* ------------------------------------------- *)
  1640.     tApplication.Init;
  1641.  
  1642.     RegisterHelpFile;
  1643.  
  1644.     DisableCommands([cmSave, cmSaveAs, cmCut,
  1645.                      cmCopy, cmPaste,  cmClear, cmUndo,
  1646.                     cmFind, cmReplace, cmSearchAgain]);
  1647.  
  1648.     EditorDialog := DoEditDialog;
  1649.     ClipWindow   := OpenEditor('', FALSE);
  1650.     IF ClipWindow <> NIL THEN BEGIN
  1651.       Clipboard := ClipWindow^.Editor;
  1652.       Clipboard^.CanUndo := FALSE;
  1653.     END;
  1654.  
  1655.       (* Prepares Desktop ID for pMenuBar *)
  1656.     GetExtent(R);
  1657.     R.A.X := R.B.X - Length(DesktopID) - 1;
  1658.     R.B.Y := R.A.Y + 1;
  1659.     Insert(New(pTitleText, Init(R, DesktopID)));
  1660.  
  1661.        (* Close/Redraw IDE Screens while in Dos.Exec *)
  1662.     ShutVideo  := TRUE;
  1663.  
  1664.     DelBatch   := FALSE;
  1665.                       (* For debugging purposes ...  *)
  1666.     Develop    := TRUE;
  1667.                       (* If TRUE, do generate        *)
  1668.                       (* LINNUM or symbolic info     *)
  1669.                       (* Also needed to recompile    *)
  1670.                       (* all modules.                *)
  1671.     EditBak    := TRUE;
  1672.                       (* Cause Editor to create .BAK *)
  1673.  
  1674.     DefaultExt := '*.MOD';
  1675.                       (* DefaultExt appears in the   *)
  1676.                       (* File Select Boxes ...       *)
  1677.  
  1678.       (* Set Defaults if ConfigFile is not available *)
  1679.     IF NOT Exists(ConfigFile) THEN BEGIN
  1680.  
  1681.       Path := ParamStr(0);
  1682.                        (* same Dir as M2IDE.EXE ??   *)
  1683.       FSplit(Path, D, N, E);
  1684.       IF NOT Exists(D + ConfigFile) THEN BEGIN
  1685.  
  1686.        (* Default installation -- same as in INSTALL *)
  1687.         UtilPath   := 'C:\FST\BIN';
  1688.         IF UtilPath[Length(UtilPath)] <> '\' THEN
  1689.           UtilPath := UtilPath + '\';
  1690.  
  1691.         LibPath   := 'C:\FST;C:\FST\DEF;C:\FST\SOURCE';
  1692.         TDMap     := 'C:\TURBO\UTILS\TDMAP.EXE';
  1693.         TD        := 'C:\TURBO\UTILS\TD.EXE';
  1694.  
  1695.         PrimFile  := '';
  1696.         WorkFile  := '';
  1697.  
  1698.       END ELSE
  1699.         RetrieveOptions;    (* CFG in StartDir ...   *)
  1700.     END ELSE
  1701.       RetrieveOptions;      (* Read the ConfigFile   *)
  1702.  
  1703.     IF UtilPath[Length(UtilPath)] <> '\' THEN
  1704.       UtilPath := UtilPath + '\';
  1705.  
  1706.     Compiler   := UtilPath + 'M2COMP.EXE';
  1707.     GenMake    := UtilPath + 'GENMAKE.EXE';
  1708.     Linker     := UtilPath + 'M2LINK.EXE';
  1709.     DbgToMap   := UtilPath + 'DBG2MAP.EXE';
  1710.     TheHelp    := 'M2HELP.HLP';
  1711.  
  1712.     IF ParamCount = 1 THEN BEGIN
  1713.       WorkFile := ParamStr(1);
  1714.       IF Pos('.', WorkFile) = 0 THEN
  1715.         WorkFile := SetDefaultExt(WorkFile, '.MOD');
  1716.       WorkFile := FExpand(WorkFile);
  1717.       OpenEditor(WorkFile, TRUE);
  1718.     END;
  1719.  
  1720.     IF (WorkFile = '') OR
  1721.        NOT Exists(WorkFile) THEN BEGIN
  1722.       AboutBox;
  1723.       OpenEditor('', TRUE);
  1724.     END ELSE BEGIN
  1725.       OpenEditor(WorkFile, TRUE);
  1726.     END;
  1727.   END;
  1728.  
  1729. (* ------------------------------------------------- *)
  1730.  
  1731.   PROCEDURE tModula.OutOfMemory;
  1732.   VAR
  1733.     D : pDialog;
  1734.     R : tRect;
  1735.     C : WORD;
  1736.   BEGIN
  1737.     MessageBox(^C'Not enough memory to complete ' +
  1738.                  'operation.' + #13 +
  1739.               ^C'Close some desktop window and retry.',
  1740.                NIL, mfError + mfOkButton);
  1741.   END;
  1742.  
  1743. (* ------------------------------------------------- *)
  1744.  
  1745. BEGIN
  1746.   Modula.Init;
  1747.   Modula.Run;
  1748.   Modula.Done;
  1749. END.
  1750. (* ------------------------------------------------- *)
  1751. (*               Ende von M2IDE.PAS                  *)
  1752.