home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / tvision / ide / ide.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-03  |  21.3 KB  |  729 lines

  1. (* ------------------------------------------------------ *)
  2. (*                       IDE.PAS                          *)
  3. (*    Integrierte Benutzeroberfläche für TASM oder BASM   *)
  4. (*     (c) 1993 Wolfhard Rinke & te-wi Verlag, München    *)
  5. (* ------------------------------------------------------ *)
  6. PROGRAM IDE;
  7.  
  8. {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+,Y+}
  9. {$M 16384,0,655360}
  10.  
  11. USES Dos, Objects, Drivers, Memory, Views, Menus, App,
  12.      Dialogs, MsgBox, StdDlg, Calc, ASCIITab, IDE_Dlg,
  13.      TxDos, TxEdit, IDE_Konst, HexCalc, Spooler, Browser,
  14.      RedirOut;
  15.  
  16. (* ------------------------------------------------------ *)
  17.  
  18. TYPE
  19.   pTitleText = ^tTitleText;
  20.   tTitleText = OBJECT (tStaticText)
  21.     FUNCTION GetPalette : pPalette;  VIRTUAL;
  22.   END;
  23.  
  24.   FUNCTION tTitleText.GetPalette : pPalette;
  25.   CONST
  26.     P : STRING [Length(cStatusLine)] = cStatusLine;
  27.   BEGIN
  28.     GetPalette := @P;
  29.   END;
  30.  
  31. (* ------------------------------------------------------ *)
  32.  
  33. TYPE
  34.   tIDE_App = OBJECT (tApplication)
  35.     ClipboardWindow : pEditWindow;
  36.     WindNo          : INTEGER;
  37.     WorkFile        : FNameStr;
  38.     ErrFile         : FNameStr;
  39.  
  40.     CONSTRUCTOR Init;
  41.     PROCEDURE   InitStatusLine; VIRTUAL;
  42.     PROCEDURE   InitMenuBar;    VIRTUAL;
  43.     PROCEDURE   HandleEvent(VAR Event : tEvent); VIRTUAL;
  44.     PROCEDURE   NewEditWin(FileName : FNameStr);
  45.     PROCEDURE   OpenWindow;
  46.     PROCEDURE   ShowClipBoard;
  47.     PROCEDURE   SaveDesktop;
  48.     PROCEDURE   LoadDesktop;
  49.   PRIVATE
  50.     Develop    : BOOLEAN;
  51.     EraseBat   : BOOLEAN;
  52.     EditBak    : BOOLEAN;
  53.     DefaultExt : PathStr;
  54.     UtilPath   : PathStr;
  55.     LibPath    : PathStr;
  56.     ObjPath    : PathStr;
  57.     IncPath    : PathStr;
  58.     AsmOpts    : STRING;
  59.     LinkOpts   : STRING;
  60.  
  61.     PROCEDURE   DoHexCalc;
  62.     PROCEDURE   DoDezCalc;
  63.     PROCEDURE   DoAsciiTab;
  64.     PROCEDURE   DoAboutBox;
  65.     PROCEDURE   Directories;
  66.     PROCEDURE   DoPrint;
  67.     PROCEDURE   Browse(FileName : PathStr; Open : BOOLEAN);
  68.     PROCEDURE   ChangeDir;
  69.     PROCEDURE   DoAsmOpts;
  70.     PROCEDURE   DoLinkOpts;
  71.     PROCEDURE   ShutSystem(Video : BOOLEAN);
  72.     PROCEDURE   ReInitSystem(Video : BOOLEAN);
  73.     PROCEDURE   DoAssemble;
  74.     PROCEDURE   DoLink;
  75.   END;
  76.  
  77.   PROCEDURE tIDE_App.SaveDesktop;
  78.   VAR
  79.     DeskFile : tBufStream;
  80.   BEGIN
  81.     Desktop^.Delete(ClipBoardWindow);
  82.     WITH DeskFile DO BEGIN
  83.       Init(DesktopFileName, stCreate, 1024);
  84.       Put(Desktop);
  85.       Done;
  86.     END;
  87.     InsertWindow(ClipBoardWindow);
  88.   END;
  89.  
  90.   PROCEDURE tIDE_App.LoadDesktop;
  91.   VAR
  92.     DeskFile  : tBufStream;
  93.     TempDesk  : pDesktop;
  94.     R         : tRect;
  95.   BEGIN
  96.     DeskFile.Init(DesktopFileName, stOpenRead, 1024);
  97.     TempDesk := pDeskTop(DeskFile.Get);
  98.     DeskFile.Done;
  99.     IF ValidView(TempDesk) <> NIL THEN BEGIN
  100.       Desktop^.Delete(ClipboardWindow);
  101.       Delete(Desktop);
  102.       Dispose(Desktop, Done);
  103.       Desktop := TempDesk;
  104.       Insert(Desktop);
  105.       GetExtent(R);
  106.       R.Grow(0, -1);
  107.       Desktop^.Locate(R);
  108.       InsertWindow(ClipboardWindow);
  109.     END;
  110.   END;
  111.  
  112.   PROCEDURE tIDE_App.ShowClipBoard;
  113.   BEGIN
  114.     WITH ClipBoardWindow^ DO BEGIN
  115.       Select;
  116.       Show;
  117.     END;
  118.   END;
  119.  
  120.   PROCEDURE tIDE_App.OpenWindow;
  121.   VAR
  122.     R : tRect;
  123.     F : pFileDialog;
  124.     N : FNameStr;
  125.   BEGIN
  126.     N := DefaultExt;
  127.     New(F, Init(N, 'Open File', '~F~ile name',
  128.       fdOkButton OR fdOpenButton, 1));
  129.     IF ExecuteDialog(F, @N) <> cmCancel THEN BEGIN
  130.       GetExtent(R);
  131.       Dec(R.B.Y, 2);
  132.       InsertWindow(New(pEditWindow, Init(R, N, WindNo)));
  133.       Inc(WindNo);
  134.       WorkFile := N;
  135.     END;
  136.   END;
  137.  
  138.   CONSTRUCTOR tIDE_App.Init;
  139.   VAR
  140.     R : tRect;
  141.   BEGIN
  142.     MaxHeapSize  := 8192;
  143.     EditorDialog := StdEditorDialog;
  144.     StreamError  := @EditStreamError;
  145.     RegisterObjects;
  146.     RegisterViews;
  147.     RegisterApp;
  148.     RegisterEditors;
  149.     RegisterCalc;
  150.     RegisterPetzCalc;
  151.     RegisterAsciiTab;
  152.     RegisterBrowser;
  153.     inherited Init;
  154.  
  155. (* ------------------- *)
  156.  
  157.     Desktop^.GetExtent(R);
  158.     ClipBoardWindow := New(pEditWindow, Init(R, '', wnNoNumber));
  159.     IF ValidView(ClipBoardWindow) <> NIL THEN BEGIN
  160.       ClipBoardWindow^.Hide;
  161.       InsertWindow(ClipboardWindow);
  162.       ClipBoard := ClipBoardWindow^.Editor;
  163.       ClipBoard^.CanUndo := FALSE;
  164.     END;
  165.  
  166.       (* Prepare Desktop ID for pMenuBar *)
  167.     R.A.X := R.B.X - Length(DesktopID) - 1;
  168.     R.B.Y := R.A.Y + 1;
  169.     Insert(New(pTitleText, Init(R, DesktopID)));
  170.  
  171.     WindNo := 1;
  172.  
  173.       (* Command Line Parameter *)
  174.     IF ParamCount = 1 THEN BEGIN
  175.       WorkFile := ParamStr(1);
  176.       IF Pos('.', WorkFile) = 0 THEN
  177.         WorkFile := SetDefaultExt(WorkFile, '.ASM');
  178.       IF Exists(WorkFile) THEN
  179.         NewEditWin(WorkFile)
  180.       ELSE
  181.         WorkFile := '';
  182.     END;
  183.     IF (WorkFile = '') OR NOT Exists(WorkFile) THEN BEGIN
  184.       DoAboutBox;
  185.       NewEditWin('');
  186.     END ELSE
  187.       NewEditWin(WorkFile);
  188.  
  189.     IF WorkFile <> '' THEN BEGIN
  190.       ErrFile := SetDefaultExt(WorkFile, '.ERR');
  191.       EnableCommands([cmAssemble]);
  192.       IF Exists(ErrFile) THEN EnableCommands([cmLastError]);
  193.     END ELSE
  194.       ErrFile := '';
  195.  
  196.     (* Defaults *)
  197.     UtilPath   := 'C:\BP\BIN\';
  198.     LibPath    := 'C:\BP\ASM\LIB\';
  199.     ObjPath    := 'C:\BP\ASM\OBJ\';
  200.     IncPath    := 'C:\BP\ASM\SRC\';
  201.     Develop    := TRUE;
  202.     EraseBat   := FALSE;
  203.     EditBak    := TRUE;
  204.     DefaultExt := '*.ASM';
  205.   END;
  206.  
  207.   PROCEDURE tIDE_App.NewEditWin(FileName : FNameStr);
  208.   VAR
  209.     R : tRect;
  210.     E : pEditWindow;
  211.   BEGIN
  212.     GetExtent(R);
  213.     Dec(R.B.Y, 2);
  214.     E := New(pEditWindow, Init(R, FileName, WindNo));
  215.     InsertWindow(E);
  216.     Inc(WindNo);
  217.   END;
  218.  
  219.   PROCEDURE tIDE_App.Browse(FileName : PathStr; Open : BOOLEAN);
  220.   VAR
  221.     D : pFileDialog;
  222.     N : PathStr;
  223.     W : pWindow;
  224.     R : tRect;
  225.   BEGIN
  226.     N := FileName;
  227.     IF (FileName = '') OR NOT Open THEN BEGIN
  228.       (* kein Dateiname angegeben *)
  229.       D := pFileDialog(ValidView(New(pFileDialog,
  230.                        Init(FileName, 'Browse a file',
  231.                        '~N~ame', fdOpenButton, 100))));
  232.  
  233.       IF ExecuteDialog(D, @N) <> cmCancel THEN BEGIN
  234.         R.Assign(0, 0, 80, 10);
  235.         W := pWindow(ValidView(New(pFileWindow, Init(R, N))));
  236.         IF W <> NIL THEN Desktop^.Insert(W);
  237.       END;
  238.     END ELSE BEGIN
  239.       R.Assign(0, 0, 80, 10);
  240.       W := pWindow(ValidView(New(pFileWindow, Init(R, N))));
  241.       IF W <> NIL THEN Desktop^.Insert(W);
  242.     END;
  243.   END;
  244.  
  245.   PROCEDURE tIDE_App.ShutSystem(Video : BOOLEAN);
  246.   BEGIN
  247.     DoneSysError;
  248.     DoneEvents;
  249.     IF Video THEN DoneVideo;
  250.     DoneDosMem;
  251.     SwapVectors;
  252.   END;
  253.  
  254.   PROCEDURE tIDE_App.ReInitSystem(Video : BOOLEAN);
  255.   BEGIN
  256.     SwapVectors;
  257.     InitDosMem;
  258.     IF Video THEN InitVideo;
  259.     InitEvents;
  260.     InitSysError;
  261.     Redraw;
  262.   END;
  263.  
  264. (* ------------------------------------------------------ *)
  265.  
  266.   FUNCTION GetPointerToViewer : pView;
  267.  
  268.     FUNCTION IsMyView(P : pView) : BOOLEAN; FAR;
  269.     BEGIN
  270.       IsMyView := (TypeOf(P^) = TypeOf(tEditWindow));
  271.     END;
  272.  
  273.   BEGIN
  274.     GetPointerToViewer := Desktop^.FirstThat(@IsMyView);
  275.   END;
  276.  
  277. (* ------------------------------------------------------ *)
  278.  
  279.   PROCEDURE tIDE_App.DoAsmOpts;
  280.   VAR
  281.     Data : AsmOptRec;
  282.     S    : STRING;  (* Instanz im Hauptobjekt wg Resource/Stream *)
  283.                     (* ... aber den Record mit den Data zu speichern,
  284.                       wäre natürlich erheblich besser ! *)
  285.   BEGIN
  286.     S := ' /t';
  287.     (* /t = always supress messages when no warnigs *)
  288.     WITH Data DO BEGIN
  289.       (* Defaults: *)
  290.       SegOrder  := $0000; (* 1 *)
  291.       DebugInfo := $0000; (* 2 *)
  292.       CrossRef  := $0000; (* 3 *)
  293.       Warnings  := $0000; (* 4 *)
  294.       Floating  := $0000; (* 5 *)
  295.       Listing   := $0000; (* 6 *)
  296.       ListErr   := $0000; (* 7 *)
  297.       Code      := $0000; (* 8 *)
  298.       Special   := $0000; (* 9 *)
  299.     END;
  300.     ExecuteDialog(AsmOptDlg, @Data);
  301.     WITH Data DO BEGIN
  302.       IF SegOrder = 0 THEN S := S + ' /a' ELSE S := S + ' /s';
  303.       CASE DebugInfo OF
  304.         0 : S := S + ' /zi';
  305.         1 : S := S + ' /zd';
  306.         2 : S := S + ' /zn';
  307.       END;
  308.       IF CrossRef = 1 THEN S := S + ' /c';
  309.       CASE Warnings OF
  310.         0 : S := S + ' /w0';
  311.         1 : S := S + ' /w1';
  312.         2 : S := S + ' /w2';
  313.       END;
  314.       IF Floating = 0 THEN S := S + ' /e' ELSE S := S + ' /r';
  315.       IF Listing  = 0 THEN S := S + ' /l' ELSE S := S + ' /la';
  316.       IF (ListErr AND 1) = 1 THEN S := S + ' /n';
  317.       IF (ListErr AND 2) = 2 THEN S := S + ' /z';
  318.       IF (ListErr AND 4) = 4 THEN S := S + ' /x';
  319.       CASE Code OF
  320.         0 : S := S + ' /os';
  321.         1 : S := S + ' /o';
  322.         2 : S := S + ' /op';
  323.         3 : S := S + ' /oi';
  324.       END;
  325.       IF (Special AND 1) = 1 THEN S := S + ' /p';
  326.       IF (Special AND 2) = 2 THEN S := S + ' /q';
  327.     END;
  328.     AsmOpts := S;
  329.   END;
  330.  
  331.   PROCEDURE tIDE_App.DoAssemble;
  332.   VAR
  333.     Err : STRING;
  334.     N   : FNameStr;
  335.     E   : pEditWindow;
  336.   BEGIN
  337.     E := pEditWindow(GetPointerToViewer);
  338.     N := E^.GetTitle(64);
  339.  
  340.     MessageBox('WorkFile ' + N + ' to be assembled',
  341.                NIL, mfInformation + mfOkButton);
  342.  
  343.    (*
  344.      Syntax:  TASM [options] source [,object] [,listing] [,xref]
  345.     /iPATH        Search PATH for include files  = IncPath;
  346.    *)
  347.  
  348.     ShutSystem(FALSE);
  349.     RedOut;                       (* redirect stdout to STDOUT.RED *)
  350.     Exec(UtilPath + 'TASM.EXE', AsmOpts + ' /t' + WorkFile + ',,,;');
  351.     Redback;                      (* redirect STDOUT.RED to stdout *)
  352.     ReInitSystem(FALSE);
  353.     IF DosError <> 0 THEN BEGIN
  354.       Str(DosError, Err);
  355.       MessageBox('Dos error #' + Err, NIL, mfError + mfOkButton);
  356.     END ELSE BEGIN
  357.       IF DosExitCode <> 0 THEN BEGIN
  358.         Str(DosExitCode, Err);
  359.         MessageBox('Child process exit code = ' + Err,
  360.                    NIL, mfInformation + mfOkButton);
  361.  
  362.       (* wenn child process exit code = 0, alles klar. *)
  363.       (*     1 = Fehler *)
  364.         Browse('STDOUT.RED', TRUE);
  365.       END ELSE
  366.         MessageBox('Assembly successful.', NIL, mfInformation + mfOkButton);
  367.     END;
  368.   END;
  369.  
  370. (* ------------------------------------------------------ *)
  371.  
  372.   PROCEDURE tIDE_App.DoLinkOpts;
  373.   VAR
  374.     Data : LinkOptRec;
  375.     S    : STRING;
  376.   BEGIN
  377.     S := '';
  378.     WITH Data DO BEGIN
  379.       DebugInfo := $0000;
  380.       MemSwap   := $0000;
  381.       Libraries := $0000;
  382.       Target    := $0000;
  383.     END;
  384.     ExecuteDialog(LinkOptDlg, @Data);
  385.     WITH Data DO BEGIN
  386.       IF (DebugInfo AND  1) =  1 THEN S := S + ' /m';
  387.       IF (DebugInfo AND  2) =  2 THEN S := S + ' /x';
  388.       IF (DebugInfo AND  4) =  4 THEN S := S + ' /l';
  389.       IF (DebugInfo AND  8) =  8 THEN S := S + ' /s';
  390.       IF (DebugInfo AND 16) = 16 THEN S := S + ' /v';
  391.       IF (DebugInfo AND 32) = 32 THEN S := S + ' /i';
  392.       IF (DebugInfo AND 64) = 64 THEN S := S + ' /o';
  393.       IF MemSwap = 0 THEN S := S + ' /ye' ELSE S := S + ' /yx';
  394.       IF (Libraries AND  1) =  1 THEN S := S + ' /n';
  395.       IF (Libraries AND  2) =  2 THEN S := S + ' /d';
  396.       IF (Libraries AND  4) =  4 THEN S := S + ' /c';
  397.       IF (Libraries AND  8) =  8 THEN S := S + ' /e';
  398.       IF (Libraries AND 16) = 16 THEN S := S + ' /C';
  399.       IF (Libraries AND 32) = 32 THEN S := S + ' /3';
  400.       CASE Target OF
  401.         0 : S := S + ' /Tdc';
  402.         1 : S := S + ' /Tdx';
  403.         2 : S := S + ' /Tdd';
  404.         3 : S := S + ' /Twc';
  405.         4 : S := S + ' /Twx';
  406.         5 : S := S + ' /Twd';
  407.       END;
  408.     END;
  409.   END;
  410.  
  411.   PROCEDURE tIDE_App.DoLink;
  412.   VAR
  413.     Err : STRING;
  414.     N   : FNameStr;
  415.     E   : pEditWindow;
  416.   BEGIN
  417.     E := pEditWindow(GetPointerToViewer);
  418.     N := E^.GetTitle(64);
  419.  
  420.     MessageBox('WorkFile ' + N + ' to be linked',
  421.                NIL, mfInformation + mfOkButton);
  422.  
  423.      (*
  424.        Syntax: TLINK objfiles, exefile, mapfile, libfiles, deffile
  425.                /L  Specify library search paths
  426.      *)
  427.  
  428.     ShutSystem(FALSE);
  429.     RedOut;          (* redirect stdout to STDOUT.RED *)
  430.     Exec(UtilPath + 'TLINK.EXE', LinkOpts + ' ' + N + ',,,,,;');
  431.     RedBack;
  432.     ReInitSystem(FALSE);
  433.     IF DosError <> 0 THEN BEGIN
  434.       Str(DosError, Err);
  435.       MessageBox('Dos error #' + Err, NIL, mfError + mfOkButton);
  436.     END ELSE BEGIN
  437.       IF DosExitCode <> 0 THEN BEGIN
  438.         Str(DosExitCode, Err);
  439.         MessageBox('Child process exit code = ' + Err,
  440.                    NIL, mfInformation + mfOkButton);
  441.         Browse('STDOUT.RED', TRUE)
  442.       END ELSE
  443.         MessageBox('Linkage successful.',
  444.                    NIL, mfInformation + mfOkButton);
  445.     END;
  446.   END;
  447.  
  448.   PROCEDURE tIDE_App.DoPrint;
  449.   VAR
  450.     E : pEditWindow;
  451.     N : FNameStr;
  452.   BEGIN
  453.     E := pEditWindow(GetPointerToViewer);
  454.     N := E^.GetTitle(64);
  455.     IF SpoolerState THEN
  456.       SubmitFile(N)
  457.     ELSE
  458.       MessageBox(#3'PRINT.COM not installed',
  459.                  NIL, mfError OR mfOkButton);
  460.  
  461.       (* alternativ: Datei Öffnen,
  462.                      while not eof ...
  463.                      Readln
  464.                      writeln(lst)
  465.                      end while
  466.                      Datei schließen
  467.       *)
  468.   END;
  469.  
  470.   PROCEDURE tIDE_App.DoAboutBox;
  471.   BEGIN
  472.     MessageBox(#3 + DeskTopID + #13+
  473.                #3'Integrierte Benutzeroberfläche'#13+
  474.                #3'(c) 1993 Wolfhard Rinke & '#13+
  475.                #3'te-wi Verlag, München'#13#13,
  476.                NIL, mfInformation OR mfOkButton);
  477.   END;
  478.  
  479.   PROCEDURE tIDE_App.DoHexCalc;
  480.   VAR
  481.     C : pPetzCalc;
  482.   BEGIN
  483.     C := New(pPetzCalc, Init);
  484.     Desktop^.Insert(C);
  485.   END;
  486.  
  487.   PROCEDURE tIDE_App.DoDezCalc;
  488.   VAR
  489.     C : pCalculator;
  490.   BEGIN
  491.     C := New(pCalculator, Init);
  492.     Desktop^.Insert(C);
  493.   END;
  494.  
  495.   PROCEDURE tIDE_App.DoAsciiTab;
  496.   VAR
  497.     C : pAsciiChart;
  498.   BEGIN
  499.     C := New(pAsciiChart, Init);
  500.     Desktop^.Insert(C);
  501.   END;
  502.  
  503.   PROCEDURE tIDE_App.ChangeDir;
  504.   BEGIN
  505.     ExecuteDialog(New(pChDirDialog, Init(cdNormal, 0)), NIL);
  506.   END;
  507.  
  508.   PROCEDURE tIDE_App.Directories;
  509.   VAR
  510.     DirInfo : RECORD
  511.                 UtilPath : PathStr;
  512.                 LibPath  : PathStr;
  513.                 ObjPath  : PathStr;
  514.                 IncPath  : PathStr;
  515.               END;
  516.   BEGIN
  517.     DirInfo.UtilPath := UtilPath;
  518.     DirInfo.LibPath  := LibPath;
  519.     DirInfo.ObjPath  := ObjPath;
  520.     DirInfo.IncPath  := IncPath;
  521.  
  522.     ExecuteDialog(CreateDirDialog, @DirInfo);
  523.  
  524.     UtilPath := DirInfo.UtilPath;
  525.     LibPath  := DirInfo.LibPath;
  526.     ObjPath  := DirInfo.ObjPath;
  527.     IncPath  := DirInfo.IncPath;
  528.   END;
  529.  
  530. (* ------------------------------------------------------ *)
  531.  
  532.   PROCEDURE tIDE_App.HandleEvent(VAR Event : tEvent);
  533.  
  534.     PROCEDURE Toggle(Command : WORD);
  535.     VAR
  536.       P : pMenuItem;
  537.  
  538.       FUNCTION FindMenuItem(Command : WORD) : pMenuItem;
  539.       VAR
  540.         P : pMenuItem;
  541.         M : pMenu;
  542.       BEGIN
  543.         IF MenuBar <> NIL THEN BEGIN
  544.           M := MenuBar^.Menu;
  545.           P := M^.Default;
  546.           WHILE (P <> NIL) AND (P^.Command <> Command) DO BEGIN
  547.             IF P^.Command = 0 THEN BEGIN
  548.               M := P^.SubMenu;
  549.               P := M^.Default;
  550.             END ELSE
  551.               P := NIL;
  552.           END;
  553.         END;
  554.         FindMenuItem := P;
  555.       END;
  556.  
  557.     BEGIN
  558.       IF Command = cmDevelop THEN BEGIN
  559.         P := FindMenuItem(cmDevelop);
  560.         IF P <> NIL THEN BEGIN
  561.           IF P^.Param^ = '√' THEN BEGIN
  562.             DisposeStr(P^.Param);
  563.             P^.Param := NewStr(' ');
  564.             Develop  := FALSE;
  565.           END ELSE BEGIN
  566.             DisposeStr(P^.Param);
  567.             P^.Param := NewStr('√');
  568.             Develop  := TRUE;
  569.           END;
  570.         END;
  571.       END ELSE IF Command = cmEditBak THEN BEGIN
  572.         P := FindMenuItem(cmEditBak);
  573.         IF P <> NIL THEN BEGIN
  574.           IF P^.Param^ = '√' THEN BEGIN
  575.             DisposeStr(P^.Param);
  576.             P^.Param := NewStr(' ');
  577.             EditBak  := FALSE;
  578.           END ELSE BEGIN
  579.             DisposeStr(P^.Param);
  580.             P^.Param := NewStr('√');
  581.             EditBak  := TRUE;
  582.           END;
  583.         END;
  584.       END ELSE IF Command = cmDefaultExt THEN BEGIN
  585.         P := FindMenuItem(cmDefaultExt);
  586.         IF P <> NIL THEN BEGIN
  587.           IF P^.Param^ = '.ASM' THEN BEGIN
  588.             DisposeStr(P^.Param);
  589.             P^.Param   := NewStr('    ');
  590.             DefaultExt := '*.*';
  591.           END ELSE BEGIN
  592.             DisposeStr(P^.Param);
  593.             P^.Param   := NewStr('.ASM');
  594.             DefaultExt := '*.ASM';
  595.           END;
  596.         END;
  597.       END;
  598.     END;
  599.  
  600.   BEGIN
  601.     inherited HandleEvent(Event);
  602.  
  603.     IF Event.What = evCommand THEN BEGIN
  604.       CASE Event.Command OF
  605.         cmAbout       : DoAboutBox;
  606.         cmCalc        : DoDezCalc;
  607.         cmAsciiTab    : DoAsciiTab;
  608.         cmHexCalc     : DoHexCalc;
  609.         cmNew         : NewEditWin('');
  610.         cmOpen        : OpenWindow;
  611.         cmClipShow    : ShowClipBoard;
  612.         cmOptionsSave : SaveDesktop;
  613.         cmOptionsLoad : LoadDesktop;
  614.         cmDevelop     : Toggle(cmDevelop);
  615.         cmEraseBat    : Toggle(cmEraseBat);
  616.         cmEditBak     : Toggle(cmEditBak);
  617.         cmDefaultExt  : Toggle(cmDefaultExt);
  618.         cmDirectories : Directories;
  619.         cmLastError   : Browse(ErrFile, TRUE);
  620.         cmPrint       : DoPrint;
  621.         cmChDir       : ChangeDir;
  622.         cmAsmOpts     : DoAsmOpts;
  623.         cmLinkOpts    : DoLinkOpts;
  624.         cmAssemble    : DoAssemble;
  625.         cmLink        : DoLink;
  626.       ELSE
  627.         Exit;
  628.       END;
  629.       ClearEvent(Event);
  630.     END;
  631.   END;
  632.  
  633.   PROCEDURE tIDE_App.InitMenuBar;
  634.   VAR
  635.     R : tRect;
  636.   BEGIN
  637.     GetExtent(R);
  638.     R.B.Y := R.A.Y + 1;
  639.     MenuBar := New(pMenuBar, Init(R, NewMenu(
  640.       NewSubMenu('~≡~', hcNoContext, NewMenu(
  641.         NewItem('~D~ez Calculator', '', kbNoKey, cmCalc, hcNoContext,
  642.         NewItem('~H~ex Calculator', '', kbNoKey, cmHexCalc, hcNoContext,
  643.         NewItem('~A~SCII Table',    '', kbNoKey, cmASCIITab, hcNoContext,
  644.         NewLine(
  645.         NewItem('A~b~out...', '', kbNoKey, cmAbout, hcNoContext,
  646.       NIL)))))),
  647.       NewSubMenu('~F~ile', hcNoContext, NewMenu(
  648.         NewItem('~N~ew', '', kbNoKey, cmNew, hcNoContext,
  649.         NewItem('~O~pen...', 'F3', kbF3, cmOpen, hcNoContext,
  650.         NewItem('~S~ave', 'F2', kbF2, cmSave, hcNoContext,
  651.         NewItem('Save ~a~s...', '', kbNoKey, cmSaveAs, hcNoContext,
  652.         NewLine(
  653.         NewItem('~P~rint', '', kbNoKey, cmPrint, hcNoContext,
  654.         NewLine(
  655.         NewItem('~C~hange directory...', '', kbNoKey, cmChDir, hcNoContext,
  656.         NewItem('~D~OS Shell', '', kbNoKey, cmDosShell, hcNoContext,
  657.         NewItem('E~x~it', 'Alt+X', kbAltX, cmQuit, hcNoContext,
  658.       NIL))))))))))),
  659.       NewSubMenu('~E~dit', hcNoContext, NewMenu(
  660.         NewItem('~U~ndo', '', kbAltBack, cmUndo, hcUndo,
  661.         NewLine(
  662.         NewItem('Cu~t~', 'Shift-Del', kbShiftDel, cmCut, hcCut,
  663.         NewItem('~C~opy', 'Ctrl-Ins', kbCtrlIns, cmCopy, hcCopy,
  664.         NewItem('~P~aste', 'Shift-Ins', kbShiftIns, cmPaste, hcPaste,
  665.         NewItem('C~l~ear', 'Ctrl-Del', kbCtrlDel, cmClear, hcClear,
  666.         NewLine(
  667.         NewItem('~S~how clipboard', '', kbNoKey, cmClipShow,
  668.                 hcNoContext,
  669.       NIL))))))))),
  670.       NewSubMenu('~S~earch', hcNoContext, NewMenu(
  671.         NewItem('~F~ind...', '', kbNoKey, cmFind, hcNoContext,
  672.         NewItem('~R~eplace...', '', kbNoKey, cmReplace, hcNoContext,
  673.         NewItem('Search ~a~gain', '', kbNoKey, cmSearchAgain, hcNoContext,
  674.         NewLine(
  675.         NewItem('~G~oto...', '', kbNoKey, cmGoto, hcNoContext,
  676.         NewItem('~L~ast Error...', '', kbNoKey, cmLastError, hcNoContext,
  677.       NIL))))))),
  678.       NewSubMenu('~M~ake', hcNoContext, NewMenu(
  679.         NewItem('~A~ssemble', 'F9', kbF9, cmAssemble, hcNoContext,
  680.         NewItem('~L~ink', 'Alt+F9', kbAltF9, cmLink, hcNoContext,
  681.       NIL))),
  682.       NewSubMenu('~O~ptions', hcNoContext, NewMenu(
  683.         NewItem('~D~evelop', '√', kbNoKey, cmDevelop, hcNoContext,
  684.         NewItem('~C~reate Backup', '√', kbNoKey, cmEditBak, hcNoContext,
  685.         NewItem('~A~ssembler', '', kbNoKey, cmAsmOpts, hcNoContext,
  686.         NewItem('Lin~k~er', '', kbNoKey, cmLinkOpts, hcNoContext,
  687.         NewItem('Default E~x~tension', '.ASM', kbNoKey, cmDefaultExt, hcNoContext,
  688.         NewLine(
  689.         NewItem('~E~nvironment...', '', kbNoKey, cmDirectories, hcNoContext,
  690.         NewLine(
  691.         NewItem('~L~oad desktop', '', kbNoKey, cmOptionsLoad, hcNoContext,
  692.         NewItem('~S~ave desktop', '', kbNoKey, cmOptionsSave, hcNoContext,
  693.       NIL))))))))))),
  694.       NewSubMenu('~W~indow', hcNoContext, NewMenu(
  695.         StdWindowMenuItems(NIL)),
  696.     NIL))))))))));
  697.   END;
  698.  
  699.   PROCEDURE tIDE_App.InitStatusLine;
  700.   VAR
  701.     R : tRect;
  702.   BEGIN
  703.     GetExtent(R);
  704.     R.A.Y := R.B.Y - 1;
  705.     New(StatusLine, Init(R,
  706.       NewStatusDef(0, $F000,
  707.         NewStatusKey('~Alt+X~ Exit', kbAltX, cmQuit,
  708.         NewStatusKey('~F2~ Save', kbF2, cmSave,
  709.         NewStatusKey('~F3~ Open', kbF3, cmOpen,
  710.         NewStatusKey('~F9~ Assemble', kbF9, cmAssemble,
  711.         NewStatusKey('~Alt+F9~ Link', kbAltF9, cmLink,
  712.         NewStatusKey('~F10~ Menu', kbF10, cmMenu,
  713.         NIL)))))),
  714.       NIL)));
  715.   END;
  716.  
  717. (* ------------------------------------------------------ *)
  718.  
  719. VAR
  720.   IDE_App : tIDE_App;
  721.  
  722. BEGIN
  723.   IDE_App.Init;
  724.   IDE_App.Run;
  725.   IDE_App.Done;
  726. END.
  727. (* ------------------------------------------------------ *)
  728. (*                    Ende von IDE.PAS                    *)
  729.