home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GME / GME.M next >
Encoding:
Text File  |  1991-09-15  |  11.7 KB  |  335 lines

  1. MODULE GME;
  2.  
  3. (* Eine Applikation der Golem-Editor-Module: GME
  4.    Begonnen: 13. 07. 86
  5.  
  6.    The Little Golem Editor
  7.    (C) 1986, 1989 by Johannes Leckebusch
  8.    
  9.    Portiert für MM2: 8. 6. 89
  10.    
  11.    TT 17.12.90  Bei Prgfehler wird über 'TermHandler' die Möglichkeit zum
  12.                 Sichern aller Texte gegeben.
  13.    TT 1.8.91    Die restlichen Texte werden nicht mehr übergangen, wenn
  14.                 bei ALT-X "Nein" auf die Frage nach dem Speichern gesagt wird.
  15.    TT 15.9.91   Wird bei Alt-C usw. bei einem namenlosen Puffer beim File-
  16.                 Selektor "Abbruch" gewählt, wird das Kommando nicht ausgeführt.
  17. *)
  18.  
  19. FROM SYSTEM IMPORT ADR, ADDRESS;
  20. FROM PrgCtrl IMPORT CatchProcessTerm, TermCarrier, TermProcess;
  21. FROM MOSGlobals IMPORT MemArea;
  22. FROM FastStrings IMPORT Assign, Append, Length, Delete;
  23. IMPORT Strings;
  24. FROM StrConv IMPORT StrToCard, StrToLCard;
  25. IMPORT EasyExceptions;
  26.  
  27. FROM GMEKernel IMPORT SchirmSchreiben;
  28. FROM GMEFile IMPORT TextSchreiben, TextLesen;
  29. FROM GMEKernel IMPORT Prompt;
  30. FROM GMEditor IMPORT Editieren;
  31. FROM GMEKernel IMPORT StelleZeileEin, StellePointerEin, SucheZeilenPointer,
  32.   InsertLine;
  33. FROM GMEKernel IMPORT LoeschePuffer;
  34.  
  35. FROM GMEFile IMPORT CommandLine, SplitFileName, NextArgument,
  36.         SetPath, BackPointer, SetCompilerInfo;
  37.  
  38. FROM GMEBase IMPORT MausEin, WriteConst, WriteChar, WriteLine, Trace,
  39.         WriteLn, LoescheBild, LoescheZeile, escape, LinesOnScreen, nul,
  40.         CursorEin, CursorAus, HighLight, Normal, GotoXY,
  41.         Nachricht, FrageJaNein, Ja, Nein, Abbruch, Auswahl,
  42.         MausPos, MausDoppel, ButtonSet, ClearAES;
  43.  
  44. FROM GMEBase IMPORT EditPuffer, AlternEdit, FehlerPuffer, MailPuffer,
  45.         GolemPuffer, Tausch, ClipBoard, HilfsPuffer, ConfigPuffer,
  46.         PSCPuffer, DruckPuff;
  47. FROM GMEBase IMPORT einBefehl;
  48. FROM GMEConfig IMPORT einTasteneintrag, einTastenTyp, LiesZeichen;
  49. FROM GMEBase IMPORT cZeile;
  50. FROM GMEBase IMPORT Loeschen, Init, InsertPuffer, GetLine, PutLine,
  51.   AllocLine, DeletePuffer;
  52. FROM GMEBase IMPORT DeleteTail, GetPfad;
  53.  
  54. FROM GMEBase IMPORT MerkIndex, einPufferDeskriptor, eineInfo,
  55.         eineZeile, einLinePointer, einPufferPointer,
  56.         Compiliert, KonfigSpeichern, AutoSave, TabFiltern, Exit,
  57.         MakeBAK, Editiert, einMerkPointer, einMerkPunkt,
  58.         CharSet;
  59.  
  60. VAR     befehl:                 einTasteneintrag;
  61.         dummybef:               einTasteneintrag;
  62.         termch:                 einTasteneintrag;
  63.         dummy:                  CHAR;
  64.         editor:                 eineInfo;
  65.         
  66.         normalQuit:             BOOLEAN;
  67.         alternate:              BOOLEAN;
  68.  
  69.         Pfadname:               eineInfo;
  70.         Dateiname:              eineInfo;
  71.         AlterPfad, AlterName:   eineInfo;
  72.         boolean:                BOOLEAN;
  73.  
  74.   PROCEDURE Warnung (p: einPufferPointer; VAR ok: einTasteneintrag);
  75.   VAR   m:              eineInfo;
  76.         wahl:           CARDINAL;
  77.         saved:          BOOLEAN;
  78.   BEGIN
  79.     WITH p^ DO
  80.       IF Editiert IN Modus THEN
  81.         SchirmSchreiben (p, p^.MerkPunkte [ErsteZeile].merkline, 0, 0);
  82.         m:= 'Text "'; Append (Name, m);
  83.         Strings.Append ('" editiert!|Speichern?', m, boolean);
  84.         wahl := Ja;
  85.         Auswahl (wahl,  m);
  86.         IF wahl = Ja THEN
  87.           TextSchreiben (p, FALSE, FALSE, FALSE, KonfigSpeichern IN Modus, FALSE, saved);
  88.           IF Editiert IN Modus THEN ok.TT := Befehl; ok.bef := nothing; END;
  89.         ELSIF wahl = Nein THEN
  90.           EXCL (Modus, Editiert);
  91.           (* das Folgende darf nicht, weil dann
  92.             1. man beim nächsten Text vielleicht doch "Abbruch" wählt und
  93.               sich dann wundert, wo die anderen Texte geblieben sind,
  94.             2. dann "p" auf EditPuffer zeigt und damit die Schleife beim
  95.               Aufrufer sofort endet. D.h, Wird bei ALT-X einmal "Nein"
  96.               gesagt, werden die anderen Texte übergangen und alles ist wech.
  97.             LoeschePuffer (p); DeletePuffer (p);
  98.           *)
  99.         ELSE ok.TT := Befehl; ok.bef := nothing;
  100.         END (* IF *);
  101.       END (* IF *);
  102.     END (* WITH *);
  103.   END Warnung;
  104.   
  105.   PROCEDURE Ringeditor;
  106.   (* Ringeditor - Hintergrundeditor *)
  107.   VAR   isSpooling:             BOOLEAN;
  108.         NeuerPuffer:            einPufferPointer;
  109.         befc,
  110.         b, bb:                  CHAR;
  111.         p:                      einPufferPointer;
  112.         FehlerMeldung:          eineInfo;
  113.         Arg1, Arg2:             eineInfo;
  114.         (* xpos, ypos:             ARRAY [0..5] OF CHAR; *)
  115.         x, y, pos:              CARDINAL;
  116.         key:                    einTasteneintrag;
  117.         laenge:                 ARRAY [0..0] OF CHAR;
  118.         suff:                   ARRAY [0..3] OF CHAR;
  119.         BackAdrStr:             ARRAY [0..10] OF CHAR;
  120.         BackAdr:                LONGCARD;
  121.         ok:                     BOOLEAN;
  122.  
  123.   BEGIN
  124.     (*Trace ('Ringeditor');*)
  125.     FehlerMeldung [0] := nul;
  126.  
  127.     IF CommandLine (Pfadname, FehlerMeldung) THEN
  128.       SplitFileName (Pfadname, EditPuffer^.Pfad, EditPuffer^.Name, suff);
  129.       TextLesen (EditPuffer, TRUE, FALSE, TRUE, TRUE);
  130.       
  131.       (* Die Datei, die das erste Argument bildete, wurde eingelesen *)
  132.       
  133.       IF  NextArgument (FehlerMeldung, Arg1)
  134.       AND NextArgument (FehlerMeldung, Arg2) THEN
  135.       
  136.         pos:= 0;
  137.         y:= StrToCard (Arg1, pos, ok);
  138.         IF ok THEN
  139.           pos:= 0;
  140.           x:= StrToCard (Arg2, pos, ok);
  141.           IF ok THEN
  142.           
  143.             (* Puffer auf Fehlerposition einstellen: *)
  144.         
  145.             StelleZeileEin (EditPuffer, y, LinesOnScreen DIV 2);
  146.             EditPuffer^.MerkPunkte [LaufendeZeile].charpos := x;
  147.             
  148.             Arg2 := FehlerMeldung; (* Ev. noch Pointer *)
  149.             IF NextArgument (FehlerMeldung, Arg1) THEN
  150.               (* Rest merken, ev. Pointer *)
  151.               Arg2 := FehlerMeldung; FehlerMeldung := Arg1;
  152.               SetCompilerInfo (EditPuffer, FehlerMeldung);
  153.             END;
  154.             
  155.             (* !TT 16.12.90 sowas brauchen wir nicht mehr
  156.               IF NextArgument (Arg2, BackAdrStr) THEN
  157.                 IF BackAdrStr [0] = '^' THEN
  158.                   Delete (BackAdrStr, 0, 1);
  159.                   pos:= 0;
  160.                   BackAdr:= StrToLCard (BackAdrStr, pos, ok);
  161.                   IF ok THEN
  162.                     BackPointer := ADDRESS (BackAdr);
  163.                   END;
  164.                 END (* IF *);
  165.               ELSE
  166.             *)
  167.             BackPointer := NIL;
  168.             (*
  169.               END (* IF *);
  170.             *)
  171.             
  172.             FehlerMeldung := Arg1;
  173.             
  174.             LoescheBild;
  175.             WriteConst ('MM2-Fehlermeldung:'); WriteLn;
  176.             WriteLine (FehlerMeldung);
  177.             
  178.           END (* IF StrToCard *);
  179.         END (* IF Arg2 *);
  180.       ELSIF Arg1 [0] = '^' THEN
  181.         Delete (Arg1, 0, 1);
  182.         pos:= 0;
  183.         BackAdr:= StrToLCard (Arg1, pos, ok);
  184.         IF ok THEN
  185.           BackPointer := ADDRESS (BackAdr);
  186.         ELSE BackPointer := NIL;
  187.         END;
  188.       END (* IF ok *)
  189.     END (* IF CommandLine *);
  190.  
  191. (* BackPointer := NIL; *)
  192.  
  193.     LOOP
  194.       EXCL (EditPuffer^.Modus, Exit);
  195.       CursorEin;
  196.       Editieren (EditPuffer, Tausch, befehl, FehlerMeldung, 0);
  197.       EditPuffer := Tausch; FehlerMeldung [0] := nul;
  198.       CASE befehl.bef OF
  199.         ExitEditor: LoescheBild;
  200.                 p := EditPuffer;
  201.                 REPEAT
  202.                   Warnung (p, befehl);
  203.                   p := p^.NaechsterPuffer;
  204.                 UNTIL p = EditPuffer;
  205.                 IF befehl.bef # ExitEditor THEN
  206.                   (*Nachricht ('Löschen Sie die Puffer!');*)
  207.                 ELSE EXIT;
  208.                 END (* IF Warnung *);
  209.                 |
  210.         SpeichereAllePuffer, QuitCompile, QuitCompileRun,
  211.         Make, MakeExec:
  212.                         p := EditPuffer;
  213.                         ok := TRUE;
  214.                         REPEAT
  215.                           IF Editiert IN p^.Modus THEN
  216.                             SchirmSchreiben (p,
  217.                               p^.MerkPunkte [LaufendeZeile].merkline, 0, 0);
  218.                             TextSchreiben (p, FALSE, FALSE, FALSE,
  219.                                            KonfigSpeichern IN p^.Modus, FALSE, ok);
  220.                             IF Editiert IN p^.Modus THEN ok := FALSE END;
  221.                           END (* IF *);
  222.                           p := p^.NaechsterPuffer;
  223.                         UNTIL (p = EditPuffer) OR ~ok;
  224.                         IF ~ok THEN
  225.                           SchirmSchreiben (EditPuffer,
  226.                           EditPuffer^.MerkPunkte [LaufendeZeile].merkline, 0, 0);
  227.                         ELSE EXIT;
  228.                         END;
  229.                 |
  230.         LoescheAllePuffer:
  231.                         p := EditPuffer; LoescheBild;
  232.                         REPEAT
  233.                           LoeschePuffer (p);
  234.                           p := p^.NaechsterPuffer;
  235.                         UNTIL p = EditPuffer;
  236.                 |
  237.         ELSE;
  238.       END (* CASE *);
  239.     END (* LOOP *);
  240.   END Ringeditor;
  241.  
  242. PROCEDURE TermHandler;
  243.  
  244.   VAR p: einPufferPointer; e: EasyExceptions.Exception; ok: BOOLEAN;
  245.  
  246.   PROCEDURE save;
  247.     VAR backup: BOOLEAN;
  248.     BEGIN
  249.       backup:= FALSE;
  250.       IF NOT (MakeBAK IN p^.Modus) THEN
  251.         backup:= FrageJaNein (Ja, "Backup erzeugen?");
  252.       END;
  253.       TextSchreiben (p, backup, FALSE, TRUE, KonfigSpeichern IN p^.Modus, FALSE, ok);
  254.     END save;
  255.  
  256.   BEGIN
  257.     IF NOT normalQuit THEN
  258.       IF FrageJaNein (Ja, "Programmfehler!|GME muß verlassen werden.|Texte sichern?") THEN
  259.         (*
  260.          * Alle editierten Texte sichern
  261.          *)
  262.         p := EditPuffer;
  263.         REPEAT
  264.           IF Editiert IN p^.Modus THEN
  265.             LOOP
  266.               EasyExceptions.Call (save, e);
  267.               IF e # EasyExceptions.NormalReturn() THEN
  268.                 Nachricht ('Der Text konnte nicht|korrekt gesichert werden. ');
  269.                 EXIT
  270.               ELSIF ok THEN
  271.                 EXIT
  272.               ELSE (* falls Fehler beim Sichern, erneuten Versuch erlauben *)
  273.                 IF NOT FrageJaNein (Ja, "Erneut versuchen?") THEN
  274.                   EXIT
  275.                 END
  276.               END
  277.             END
  278.           END (* IF *);
  279.           p := p^.NaechsterPuffer;
  280.         UNTIL (p = EditPuffer);
  281.       END
  282.     END
  283.   END TermHandler;
  284.  
  285.  
  286. VAR     command:        eineInfo;
  287.         suff:           eineInfo;
  288.         index, ind, i:  CARDINAL;
  289.  
  290. PROCEDURE Vorlauf;
  291. BEGIN
  292.   (*Trace ('Vorlauf');*)
  293.   alternate := FALSE; Pfadname := ''; Dateiname := '';
  294.   befehl.TT := Befehl; befehl.bef := nothing;
  295. END Vorlauf;
  296.  
  297. VAR     dumm:           INTEGER;
  298.         bewegt:         BOOLEAN;
  299.         Knoepfe:        ButtonSet;
  300.         ok:             BOOLEAN;
  301.         termHdl:        TermCarrier;
  302.  
  303. BEGIN (* LittleGolemEditor *)
  304.   Trace ('G2E');
  305.   Vorlauf;
  306.   
  307.   (* Bei Prgabbruch 'TermHandler' aufrufen *)
  308.   normalQuit:= FALSE;
  309.   CatchProcessTerm (termHdl, TermHandler, MemArea {NIL, 0});
  310.   
  311.   Trace ('Start Ringeditor');
  312.   Ringeditor;
  313.   normalQuit:= TRUE;
  314.  
  315.   (* Für MM2-Shell: Aktuelles Programm einstellen: *)
  316.   IF BackPointer # NIL THEN
  317.     (*Nachricht (BackPointer^);*)
  318.     Pfadname := EditPuffer^.Pfad; DeleteTail (Pfadname);
  319.     Append (EditPuffer^.Name, Pfadname);
  320.     (*Nachricht (Pfadname);*)
  321.     Assign (Pfadname, BackPointer^);
  322.   END;
  323.  
  324.   CursorAus; MausEin; (* Schaltet wieder auf GEM-Oberflaeche zurueck *)
  325.   (*TastReset; *)
  326.   ClearAES;
  327.   CASE befehl.bef OF
  328.     QuitCompile:        TermProcess (1);|
  329.     QuitCompileRun:     TermProcess (2);|
  330.     Make:               TermProcess (3);|
  331.     MakeExec:           TermProcess (4);|
  332.     ELSE                TermProcess (0);
  333.   END (* CASE *);
  334. END GME.
  335.