home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / naxos / source / naxos.pas < prev    next >
Pascal/Delphi Source File  |  1992-02-08  |  29KB  |  978 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V+,X+}
  2. {$M 16384,32767,653000}
  3. (*--------------------------------------------------------*)
  4. (*                         NAXOS.PAS                      *)
  5. (*    (C) 1992 DMV-Verlag & Peper, Zissis, Tossounidis    *)
  6. (*             Compiler: Turbo Pascal 6.0                 *)
  7. (*--------------------------------------------------------*)
  8. (* Für die Neucompilation ohne Änderungen werden die      *)
  9. (* deutschen Versionen der Turbo-Vision Standardunits     *)
  10. (* benötigt.                                              *)
  11. (*--------------------------------------------------------*)
  12.  
  13. PROGRAM NaxosIDE;
  14.  
  15.  
  16.  
  17. USES Dos, Objects, Drivers, Memory, Views, Menus, Dialogs,
  18.      StdDlgd, MsgBox, Gadgets, App, Rechner,
  19.      Buffers, EditD, AsciiTab, Color_D;
  20.  
  21. CONST
  22.   Version      = '1.01 BETA1';
  23.   Release      = '20.03.1992';
  24.   HeapSize     = 32 * (1024 DIV 16);
  25.   Compiler     : STRING[80] = 'NX.EXE';
  26.   Switches     : STRING[32] = ' -M';
  27.  
  28.   COptionen    : WORD = 3;
  29.   Debugger     : STRING[32] = 'DEBUG.EXE';
  30.   DebCmd1      : STRING[32] = '';
  31.   DebCmd2      : STRING[32] = '';
  32.  
  33.   cmOpen       = 200;
  34.   cmNew        = 201;
  35.   cmChangeDir  = 202;
  36.   cmDosShell   = 203;
  37.   cmCalculator = 204;
  38.   cmShowClip   = 205;
  39.   cmRun        = 206;
  40.   cmCompile    = 207;
  41.   cmAscii      = 208;
  42.   cmDebug      = 209;
  43.   cmInfo       = 210;
  44.   cmLogo       = 211;
  45.   cmFarbe      = 212;
  46.   cmDebOpt     = 213;
  47.   cmComOpt     = 214;
  48.   cmsOpt       = 215;
  49.   cmLopt       = 216;
  50.  
  51. TYPE
  52.   CnfDat = RECORD
  53.              cOptionen    : WORD;
  54.              Debugger     : STRING[32];
  55.              DebCmd1      : STRING[32];
  56.              DebCmd2      : STRING[32];
  57.              Farben       : tPalette;
  58.            END;
  59.   DBGDat = RECORD
  60.              Debugger     : STRING[32];
  61.              DebCmd1      : STRING[32];
  62.              DebCmd2      : STRING[32];
  63.            END;
  64.  
  65. VAR
  66.   Event    : tEvent;
  67.   InfFile  : FNameStr;
  68.   SysPfad  : DirStr;
  69.   ef       : TEXT;
  70.   MaxErr,i : BYTE;
  71.   ErrMsg   : ARRAY[0..154] OF STRING[40];
  72.   CNFDaten : CnfDat;
  73.   DBGDaten : DBGDat;
  74.   CrtReg   : WORD ABSOLUTE $0040:$0063;
  75.   DTA      : POINTER;
  76.   Result   : RECORD
  77.              CASE BOOLEAN OF
  78.              TRUE : ( ErrorPos:  WORD;
  79.                       ErrorWort: STRING[16] );
  80.              FALSE: ( Main, Here, s0, r0, Zeilen, Bytes: WORD );
  81.              END;
  82.  
  83. TYPE
  84.   pCnf = ^Cnf;
  85.   Cnf  = OBJECT(tObject)
  86.           Data : CnfDat;
  87.           CONSTRUCTOR Init(VAR x:CnfDat);
  88.           CONSTRUCTOR Load(VAR s:tStream);
  89.           PROCEDURE Store (VAR s:tStream);
  90.          END;
  91.  
  92.   CONSTRUCTOR Cnf.Init(VAR x:CnfDat);
  93.   BEGIN
  94.     Data := x;
  95.   END;
  96.  
  97.   CONSTRUCTOR Cnf.Load(VAR s:tStream);
  98.   BEGIN
  99.     s.Read(Data,SizeOf(Data));
  100.   END;
  101.  
  102.   PROCEDURE Cnf.Store(VAR s:tStream);
  103.   BEGIN
  104.     s.Write(Data,SizeOf(Data));
  105.   END;
  106.  
  107. CONST
  108.   rCnf : tStreamRec = (
  109.            OBJType  : 1100;
  110.            VmtLink:   Ofs(TypeOf(Cnf)^);
  111.            Load:      @Cnf.Load;
  112.            Store:     @Cnf.Store );
  113.  
  114.  
  115. TYPE
  116.   PWin       = ^tWin;
  117.   tWin       = OBJECT(tWindow) END;
  118.   pbut       = ^tBut;
  119.   tBut       = OBJECT(tButton) END;
  120.   pEditorApp = ^tEditorApp;
  121.   tEditorApp = OBJECT(tApplication)
  122.     Clock : pClockView;
  123.     Heap  : pHeapView;
  124.     CONSTRUCTOR Init;
  125.     DESTRUCTOR Done; VIRTUAL;
  126.     PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
  127.     PROCEDURE Idle;VIRTUAL;
  128.     PROCEDURE InitMenuBar; VIRTUAL;
  129.     PROCEDURE InitStatusLine; VIRTUAL;
  130.     PROCEDURE OutOfMemory; VIRTUAL;
  131.   END;
  132.  
  133. VAR
  134.   EditorApp  : tEditorApp;
  135.   ClipWindow : pEditWindow;
  136.   sFileName  : FNameStr;
  137.  
  138. FUNCTION ExecDialog(p: pDialog; Data: POINTER): WORD;
  139. VAR
  140.   Result: WORD;
  141. BEGIN
  142.   Result := cmCancel;
  143.   p := pDialog(Application^.ValidView(p));
  144.   IF p <> NIL THEN
  145.   BEGIN
  146.     IF Data <> NIL THEN p^.SetData(Data^);
  147.     Result := DeskTop^.ExecView(p);
  148.     IF (Result <> cmCancel) AND (Data <> NIL) THEN
  149.       p^.GetData(Data^);
  150.     Dispose(p, Done);
  151.   END;
  152.   ExecDialog := Result;
  153. END;
  154.  
  155. FUNCTION CreateFindDialog: pDialog;
  156. VAR
  157.   d      : pDialog;
  158.   Control: pView;
  159.   r      : tRect;
  160. BEGIN
  161.   r.Assign(0, 0, 38, 12);
  162.   d := New(pDialog, Init(r, 'Finden'));
  163.   WITH d^ DO
  164.   BEGIN
  165.     Options := Options OR ofCentered;
  166.     r.Assign(3, 3, 32, 4);
  167.     Control := New(pInputLine, Init(r, 80));
  168.     Insert(Control);
  169.     r.Assign(2, 2, 18, 3);
  170.     Insert(New(pLabel, Init(r, '~T~ext eingeben', Control)));
  171.     r.Assign(32, 3, 35, 4);
  172.     Insert(New(pHistory, Init(r, pInputLine(Control), 10)));
  173.     r.Assign(3, 5, 35, 7);
  174.     Insert(New(pCheckBoxes, Init(r,
  175.       NewSItem('~G~roß/Kleinschreibung',
  176.       NewSItem('~N~ur ganze Worte', NIL)))));
  177.     r.Assign(14, 9, 24, 11);
  178.     Insert(New(pButton, Init(r, 'O~K~', cmOk, bfDefault)));
  179.     Inc(r.A.x, 12); Inc(r.B.x, 13);
  180.     Insert(New(pButton, Init(r, 'Abbruch', cmCancel, bfNormal)));
  181.     SelectNext(FALSE);
  182.   END;
  183.   CreateFindDialog := d;
  184. END;
  185.  
  186. FUNCTION CreateReplaceDialog: pDialog;
  187. VAR
  188.   d      : pDialog;
  189.   Control: pView;
  190.   r      : tRect;
  191. BEGIN
  192.   r.Assign(0, 0, 40, 16);
  193.   d := New(pDialog, Init(r, 'Ersetzen'));
  194.   WITH d^ DO
  195.   BEGIN
  196.     Options := Options OR ofCentered;
  197.     r.Assign(3, 3, 34, 4);
  198.     Control := New(pInputLine, Init(r, 80));
  199.     Insert(Control);
  200.     r.Assign(2, 2, 18, 3);
  201.     Insert(New(pLabel, Init(r, '~T~ext eingeben', Control)));
  202.     r.Assign(34, 3, 37, 4);
  203.     Insert(New(pHistory, Init(r, pInputLine(Control), 10)));
  204.  
  205.     r.Assign(3, 6, 34, 7);
  206.     Control := New(pInputLine, Init(r, 80));
  207.     Insert(Control);
  208.     r.Assign(2, 5, 18, 6);
  209.     Insert(New(pLabel, Init(r, '~E~rsetzen durch', Control)));
  210.     r.Assign(34, 6, 37, 7);
  211.     Insert(New(pHistory, Init(r, pInputLine(Control), 11)));
  212.  
  213.     r.Assign(3, 8, 37, 12);
  214.     Insert(New(pCheckBoxes, Init(r,
  215.       NewSItem('~G~roß/Kleinschreibung',
  216.       NewSItem('~N~ur ganze Worte',
  217.       NewSItem('~M~it Abfrage',
  218.       NewSItem('~A~lle ersetzen', NIL)))))));
  219.  
  220.     r.Assign(17, 13, 27, 15);
  221.     Insert(New(pButton, Init(r, 'O~K~', cmOk, bfDefault)));
  222.     r.Assign(28, 13, 39, 15);
  223.     Insert(New(pButton, Init(r, 'Abbruch', cmCancel,
  224.                                 bfNormal)));
  225.  
  226.     SelectNext(FALSE);
  227.   END;
  228.   CreateReplaceDialog := d;
  229. END;
  230.  
  231. FUNCTION DoEditDialog(Dialog: INTEGER;
  232.                       Info  : POINTER): WORD; FAR;
  233. VAR
  234.   r: tRect;
  235.   t: tPoint;
  236. BEGIN
  237.   CASE Dialog OF
  238.     edOutOfMemory:
  239.       DoEditDialog :=
  240.         MessageBox('Nicht genug Speicher für diese Operation',
  241.         NIL, mfError + mfOkButton);
  242.     edReadError:
  243.       DoEditDialog := MessageBox('Fehler beim Lesen der Datei %s.',
  244.         @Info, mfError + mfOkButton);
  245.     edWriteError:
  246.       DoEditDialog := MessageBox('Fehler beim Schreiben der Datei %s.',
  247.         @Info, mfError + mfOkButton);
  248.     edCreateError:
  249.       DoEditDialog := MessageBox('Fehler beim Anlegen der Datei %s.',
  250.         @Info, mfError + mfOkButton);
  251.     edSaveModify:
  252.       DoEditDialog := MessageBox('%s wurde verändert. Speichern ?',
  253.         @Info, mfInformation + mfYesNoCancel);
  254.     edSaveUntitled:
  255.       DoEditDialog := MessageBox('Unbenannte Datei speichern ?',
  256.         NIL, mfInformation + mfYesNoCancel);
  257.     edSaveAs:
  258.       DoEditDialog := ExecDialog(New(pFileDialog, Init('*.*',
  259.         'Speichern als', '~N~ame', fdOkButton, 101)), Info);
  260.     edFind:
  261.       DoEditDialog := ExecDialog(CreateFindDialog, Info);
  262.     edSearchFailed:
  263.       DoEditDialog := MessageBox('Suchtext nicht gefunden.',
  264.         NIL, mfError + mfOkButton);
  265.     edReplace:
  266.       DoEditDialog := ExecDialog(CreateReplaceDialog, Info);
  267.     edReplacePrompt:
  268.       BEGIN
  269.         { Avoid placing the dialog on the same line as the cursor }
  270.         r.Assign(0, 1, 40, 8);
  271.         r.Move((DeskTop^.Size.x - r.B.x) DIV 2, 0);
  272.         DeskTop^.MakeGlobal(r.B, t);
  273.         Inc(t.y);
  274.         IF tPoint(Info).y <= t.y THEN
  275.           r.Move(0, DeskTop^.Size.y - r.B.y - 2);
  276.         DoEditDialog := MessageBoxRect(r, 'Ersetzen ?',
  277.           NIL, mfYesNoCancel + mfInformation);
  278.       END;
  279.   END;
  280. END;
  281.  
  282. FUNCTION OpenEditor(FileName: FNameStr;
  283.                     Visible: BOOLEAN): pEditWindow;
  284. VAR
  285.   p: pView;
  286.   r: tRect;
  287. BEGIN
  288.   DeskTop^.GetExtent(r);
  289.   p := Application^.ValidView(New(pEditWindow,
  290.     Init(r, FileName, wnNoNumber)));
  291.   IF NOT Visible THEN p^.Hide;
  292.   DeskTop^.Insert(p);
  293.   OpenEditor := pEditWindow(p);
  294. END;
  295.  
  296. CONSTRUCTOR tEditorApp.Init;
  297. VAR
  298.   fn:STRING;
  299.   h: WORD;
  300.   r: tRect;
  301.   Event : tEvent;
  302. BEGIN
  303.   h := PtrRec(HeapEnd).Seg - PtrRec(HeapPtr).Seg;
  304.   IF h > HeapSize THEN
  305.     BufHeapSize := h - HeapSize ELSE BufHeapSize := 0;
  306.   InitBuffers;
  307.   tApplication.Init;
  308.   RegisterType(rCnf);
  309.   Event.what := evCommand;
  310.   Event.command := cmLopt;
  311.   HandleEvent(Event);
  312.  
  313.   DisableCommands([cmSave, cmSaveAs, cmCut,
  314.                    cmCopy, cmPaste, cmClear,
  315.                    cmUndo, cmFind, cmReplace,
  316.                    cmSearchAgain, cmCompile,
  317.                    cmRun, cmDebug, cmInfo]);
  318.   EditorDialog := DoEditDialog;
  319.   ClipWindow := OpenEditor('', FALSE);
  320.   IF ClipWindow <> NIL THEN
  321.   BEGIN
  322.     Clipboard := ClipWindow^.Editor;
  323.     Clipboard^.CanUndo := FALSE;
  324.   END;
  325.   Event.what := evCommand;
  326.   GetExtent(r);
  327.   r.A.x := r.B.x - 9;
  328.   r.B.y := r.A.y + 1;
  329.   Clock := New(pClockView, Init(r));
  330.   Insert(Clock);
  331.  
  332.   IF ParamCount > 0 THEN BEGIN
  333.        fn := ParamStr(1);
  334.        IF Pos('.', fn) = 0 THEN fn := fn+'.FTH';
  335.        OpenEditor(fn,TRUE)
  336.   END ELSE
  337.   Event.command := MessageBox(#3'NAXOS-COMPILER V ' + Version
  338.   + #13#3'(C) 1992 DMV-Verlag & Peper, Zissis, Tossounidis'
  339.   + #13#3 + Release, NIL, 2 + mfOkButton);
  340. END;
  341.  
  342. DESTRUCTOR tEditorApp.Done;
  343. BEGIN
  344.   tApplication.Done;
  345.   DoneBuffers;
  346. END;
  347.  
  348. PROCEDURE tEditorApp.HandleEvent(VAR Event: tEvent);
  349.  
  350. VAR InFile : TEXT;
  351. PROCEDURE FileOpen;
  352. VAR
  353.   FileName: FNameStr;
  354. BEGIN
  355.   sFileName := '*.FTH';
  356.   IF ExecDialog(New(pFileDialog, Init('*.FTH', 'Datei öffnen',
  357.     '~N~ame', fdOpenButton, 100)), @sFileName) <> cmCancel THEN
  358.     OpenEditor(sFileName, TRUE);
  359.     DisableCommands([cmDebug, cmRun, cmInfo]);
  360.     EnableCommands([cmCompile]);
  361. END;
  362.  
  363. PROCEDURE FileNew;
  364. BEGIN
  365.   OpenEditor('', TRUE);
  366.   DisableCommands([cmDebug, cmRun, cmInfo]);
  367.   EnableCommands([cmCompile]);
  368. END;
  369.  
  370. PROCEDURE ChangeDir;
  371. BEGIN
  372.   ExecDialog(New(pChDirDialog, Init(cdNormal, 0)), NIL);
  373. END;
  374.  
  375. PROCEDURE DosShell;
  376. BEGIN
  377.   DoneSysError;
  378.   DoneEvents;
  379.   DoneVideo;
  380.   DoneMemory;
  381.   SetMemTop(Ptr(BufHeapPtr, 0));
  382.   PrintStr('Geben Sie EXIT ein um in die Oberfläche zurückzukehren...');
  383.   SwapVectors;
  384.   Exec(GetEnv('COMSPEC'), '');
  385.   SwapVectors;
  386.   SetMemTop(Ptr(BufHeapEnd, 0));
  387.   InitMemory;
  388.   InitVideo;
  389.   InitEvents;
  390.   InitSysError;
  391.   Redraw;
  392. END;
  393.  
  394. FUNCTION Hex(n, l: INTEGER): STRING;
  395. { n in l-stellige Hexzahl wandeln }
  396. VAR
  397.   i, z: INTEGER;
  398.   s   : STRING;
  399.  
  400. BEGIN
  401.   s := '';
  402.   FOR i := 1 TO l DO BEGIN
  403.       z := n AND 15; { Ziffer bilden }
  404.       IF z > 9 THEN z := z + 7;
  405.       s := Chr(z + 48) + s;
  406.       n := n SHR 4; { Division durch 16 }
  407.     END;
  408.   Hex := s;
  409. END;
  410.  
  411. FUNCTION Dez(n: WORD): STRING;
  412. VAR
  413.   s: STRING;
  414. BEGIN
  415.    Str(n:5,s);
  416.    Dez := s;
  417. END;
  418.  
  419. PROCEDURE GetInfo;
  420. VAR
  421.   Msg:           STRING;
  422.   f:             TEXT;
  423.   Main, Here,
  424.   s0, r0,
  425.   Zeilen, Bytes: WORD;
  426.   p:             PathStr;
  427.   d:             DirStr;
  428.   n:             NameStr;
  429.   e:             ExtStr;
  430. BEGIN
  431.     FSplit(IDEFileName,d,n,e);
  432.     Msg := 'Quelldatei : ' + n + e + #13     +
  433.       #3 + 'Zeilen: ' +  Dez(Result.Zeilen)  +
  434.       '      Bytes: ' +  Dez(Result.Bytes)   + #13 +
  435.       #3 + 'MAIN  : ' +  Hex(Result.Main, 4) +
  436.       '      HERE :  ' + Hex(Result.Here, 4) + #13 +
  437.       #3 + 'S0    : ' +  Hex(Result.s0, 4)   +
  438.       '      R0   :  ' + Hex(Result.r0, 4);
  439.     Event.what := evCommand;
  440.     Event.command := MessageBox(#3 + Msg,
  441.                      NIL, mfInformation + mfOkButton);
  442.     HandleEvent(Event);
  443. END;
  444.  
  445. PROCEDURE Comp;
  446. VAR
  447.   Msg, s1 : STRING;
  448.   ErrWort : STRING[20];
  449.   ds      : WORD;
  450.   Win     : pWin;
  451.   but     : pbut;
  452.   r       : tRect;
  453.   x, y    : WORD;
  454. BEGIN
  455.   r.Assign(20, 7, 60, 16);
  456.   Win := New(PWin, Init(r, 'Compiliere', 0));
  457.   Win^.Palette := wpGrayWindow;
  458.   Win^.Flags := 4;
  459.   DeskTop^.Insert(Win);
  460.   SetMemTop(Ptr(BufHeapPtr, 0));
  461.   SwapVectors;
  462.   Exec(SysPfad + Compiler, IDEFileName + ' ' + Switches);
  463.   SwapVectors;
  464.   Move(DTA^, Result, 19);
  465.   Event.what := evCommand;
  466.   Event.command := cmPrev;
  467.   HandleEvent(Event);
  468.   Win^.Done;
  469.   ds := DosExitCode;
  470.   IF ds<>0 THEN BEGIN
  471.     ds := ds - 100;
  472.     Str(ds:3, Msg);
  473.     IF (ds <> 0) AND (ds <= MaxErr) THEN
  474.       Msg := ErrMsg[ds]
  475.     ELSE
  476.       Msg := Msg + ' = Unbekannter Fehler';
  477.     IF ds = 155 THEN Msg := 'Abbruch';
  478.     IF ds < 100 THEN BEGIN
  479.        Msg := Dez(ds) + ' bei' + Dez(Result.ErrorPos) +
  480.               #13#3 + Msg + #13#3 + Result.ErrorWort;
  481.     END;
  482.     Event.what := evCommand;
  483.     Event.command := MessageBox(#3 + Msg + #13#3 +
  484.                      'Weiter mit ESC', NIL, mfError);
  485.     HandleEvent(Event);
  486.     IF ds < 100 THEN BEGIN
  487.        Event.what := evCommand;
  488.        Event.command := cmTextGoto;
  489.        Event.Infoword := Result.ErrorPos;
  490.        HandleEvent(Event);
  491.     END;
  492.   END ELSE BEGIN
  493.     EnableCommands([cmDebug, cmRun, cmInfo]);
  494.     GetInfo;
  495.   END;
  496.   SetMemTop(Ptr(BufHeapEnd, 0));
  497.   Redraw;
  498. END;
  499.  
  500. PROCEDURE FileRun;
  501. VAR
  502.   LfName : FNameStr;
  503. BEGIN
  504.   DoneSysError;
  505.   DoneEvents;
  506.   DoneVideo;
  507.   DoneMemory;
  508.   SetMemTop(Ptr(BufHeapPtr, 0));
  509.   SwapVectors;
  510.   LfName := Copy(IDEFileName, 1, Pos('.', IDEFileName)) + 'COM';
  511.   Exec(LfName, '');
  512.   SwapVectors;
  513.   SetMemTop(Ptr(BufHeapEnd, 0));
  514.   InitMemory;
  515.   InitVideo;
  516.   InitEvents;
  517.   InitSysError;
  518.   Redraw;
  519. END;
  520.  
  521. PROCEDURE Debug;
  522. VAR
  523.   LfName: STRING;
  524. BEGIN
  525.   DoneSysError;
  526.   DoneEvents;
  527.   DoneVideo;
  528.   DoneMemory;
  529.   SetMemTop(Ptr(BufHeapPtr, 0));
  530.   SwapVectors;
  531.   LfName := Copy(IDEFileName,1,Pos('.', IDEFileName)) + 'COM';
  532.   Exec(Debugger, ' ' + DebCmd1 + ' ' + LfName + ' ' + DebCmd2);
  533.   SwapVectors;
  534.   SetMemTop(Ptr(BufHeapEnd, 0));
  535.   InitMemory;
  536.   InitVideo;
  537.   InitEvents;
  538.   InitSysError;
  539.   Redraw;
  540. END;
  541.  
  542. PROCEDURE ShowClip;
  543. BEGIN
  544.   ClipWindow^.Select;
  545.   ClipWindow^.Show;
  546. END;
  547.  
  548. PROCEDURE Tile;
  549. VAR
  550.   r: tRect;
  551. BEGIN
  552.   DeskTop^.GetExtent(r);
  553.   DeskTop^.Tile(r);
  554. END;
  555.  
  556. PROCEDURE Cascade;
  557. VAR
  558.   r: tRect;
  559. BEGIN
  560.   DeskTop^.GetExtent(r);
  561.   DeskTop^.Cascade(r);
  562. END;
  563.  
  564. PROCEDURE Calculator;
  565. BEGIN
  566.   DeskTop^.Insert(ValidView(New(pCalculator, Init)));
  567. END;
  568.  
  569. PROCEDURE AsciiTab;
  570. VAR
  571.   p: pAsciiChart;
  572. BEGIN
  573.   p := New(pAsciiChart, Init);
  574.   DeskTop^.Insert(ValidView(p));
  575. END;
  576.  
  577. PROCEDURE GetLogo;
  578. BEGIN
  579.   MessageBox(#3'NAXOS-COMPILER V ' + Version +
  580.              #13#3'(C) 1992 DMV-Verlag & Peper, Zissis, Tossounidis' +
  581.              #13#3 + Release, NIL, 2 + mfOkButton);
  582. END;
  583.  
  584. PROCEDURE Farben;
  585. VAR
  586.   d: pColorDialog;
  587. BEGIN
  588.   d := New(pColorDialog, Init('',
  589.            ColorGroup('Menue',
  590.            ColorItem('Normal',              2,
  591.            ColorItem('Inaktiv',             3,
  592.            ColorItem('Shortcut',            4,
  593.            ColorItem('Selektiert',          5,
  594.            ColorItem('Selektiert inaktiv',  6,
  595.            ColorItem('Shortcut selektiert', 7, NIL)))))),
  596.            ColorGroup('Dialog/Rechner',
  597.            ColorItem('Rahmen/Hintergrund', 33,
  598.            ColorItem('Rahmen-Icon',        34,
  599.            ColorItem('Rollbalken',         35,
  600.            ColorItem('Rollbalkenpfeile',   36,
  601.            ColorItem('Statischer Text',    37,
  602.            ColorItem('Label normal',       38,
  603.            ColorItem('Label selektiert',   39,
  604.            ColorItem('Label shortcut',     40,
  605.            ColorItem('Button normal',      41,
  606.            ColorItem('Button default',     42,
  607.            ColorItem('Button selektiert',  43,
  608.            ColorItem('Button inaktiv',     44,
  609.            ColorItem('Button shortcut',    45,
  610.            ColorItem('Button Schatten',    46,
  611.            ColorItem('Cluster normal',     47,
  612.            ColorItem('Cluster selektiert', 48,
  613.            ColorItem('Cluster shortcut',   49,
  614.            ColorItem('Eingabe normal',     50,
  615.            ColorItem('Eingabe selektiert', 51,
  616.            ColorItem('Eingabepfeil',       52,
  617.            ColorItem('History button',     53,
  618.            ColorItem('History sides',      54,
  619.            ColorItem('History bar page',   55,
  620.            ColorItem('History bar icons',  56,
  621.            ColorItem('Liste normal',       57,
  622.            ColorItem('Liste fokusiert',    58,
  623.            ColorItem('List selektiert',    59,
  624.            ColorItem('Listentrennung',     60,
  625.            ColorItem('Information',        61,
  626.                       NIL))))))))))))))))))))))))))))),
  627.            ColorGroup('Editor-Fenster',
  628.            ColorItem('Rahmen passiv',       8,
  629.            ColorItem('Rahmen aktiv',        9,
  630.            ColorItem('Rahmen-Icon',        10,
  631.            ColorItem('Rollbalken',         11,
  632.            ColorItem('Rollbalkenpfeile',   12,
  633.            ColorItem('Text',               13, NIL)))))),
  634.            ColorGroup('Ascii-Tabelle',
  635.            ColorItem('Rahmen passiv',      24,
  636.            ColorItem('Rahmen aktiv',       25,
  637.            ColorItem('Rahmen-Icon',        26,
  638.            ColorItem('Rollbalken',         27,
  639.            ColorItem('Rollbalkenpfeile',   28,
  640.            ColorItem('Text',               29, NIL)))))),
  641.                                                NIL))))));
  642.  
  643.   IF ValidView(d) <> NIL THEN
  644.   BEGIN
  645.     d^.SetData(Application^.GetPalette^);
  646.     IF DeskTop^.ExecView(d) <> cmCancel THEN BEGIN
  647.       Application^.GetPalette^ := d^.Pal;
  648.       DoneMemory;  { Dispose all group buffers }
  649.       Redraw;      { Redraw application with new palette }
  650.     END;
  651.     Dispose(d, Done);
  652.   END;
  653. END;
  654.  
  655. PROCEDURE DebOpt;
  656. TYPE
  657.   DebDialog = ^tDialog;
  658.   pbut      = ^tButton;
  659.   zle       = ^tInputLine;
  660.  
  661. VAR
  662.   Dialog    : DebDialog;
  663.   r         : tRect;
  664.   Control   : WORD;
  665.   Dummy     : WORD;
  666.   Zeile1,
  667.   Zeile2,
  668.   Zeile3    : zle;
  669. BEGIN
  670.   DBGDaten.Debugger := Debugger;
  671.   DBGDaten.DebCmd1  := DebCmd1;
  672.   DBGDaten.DebCmd2  := DebCmd2;
  673.   r.Assign(10, 4, 70, 19);
  674.   Dialog := New(DebDialog, Init(r, 'Debug-Optionen'));
  675.   WITH Dialog^ DO
  676.   BEGIN
  677.     r.Assign(23, 3, 57, 4);
  678.     Zeile1 := (New(pInputLine, Init(r, 32)));
  679.     Insert(Zeile1);
  680.     r.Assign(5, 3, 20, 4);
  681.     Insert(New(pLabel, Init(r, 'DEBUGGER :', Zeile1)));
  682.     r.Assign(23, 5, 57, 6);
  683.     Zeile2 := (New(pInputLine,Init(r, 32)));
  684.     Insert(Zeile2);
  685.     r.Assign(5, 5, 20, 6);
  686.     Insert(New(pLabel, Init(r, 'PARAMETER 1 :', Zeile2)));
  687.     r.Assign(23,7,57,8);
  688.     Zeile3 := (New(pInputLine, Init(r, 32)));
  689.     Insert(Zeile3);
  690.     r.Assign(5, 7, 20, 8);
  691.     Insert(New(pLabel, Init(r, 'PARAMETER 2 :', Zeile3)));
  692.     r.Assign(5, 12, 19, 14);
  693.     Insert(New(pbut, Init(r, 'Cancel', cmCancel, bfNormal)));
  694.     r.Assign(40, 12, 54, 14);
  695.     Insert(New(pbut, Init(r, '~O~K', cmOk, bfDefault)));
  696.   END;
  697.   Dialog^.SetData(DBGDaten);
  698.   Control := DeskTop^.ExecView(Dialog);
  699.   IF Control <> cmCancel THEN BEGIN
  700.      Dialog^.GetData(DBGDaten);
  701.   END;
  702.   Debugger  := DBGDaten.Debugger;
  703.   DebCmd1   := DBGDaten.DebCmd1;
  704.   DebCmd2   := DBGDaten.DebCmd2;
  705.   Dispose(Dialog, Done);
  706. END;
  707.  
  708. PROCEDURE ComOpt;
  709. TYPE
  710.   ComDIALOG = ^tDialog;
  711.   pSchalter = ^tCheckBoxes;
  712.   pbut      = ^tButton;
  713.  
  714. VAR
  715.   Dialog   : ComDIALOG;
  716.   r        : tRect;
  717.   Schalter : pSchalter;
  718.   Control  : WORD;
  719. BEGIN
  720.   r.Assign(30, 5, 65, 20);
  721.   Dialog := New(ComDIALOG, Init(r, 'Compiler-Optionen'));
  722.   WITH Dialog^ DO
  723.   BEGIN
  724.     r.Assign(20, 11, 30, 13);
  725.     Insert(New(pbut, Init(r, '~O~K', cmOk, bfDefault)));
  726.     r.Assign(4, 11, 14, 13);
  727.     Insert(New(pbut,Init(r, 'Cancel', cmCancel, bfNormal)));
  728.     r.Assign(5,4,28,9);
  729.     Schalter := New(pSchalter,Init(r,
  730.        NewSItem('~C~ode     erzeugen',
  731.        NewSItem('~M~AP-File erzeugen',
  732.        NewSItem('~O~ptimierung ein  ',
  733.        NewSItem('~I~ntermediärsource',
  734.        NIL))))
  735.     ));
  736.     Insert(Schalter);
  737.   END;
  738.   Dialog^.SetData(COptionen);
  739.   Control := DeskTop^.ExecView(Dialog);
  740.   IF Control <> cmCancel THEN Dialog^.GetData(cOptionen);
  741.   IF (cOptionen AND $3) = 0 THEN Switches := ' -N';
  742.   IF (cOptionen AND $3) = 1 THEN Switches := '';
  743.   IF (cOptionen AND $3) = 2 THEN Switches := ' -N -M';
  744.   IF (cOptionen AND $3) = 3 THEN Switches := ' -M';
  745.   IF (cOptionen AND $4) = 0 THEN Compiler := 'NX.EXE'
  746.                             ELSE Compiler := 'NXO.EXE';
  747.   IF (cOptionen AND $C) = $C THEN Switches := Switches + ' -D';
  748.   Dispose(Dialog, Done);
  749. END;
  750.  
  751. PROCEDURE OptSave;
  752. VAR
  753.   s: pBufStream;
  754.   x: pCnf;
  755. BEGIN
  756.    CNFDaten.COptionen := COptionen;
  757.    CNFDaten.Debugger := Debugger;
  758.    CNFDaten.DebCmd1 := DebCmd1;
  759.    CNFDaten.DebCmd2 := DebCmd2;
  760.    CNFDaten.Farben  := Application^.GetPalette^;
  761.    s := New(pBufStream, Init('NAXOS.CNF', stCreate, 1024));
  762.    x := New(pCnf, Init(CNFDaten));
  763.    s^.put(x);
  764.    Dispose(s, Done);
  765.    Dispose(x, Done);
  766. END;
  767.  
  768. PROCEDURE OptLoad;
  769. VAR
  770.   s: pBufStream;
  771.   x: pCnf;
  772.   f: FILE;
  773. BEGIN
  774.    Assign(f, 'NAXOS.CNF');
  775.    {$I-} Reset(f); {$I+}
  776.    IF IOResult = 0 THEN BEGIN
  777.      Close(f);
  778.      s := New(pBufStream, Init('NAXOS.CNF', stOpenRead, 1024));
  779.      x := New(pCnf, Init(CNFDaten));
  780.      x := pCnf(s^.get);
  781.      CNFDaten  := x^.Data;
  782.      COptionen := CNFDaten.COptionen;
  783.      Debugger  := CNFDaten.Debugger;
  784.      DebCmd1   := CNFDaten.DebCmd1;
  785.      DebCmd2   := CNFDaten.DebCmd2;
  786.      Application^.GetPalette^ := CNFDaten.Farben;
  787.      Redraw;
  788.      Dispose(x,Done);
  789.      Dispose(s,Done);
  790.      IF (COptionen AND $3) = 0 THEN Switches := ' -N';
  791.      IF (COptionen AND $3) = 1 THEN Switches := '';
  792.      IF (COptionen AND $3) = 2 THEN Switches := ' -N -M';
  793.      IF (COptionen AND $3) = 3 THEN Switches := ' -M';
  794.      IF (COptionen AND $4) = 0 THEN Compiler := 'NX.EXE'
  795.                                ELSE Compiler := 'NXO.EXE';
  796.      IF (COptionen AND $C) = $C THEN Switches := Switches + ' -D';
  797.    END;
  798. END;
  799.  
  800.  
  801. BEGIN
  802.   tApplication.HandleEvent(Event);
  803.   CASE Event.what OF
  804.     evCommand:
  805.       CASE Event.command OF
  806.         cmOpen      : FileOpen;
  807.         cmNew       : FileNew;
  808.         cmChangeDir : ChangeDir;
  809.         cmDosShell  : DosShell;
  810.         cmCalculator: Calculator;
  811.         cmShowClip  : ShowClip;
  812.         cmTile      : Tile;
  813.         cmCascade   : Cascade;
  814.         cmCompile   : BEGIN
  815.                         Event.what := evCommand;
  816.                         Event.command := cmSave;
  817.                         HandleEvent(Event);
  818.                         Comp;
  819.                       END;
  820.         cmRun       : FileRun;
  821.         cmAscii     : AsciiTab;
  822.         cmDebug     : Debug;
  823.         cmInfo      : GetInfo;
  824.         cmLogo      : GetLogo;
  825.         cmFarbe     : Farben;
  826.         cmDebOpt    : DebOpt;
  827.         cmComOpt    : ComOpt;
  828.         cmsOpt      : OptSave;
  829.         cmLopt      : OptLoad;
  830.       ELSE
  831.         Exit;
  832.       END;
  833.   ELSE
  834.     Exit;
  835.   END;
  836.   ClearEvent(Event);
  837. END;
  838.  
  839. PROCEDURE tEditorApp.Idle;
  840.  
  841.   FUNCTION IsTileable(p: pView): BOOLEAN; FAR;
  842.   BEGIN
  843.     IsTileable := p^.Options AND ofTileable <> 0;
  844.   END;
  845.  
  846. BEGIN
  847.   tApplication.Idle;
  848.   Clock^.Update;
  849.   InfFile := Copy(IDEFileName, 1, Pos('.', IDEFileName) - 1) + '.INF';
  850.   IF DeskTop^.FirstThat(@IsTileable) <> NIL THEN
  851.     EnableCommands([cmTile, cmCascade])
  852.   ELSE
  853.     DisableCommands([cmTile, cmCascade]);
  854.   IF IDEFileName = '' THEN DisableCommands([cmCompile,
  855.                                             cmRun,
  856.                                             cmDebug,
  857.                                             cmInfo])
  858.                       ELSE EnableCommands([cmCompile]);
  859. END;
  860.  
  861. PROCEDURE tEditorApp.InitMenuBar;
  862. VAR
  863.   r: tRect;
  864. BEGIN
  865.   GetExtent(r);
  866.   r.B.y := r.A.y + 1;
  867.   MenuBar := New(pMenuBar, Init(r, NewMenu(
  868.              NewSubMenu('~'#240'~', hcNoContext, NewMenu(
  869.              NewItem('~T~aschenrechner', '', kbNoKey,
  870.                      cmCalculator, hcNoContext,
  871.              NewItem('A~S~CII-Tabelle', '', kbNoKey,
  872.                      cmAscii, hcNoContext,
  873.              NewLine(
  874.              NewItem('~A~bout','', kbNoKey,
  875.                      cmLogo, hcNoContext, NIL))))),
  876.              NewSubMenu('~D~atei', hcNoContext, NewMenu(
  877.              NewItem('~L~aden...', 'F3', kbF3, cmOpen, hcNoContext,
  878.              NewItem('~N~eu', '', kbNoKey, cmNew, hcNoContext,
  879.              NewItem('~S~peichern', 'F2', kbF2, cmSave, hcNoContext,
  880.              NewItem('S~p~eichern als ...', '', kbNoKey, cmSaveAs, hcNoContext,
  881.              NewLine(
  882.              NewItem('~V~erzeichnis wechseln...', '',
  883.              kbNoKey, cmChangeDir, hcNoContext,
  884.              NewItem('~D~OS shell', '', kbNoKey, cmDosShell, hcNoContext,
  885.              NewItem('~E~nde', 'Alt-X', kbAltX, cmQuit, hcNoContext,
  886.              NIL))))))))),
  887.              NewSubMenu('~E~ditieren', hcNoContext, NewMenu(
  888.              NewItem('~Z~urück', '', kbNoKey, cmUndo, hcNoContext,
  889.              NewLine(
  890.              NewItem('~A~usschneiden', 'Shift-Del', kbShiftDel, cmCut, hcNoContext,
  891.              NewItem('~K~opieren', 'Ctrl-Ins', kbCtrlIns, cmCopy, hcNoContext,
  892.              NewItem('~E~insetzen', 'Shift-Ins', kbShiftIns, cmPaste, hcNoContext,
  893.              NewItem('~N~otizblock zeigen', '', kbNoKey, cmShowClip, hcNoContext,
  894.              NewLine(
  895.              NewItem('~L~öschen', 'Ctrl-Del', kbCtrlDel, cmClear, hcNoContext,
  896.              NIL))))))))),
  897.              NewSubMenu('~S~uchen', hcNoContext, NewMenu(
  898.              NewItem('~F~inden...', '', kbNoKey, cmFind, hcNoContext,
  899.              NewItem('~E~rsetzen...', '', kbNoKey, cmReplace, hcNoContext,
  900.              NewItem('~S~uche wiederholen', '', kbNoKey, cmSearchAgain, hcNoContext,
  901.              NIL)))),
  902.              NewSubMenu('~C~ompilieren',hcNoContext,NewMenu(
  903.              NewItem('~R~un','Ctrl-F9', kbCtrlF9, cmRun, hcNoContext,
  904.              NewItem('~C~ompilieren','F9', kbF9, cmCompile, hcNoContext,
  905.              NewItem('~I~nformation','Alt-F9', kbAltF9, cmInfo, hcNoContext,
  906.              NIL)))),
  907.              NewItem('De~b~ug','',kbF7, cmDebug, hcNoContext,
  908.              NewSubMenu('~F~enster', hcNoContext, NewMenu(
  909.              NewItem('~B~ewegen','Ctrl-F5', kbCtrlF5, cmResize, hcNoContext,
  910.              NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext,
  911.              NewItem('~N~ebeneinander', '', kbNoKey, cmTile, hcNoContext,
  912.              NewItem('~U~ebereinander', '', kbNoKey, cmCascade, hcNoContext,
  913.              NewItem('Nächstes ~F~enster', 'F6', kbF6, cmNext, hcNoContext,
  914.              NewItem('~V~orheriges Fenster', 'Shift-F6', kbShiftF6, cmPrev, hcNoContext,
  915.              NewItem('~S~chließen', 'Alt-F3', kbAltF3, cmClose, hcNoContext,
  916.              NIL)))))))),
  917.              NewSubMenu('~O~ptionen',hcNoContext,NewMenu(
  918.              NewItem('~F~arben wählen...','',kbNoKey,cmFarbe,hcNoContext,
  919.              NewItem('~D~ebugger...','',kbNoKey,cmDebOpt,hcNoContext,
  920.              NewItem('~C~ompiler...','',kbNoKey,cmComOpt,hcNoContext,
  921.              NewLine(
  922.              NewItem('Einstellungen ~s~peichern','',kbNoKey,cmsOpt,hcNoContext,
  923.              NewItem('Einstellungen ~l~aden','',kbNoKey,cmLopt,hcNoContext,
  924.     NIL))))))),
  925.   NIL)))))))))))
  926. END;
  927.  
  928. PROCEDURE tEditorApp.InitStatusLine;
  929. VAR
  930.   r: tRect;
  931. BEGIN
  932.   GetExtent(r);
  933.   r.A.y := r.B.y - 1;
  934.   New(StatusLine, Init(r,
  935.     NewStatusDef(0, $FFFF,
  936.       NewStatusKey('~F2~ Speichern', kbF2, cmSave,
  937.       NewStatusKey('~F3~ Laden', kbF3, cmOpen,
  938.       NewStatusKey('~Alt-F3~ Schließen', kbAltF3, cmClose,
  939.       NewStatusKey('~F5~ Zoom', kbF5, cmZoom,
  940.       NewStatusKey('~F6~ Next', kbF6, cmNext,
  941.       NewStatusKey('~F10~ Menü', kbF10, cmMenu,
  942.       NewStatusKey('', kbCtrlF5, cmResize,
  943.       NIL))))))),
  944.     NIL)));
  945. END;
  946.  
  947. PROCEDURE tEditorApp.OutOfMemory;
  948. BEGIN
  949.   MessageBox('Nicht genug Speicherplatz für diese Operation.',
  950.               NIL, mfError + mfOkButton);
  951. END;
  952.  
  953.  
  954. BEGIN
  955.   DTA := Ptr($B800,140);
  956.   IF CrtReg=$03B4 THEN DTA := Ptr($B000,140);
  957.   SysPfad := GetEnv('NAXOS');
  958.   IF SysPfad='' THEN BEGIN
  959.      WriteLn('NAXOS V', Version,
  960.              ' : Environment Variable NAXOS nicht gesetzt !', #7);
  961.      Halt(0);
  962.   END ELSE SysPfad := SysPfad + '\';
  963.   Assign(ef, SysPfad + 'ERROR.MSG');
  964.   {$I-}  Reset(ef); {$I+}
  965.   MaxErr := 0;
  966.   IF IOResult = 0 THEN BEGIN
  967.     ReadLn(ef, MaxErr);
  968.     FOR i:= 1 TO MaxErr DO ReadLn(ef, ErrMsg[i]);
  969.     Close(ef);
  970.   END;
  971.   EditorApp.Init;
  972.   EditorApp.Run;
  973.   EditorApp.Done;
  974. END.
  975.  
  976. (*--------------------------------------------------------*)
  977. (*                    Ende von NAXOS.PAS                  *)
  978.