{$if not def AP_SERIENDRUCK_H}

 CONST
  AP_SERIENDRUCK_H = 0;


PROCEDURE druckcodebearbeitung;
{ wandelt den ascii code in eine Zahl um der Code kann als /1 /23 /456 vorliegen}
 VAR dcode: BYTE;
     
 BEGIN
  codestring[1]:=s[anf];
  codestring[2]:=chr(0);
  inc(anf);
  val(s[anf],i1,iok);
  IF (iok=0) AND (anf<>zeilenlaenge) THEN
   BEGIN
   codestring[2]:=s[anf];
   codestring[3]:=chr(0);
   inc(anf);
   val(s[anf],i1,iok);
   IF (iok=0) AND (anf<>zeilenlaenge) THEN
    BEGIN
    codestring[3]:=s[anf];
    codestring[4]:=CHR(0);
    inc(anf);
    END;
   END;
  val(codestring,i1,iok);
  write(out,chr(i1));     {code als char drucken}
 END;

PROCEDURE feldfilter;
{ sucht die zu ersetzenden Felder raus und ersetzt sie mit dem aktuellen
  Datensatz }
 VAR puff,puff2,puff3:STRING;
 BEGIN
  IF pos(getlocstr(ser_name),s)=anf THEN BEGIN
   write(out,aktuellePerson^.name); anf:=anf+length(getlocstr(ser_name)); END
  ELSE IF pos(getlocstr(ser_vorname),s)=anf THEN BEGIN
   write(out,aktuellePerson^.vorname); anf:=anf+length(getlocstr(SER_VORNAME)); END
   ELSE IF pos(getlocstr(ser_anrede),s)=anf THEN BEGIN
   write(out,aktuelleperson^._anrede); anf:=anf+length(getlocstr(SER_ANREDE)); END
    ELSE IF pos(getlocstr(ser_ansprache),s)=anf THEN
     BEGIN
      puff:=aktuelleperson^._anrede;
      for i:=1 TO length(puff) DO puff[i]:=upcase(puff[i]); {großwandeln}
      IF anf=2 THEN write(out,getlocstr(SER_ANSPRACHE1))  { Zeilenanfang }
               ELSE write(out,getlocstr(SER_ANSPRACHE2)); 
      puff2:=getlocstr(SER_ANSPRACHE3); {Wegen STR und STRING-Problem}
      puff3:=getlocstr(SER_ANSPRACHE4);
      IF (puff=puff2) OR (puff=puff3) THEN 
          write(out,getlocstr(SER_ANSPRACHE5))
       ELSE 
       BEGIN
        puff2:=getlocstr(SER_ANSPRACHE6);
        puff3:=getlocstr(SER_ANSPRACHE8);
        IF puff=puff2 THEN write(out,getlocstr(SER_ANSPRACHE7))
        ELSE IF puff=puff3 THEN write(out,getlocstr(SER_ANSPRACHE9))
         ELSE write(out,getlocstr(SER_ANSPRACHE10));
       END; 
      anf:=anf+length(getlocstr(SER_ANSPRACHE));
     END
     ELSE IF pos(getlocstr(SER_strasse),s)=anf THEN BEGIN
     write(out,aktuellePerson^.strasse); anf:=anf+length(getlocstr(SER_STRASSE)); END
      ELSE IF pos(getlocstr(SER_plz),s)=anf THEN BEGIN
      write(out,aktuellePerson^.plz); anf:=anf+length(getlocstr(SER_PLZ)); END
       ELSE IF pos(getlocstr(SER_land),s)=anf THEN BEGIN
       write(out,aktuellePerson^.land); anf:=anf+length(getlocstr(SER_LAND)); END  
        ELSE IF pos(getlocstr(SER_ort),s)=anf THEN BEGIN
        write(out,aktuellePerson^.ort); anf:=anf+length(getlocstr(SER_ORT)); END
         ELSE IF pos(getlocstr(SER_email1),s)=anf THEN BEGIN
         write(out,aktuellePerson^.email1); anf:=anf+length(getlocstr(SER_EMAIL1)); END
          ELSE IF pos(getlocstr(SER_email2),s)=anf THEN BEGIN
          write(out,aktuellePerson^.email2); anf:=anf+length(getlocstr(SER_EMAIL2)); END
           ELSE IF pos(getlocstr(SER_email3),s)=anf THEN BEGIN
           write(out,aktuellePerson^.email3); anf:=anf+length(getlocstr(SER_EMAIL3)); END   
            ELSE IF pos(getlocstr(SER_geburt),s)=anf THEN BEGIN
            write(out,aktuellePerson^.geb); anf:=anf+length(getlocstr(SER_GEBURT)); END
             ELSE IF pos(getlocstr(SER_telefon),s)=anf THEN BEGIN
             write(out,aktuellePerson^.tel); anf:=anf+length(getlocstr(SER_TELEFON)); END
              ELSE IF pos(getlocstr(SER_fax),s)=anf THEN BEGIN
              write(out,aktuellePerson^.fax); anf:=anf+length(getlocstr(SER_FAX)); END
               ELSE IF pos(getlocstr(SER_kommentar),s)=anf THEN BEGIN
               write(out,aktuellePerson^.kommentar) anf:=anf+length(getlocstr(SER_KOMMENTAR)); END
                ELSE IF pos(getlocstr(SER_co),s)=anf THEN BEGIN
                write(out,aktuellePerson^.co) anf:=anf+length(getlocstr(SER_CO)); END
                  ELSE IF pos(getlocstr(SER_absend),s)=anf THEN BEGIN
                    si:=dgads[4]^.specialinfo;
                    absender:=si^.buffer;
                    write(out,absender); 
                    anf:=anf+length(getlocstr(SER_ABSEND)); 
                   END
                   ELSE BEGIN
                    write(out,'/',s[anf]);
                    inc(anf);
                   END;
 END;

PROCEDURE checkzeile;
{ parsd eine Zeile durch und sucht nach dem Steuerzeichen "/"
  zweigt, falls eine Zahl folgt nach druckcodebearbeitung, sonst
  nach feldfilter ab }

 BEGIN
  IF ((anf+1)=zeilenlaenge) THEN writeln(out,'/') {wenn am ende der Zeile}
  ELSE REPEAT
   IF (s[anf]='/') AND ((anf+1)<>zeilenlaenge) THEN BEGIN
    inc(anf);
    IF s[anf] in ['1','2','3','4','5','6','7','8','9','0']
     THEN druckcodebearbeitung
     ELSE feldfilter;
   END ELSE
     IF (anf<>zeilenlaenge) THEN
     BEGIN
      write(out,s[anf]);
      inc(anf);
     END;
  UNTIL anf>=zeilenlaenge;
  writeln(out);
 END;

PROCEDURE druckschleife;
 BEGIN
  seek(f,0);
  WHILE NOT eof(f) DO
  BEGIN
   readln(f,s);
   anf:=pos('/',s);
   IF anf<>0 THEN
   BEGIN
    write(out,copy(s,1,anf-1));
    zeilenlaenge:=length(s)+1;        { +1 war der K(n)ackpunkt }
    checkzeile;
   END
   ELSE writeln(out,s);
  END;
 END;

PROCEDURE und_los;
 VAR zustand:INTEGER;
 BEGIN
   zustand:=cyclezustand(serdruck,dgads[7],zustand7);
   IF (zustand=0) THEN druckschleife           { aktuelle person drucken }
       ELSE IF zustand=1 THEN
    BEGIN                                      { alle Datensätze drucken }
     dperson:=aktuelleperson;
     aktuelleperson:=p_person(Plist^.lh_head);
     druckschleife;
     WHILE aktuelleperson^.pn.ln_succ^.ln_succ<>NIL DO
      BEGIN
       aktuelleperson:=p_Person(aktuelleperson^.pn.ln_succ);
       druckschleife;
      END;
     aktuelleperson:=dperson;
    END
   ELSE
    BEGIN                                      { Selectionsmenge x drucken }
     dperson:=aktuelleperson;
     aktuelleperson:=p_person(Plist^.lh_head);
     dec(zustand);
     IF aktuelleperson<>NIL THEN IF aktuelleperson^.select[zustand] THEN druckschleife;
     WHILE aktuelleperson^.pn.ln_succ^.ln_succ<>NIL DO
     BEGIN
      aktuelleperson:=p_Person(aktuelleperson^.pn.ln_succ);
      IF aktuelleperson^.select[zustand] THEN druckschleife;
     END;
     aktuelleperson:=dperson;
    END;
  END;

PROCEDURE kurzvorschau;
 VAR ok:LONG;STATIC;
     executestring:STRING[300];STATIC;
     kvreq:Requester;STATIC;
  
 BEGIN
  IF anzahl>0 THEN
  BEGIN
{   Setbusywindow(serdruck,kvreq);}
   merker:=druckerausgabe;   {alte druckerausgabe merken }
   si:=dgads[1]^.specialinfo;
   briefname:=si^.buffer;
   temp:=pfad+briefname;
   IF dateivorhanden(temp) THEN
    IF dateivorhanden(textanzeiger) THEN
    BEGIN
     druckerausgabe:='t:addipro.temp';
     rewrite(out,druckerausgabe);
     IF (IORESULT=0) THEN   
     BEGIN      
      reset(f,temp);
      und_los;
      close(f);   
      close(out);   
      executestring:=textanzeiger+' t:addipro.temp';
      ok:=execute(executestring,0,0);
      ok:=deleteFile('t:addipro.temp'); {temporäre Datei löschen }
     END
     ELSE 
     BEGIN
      executestring:='ups ! konnte keine temporäre Datei anlegen !'+chr(10)+
                     '         Zu wenig Arbeitsspeicher ?';
      umeld(executestring);
     END; 
    END
    ELSE
    BEGIN 
     executestring:='Konnte Textanzeiger '+textanzeiger+chr(10)+'nicht finden';
     umeld(executestring);
    END
   ELSE 
   BEGIN
     executestring:='Konnte Datei '+temp+' nicht öffnen !';
     umeld(executestring);   
   END;
{   Unbusywindow(serdruck,kvreq);}
  END ELSE Umeld('Noch kein Datensatz eingegeben '); { Sinnlos }
  druckerausgabe:=merker
 END; 

PROCEDURE editier;

 VAR ok:LONG;STATIC;
     executestring:STRING[300];STATIC;
     editreq:Requester;STATIC;
  
  BEGIN
   Setbusywindow(serdruck,editreq);
   si:=dgads[1]^.specialinfo;
   briefname:=si^.buffer;
   briefname:=pfad+briefname;
   IF dateivorhanden(editor) THEN
    BEGIN
      executestring:=editor+' '+briefname;
      ok:=execute(executestring,0,0);
    END
    ELSE 
    BEGIN 
     executestring:='Konnte editor '+editor+chr(10)+'nicht finden';
     umeld(executestring);
    END;
   Unbusywindow(serdruck,editreq);
  END;

PROCEDURE druck;
 BEGIN
  IF anzahl>0 THEN
  BEGIN
  IF druckerok THEN
  BEGIN
   si:=dgads[1]^.specialinfo;
   briefname:=si^.buffer;
   temp:=pfad+briefname;
   reset(f,temp);
   IF IORESULT<>0 THEN
    BEGIN
     umeld('Serienbrieffile nicht gefunden');
     exit;
    END;
   buffer(f,2000);
   rewrite(out,druckerausgabe);
   temp:=chr(31);
   write(out,temp);
   und_los;
   close(out);
   close(f);
   END;
  END ELSE umeld('Noch kein Datensatz eingegeben');
 END;

 PROCEDURE briefladen
  BEGIN
   si:=dgads[1]^.specialinfo;
   briefname:=si^.buffer;
   IF filereqpattern('Serienbrief wählen',briefname,pfad,pats) THEN
   BEGIN
    t[1]:=TagItem(GTST_String,LONG(^briefname)); 
    t[2].ti_tag:=TAG_DONE;
    GT_SetGadgetAttrsA(dgads[1],serdruck,NIL,^t);
    refreshgadgets(dgads[1],serdruck,NIL);
   END;
  END;    

PROCEDURE serienbrief;
VAR buffer:STRING;   
    hilfi:INTEGER;
    
 
 BEGIN
  Cyclelabels:=labels(GetLocStr(EDRUCK_DS_AKTUELLER),
                      GetLocStr(EDRUCK_DS_ALLE),
                      Selecttexte[1],
                      Selecttexte[2],
                      Selecttexte[3],
                      Selecttexte[4],
                      Selecttexte[5],
                      Selecttexte[6],
                      Selecttexte[7],
                      Selecttexte[8],
                      Selecttexte[9],
                      Selecttexte[10],NIL);  


  dummy:=FALSE;
  Computefont(551,78);
  ww:=computeX(551);
  wh:=computeY(78);
  gl1:=NIL;
  gl1:=CreateContext(^gl1);
  
  IF serdruck1 THEN
  BEGIN
   IF holett('FORMULAR_PFAD',buffer) THEN pfad:=buffer
                                     ELSE pfad:='sys:';   { voreingestellter pfad }
   IF holett('ABSENDER_STRING',buffer) THEN absender:=buffer
                                       ELSE absender:='';
   IF holett('ABSENDER_DATEI',buffer) THEN absend:=buffer
                                      ELSE absend:='';  { dateiname des Absenders }
   IF holett('BRIEF_NAME',buffer) THEN briefname:=buffer
                                  ELSE briefname:='';
   IF holett('PATTERN_SERIENBRIEF',buffer) THEN pats:=buffer
                                           ELSE pats:='#?.ser';    
                                       { Pattern für Filerequester }
   IF holett('PATTERN_ABSENDER',buffer) THEN pata:=buffer
                                        ELSE pata:='#?.abs';
                                       { Pattern für Filerequester des Absenders }

   IF NOT holettint('DATENSÄTZE_BRIEF',hilfi) THEN zustand7:=0
   ELSE
    CASE hilfi OF
      1: zustand7:=2;
      2: zustand7:=3;
      3: zustand7:=4;
      4: zustand7:=5;
      5: zustand7:=6;
      6: zustand7:=7;
      7: zustand7:=8;
      8: zustand7:=9;
      9: zustand7:=10;
     10: zustand7:=11;
     11: zustand7:=0;
     12: zustand7:=1
    ELSE zustand7:=0;
  END; { OF CASE }
 END;
 serdruck1:=FALSE;
   
  t[1]:=TagItem(GT_Underscore,LONG('_'));
  t[2]:=TagItem(GTST_Maxchars,200);             
  t[3]:=TagItem(GTST_String,long(^Briefname));
  t[4].ti_tag:=TAG_DONE;
    
  ng:=NewGadget(100,5,200,15,GetLocStr(SER_BRIEFNAME),mytattr,
                1,PLACETEXT_LEFT,
                vi,NIL);
  sensitivgadget(ng);
  dgads[1]:=CreateGadgetA(STRING_KIND,gl1,^ng,^t);

  t[2].ti_tag:=TAG_DONE;
  ng:=NewGadget(301,5,120,15,GetLocStr(SER_BLADEN),mytattr,
                2,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[2]:=CreateGadgetA(BUTTON_KIND,dgads[1],^ng,^t);
    
  ng:=NewGadget(422,5,120,15,GetLocStr(SER_KURZVORSCHAU),mytattr,
                3,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[3]:=CreateGadgetA(BUTTON_KIND,dgads[2],^ng,^t);
  
  t[1]:=TAGITEM(GT_UNDERSCORE,LONG('_'));  
  t[2]:=TagItem(GTST_Maxchars,200);
  t[3]:=TagItem(GTST_String,LONG(^Absender)); 
  t[4].ti_tag:=TAG_DONE;
  
  ng:=NewGadget(100,23,200,15,GetLocStr(SER_ABSENDER),mytattr,
                4,PLACETEXT_LEFT,
                vi,NIL);
  sensitivgadget(ng);
  dgads[4]:=CreateGadgetA(STRING_KIND,dgads[3],^ng,^t);

  t[2].ti_tag:=TAG_DONE;
  ng:=NewGadget(301,23,120,15,GetLocStr(SER_ALADEN),mytattr,
                5,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[5]:=CreateGadgetA(BUTTON_KIND,dgads[4],^ng,^t);
    
  ng:=NewGadget(422,23,120,15,GetLocStr(SER_ASPEICHERN),mytattr,
                6,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[6]:=CreateGadgetA(BUTTON_KIND,dgads[5],^ng,^t);
  
  t[2]:=TagItem(GTCY_ACTIVE,zustand7);
  t[3]:=TagItem(GTCY_Labels,LONG(^Cyclelabels)); 
  t[4].ti_tag:=TAG_DONE;

   ng:=NewGadget(100,41,200,15,GetLocStr(SER_DATENSAETZE),mytattr,
                7,PLACETEXT_LEFT,
                vi,NIL);
  sensitivgadget(ng);
  dgads[7]:=CreateGadgetA(CYCLE_KIND,dgads[6],^ng,^t);
    
  t[2].ti_tag:=TAG_DONE;  
  ng:=NewGadget(422,41,120,15,GetLocStr(SER_EDITOR),mytattr,
                8,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[8]:=CreateGadgetA(BUTTON_KIND,dgads[7],^ng,^t);
      
  ng:=NewGadget(5,62,140,15,GetLocStr(SER_DRUCKEN),mytattr,
                9,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[9]:=CreateGadgetA(BUTTON_KIND,dgads[8],^ng,^t);
  
  ng:=NewGadget(406,62,140,15,GetLocStr(EDRUCK_ABBRUCH),mytattr,
                10,PLACETEXT_IN,
                vi,NIL);
  sensitivgadget(ng);
  dgads[10]:=CreateGadgetA(BUTTON_KIND,dgads[9],^ng,^t);  
    
  t[1]:=TagItem(WA_InnerWidth,ww);
  t[2]:=TagItem(WA_InnerHeight,wh);
  t[3].ti_Tag:=WA_Title;
  t[3].ti_data:=LONG(GetLocStr(SER_TITEL));
  t[4]:=TagItem(WA_Idcmp,IDCMP_CLOSEWINDOW+IDCMP_GADGETUP+
                         IDCMP_RAWKEY+IDCMP_NEWSIZE);
  t[5]:=TagItem(WA_Flags,WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_ACTIVATE+
                WFLG_DEPTHGADGET+WFLG_SMART_REFRESH+WFLG_NOCAREREFRESH+
                WFLG_HASZOOM);
  t[6]:=TagItem(WA_Left,seriendruckwinleft);
  t[7]:=TagItem(WA_Top,seriendruckwintop);
  t[8] := TagItem(WA_MinWidth, 250);
  t[9] := TagItem(WA_MinHeight, yoff+1);
  t[10].ti_Tag:=TAG_DONE;
  IF pubname <> "" THEN
  BEGIN
    t[10] := TagItem(WA_PubScreenFallBack, 1);
    t[11] := TagItem(WA_PubScreenName, LONG(pubname));
    t[12].ti_Tag := TAG_DONE;
  END;
  serdruck:=OpenWindowTaglist(NIL,^t);
  IF serdruck<>NIL THEN
  BEGIN
   {raster(serdruck,0,1,551,77);}
   raster(serdruck,0,58,551-1,78-58);
   Linie(serdruck,0,58,551); 
{   clearq(serdruck,4,2,543,55);
   Rahmen(serdruck,4,2,543,56,TRUE);}
   l:=addgList(serdruck,gl1,0,-1,NIL);
   refreshglist(serdruck^.firstgadget,serdruck,NIL,-1);    { Gagets refreshen }
   dummy:=FALSE;
  REPEAT
   GetMessage(serdruck,class,code,qual,GadNum); 
   CASE class OF
   
    IDCMP_CLOSEWINDOW : dummy := TRUE;;
  
    IDCMP_NEWSIZE: 
     BEGIN
      rasterabs(serdruck,0,1,ww,wh);
      clearq(serdruck,4,2,543,55);
      Rahmen(serdruck,4,2,543,56,TRUE);
      refreshglist(serdruck^.firstgadget,serdruck,NIL,-1);
    END;
  
    IDCMP_RAWKEY:
      BEGIN
       IF code=locqual[SER_DATENSAETZE] THEN
         changecycler(serdruck,dgads[7],PTR(^Cyclelabels),12,zustand7);
       IF code=locqual[SER_BRIEFNAME] THEN
              ok:=ActivateGadget(dgads[1],serdruck,NIL);
       IF code=locqual[SER_ALADEN] THEN
             BEGIN 
              Butselecter(serdruck,dgads[5]);
              absenderladenser(dgads[4],serdruck);
             END;
       IF code=locqual[SER_BLADEN] THEN
             BEGIN
              Butselecter(serdruck,dgads[2]);
              briefladen;
             END;
       IF code=locqual[SER_KURZVORSCHAU] THEN
             BEGIN
              Butselecter(serdruck,dgads[3]);
              kurzvorschau;
             END;
       IF code=locqual[SER_DRUCKEN] THEN
             BEGIN
              Butselecter(serdruck,dgads[9]);
              druck;
             END;
       IF code=locqual[SER_ABSENDER] THEN
              ok:=ActivateGadget(dgads[4],serdruck,NIL);
       IF code=locqual[SER_ASPEICHERN] THEN
             BEGIN
              Butselecter(serdruck,dgads[6]);  
              absenderspeichern(dgads[4]);
             END;
       IF code=locqual[SER_EDITOR] THEN
             BEGIN
              Butselecter(serdruck,dgads[8]);
              editier;
             END;
       IF (code=locqual[EDRUCK_EW_ABBRUCH]) OR (code=69) THEN
             BEGIN
              Butselecter(serdruck,dgads[10]);
              dummy:=TRUE;
             END;
      END;

    IDCMP_GADGETUP:
     BEGIN     
      CASE Gadnum OF
       2 : briefladen;
       3 : Kurzvorschau; 
       5 : absenderladenser(dgads[4],serdruck);
       6 : absenderspeichern(dgads[4]);
       7 : BEGIN
            IF Zustand7<11 THEN inc(zustand7)
                           ELSE zustand7:=0;
           { nur für < OS39 nötig !}
           END;
     
        8 :  editier;
    
        9 : Druck;
    
       10 : dummy:=TRUE
      ELSE END
      END
    ELSE END;   
   UNTIL dummy;
   dummy:=FALSE;
   IF OS39 THEN berichtigezustand(zustand7,dgads[7],serdruck);
   si:=dgads[4]^.specialinfo;
   absender:=si^.buffer;
   si:=dgads[1]^.specialinfo;
   briefname:=si^.buffer;
   l:=removegList(serdruck,serdruck^.firstgadget,-1);
   seriendruckwinleft:=serdruck^.leftedge;
   seriendruckwintop:=serdruck^.topedge;
   Fenster_Zu(serdruck);
  END;
 FreeGadgets(gl1);
{ computefont(Mainwinwidth,mainwinheight);}
END;
 
{$ENDIF}
