(* *****************************************************************
** File    : Comment.PAS
** Created : 24.10.2003
** Author  : Hz
**
** Macro for FoldMaster
**
** It provides a function to change all lines inside a fold (and all included
** subfolds) to comment. All changed lines are marked with a label for back
** conversion.
** Another function converts all lines back from comment to normal text.
**
** Makro für FoldMaster
**
** Eine Falte in einen Kommentar umwandeln mit allen darin enthaltenen
** Zeilen und Unterfalten.
** Alle so in einen Kommentar umgewandelten Zeilen sind durch eine
** Kennung gekennzeichnet, damit man sie auch wieder in normalen Text
** umwandeln kann.
** + Kommentarzeilen im Original werden als Kommentare erkannt.
** + Verschachtelte Kommentare werden speziell bearbeitet.
** + Kommentar-Start/Ende-Zeichen innerhalb Strings werden erkannt.
** OPL:
**  1. Während das Makro läuft darf man das Editorfenster nicht wechseln!
**     Das Makro arbeitet ansonst im neuen Fenster weiter und macht Kuddelmuddel.
**  2. PASCAL-Syntaxfilter liefert nicht alle Kommentar-Start/Ende-Zeichen zurück.
**     Workaround: Selbst die Kommentarzeichen eintragen bei PASCAL.
**
** V3
** 24.10.2003: Komplette Umstellung wegen Mangel bei Rückumwandlung
**             Problematik: Falls in einem String ein Ende-Kommentar steht,
**             kann bei der Rückwandlung nicht erkannt werden wo das
**             zugehörige Endezeichen ist, da ja alles Kommentar war bzw. noch ist..
**             --> Jetzt wird bei der Kommentierung hinter den COMMENT_HEADER
**             die relative Position des Endekommentarzeichens eingetragen.
**             Mit dieser Info kann die Kommentierung dann korrekt zurückgenommen
**             werden.
**
** 3.1         21.12.03  english menu added
**
** **************************************************************-**)


PROGRAM Comment;
CONST
  COMMENT_HEADER = 'COMMENT';

  (*{{{  Subroutinen*)
  (*{{{  PROCEDURE SucheKommentar (kommentar:STRING;Zeile:STRING; Zeile_nc_org:STRING;Zpos:INTEGER;VAR Cpos:INTEGER);*)
  PROCEDURE SucheKommentar (kommentar:STRING;Zeile:STRING; Zeile_nc_org:STRING;Zpos:INTEGER;VAR Cpos:INTEGER);
  (*{{{  Beschreibung*)
  {
  Name         : SucheKommentar
  Aufgabe      : Position eines Kommentar-Start/Ende-Zeichens in einer Zeile suchen
  Beschreibung : Es wird nach dem Kommentarstring gesucht.
                 Falls gefunden wird geprüft, ob an dieser Position in der Originalzeile
                 auch dieser Kommentarstring enthalten ist. Falls ja so ist der Kommentarstring
                 in einem String enthalten und kein echter Kommentarstring. In diesem Fall
                 wird ab dieser Position nach weiteren Kommentarstrings gesucht und weiter
                 geprüft.
                 Das geschieht solange, bis entweder ein echter Kommentarstring gefunden wird
                 oder kein mehr gefunden wird.
  Übergabe     : 'Kommentar' gibt den String für Kommentar-Start oder -Ende-Zeichen an
                 'Zeile' ist der Teilstring der 'Zeile_nc_org' entspricht
                 'Zeile_nc_org' wurde mit GetLineNc(0) ermittelt und enthält die
                 komplette Zeile mit Strings jedoch ohne Kommentar. Kommentare sind hier durch
                 Leerzeichen ersetzt (auch die Kommentar-Start und -Endezeichen sind durch
                 Leerzeichen ersetzt).
                 'Zpos' gibt die Position von 'Zeile' innerhalb von 'Zeile_nc_org' an.
                 'Cpos' ist die Rückgabe-Variable für die Position
  Zurück       : 'Cpos' liefert entweder die Position des Kommentar-Start/Ende oder 0.
  Voraussetzung: -
  Externe Proz.: -
  }
  (*}}}*)

  VAR
    stop_f  : BOOLEAN;
    start   : INTEGER;
  BEGIN  (* SucheKommentar *)
    stop_f := FALSE;
    start  := 1;
    REPEAT
      Cpos := POSIX(kommentar,Zeile,start);                                       // Suche Kommentar
      IF Cpos > 0 THEN                                                            // Falls gefunden:
      BEGIN
        (* Prüfen ob das Kommentarstartzeichen nicht vielleicht in einem String enthalten ist *)
        IF (copy (Zeile_nc_org, Zpos+Cpos-1,length(Kommentar)) = Kommentar) THEN
        BEGIN
          start := Cpos +Length(Kommentar);                                       // Ja in String enthalten
          Cpos := 0;                                                              // desshalb als nicht vorhanden deklarieren
        END;                                                                      // weitersuchen
      END
      ELSE
      BEGIN
        stop_f := TRUE;
        Cpos := 0;                                                                // nichts mehr gefunden: Stop
      END;

    UNTIL (stop_f OR (Cpos > 0));
  END; (* SucheKommentar *)
  (*}}}*)
  (*{{{  FUNCTION LenInfo(Zeile:STRING):STRING;*)
  FUNCTION LenInfo(Zeile:STRING):STRING;
  // Liefert die Länge+1 als String vor dem Zeile-String getrennt durch ein Leerzeichen
  VAR
    len : STRING;
  BEGIN
    Str(length(zeile)+1,len);       // +1 wegen dem Leerzeichen
    LenInfo := Len+' '+Zeile;       // das hier eingefügt wird
  END;
  (*}}}*)
  (*}}}*)
  (*{{{  procedure Fold2Comment;*)
  PROCEDURE Fold2Comment;
  (*{{{  VAR*)
  VAR
    StartLine       : INTEGER;
    StartComment    : STRING;
    EndComment      : STRING;
    StartAuxComment : STRING;
    EndAuxComment   : STRING;
    StartTrdComment : STRING;
    EndTrdComment   : STRING;
    res             : INTEGER;
    Zeile           : STRING;
    Zeile_s         : STRING;
    Zeile_nc        : STRING;
    Zeile_nc_org    : STRING;
    Zeile_c         : STRING;
    end_f           : BOOLEAN;
    noKomment_f     : BOOLEAN;
    Cpos            : INTEGER;
    Zpos            : INTEGER;
  (*}}}*)

    (*{{{  FUNCTION Code_und_Kommentar(Zeile_org:STRING;VAR Zpos:INTEGER;VAR Zeile_s:STRING): BOOLEAN;*)
    FUNCTION Code_und_Kommentar(Zeile_org:STRING;VAR Zpos:INTEGER;VAR Zeile_s:STRING): BOOLEAN;
    (*{{{  VAR*)
    VAR
      Zeile       : STRING;
      Cpos        : INTEGER;
      CAuxpos     : INTEGER;
      CTrdpos     : INTEGER;
      Cmin        : INTEGER;
      Cendpos     : INTEGER;
      Cend        : STRING;
      endfirst_f  : BOOLEAN;
      Teilstr     : STRING;
    (*}}}*)
      (*{{{  FUNCTION noBlank (str:STRING):STRING;*)
      FUNCTION noBlank (str:STRING):STRING;
      BEGIN
        WHILE(str[1] = ' ') DO delete(str,1,1);
        WHILE(str[length(str)] = ' ') DO delete(str,length(str),1);
        noBlank := str;
      END;
      (*}}}*)
    BEGIN (* Code_und_Kommentar *)
      endfirst_f := FALSE;
      Zeile      := copy (Zeile_org,Zpos,Length(Zeile_org));                        // Teil aus der Originalzeile entnehmen
      IF Zeile = '' THEN                                                            // Nichts mehr zu tun?
      BEGIN
        Zeile_s := '';                                                              // Ja: Leerstring zurückliefern
        Code_und_Kommentar := TRUE;                                                 //     Zeile ist bearbeitet
        EXIT;                                                                       //     Zurück
      END;
      (*{{{  Welcher Kommentar-Start ist zuerst in der Zeile enthalten*)
      // Start-Kommentar
      SucheKommentar(StartComment,    Zeile, Zeile_nc_org, Zpos, Cpos);
      SucheKommentar(StartAuxComment, Zeile, Zeile_nc_org, Zpos, CAuxpos);
      SucheKommentar(StartTrdComment, Zeile, Zeile_nc_org, Zpos, CTrdpos);

      Cmin := Cpos; Cend := EndComment;
      IF (CAuxpos > 0) AND ((Cmin = 0) OR (Cmin > CAuxpos)) THEN BEGIN Cmin := CAuxpos; Cend := EndAuxComment; END;
      IF (CTrdpos > 0) AND ((Cmin = 0) OR (Cmin > CTrdpos)) THEN BEGIN Cmin := CTrdpos; Cend := EndTrdComment; END;
      (*}}}*)

      (*{{{  Gibt es vor einem Kommentar-Start ein Kommentar-Ende?*)
      // Ende-Kommentar
      SucheKommentar(EndComment,    Zeile, Zeile_nc_org, Zpos, Cpos);
      SucheKommentar(EndAuxComment, Zeile, Zeile_nc_org, Zpos, CAuxpos);
      SucheKommentar(EndTrdComment, Zeile, Zeile_nc_org, Zpos, CTrdpos);

      (*  Ende vorhanden & (kein Start || Start > Ende):    Endepos merken und Endezeichen merken und Merker setzen 'zuerst Endekommentar *)
      IF (Cpos    > 0) AND ((Cmin = 0) OR (Cmin > Cpos))    THEN BEGIN Cmin := Cpos;    Cend := EndComment;   endfirst_f := TRUE; END;
      IF (CAuxpos > 0) AND ((Cmin = 0) OR (Cmin > CAuxpos)) THEN BEGIN Cmin := CAuxpos; Cend := EndAuxComment;endfirst_f := TRUE; END;
      IF (CTrdpos > 0) AND ((Cmin = 0) OR (Cmin > CTrdpos)) THEN BEGIN Cmin := CTrdpos; Cend := EndTrdComment;endfirst_f := TRUE; END;
      (*}}}*)

      IF endfirst_f THEN                                                            // Es gibt zuerst ein Endekommentar
      BEGIN
        Zeile_s := copy (Zeile_org,Zpos,Cmin+Length(Cend)-1);                       // Alles von Zeilenbeginn bis dahin übernehmen
        Zpos := Zpos + Cmin + Length(Cend) - 1;                                     // Zeiger für Originalzeile zeigt jetzt dahinter
        Code_und_Kommentar := FALSE;                                                // Zeile noch nicht fertig bearbeitet
      END
      ELSE
      BEGIN                                                                         // Evtl. zuerste ein Kommentar-Start

        IF Cmin > 0 THEN                                                            // Kommentar überhaupt vorhanden?
        BEGIN
          IF Cmin > 1 THEN                                                          // Mindestens EIN Code-Zeichen vor dem Kommentar?
          BEGIN                                                                     // Ja:
            Teilstr := copy (Zeile_org,Zpos,Cmin-1);
            IF noBlank(Teilstr) = '' THEN                                           // Nur Leerzeichen?
            BEGIN
              Zeile_s := Teilstr;                                                   // Ja: Teilbereich: kein Code sondern nur Leerzeichen. Direkt übernehmen
            END
            ELSE
            BEGIN
              Zeile_s := StartComment+COMMENT_HEADER+LenInfo(Teilstr)+EndComment;   // Nein: Teilbereich: Code als Kommentar zurückliefern
            END;
          END;
          SucheKommentar(Cend,    Zeile, Zeile_nc_org, Zpos, Cendpos);              // Kommentarende suchen
          IF Cendpos = 0 THEN Cendpos := Length(Zeile)+1;                           // Falls kein Endezeichen vorhanden: So tun als wäre Endezeichen am Ende der Zeile
          Zeile_s := Zeile_s + copy (Zeile,Cmin,Cendpos+Length(Cend)-Cmin);         // An Zeile noch Kommentar anfügen
          Zpos := Zpos + Cendpos + Length(Cend)-1;                                  // Zpos hinter Kommentarende stellen (auf erstes evtl. vorhandenes Codezeichen)
          Code_und_Kommentar := FALSE;                                              // Zeile noch nicht fertig bearbeitet
        END
        ELSE
        BEGIN                                                                       // Nein: Kein weiterer Kommentarbeginn
          Zeile_s := StartComment+COMMENT_HEADER+LenInfo(copy (Zeile_org,Zpos,Length(Zeile_org)))+EndComment;  // Zeile komplett kommentiert zurückliefern
          Zpos := Length(Zeile_org)+1;                                              // Zpos ans Ende der Zeile stellen
          Code_und_Kommentar := TRUE;                                               // Zeile ist fertig bearbeitet.
        END;
      END;
    END; (* Code_und_Kommentar *)
    (*}}}*)

  BEGIN (* Fold2Comment *)
    IF (NOT IsFoldTitle) THEN                                                     // Cursor muss auf Falte stehen
    BEGIN
      IF (EditorOpt_language = 0) THEN
        res := BoxWarning('Note from "COMMENT"','No fold selected!')
      ELSE
        res := BoxWarning('Hinweis von "COMMENT"','Keine Falte selektiert!');
    END
    ELSE
    BEGIN
      Lock;                                                                       // Keine Aktualisierung am Bildschirm
      EnableUndo(0);                                                              // Undo sperren
      StartLine := GetLineNum;
      (*{{{  Syntaxabhängig alle Start- und Ende-Kommentarzeichen ermitteln*)
      SyntaxGetComment(GetModuleSyntax,                                           // Vom aktuellem Modul den
                       StartComment,                                              // String für Kommentarstart und
                       EndComment);                                               // den String für Kommentarende ermitteln
      SyntaxGetAuxComment(GetModuleSyntax,                                        // Vom aktuellem Modul den
                       StartAuxComment,                                           // String für Aux-Kommentarstart und
                       EndAuxComment);                                            // den String für Aux-Kommentarende ermitteln
      SyntaxGetTrdComment(GetModuleSyntax,                                        // Vom aktuellem Modul den
                       StartTrdComment,                                           // String für Trd-Kommentarstart und
                       EndTrdComment);                                            // den String für Trd-Kommentarende ermitteln

      (* workaround wegen Fehler in V1.62 VI *)
      IF (GetModuleSyntax = 'PASCAL') THEN
      BEGIN
        IF StartAuxComment = '' THEN StartAuxComment := '{';
        IF EndAuxComment = ''   THEN EndAuxComment   := '}';
        IF StartTrdComment = '' THEN StartTrdComment := '//';
      END;
      (*}}}*)

      Zeile := GetLine;                                                           // Zeile lesen
      IF POS(COMMENT_HEADER,Zeile) > 0 THEN                                       // Ist die Zeile schon auskommentiert?
      BEGIN                                                                       // Ja: Nur eine Meldung und Ende
        IF (EditorOpt_language = 0) THEN
          res := BoxWarning('Note from "COMMENT"','Fold is already comment!')
        ELSE
          res := BoxWarning('Hinweis von "COMMENT"','Falte ist schon auskommentiert!');
        EXIT;
      END;

      Zeile := COMMENT_HEADER+Zeile;                                              // Markiere Header als Kommentar
      ReplaceLine(Zeile);                                                         // und schreibe Headerzeile zurück
      FoldOpen;                                                                   // Falte in neuem Fenster öffnen
      Lock;                                                                       // Keine Aktualisierung am Bildschirm
      FoldExpandAll;                                                              // Alle Subfalten öffnen
      StartOfFold;                                                                // Cursor auf Beginn setzen
      end_f := FALSE;                                                             // Schleifen-bedingung
      REPEAT
        IF (IsFoldTitle) THEN                                                     // Bei Faltentitel
        (*{{{  Faltentitel*)
        BEGIN
          Zeile := COMMENT_HEADER+GetLine;                                        // Markiere Header als Kommentar
          ReplaceLine(Zeile);                                                     // und schreibe Headerzeile zurück
          IF NOT IsLineDownOK THEN End_f := TRUE;                                 // gehts noch weiter runter?
        END
        (*}}}*)
        ELSE
        BEGIN
          Zeile := GetLine;                                                       // aktuelle Zeile lesen
          IF Zeile <> '' THEN                                                     // Leerzeile: Dann nichts ändern
          BEGIN
            IF (Zeile <> GetLineNc(0)) THEN                                       // Zeile ungleich Zeile ohne Kommentar?
            (*{{{  In Zeile ist Kommentar enthalten*)
            BEGIN                                                                 // Ja: In Zeile ist Kommentar enthalten
              Zeile_nc := GetLineNc(0);                                           // Zeileninhalt ohne Kommentar merken
              Zeile_nc_org := Zeile_nc;                                           // Original noch weiter merken
              WHILE Zeile_nc[1] = ' ' DO DELETE (Zeile_nc,1,1);                   // alle vorlaufenden Leerzeichen entfernen
              IF Zeile_nc <> '' THEN                                              // Waren es nur Leerzeichen oder nur Kommentar?
              BEGIN                                                               // Nein:
                Zeile_s := StartComment+COMMENT_HEADER+LenInfo(Zeile_nc)+EndComment;       // Vorerst 'Zeile ohne Kommenar' auskommentieren
                Cpos := POS(Zeile_nc,Zeile);                                      // Position des Teils 'Zeile ohne Kommentar' innerhalb Gesamtzeile ermitteln
              END
              ELSE
              BEGIN                                                               // Ja: Nur Leerzeichen waren in Zeile, oder nur Kommentar
                Zeile_s  := Zeile;                                                // Zeile desshalb original übernehmen
                Zeile_nc := Zeile;                                                // Zeile desshalb original übernehmen
                Cpos := 1;                                                        // Ab Zeichen 1 übernehmen s.u.
              END;
              IF Cpos > 0 THEN                                                    // Position zum Ersetzen > 0: Beispiel: (*kommentar*) code (*Kommentar*)
              BEGIN                                                               // Ja:
                Replace(Zeile_s,Zeile,Cpos,Length(Zeile_nc));                     // Ersetze Code-Teil          wird zu : (*kommentar*) (*//COMMENT code*) (*Kommentar*)
              END
              ELSE                                                                // Nein: Jetzt wirds kompliziert, das erledigt dann eine Routine
              (*{{{  Gemischte Zeile*)
              BEGIN
                // Jetzt wirds komplizierter: gemischter Code+Kommentar+Code+...    Beispiel: code1 (*kommentar*) code2 (*Kommentar*) code3 ...
                Zpos := 1;       // ab erstem Zeichen gehts los
                Zeile_s := '';
                noKomment_f := FALSE;
                REPEAT
                  noKomment_f := Code_und_Kommentar(Zeile,Zpos,Zeile_c);
                  Zeile_s := Zeile_s+Zeile_c;
                UNTIL noKomment_f;
                Zeile := Zeile_s;
              END;
              (*}}}*)
              ReplaceLine(Zeile);                                                 // Manipulierte Zeile zurückschreiben
            END
            (*}}}*)
            ELSE
            BEGIN                                                                 // Zeile enthält keinen Kommentar: Einfache Auskommentierung
              Zeile := StartComment+COMMENT_HEADER+LenInfo(Zeile)+EndComment;     // Zeilenweise Kommentieren
              ReplaceLine(Zeile);                                                 // Manipulierte Zeile zurückschreiben
            END;
          END;
          IF NOT IsLineDownOK THEN End_f := TRUE;                                 // gehts noch weiter runter?
        END;
      UNTIL (end_f);
      FoldHideAll;                                                                // Alle Subfalten schließen
      FoldCloseToParent;                                                          // Zurück zur aufrufenden Falte
      GotoLineNum(StartLine,0);                                                   // Cursor auf erste Zeile setzen
      EnableUndo(1);                                                              // Undo wiederherstellen
      UnLock;                                                                     // Jetzt Bildschirm wieder aktualsieren
    END;
  END; (* Fold2Comment *)
  (*}}}*)
  (*{{{  procedure Comment2Fold;*)
  PROCEDURE Comment2Fold;
  VAR
    StartLine    : INTEGER;
    StartComment : STRING;
    EndComment   : STRING;
    res          : INTEGER;
    Zeile        : STRING;
    Zeile_nc     : STRING;
    Cpos         : INTEGER;
    Cpos2        : INTEGER;
    end_f        : BOOLEAN;

    (*{{{  PROCEDURE GetLenInfoDel(VAR Zeile: STRING; Cpos:INTEGER);*)
    PROCEDURE GetLenInfoDel(VAR Zeile: STRING; Cpos:INTEGER);
    // Entferne COMMENT_HEADER und ermittle Endeposition und lösche EndComment
    VAR
      Cpos_start : INTEGER;
      lenstr     : STRING;
      Cpos2      : INTEGER;
      code       : INTEGER;
    BEGIN
      Cpos_start := Cpos;
      Delete(Zeile,Cpos,Length(COMMENT_HEADER)+Length(StartComment));       // Kommentarzeichen und Header entfernen

      Cpos := POSX(' ',Zeile,Cpos_start);
      IF Cpos - Cpos_start > 4 THEN Cpos := Cpos_start;                     // fünfstellige Zahlen können nicht sein.
      lenstr := copy (Zeile,Cpos_start, Cpos-Cpos_start);
      Delete(Zeile,Cpos_start,Cpos+1-Cpos_start);                           // lösche Ziffern mit Leerzeichen
      VAL(lenstr,Cpos2,code);                                               // Wandle String in Wert
      IF code = 0 THEN                                                      // gültige Zeichen?
      BEGIN
        Cpos2 := Cpos2 + Cpos_start -1;                                     // Ja:Position des EndComment bestimmen
      END
      ELSE
      BEGIN
        Cpos2 := length(Zeile)-length(EndComment);                          // nein: auf gut Glück vielleicht am Zeilenende?
      END;

      IF (copy(zeile,Cpos2,length(EndComment)) = EndComment) THEN           // Ist an dieser Stelle der EndComment?
      BEGIN
        Delete(Zeile,Cpos2,length(EndComment));                             // Ja: Lösche ihn
      END
      ELSE
      BEGIN
        IF (EditorOpt_language = 0) THEN
          IF BoxWarning('COMMENT','FATAL Error while changing to text'#13#10'Terminating!') THEN HALT
        ELSE
          IF BoxWarning('COMMENT','FATALER Fehler beim Umwandeln in Normaltext'#13#10'Es wird abgebrochen!') THEN HALT;
      END;


    END;
    (*}}}*)

  BEGIN (* Comment2Fold *)
    IF (NOT IsFoldTitle) THEN
    BEGIN
      IF (EditorOpt_language = 0) THEN
        res := BoxWarning('Note from "COMMENT"','No fold selected!')
      ELSE
        res := BoxWarning('Hinweis von "COMMENT"','Keine Falte selektiert!');
    END
    ELSE
    BEGIN
      Lock;                                                                       // Keine Aktualisierung am Bildschirm
      EnableUndo(0);                                                              // Undo sperren
      StartLine := GetLineNum;
      SyntaxGetComment(GetModuleSyntax,                                           // Vom aktuellem Modul den
                       StartComment,                                              // String für Kommentarstart und
                       EndComment);                                               // den String für Kommentarende ermitteln

      Zeile := GetLine;                                                           // Zeilenweise Kommentar entfernen:
      Cpos := POSI(COMMENT_HEADER,Zeile);                                         // Position des COMMENT-Kommentars
      IF (Cpos = 6) THEN                                                          // 1+5=6 und nicht 1 da bei Faltentitel auch ... und zwei Leerzeichen zurückgeliefert werden
      BEGIN
        Cpos := Cpos-5;                                                           // -5 da GetLine bei Faltentitel auch ... und zwei Leerzeichen zurückliefert
        Delete(Zeile,Cpos,Length(COMMENT_HEADER)+5);                              // +5 da GetLine bei Faltentitel auch ... und zwei Leerzeichen zurückliefert
        ReplaceLine(Zeile);                                                       // und schreibe Headerzeile zurück
      END;
      FoldOpen;
      Lock;
      FoldExpandAll;
      StartOfFold;                                                                // Cursor auf Beginn setzen

      end_f := FALSE;
      REPEAT
        IF (IsFoldTitle) THEN                                                     // Falls neue Zeile eine Falte ist:
        (*{{{  Faltentitel*)
        BEGIN
          Zeile := GetLine;                                                       // Zeilenweise Kommentar entfernen:
          Cpos := POSI(COMMENT_HEADER,Zeile);                                     // Position des COMMENT-Kommentars
          IF (Cpos = 6) THEN                                                      // 1+5=6 und nicht 1 da bei Faltentitel auch ... und zwei Leerzeichen zurückgeliefert werden
          BEGIN
            Cpos := Cpos-5;                                                       // -5 da GetLine bei Faltentitel auch ... und zwei Leerzeichen zurückliefert
            Delete(Zeile,Cpos,Length(COMMENT_HEADER)+5);                          // +5 da GetLine bei Faltentitel auch ... und zwei Leerzeichen zurückliefert
            ReplaceLine(Zeile);                                                   // und schreibe Headerzeile zurück
          END;
          IF NOT IsLineDownOK THEN End_f := TRUE;                                 // nächste Zeile bearbeiten
        END
        (*}}}*)
        ELSE
        BEGIN
          REPEAT                                                                  // Für alle Vorkommen innerhalb einer Zeile:
            Zeile := GetLine;                                                     // Zeilenweise Kommentar entfernen:

            Cpos := POSI(StartComment+COMMENT_HEADER,Zeile);                      // Position des COMMENT-Kommentars
            IF (Cpos > 0) THEN                                                    // Nur wenn Kommentar vorhanden
            BEGIN
              GetLenInfoDel(Zeile,Cpos);
              ReplaceLine(Zeile);                                                 // bereinigte Zeile ersetzen
            END;
          UNTIL (CPos = 0);
          IF NOT IsLineDownOK THEN End_f := TRUE;                                 // nächste Zeile oder falls es die letzte war Endekriterium setzen
        END;
      UNTIL (end_f);
      FoldHideAll;
      FoldCloseToParent;                                                          // Zurück zur aufrufenden Falte
      GotoLineNum(StartLine,0);
      EnableUndo(1);                                                              // Undo wieder aktivieren
      UnLock;                                                                     // Jetzt Bildschirm wieder aktualsieren
    END;
  END; (* Comment2Fold *)
  (*}}}*)


BEGIN
  IF (EditorOpt_language = 0) THEN
    BEGIN
    MACROMENUADD('Fold2Comment','Comment Text in Fold');
    MACROMENUADD('Comment2Fold','Uncomment Text in Fold');
    END
  ELSE
    BEGIN
    MACROMENUADD('Fold2Comment','Text in Falte als Kommentar');
    MACROMENUADD('Comment2Fold','Kommentierten Text wieder als Normaltext');
    END;
END.

