{$if not def AP_SORTIEREN_H}

CONST
   AP_SORTIEREN_H = 0;
 
 VAR
    swapped:BOOLEAN;    
  
PROCEDURE sortiere(aufwärts:BOOLEAN);

 PROCEDURE tausche(VAR no1,no2:p_person);
  BEGIN
   exchange(no1^,no2^);
   exchange(no1^.pn,no2^.pn);  { ja, so kann man sparen ! }
   exchange(no1^.pn.ln_name,no2^.pn.ln_name);
   swapped:=TRUE;
  END;

 PROCEDURE datensätze_zählen;
  BEGIN
   j:=1;
   aktuelleperson:=p_person(Plist^.lh_head);
   WHILE aktuelleperson^.pn.ln_succ^.ln_succ<>NIL DO
   BEGIN
    inc(j);
    aktuelleperson:=p_Person(aktuelleperson^.pn.ln_succ)
   END;
  END;
  
  PROCEDURE refreshen;
   BEGIN
    t[1] := TagItem(GTLV_Labels,LONG(PList));
    t[2] := TagItem(GTLV_Selected,0);
    t[3].ti_Tag := TAG_DONE;
    GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
   END;
  
  PROCEDURE p0;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.name>dperson^.name) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.name<dperson^.name) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
   { Wenn man das sortieren nicht sehen soll hier refreshen }
 END;
  
  PROCEDURE p1;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.vorname>dperson^.vorname) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.vorname<dperson^.vorname) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
 END;

  PROCEDURE p2;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.strasse>dperson^.strasse) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.strasse<dperson^.strasse) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
  END;
 
  PROCEDURE p3;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.plz>dperson^.plz) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.plz<dperson^.plz) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
  END;

  PROCEDURE p4;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.ort>dperson^.ort) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.ort<dperson^.ort) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
  END;
  
  PROCEDURE p5;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.tel>dperson^.tel) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.tel<dperson^.tel) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
  END;
 
  PROCEDURE p6;
   BEGIN
    WHILE swapped DO
    BEGIN
     swapped:=FALSE;
     aktuelleperson:=p_person(Plist^.lh_head);
     FOR k:=1 TO (j-1) DO
      BEGIN
       dperson:=p_person(aktuelleperson^.pn.ln_succ);
       IF aufwärts THEN 
        BEGIN
         IF (aktuelleperson^.fax>dperson^.fax) THEN 
           tausche(aktuelleperson,dperson);
        END
       ELSE
         IF (aktuelleperson^.fax<dperson^.fax) THEN 
           tausche(aktuelleperson,dperson);
       aktuelleperson:=p_person(aktuelleperson^.pn.ln_succ);      
      END;
     refreshen;
   END;  
 END;

 BEGIN
  datensätze_zählen;
  IF j>1 THEN 
  BEGIN
   swapped:=TRUE;
   CASE i OF
     1 : p1;
     2 : p2;
     3 : p3;
     4 : p4;
     5 : p5;
     6 : p6;
   ELSE p0 END;
  END; 
 END;
   
PROCEDURE Sortieren;
{ -- Sortier-Prozedur -- }
 BEGIN
  sortierenOberfläche;
  i:=0;
  t[1] := TagItem(WA_Innerwidth,ww);
  t[2] := TagItem(WA_Innerheight,wh);
  t[3] := Tagitem(WA_Top,sortierwintop);
  t[4] := TagItem(WA_Left,sortierwinleft);
  t[5].ti_Tag := WA_Title;
  t[5].ti_Data := "AddiPro - Sortieren";
  t[6] := TagItem(WA_Idcmp,IDCMP_CLOSEWINDOW+IDCMP_GADGETUP+IDCMP_GADGETDOWN+IDCMP_RAWKEY);
  t[7] := TagItem(WA_Flags,WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_ACTIVATE+WFLG_DEPTHGADGET+
                  WFLG_RMBTRAP+WFLG_SMART_REFRESH+WFLG_NOCAREREFRESH);
  t[8].ti_Tag := TAG_DONE;
  IF pubname <> "" THEN
  BEGIN
    t[8] := TagItem(WA_PubScreenFallBack, 1);
    t[9] := TagItem(WA_PubScreenName, LONG(pubname));
    t[10].ti_Tag := TAG_DONE;
  END;

  wp2 := OpenWindowTagList(NIL,^t);
  IF wp2=NIL THEN exit;
   raster(wp2,0,1,276,79{-1});
   clearq(wp2,6,4,136,74);
   Rahmen(wp2,6,4,138,75,TRUE);
   l:=addgList(wp2,gl2,0,-1,NIL);
   refreshglist(wp2^.firstgadget,wp2,NIL,-1);
   GT_Refreshwindow(wp2,NIL);
   dummy:=FALSE;
   REPEAT
   GetMessage(wp2,class,code,qual,gadnum);
     CASE Class OF

    IDCMP_CLOSEWINDOW: dummy:=TRUE;
  
    IDCMP_RAWKEY:
     IF qual in [32768,32769,32770,32772] THEN
      BEGIN
       CASE code OF
        53,69:BEGIN {B, ESC}  
               Butselecter(wp2,egad[4]);
               dummy:=TRUE;
              END;    
        54 : BEGIN {N}
              t[2] := TagItem(GTMX_Active,0);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=0;
             END;
        52 : BEGIN {V}
              t[2] := TagItem(GTMX_Active,1);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=1
             END;
        11 : BEGIN {ß}
              t[2] := TagItem(GTMX_Active,2);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=2;
             END;
        25 : BEGIN {P}
              t[2] := TagItem(GTMX_Active,3);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=3;
             END;
        24 : BEGIN {O}
              t[2] := TagItem(GTMX_Active,4);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=4;
             END;
        20 : BEGIN {T}
              t[2] := TagItem(GTMX_Active,5);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=5
             END;
        35 : BEGIN {F}
              t[2] := TagItem(GTMX_Active,6);
              t[3].ti_Tag := TAG_DONE;
              GT_SetGadgetAttrsA(egad[1],wp2,NIL,^t);
              i:=6
             END;
        32 : BEGIN {A}
              Butselecter(wp2,egad[2]);
              sortiere(TRUE);
             END;
        17 : BEGIN {W}
              Butselecter(wp2,egad[3]);
              Sortiere(FALSE);
             END;
           ELSE END;
      END;

     IDCMP_GadgetUP,IDCMP_GADGETDOWN:
        CASE gadnum OF
           1 : i:=code;
           2 : sortiere(TRUE);
           3 : sortiere(FALSE);
           4 : dummy:=TRUE ;
        ELSE END;      
      ELSE END;
  
  UNTIL dummy;
  sortierwintop:=wp2^.topedge;
  sortierwinleft:=wp2^.leftedge;
  err:=removegList(wp2,wp2^.firstgadget,-1);
  Fenster_zu(wp2);
  Freegadgets(gl2);  
  ComputeFont(MainWinWidth,MainWinHeight);
  ww := ComputeX(MainWinWidth);
  wh := ComputeY(MainWinHeight);
 END;

  
{$endif} 
