PROGRAM Adressenverwaltung;

{
       Gemeinschaftsproduktion einer Adressenverwaltung
   
              geschrieben in MaxonPascal3 von
  
                 
                 Bombersoft  &  Røgersøft                                             
               
  
            (Björn Schotte und Michael Klein)
                                                              }
                     

{{$opt q}}

USES Intuition, ExecSupport, EXECIO, Graphics, Gadtools;

{$incl "dos.lib",
       "diskfont.lib",
       "workbench/startup.h",
       "icon.lib",
       "asl.lib",
       "locale.lib",
       "libraries/locale.h",
       {"rexxsyslib.lib",}
       "devices/printer.h",   
       "devices/prtbase.h",
       "intuition/intuition_functions.h",
       "wb.lib",
       "keymap.lib" }

CONST
{  RexxName = "ADDIPRO";}
  AppName  = "AddiPro.2";
  
  verstag = "$VER: AddiPro V1.12 (18.11.1996)";
  
  { Fensterbreiten und -höhen bei Topaz80-Font }
  
  EditWinWidth  = 624;
  EditWinHeight = 175;

  MainIDCMP = IDCMP_GADGETUP OR
              IDCMP_GADGETDOWN OR
              IDCMP_MOUSEBUTTONS OR
              IDCMP_CLOSEWINDOW OR
              IDCMP_INTUITICKS OR
              IDCMP_CHANGEWINDOW OR
              IDCMP_MOUSEMOVE OR
              IDCMP_MENUPICK OR
              IDCMP_RAWKEY;
              
  { ** Gadget-Nummern des Hauptwindows ** }
  M_LV           =  1;
  M_NEU          =  2;
  M_ÄNDERN       =  3;
  M_LÖSCHEN      =  4;
  M_SUCHEN       =  5;
  M_BLÄTTERN     =  6;
  M_INFOGAD      =  7;
  M_PREFS        =  8;
  M_DRUCKEN      =  9;


  { ** Datensatzlänge in Zeichen ** }
  namelength    = 31;
  vnamelength   = 21;
  strasselength = 31;
  ortlength     = 31;
  landlength    = 41;
  plzlength     = 8;
  tellength     = 21;
  faxlength     = 21;
  geblength     = 13;
  EMaillength   = 45;
  AnLength      = 10;
  komlength     = 80;
  colength      = 40;

  { ** Header der Adressdatei **}
  kennung = "AddiPro";

{  { -- Default PopKey für Commodity -- }
  DefHotKey = "lcommand control a";}
  
{ **
  ** Debuggen der Oberfläche mit topaz.font
  **
  ** }

{  DEBUG_TOPAZ = 0;}

{** muß TRUE sein, wenn vom compiler gestartet ! **}
  voncompiler=TRUE;
 
{ **
  ** mit deutschen Texten compilieren 
  **
  ** }
 rogersoft=6;
 
TYPE
  rawcodesarray=ARRAY[1..48] OF SHORT; {für die rawkeycodes} 
  String256 = STRING[256];
  String200 = STRING[200];

  WaitPointerTyp = ARRAY[1..36] OF WORD;

 tname=STRING[namelength];
 tvname=STRING[vnamelength];
 tStrasse=STRING[strasselength];
 tort=STRING[ortlength];
 tplz=STRING[plzlength];
 ttel=STRING[tellength];
 tfax=STRING[faxlength];
 tgeb=STRING[geblength];
 temail=STRING[EMaillength];
 tanrede=STRING[AnLength];
 tkom=STRING[komlength];
 tCO=STRING[colength];
 tland=STRING[landlength];
 
 { ** Hauptdaten-Record ** }
 p_person=^person;
 Person=RECORD
   pn       :   node;
   _anrede   :   tanrede;
   name     :   tname;
   vorname  :   tvname;
   co       :   tCo; 
   strasse  :   tstrasse;
   ort      :   tort;
   land     :   tland;
   plz      :   tplz;
   tel      :   ttel;
   fax      :   tfax;
   geb      :   tgeb;
   email1,
   email2,
   email3   :   temail;
   select   :   array[1..10] of boolean;
   kommentar:   tkom; 
 END; 

VAR
 bhöhe,bbreite,anzlist:INTEGER; {höhe+breite derImages,anzahl ds in Listview  im Mainfenster}
  serdruck1,listdruck1,fordruck1: BOOLEAN; {zeigt an, ob zum 1.Mal in Serdruck}
  iconname                      : STRING256;STATIC; {name der icondatei}
  eigenname                     : STRING256;STATIC; {name des Programms}
  MyAppIcon                     : p_AppIcon;
  iconified,PROJECTICON         : BOOLEAN;
  Mens                          : ARRAY[1..35] OF NewMenu;STATIC;
  MyMen                         : p_Menu;
  nbuf                          : tname;STATIC; { Für die STRING-Gadgets }
  vbuf                          : tvname;STATIC;
  sbuf                          : tstrasse;STATIC;
  obuf                          : tort;STATIC;
  pbuf                          : tplz;STATIC;
  tbuf                          : ttel;STATIC;
  fbuf                          : tfax;STATIC;
  gbuf                          : tgeb;STATIC;
  kombuf                        : tkom;STATIC;
  em1buf,em2buf,em3buf          : tEMail;STATIC;
  anredebuf                     : tAnrede;STATIC;
  cobuf                         : tCO;STATIC;
  landbuf                       : tland;STATIC;
  PList                         : p_List;  { Unsere List }
  PNode                         : p_Person; { Unser Record (Pointer) }
  a                             : STR;
  hs                            : STRING; {Hilfstring}
  gl,gad,gl1,gad1,KlickG,
  gad2,gl2,ÜberGl               : p_Gadget;
  mgad                          : ARRAY[1..15] OF p_Gadget;STATIC;
  egad                          : ARRAY[1..27] OF p_Gadget;STATIC;
  agad                          : ARRAY[1..2] OF p_Gadget;STATIC;
  wp,wp1,wp2                    : p_Window;
  t                             : ARRAY[1..15] OF TagItem;STATIC;
  ng                            : NewGadget;
  ps                            : p_Screen;
  vi                            : PTR; 
  msg                           : p_IntuiMessage;
  l                             : LONG;
  done,dummy,ok,
  start_iconified               : BOOLEAN;
  class,qual,code               : LONG;
  err                           : WORD;
  i,j,k,
  xoff, yoff,x,y,oldclicked     : INTEGER; 
  tattr,mtattr                  : TextAttr;
  GadNum                        : CARDINAL;
  Anzahl                        : LONGINT;
  pfad,datei                    : String200;STATIC;
  f,f1                          : Text;
  erkenn,
  oldinfotext                   : STRING;
  AktuellePerson,DPerson        : p_Person;
  es                            : EasyStruct;
  s                             : STRING200;STATIC;
  ls                            : STRING[256]; {langer String für Etikettdruck}
  Knoten                        : p_Node;
  SelectTexte                   : ARRAY[1..10] OF STRING[11];STATIC;
  DruckerAusgabe                : STRING[80];
  port                          : p_MsgPort;
  MainReq,BlättReq,suchreq      : Requester;
  WaitPointerData               : WaitPointerTyp;
  WaitPointer                   : PTR;
  OS39                          : BOOLEAN;
  psfont                        : p_TextFont;
  WBR,WBB,psh,psw,FontX,FontY,
  ww,wh                         : INTEGER;
  MyTattr,maintattr             : p_TextAttr;
  AktuellGewählt                : LONG;
  AddiProid, prefsid, verid,
  AppSig{,edisig}               : LONG;
  suchbuf,passwort              : STRING;
  suchmerk                      : LONG; {um die Gadgetzustände im Suchwin zu merken}
  sgad                          : ARRAY[1..23] OF p_Gadget;STATIC;
  MXLabels                      : ARRAY[1..8] OF STR; STATIC;
  prozentwin                    : p_Window;
  DoppelKlick,
  Iconsave,autoload,verschluesseln, {für Voreinstellungen}
  druckwin,                       { ob das Druckwindow offen ist?}
  iconleiste,                     { ob die Maingadgets von icons kommen} 
  vonmain                       : BOOLEAN; {Wenn man vom Mainwindow kam}
  signalmasc,oldsecs, 
  oldmics,secs,mics             : LONG;
  pubname                       : STR;
  EditorPort,AppPort            : p_MsgPort;
  AppWin                        : p_AppWindow;
  MainWinHeight,MainWinWidth,
  MainWinLeft, MainWinTop,
  EditWinLeft, EditWinTop,
  Suchpfadwinleft,suchpfadwintop,
  selectwinleft,selectwintop,
  BlätterWinLeft, BlätterWinTop,
  EinstellWinLeft, EinstellWinTop,
  druckwinleft, druckwintop,
  suchwinleft,suchwintop,
  Seriendruckwinleft,Seriendruckwintop,
  etikettdruckwinleft,etikettdruckwintop,
  aslf_width,aslf_height,
  aslf_topedge,aslf_leftedge,
  Sortierwinleft,sortierwintop,
  wahlWinLeft, wahlWinTop,
  entwurfwinleft,entwurfwintop,
  Listendruckwinleft,Listendruckwintop:INTEGER;STATIC;
  BlätterGl                     : p_Gadget;
  BlätterWp,serdruck,fordruck   : p_Window;
  serverp                       : p_MsgPort;
  editor, textanzeiger          : STRING[256];STATIC;
  ff,fd,ff1,fd1,ff2,fd2         : STRING[200];STATIC;
  si                            : p_stringinfo;
  druckmask                     : LONG;
  c                             : CHAR;

{$path"AddiPro:Editor/";
  incl"locales.h",
      "allgemein.h",
      "tooltype.h",
      "brushes.h",
      "winclose.h",
      "listen.h",
      "oberfläche.h",
      "druckmenü.h",
      "prefs.h",
      "sortieren.h",
      "dateioperationen.h"
      }
      
PROCEDURE CloseLibs;
{ -- Schliesst die geöffneten Libraries -- }
BEGIN
  IF KeymapBase <> NIL THEN CloseLibrary(KeymapBase);
  IF WorkbenchBase <> NIL THEN CloseLibrary(WorkbenchBase);
  IF GadToolsBase <> NIL THEN CloseLibrary(GadToolsBase);
{  IF RexxSysBase <> NIL THEN CloseLibrary(RexxSysBase);}
  IF DiskFontBase <> NIL THEN CloseLibrary(DiskFontBase);
  IF IconBase <> NIL THEN CloseLibrary(IconBase);
  IF ASLBase <> NIL THEN CloseLibrary(ASLBase);
  IF DOSBase <> NIL THEN CloseLibrary(DOSBase);
  IF LocaleBase <> NIL THEN CloseLibrary(LocaleBase);
END;

{ ** CleanUp - Routine  **}
 
PROCEDURE CleanUp(why:Str; rc:INTEGER);
BEGIN
  (** Hauptfenster schliessen **)
  CloseMainWin;
  { fordruckfenster schließen }
{  IF fordruck<>NIL THEN Closewindow(fordruck);}
  (** VisualInfo freigeben **)
  IF vi <> NIL THEN FreeVisualInfo(vi);            
  (** PublicScreen unlocken **)
  IF ps <> NIL THEN UnLockPubScreen(NIL,ps);       
  (** WaitPointer-Speicher freigeben **)
  IF NOT OS39 THEN
    IF WaitPointer <> NIL THEN FreeVec(WaitPointer);
{$if def DEBUG_TOPAZ}
  IF psfont <> NIL THEN CloseFont(psfont);
{$endif}    
  (** Falls Fehlermeldung -> Fehler ausgeben **)
  s := why;
  IF why <> "" THEN i := MeldReq("ERROR",s,"ok");
  (** AppIcon removen **)
  IF MyAppIcon <> NIL THEN dummy:=RemoveAppIcon(myAppIcon);
  FreeMainImages;
  IF cat<>NIL THEN closecatalog(cat);
{  IF loc<>NIL THEN closelocale(loc);} {Oh, gibt einen Privileg Error!}
  closett;
  CloseLibs;
  IF NOT fordruck1 THEN
  BEGIN
   DeleteAllnodes(elists);     {Listen löschen}
   IF elistdz>=0 THEN DeleteAllnodes(elistd);
  END;
  HALT(rc);
END;

{ ** Öffnet die benötigten Libraries
  **
  ** }
PROCEDURE OpenLibs;
BEGIN
  ASLBase := NIL; IconBase := NIL; 
  DiskfontBase := NIL; {RexxSysBase := NIL;} GadToolsBase := NIL;
  WorkbenchBase := NIL; KeymapBase:=NIL;
  KeymapBase := OpenLibrary("keymap.library",36);
  IF KeymapBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_KEYMAP), 20);
  DOSBase := OpenLibrary("dos.library",37);
  IF DOSBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_DOS), 20);
  ASLBase := OpenLibrary("asl.library",37);
  IF ASLBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_ASL), 20);
  IconBase := OpenLibrary("icon.library",0);
  IF IconBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_ICON),20);
  DiskfontBase := OpenLibrary("diskfont.library",0);
  IF DiskfontBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_DISKFONT),20);
{  RexxSysBase := OpenLibrary("rexxsyslib.library",0);
  IF RexxSysBasE = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_REXX),20);}
  GadToolsBase := OpenLibrary("gadtools.library",37);
  IF GadToolsBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_GADTOOLS),20);
  WorkbenchBase := OpenLibrary("workbench.library", 37);
  IF WorkbenchBase = NIL THEN CleanUp(Getlocstr(MSG_CANT_OPEN_WB),20);
END;

{ ** Überprüft, ob Kick-Version 37+ vorhanden
  **
  ** 24.10.1995:
  **
  **  - Bei Start von Workbench erscheint nun ein
  **    EasyRequester, falls kein Kick 37+ vorhanden.
  **
  ** 19.04.1996:
  **
  **  - Texte nach locale.library
  ** }
PROCEDURE Versionsprüfung;
VAR
  lib : p_Library;
  x : STRING;
BEGIN
  lib := IntuitionBase;
  IF lib^.lib_Version < 37 THEN
  BEGIN
    DisplayBeep(NIL);
    x := GetLocStr(MSG_ONLY_AT_OS37);
    IF FromWB THEN i := MeldReq("AddiPro",
                                x,
                                "OK")
    ELSE Writeln("Nur ab OS2.04 lauffähig !!");
    HALT(20);
  END;
  { Ist schon Kick3.0+ vorhanden ?? }
  OS39 := (lib^.lib_Version >= 39);
END;

PROCEDURE FreePs;
{ Freigeben des gelockten PublicScreens }
BEGIN
  IF ps <> NIL THEN UnLockPubScreen(NIL, ps);
  ps := NIL;
END;

{ -- Holt sich alles vom PublicScreen (X/Y-Offsets) und die VisualInfo -- }
   
PROCEDURE GetPubScr;
{$if def DEBUG_TOPAZ}
VAR debug_tattr : TextAttr;
{$endif}
VAR x : STRING;
BEGIN
  ps:=NIL;
  IF pubname<>"" THEN ps := LockPubScreen(pubname)
                 ELSE ps := LockPubScreen(NIL);
  IF ps<>NIL THEN
  BEGIN
    vi:=GetVisualInfoA(ps,NIL);
    { -- Die nächsten 7 Daten werden für fontsensitives Programmieren -- }
    { -- gebraucht                                                    -- }
{$if def DEBUG_TOPAZ}
    debug_tattr := TextAttr("topaz.font",8,0,0);
    psfont := OpenFont(^debug_Tattr);
{$else}  
    psfont := ps^.RastPort.Font;
 
{$endif} 
    wbr := ps^.WBorRight;
    wbb := ps^.WBorBottom;
    psw := ps^.Width;
    psh := ps^.Height;
    xoff := ps^.WBorLeft;
    yoff := ps^.WBorTop + ps^.Font^.ta_YSize;
    { ------------------------------------------------------------------ }
    IF vi = NIL THEN
    BEGIN
      x := GetLocStr(MSG_NO_VISUALI);
      i := MeldReq("AddiPro",x,"OK");
      DOSExit(20);
    END;
   UnLockPubScreen(NIL, ps);
    ps := NIL; 
  END ELSE
  BEGIN
    x := GetLocStr(MSG_CANT_LOCK_PUBSCR); i := MeldReq("AddiPro",x,"OK");
    DOSExit(20);
  END;
  tattr := TextAttr("topaz.font",8,0,0);
  ComputeFont(0,0);
END;

{ ** Kleine Copyright-Prozedure}
PROCEDURE Über;
VAR
  es   : EasyStruct;
  s    : STRING[300];
BEGIN
  s := "       *** AddiPro V1.19ß ***"+
       CHR(10)+
       "(c) 1997 by Björn Schotte/Michael Klein"+
       CHR(10)+
       CHR(10)+
       "  Björn Schotte"+CHR(10)+
       "  Am Burkardstuhl 45"+CHR(10)+
       "  D-97267 Himmelstadt"+CHR(10)+
       "  EMail: bjoern@bomber.mayn.de"+CHR(10)+
       CHR(10)+
       "  Michael Klein"+CHR(10)+
       "  Am Wasserturm 6"+CHR(10)+
       "  D-67346 Speyer"+CHR(10)+
       "  EMail: 100.145849@germanynet.de"+CHR(10)+
       "  http://www.germany.net/teilnehmer/100,145849" ;

  es := EasyStruct(SizeOf(EasyStruct),0,"AddiPro: Info",^s,"ok");
  i := EasyRequestArgs(wp,^es,NIL,NIL);
END;

{
  ** Variable titel in STR umgeändert (es wurde manchmal
  ** Müll angezeigt)
  ** aha !!! ;-)
}
FUNCTION ÖffneEditFenster(titel : STR) : BOOLEAN;
VAR
  t : ARRAY[1..13] OF TagItem;
BEGIN
  SetEditGads;
  t[1] := TagItem(WA_InnerWidth,ww);
  t[2] := TagItem(WA_InnerHeight,wh);
  t[3] := TagItem(WA_Flags,WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR WFLG_ACTIVATE OR
                           WFLG_CLOSEGADGET OR WFLG_HASZOOM OR WFLG_RMBTRAP);
  t[4] := TagItem(WA_Idcmp,IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR
{**}                           IDCMP_CHANGEWINDOW {OR IDCMP_VANILLAKEY} OR IDCMP_RAWKEY OR
                           IDCMP_GADGETDOWN);
  t[5] := TagItem(WA_Title, LONG(titel));
  t[6] := TagItem(WA_MinWidth, 100);
  t[7] := TagItem(WA_MinHeight, yoff);
  t[8] := TagItem(WA_Gadgets, LONG(gl1));
  t[9] := TagItem(WA_Left, EditWinLeft);
  t[10] := TagItem(WA_Top, EditWinTop);
  t[11].ti_Tag := TAG_DONE;
  IF pubname <> "" THEN
  BEGIN
    t[11] := TagItem(WA_PubScreenFallBack, 1);
    t[12] := TagItem(WA_PubScreenName, LONG(pubname));
    t[13].ti_Tag := TAG_DONE;
  END;

  wp1 := OpenWindowTagList(NIL, ^t);
  IF wp1 = NIL THEN
  BEGIN
    FreeGadgets(gl1);
    DisplayBeep(NIL);
    ÖffneEditFenster := FALSE;
    EXIT;
  END;
  Linie(wp1,2,124,618);
  Linie(wp1,2,154,618);
  ÖffneEditFenster := TRUE;
END;

PROCEDURE Edit(VAR p:p_Person; ändern:BOOLEAN);
{ -- Die eigentliche Edit-Prozedur. Parameter:               --
  -- p : Beim Neuanlegen eines Datensatzes ein NIL,          --
  --     ansonsten ein schon vorhandener                     --
  -- ändern: Je nachdem, welchen Wert ändern hat, wird       --
  --         die vorhandene Person dargestellt und geändert, --
  --         ansonsten neu eingerichtet zum Schluß !!        -- }
  
{ ** 19.04.1996: Texte per locale.library }
VAR
  abbruch,ok : BOOLEAN;
  b          : STRING[50];
  x,x1       : STR;
  s          : STRING;

  PROCEDURE Changer(Nr:INTEGER);
  VAR
    dummy : BOOLEAN;
  BEGIN
    dummy := (egad[Nr+17]^.Flags AND SELECTED) = SELECTED;
    t[1] := TagItem(GTCB_Checked,ORD(NOT dummy));
    t[2].ti_Tag := TAG_DONE;
    GT_SetGadgetAttrsA(egad[Nr+17],wp1,NIL,^t);
  END;
  
  (**
   ** TestIfEmpty
   **
   ** Überprüft, ob wenigstens im String-Gadget "Name"
   ** und "Vorname" etwas eingegeben wurde.
   **)
  FUNCTION TestIfEmpty : BOOLEAN;
  VAR name, vorname : STR;
      ok            : BOOLEAN;
      x,x1          : STRING[256];
  BEGIN
    TestIfEmpty := FALSE;
    name := GetString(egad[EDIT_NAME]);
    vorname := GetString(egad[EDIT_VORNAME]);
    IF (name = "") OR (vorname = "") THEN
    BEGIN
      TestIfEmpty := TRUE;     
      { Kein Name/Vorname -> Fehlermeldung! }
      x := GetLocStr(MSG_EDIT_NAME_AND_FIRST);
      x1 := GetLocStr(MSG_YES);
      i := MeldReq("AddiPro",
                   x,x1);                
      { Entsprechendes Stringgadget, das leer ist, aktivieren }
      IF name = "" THEN ok := ActivateGadget(egad[EDIT_NAME],wp1,NIL)
                   ELSE ok := ActivateGadget(egad[EDIT_VORNAME],wp1,NIL)     
    END;     
  END; 

BEGIN
  (** Puffer für String-Gadgets initialisieren **)
  nbuf := ""; vbuf := ""; sbuf := "";
  pbuf := ""; obuf := ""; tbuf := "";
  fbuf := ""; gbuf := ""; em1buf := "";
  em2buf := ""; em3buf := ""; kombuf := "";
  cobuf := ""; landbuf := ""; anredebuf := "";
  
  (** Bestehende Adresse ändern? **)
  IF ändern THEN
  BEGIN
    (** Alle Felder unserer Adresse in die Puffer kopieren **)
    cobuf     := p^.co;
    nbuf      := p^.Name;
    vbuf      := p^.Vorname;
    sbuf      := p^.Strasse;
    pbuf      := p^.PLZ;
    obuf      := p^.Ort;
    tbuf      := p^.Tel;
    fbuf      := p^.Fax;
    gbuf      := p^.Geb;
    em1buf    := p^.EMail1;
    em2buf    := p^.EMail2;
    em3buf    := p^.EMail3; 
    anredebuf := p^._anrede;
    kombuf    := p^.kommentar;
    landbuf   := p^.land; 
  END;
  (** Ediere-Fenster öffnen **)
  dummy := ÖffneEditFenster(getlocstr(EDITF));
  IF dummy THEN
  BEGIN
    IF ändern THEN
    BEGIN
      (** Group-Gadgets (de-)selektieren **)
      FOR i := 1 TO 10 DO
      BEGIN
        t[1] := TagItem(GTCB_Checked,LONG(p^.select[i]));
        t[2].ti_Tag := TAG_DONE;
        GT_SetGadgetAttrsA(egad[i+17],wp1,NIL,^t);
      END;
    END;
    (** Gadgets sichtbar machen **) 
    GT_RefreshWindow(wp1,NIL);
    dummy := FALSE;
    abbruch := FALSE;
    (** Erstes Gadget (Anrede) aktivieren **) 
    ok := ActivateGadget(egad[1],wp1,NIL);
    REPEAT
      GetMessage(wp1,class,code,qual,GadNum);
{     writeln(code);
      IF (class AND IDCMP_VANILLAKEY) = IDCMP_VANILLAKEY THEN
      BEGIN
        FOR i := 1 TO 17 DO
        BEGIN
          x := STR(egad[i]^.UserData); s := x;
          IF s = CHR(code) THEN
          BEGIN
            IF i IN [1..15] THEN ok := ActivateGadget(egad[i],wp1,NIL)
            ELSE
            BEGIN
              ButSelecter(wp1,egad[i]);
              class := IDCMP_GADGETUP;
              GadNum := i;
            END;
          END;
        END;
      END;}
      
      CASE class OF
        IDCMP_CLOSEWINDOW : BEGIN
                              dummy := TRUE;
                              abbruch := TRUE;
                            END;
        IDCMP_RAWKEY:
         CASE code OF
           105..300:; {zum verringern des ELSE-Zweiges}
            80..89 : Changer(code - 79);
                  1: ok := ActivateGadget(egad[EDIT_EMAIL1],wp1,NIL);
                  2: ok := ActivateGadget(egad[EDIT_EMAIL2],wp1,NIL);
                  3: ok := ActivateGadget(egad[EDIT_EMAIL3],wp1,NIL);
          ELSE
          BEGIN
           IF code=locqual[EDIT_GADGET_SALUTATION] THEN
                      ok := ActivateGadget(egad[EDIT_ANREDE],wp1,NIL);
           IF code=locqual[EDIT_GADGET_FIRST] THEN
                      ok := ActivateGadget(egad[EDIT_VORNAME],wp1,NIL);
           IF code=locqual[EDIT_GADGET_NAME] THEN
                      ok := ActivateGadget(egad[EDIT_NAME],wp1,NIL);
           IF code=locqual[EDIT_GADGET_CO] THEN
                      ok := ActivateGadget(egad[EDIT_CO],wp1,NIL);
           IF code=locqual[EDIT_GADGET_STREET] THEN
                      ok := ActivateGadget(egad[EDIT_STRASSE],wp1,NIL);
           IF code=locqual[EDIT_GADGET_ZIP] THEN
                      ok := ActivateGadget(egad[EDIT_PLZ],wp1,NIL);
           IF code=locqual[EDIT_GADGET_CITY] THEN
                      ok := ActivateGadget(egad[EDIT_ORT],wp1,NIL);
           IF code=locqual[EDIT_GADGET_COUNTRY] THEN
                      ok := ActivateGadget(egad[EDIT_LAND],wp1,NIL);
           IF code=locqual[EDIT_GADGET_PHONE] THEN
                      ok := ActivateGadget(egad[EDIT_TELEFON],wp1,NIL);
           IF code=locqual[EDIT_GADGET_FAX] THEN
                      ok := ActivateGadget(egad[EDIT_FAX],wp1,NIL);
           IF code=locqual[EDIT_GADGET_BIRTHDAY] THEN
                      ok := ActivateGadget(egad[EDIT_BIRTH],wp1,NIL);
           IF code=locqual[EDIT_GADGET_COMMENT] THEN
                      ok := ActivateGadget(egad[EDIT_COMMENT],wp1,NIL);        
           IF code=locqual[EDIT_GADGET_OK] THEN
                     BEGIN
                       ButSelecter(wp1,egad[EDIT_OK]);
                       IF TestIfEmpty = FALSE THEN dummy := TRUE;
                     END;
           IF code=locqual[EDIT_GADGET_CANCEL] THEN
                    BEGIN
                       ButSelecter(wp1,egad[EDIT_CANCEL]);
                       dummy := TRUE;
                       abbruch := TRUE;
                     END;
            END;
           END;
 
   
        IDCMP_GADGETUP:
          CASE GadNum OF
            1..14 : ok := ActivateGadget(egad[GadNum+1],wp1,NIL);
            EDIT_OK: IF TestIfEmpty = FALSE THEN dummy := TRUE;
            EDIT_CANCEL:
              BEGIN
                dummy := TRUE;
                abbruch := TRUE;
              END;
          ELSE END;
      ELSE END;
    UNTIL dummy;
    (** Wurde nicht abgebrochen? **) 
    IF abbruch = FALSE THEN
    BEGIN
      IF ändern THEN
      BEGIN
        (** Geänderte Felder in Adresse kopieren **) 
        p^._anrede := GetString(egad[EDIT_ANREDE]);  
        p^.Name    := GetString(egad[EDIT_NAME]);
        p^.Vorname := GetString(egad[EDIT_VORNAME]);
        p^.co      := GetString(egad[EDIT_CO]);  
        p^.Strasse := GetString(egad[EDIT_STRASSE]);
        p^.PLZ     := GetString(egad[EDIT_PLZ]);
        p^.Ort     := GetString(egad[EDIT_ORT]);
        p^.land    := GetString(egad[EDIT_LAND]);  
        p^.Tel     := GetString(egad[EDIT_TELEFON]);
        p^.Fax     := GetString(egad[EDIT_FAX]);
        p^.Geb     := GetString(egad[EDIT_BIRTH]);
        p^.EMail1  := GetString(egad[EDIT_EMAIL1]);
        p^.EMail2  := GetString(egad[EDIT_EMAIL2]);
        p^.EMail3  := GetString(egad[EDIT_EMAIL3]);  
        p^.kommentar := GetString(egad[EDIT_COMMENT]);
        
        FOR i := 1 TO 10 DO p^.select[i] := ( (egad[i+17]^.Flags AND SELECTED)=SELECTED );
        s := p^.Name+", "+p^.Vorname;
        x := s;
        FreeVec(PTR(p^.pn.ln_Name));
        p^.pn.ln_Name := PTR(AllocVec(Length(x)+1,MEMF_ANY));
        CopyMem(PTR(x),PTR(p^.pn.ln_Name),Length(x)+1);
      END ELSE
      BEGIN
        (** Neue Adresse kreieren **) 
        New(PNode);
        PNode^._anrede := GetString(egad[EDIT_ANREDE])
        ;  
        PNode^.name    := GetString(egad[EDIT_NAME]);
        PNode^.vorname := GetString(egad[EDIT_VORNAME]);
        PNode^.co      := GetString(egad[EDIT_CO]);  
        PNode^.strasse := GetString(egad[EDIT_STRASSE]);
        PNode^.plz     := GetString(egad[EDIT_PLZ]);
        PNode^.ort     := GetString(egad[EDIT_ORT]);
        PNode^.land    := GetString(egad[EDIT_LAND]);  
        PNode^.tel     := GetString(egad[EDIT_TELEFON]);
        PNode^.fax     := GetString(egad[EDIT_FAX]);
        PNode^.geb     := GetString(egad[EDIT_BIRTH]);
        PNode^.EMail1  := GetString(egad[EDIT_EMAIL1]);
        PNode^.EMail2  := GetString(egad[EDIT_EMAIL2]);
        PNode^.EMail3  := GetString(egad[EDIT_EMAIL3]);
        PNode^.kommentar := GetString(egad[EDIT_COMMENT]);
        PNode^.pn.ln_succ := NIL;
        PNode^.pn.ln_pred := NIL;
        PNode^.pn.ln_Type := NT_UNKNOWN;
        PNode^.pn.ln_Pri := 0;
        FOR i := 1 TO 10 DO PNode^.select[i] := ( (egad[i+17]^.Flags AND SELECTED)=SELECTED );
        b := GetString(egad[EDIT_NAME])+", "+GetString(egad[EDIT_VORNAME]);
        x := b;
        NeuePerson(PNode,x);
        Inc(Anzahl);
      END;
{      IF vonmain THEN 
      BEGIN
        ComputeFont(MainWinWidth,MainWinHeight);
      END
      ELSE
      BEGIN}
        ComputeFont(325,140)
{      END;}
      t[1] := TagItem(GTLV_Labels,LONG(PList));
      t[2] := TagItem(GTLV_Selected, AktuellGewählt);
      t[3].ti_Tag := TAG_DONE;
      GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
      GhostGadget(mgad[M_SUCHEN],wp,FALSE);
      GhostGadget(mgad[M_ÄNDERN],wp,FALSE);
      GhostGadget(mgad[M_BLÄTTERN],wp,FALSE);
      GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);
      GT_RefreshWindow(wp,NIL);
      IF Anzahl = 1 THEN AktuellePerson := SucheNode(0);
    END;
    EditWinLeft := wp1^.LeftEdge;
    EditWinTop := wp1^.TopEdge;
    CloseWindow(wp1);
    wp1 := NIL;
    FOR i := 1 TO EDIT_CANCEL DO
      IF egad[i]^.UserData <> NIL THEN FreeVec(egad[i]^.UserData);
    FreeGadgets(gl1);
    gl1 := NIL;
{    ComputeFont(MainWinWidth,MainWinHeight);}
  END;
 {***!!***} dummy:=FALSE; 
END;


{ ** Löscht einen Datensatz, mit Sicherheitsabfrage
  **
  ** 24.10.1995:
  **
  **  - Kleines "MakeUp" am Sicherheitsrequester
  **  - "Handgemachtes" EasyRequestArgs() durch
  **    MeldReq() ersetzt.
  **
  ** 19.04.1996:
  **
  **  - Text nach locale.library
  ** }
PROCEDURE DatensatzLöschen;
VAR letzter:BOOLEAN;
    x : STRING;
BEGIN
  IF AktuellePerson <> NIL THEN
  BEGIN
    s := GetLocStr(MSG_DELETE_DATA)+CHR(10)+"'"+AktuellePerson^.pn.ln_Name+"'";
    x := GetLocStr(MSG_YES) + "|" + GetLocStr(MSG_NO);
    l := MeldReq("AddiPro",s,x);
    IF l = 1 THEN { OK angeklickt }
    BEGIN
     letzter:=FALSE;
     IF aktuelleperson = p_person(plist^.lh_tailpred) THEN letzter:=TRUE;
     LöscheNode(AktuellePerson);
     Dec(Anzahl);
     IF (Anzahl = 0) THEN
        AktuellePerson := NIL
      ELSE
       IF letzter THEN aktuelleperson:=  p_person(plist^.lh_tailpred)
                  ELSE AktuellePerson := SucheNode(AktuellGewählt);
      t[1] := TagItem(GTLV_Labels,LONG(PList));
      t[2].ti_Tag := GTLV_Selected;
      IF Anzahl = 0 THEN
        t[2].ti_Data := NOT 0
      ELSE
        t[2].ti_Data := AktuellGewählt;
      t[3].ti_Tag := TAG_DONE;
      GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
      IF Anzahl = 0 THEN
      BEGIN
        { Gadgets deaktivieren: }
        GhostGadget(mgad[M_SUCHEN],wp,TRUE);
        GhostGadget(mgad[M_ÄNDERN],wp,TRUE);
        GhostGadget(mgad[M_BLÄTTERN],wp,TRUE);
        GhostGadget(mgad[M_LÖSCHEN],wp,TRUE);  
      END;
    END;
  END;
END;

{ -- Löscht alle Datensätze -- }
   
{ *********************** 08.06.1996: Save-saveas }
PROCEDURE AllesLöschen;
VAR s1 : STRING;
BEGIN
  IF anzahl = 0 THEN EXIT;
  s := GetLocStr(MSG_DELETE_ALL)+" "+IntStr(anzahl)+CHR(10)+GetLocStr(MSG_DELETE_ALL2);
  s1 := GetLocStr(MSG_YES)+"|"+GetLocStr(MSG_NO);
  es := EasyStruct(SizeOf(EasyStruct),0,"AddiPro",s,s1);
  l := EasyRequestArgs(wp,^es,NIl,NIL);
  IF l = 1 THEN
  BEGIN
    s := GetLocStr(MSG_YES)+"|"+GetLocStr(MSG_NO);
    es := EasyStruct(SizeOf(EasyStruct),0,"AddiPro",GetLocStr(MSG_SURE),s);
    l := EasyRequestArgs(wp,^es,NIl,NIL);
    IF l = 1 THEN
    BEGIN
      DeleteAllPersons;
      New(PList);
      NewList(PList);
      t[1] := TagItem(GTLV_Labels,LONG(NIL));
      t[2].ti_Tag := TAG_DONE;
      GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
      Anzahl := 0;
      AktuellGewählt := 0;
      AktuellePerson := NIL;
      GhostGadget(mgad[M_SUCHEN],wp,TRUE);
      GhostGadget(mgad[M_ÄNDERN],wp,TRUE);
      GhostGadget(mgad[M_BLÄTTERN],wp,TRUE);
      GhostGadget(mgad[M_LÖSCHEN],wp,TRUE);
{**************************new, Dateiname wirdgelöscht }
      IF pfad<>'' THEN
      BEGIN
       ok:=AddPart(pfad,datei,200);  
       datei:=filepart(pfad); 
       delete(pfad,length(pfad)-length(datei),length(datei)+1);
       datei:='';
      END;
    END;
  END;
END;

{$incl "blättern.h","suchen.h"}

{ ** Kreiert die Menüs für das Hauptfenster
  ** von AddiPro.
  **
  ** 24.10.1995:
  **
  **  - Menüpunkt "Iconify" wird gesperrt, falls AddiPro
  **    von der Shell gestartet wurde.
  **
  ** 02.12.1995:
  **
  **  - Menüpunkt "Iconify" wird nicht mehr gesperrt!
  **
  ** 19.04.1996:
  **
  **  - Locale.library-Support
  **}
PROCEDURE MainMenus;
VAR
  dummy : BOOLEAN;
BEGIN
  Mens[ 1] := NewMenu(NM_TITLE,0,GetLocStr(MENTIT_PROJECT),NIL,0,0,NIL);
  Mens[ 2] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_LOAD),GetLocStr(MENIT_LOAD_C),0,0,NIL);
  Mens[ 3] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_APPEND),GetLocStr(MENIT_APPEND_C),0,0,NIL);
  Mens[ 4] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_SAVE),GetLocStr(MENIT_SAVE_C),0,0,NIL);
  Mens[ 5] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_SAVEAS),GetLocStr(MENIT_SAVEAS_C),0,0,NIL);
  Mens[ 6] := NewMenu(NM_ITEM ,0,STR(NM_BARLABEL),NIL,0,0,NIL);
  Mens[ 7] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_INFO),GetLocStr(MENIT_INFO_C),0,0,NIL);
  Mens[ 8] := NewMenu(NM_ITEM ,0,STR(NM_BARLABEL),NIL,0,0,NIL);
  Mens[ 9] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_ICONIFY),GetLocStr(MENIT_ICONIFY_C),0,0,NIL);
  Mens[10] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_QUIT),GetLocStr(MENIT_QUIT_C),0,0,NIL);
  
  Mens[11] := NewMenu(NM_TITLE,0,GetLocStr(MENTIT_EXTRAS),NIL,0,0,NIL);
  Mens[12] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_DELALL),NIL,0,0,NIL);
  Mens[13] := NewMenu(NM_ITEM ,0,STR(NM_BARLABEL),NIL,0,0,NIL);
  Mens[14] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_PREFS),GetLocStr(MENIT_PREFS_C),0,0,NIL);
  
  Mens[15] := NewMenu(NM_TITLE,0,GetLocStr(MENTIT_PRINT),NIL,0,0,NIL);
  Mens[16] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_SERIES),GetLocStr(MENIT_SERIES_C),0,0,NIL);
  Mens[17] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_ETIQ),GetLocStr(MENIT_ETIQ_C),0,0,NIL);
  Mens[18] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_LIST),GetLocStr(MENIT_LIST_C),0,0,NIL);
  
  Mens[19] := NewMenu(NM_TITLE,0,GetLocStr(MENTIT_SORT),NIL,0,0,NIL);
  Mens[20] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_NAME),NIL,0,0,NIL);
  Mens[21] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_UP),"+",0,0,NIL);
  Mens[22] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_DOWN),"-",0,0,NIL);
  Mens[23] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_ZIP),NIL,0,0,NIL);
  Mens[24] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_UP),NIL,0,0,NIL);
  Mens[25] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_DOWN),NIL,0,0,NIL);
  Mens[26] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_CITY),NIL,0,0,NIL);
  Mens[27] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_UP),NIL,0,0,NIL);
  Mens[28] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_DOWN),NIL,0,0,NIL);
  Mens[29] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_COUNTRY),NIL,0,0,NIL);
  Mens[30] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_UP),NIL,0,0,NIL);
  Mens[31] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_DOWN),NIL,0,0,NIL);
  Mens[32] := NewMenu(NM_ITEM ,0,GetLocStr(MENIT_PHONE),NIL,0,0,NIL);
  Mens[33] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_UP),NIL,0,0,NIL);
  Mens[34] := NewMenu(NM_SUB ,0,GetLocStr(MENSORT_DOWN),NIL,0,0,NIL);  
  Mens[35].nm_Type := NM_END;
  t[1] := TagItem(GTMN_NewLookMenus, 1);
  t[2].ti_Tag := TAG_DONE;
  
  MyMen := CreateMenusA(^Mens,^t);
  
  IF MyMen = NIL THEN
  BEGIN
    FreeGadgets(gl);
    CloseWindow(wp);
    FreeVisualInfo(vi);
    s := GetLocStr(MSG_NO_MENU)
    l := MeldReq("AddiPro",s,"OK");
    HALT(20);
  END;
  
  dummy := LayoutMenusA(MyMen, vi, ^t);
  
  dummy := SetMenuStrip(wp, MyMen);
END;

{ -- Die Hauptprozedur -- }
 
{ ** 02.12.1995:
  **
  **  - AppIcon wird abgefragt. Alle Dateien, die auf das AppIcon
  **    gelegt werden, werden geladen. Möglichkeiten: Anhängen,
  **    evtl. vorhandene Datensätze löschen oder Abbruch
  **
  ** }
PROCEDURE Main;
TYPE
  typ = ^ARRAY[1..MaxInt] OF WBArg;
VAR
  ww,wh : INTEGER;
  winmask,
  mask              : LONG;
  msg               : p_IntuiMessage;
  MenNum, ItNum, Sunum,
  code              : INTEGER;
  amsg              : p_AppMessage;
  wba               : p_WBArg;
  mylock,oldlock    : BPTR;
  wb2               : typ;

 PROCEDURE mainwinopen;
  {ein paar für den Aussenstehenden undurchschaubare Berechnungsroutinen }

  BEGIN
   mtattr:=TextAttr("topaz.font",8,0,0);
   MainTattr := ^mtattr;                      {damm it !}
{   Forbid;}
   MainTattr^.ta_Name := psfont^.tf_Message.mn_Node.ln_Name;
   MainTattr^.ta_YSize := psfont^.tf_YSize;
{   Permit;   }{ Forbid and Permit is forbidden!!! And there is imho no need for Björn!}

   { Höhe berechnen}

 IF NOT iconified THEN 
 BEGIN
   mainwinheight:=mainwinheight-yoff-9;
   mainwinwidth:=mainwinwidth-9;  { geladene daten berichtigen, da innerwidth}
    
   IF mainwinheight<(4*3+bhöhe+4+MainTattr^.ta_YSize*3+4+9+yoff) THEN
   mainwinheight:=4*3+bhöhe+4+MainTattr^.ta_YSize*(anzlist+1)+4+9+yoff
   ELSE
    BEGIN
     { mainwinheight:=mainwinheight-yoff-9;}
     anzlist:= (mainwinheight-(4*3+bhöhe+MainTattr^.ta_YSize+4+4))
                DIV MainTattr^.ta_YSize;
    END;
{ggf. Fenster nach oben verschieben }
 
   IF (mainwinheight+mainwintop)>(psh) THEN mainwintop:=0;

   WHILE (mainwinheight>psh) AND (anzlist>=2) DO
    BEGIN
     dec(anzlist);
     mainwinheight:=yoff+3*3+bhöhe+4+MainTattr^.ta_YSize*(anzlist)+4+9+yoff;
    END;
 
   IF mainwinwidth<(7*bbreite+5*3) THEN mainwinwidth:=7*bbreite+5*3;
  END; {OF NOT iconified}

   ww:=mainwinwidth;
   wh:=mainwinheight;
   SetMainGads;
   
   t[1] := TagItem(WA_InnerWidth,ww);
   t[2] := TagItem(WA_InnerHeight,wh);
   t[3] := TagItem(WA_IDCMP,MainIDCMP);
   t[4] := TagItem(WA_Flags, WFLG_ACTIVATE+
                             WFLG_CLOSEGADGET+
                             WFLG_DRAGBAR+
                             WFLG_DEPTHGADGET+
                             WFLG_HASZOOM+
                             WFLG_NEWLOOKMENUS+
                             WFLG_NOCAREREFRESH+
                             WFLG_SMART_REFRESH+
                             WFLG_SIZEBBOTTOM+ 
                             WFLG_SIZEGADGET+
                             WFLG_REPORTMOUSE
                             );
   IF os39 THEN t[3].ti_data:=IDCMP_GADGETUP OR
                            IDCMP_GADGETDOWN OR
                            IDCMP_MOUSEBUTTONS OR
                            IDCMP_CLOSEWINDOW OR
                            IDCMP_INTUITICKS OR
                            IDCMP_CHANGEWINDOW OR
                            IDCMP_GADGETHELP OR
                            IDCMP_MENUPICK OR
                            IDCMP_MOUSEMOVE OR
                            IDCMP_RAWKEY;
                

   t[5] := TagItem(WA_Gadgets, LONG(gl));
   t[6] := TagItem(WA_MaxWidth, psw);
   t[7] := TagItem(WA_MaxHeight, psh);
   t[8] := TagItem(WA_MinWidth, 7*bbreite+18+6);
   t[9] := TagItem(WA_MinHeight, yoff+10+4*3+bhöhe+4+MainTattr^.ta_YSize*(2)+6+9);
   t[10].ti_Tag := WA_Title;
   t[10].ti_Data := "AddiPro - Mainwindow ";
   t[11] := TagItem(WA_Left, MainWinLeft);
   t[12] := TagItem(WA_Top, MainWinTop);
   t[13].ti_Tag := TAG_DONE;
   IF pubname <> "" THEN
   BEGIN
     t[14] := TagItem(WA_PubScreenFallBack, 1);
     t[14] := TagItem(WA_PubScreenName, LONG(pubname));
     t[15].ti_Tag := TAG_DONE;
   END;
   wp := OpenWindowTagList(NIL,^t);
   IF wp = NIL THEN
   BEGIN
     FreeGadgets(gl);
     FreeVisualInfo(vi);
     s := GetLocStr(MSG_NO_WINDOW);
     i := MeldReq("AddiPro",s,"OK");
     HALT(20);
   END;
   AppWin := AddAppWindowA(1,0,wp,AppPort,NIL);
   IF AppWin = NIL THEN
   BEGIN
     CloseWindow(wp);
     FreeGadgets(gl);
     FreeVisualInfo(vi);
     s := GetLocStr(MSG_NO_APPWIN);
     i := MeldReq("AddiPro",s,"OK");
     HALT(20);
   END;
   MainMenus;
  END;

FUNCTION TestAnzahl : LONG;
VAr x : STRING;
BEGIN
  TestAnzahl := 1;
  IF Anzahl > 0 THEN
  BEGIN
    s := GetLocStr(MSG_DATAS_IN_MEM)+" "+IntStr(Anzahl)+GetLocStr(MSG_DATAS_IN_MEM2);
    x := GetLocStr(MSG_DATAS_IN_MEM_DELETE)+"|"+GetLocStr(MSG_DATAS_IN_MEM_APPEND)+"|"+
         GetLocStr(MSG_CANCEL);
    TestAnzahl := MeldReq("AddiPro",s,x);
  END; 
END;

PROCEDURE LoadFromAppIcon(VAR amsg:p_AppMessage);
TYPE
{*************}  typ = ^ARRAY[1..MaxSHORT] OF WBArg;
VAR
  wb2 : typ;
{  mylock : BPTR;}
BEGIN
  IF (amsg^.am_NumArgs = 0) AND (wp <> NIL) THEN i := ActivateWindow(wp)
  ELSE
  BEGIN
    FOR i := 1 TO amsg^.am_NumArgs DO
    BEGIN 
      l := TestAnzahl; 
      IF l <> 0 THEN
      BEGIN                   
        wb2 := typ(amsg^.am_ArgList);
        oldlock := CurrentDir(wb2^[i].wa_Lock);
        datei := wb2^[i].wa_Name;
        dummy := GetcurrentDirName(^pfad,256);
        mylock := Currentdir(oldlock);
        IF l = 1 THEN DateiLaden(FALSE) ELSE anhaengen(FALSE);
      END;    
    END;        
  END;       
END;

  PROCEDURE ShowInfo(s : STR);
  BEGIN
    IF s <> oldinfotext THEN
    BEGIN 
      oldinfotext := s; 
      t[1] := TagItem(GTTX_Text, LONG(s));
      t[2].ti_Tag := TAG_DONE;
      GT_SetGadgetAttrsA(mgad[M_INFOGAD],wp,NIL,^t);  
    END;
  END;

{ Zeigt einen Info-Text wenn Mousezeiger über einem Gadget }
PROCEDURE ShowInfoTextNEW;
 BEGIN
{  i:=gadnum^.GadgetID;}
  CASE gadnum OF
   M_LV: ShowInfo(GetLocStr(INFOTEXT_ADDRESSFIELD));
   M_NEU:ShowInfo(GetLocStr(INFOTEXT_CREATE_ADDRESS));
   M_ÄNDERN:ShowInfo(GetLocStr(INFOTEXT_CHANGE_ADDRESS));
   M_LÖSCHEN:ShowInfo(GetLocStr(INFOTEXT_DELETE_ADDRESS));
   M_SUCHEN:ShowInfo(GetLocStr(INFOTEXT_SEARCH_ADDRESS));
   M_BLÄTTERN:ShowInfo(GetLocStr(INFOTEXT_FLIP_ADDRESS));
   M_PREFS:ShowInfo(GetLocStr(INFOTEXT_PREFS));
   M_DRUCKEN:ShowInfo(GetLocStr(INFOTEXT_PRINT));
  ELSE ShowInfo(""); END;
 END;
 
PROCEDURE ShowInfoText;
  
BEGIN
  IF (x>=xoff+3) AND (y>=yoff+3*3+bhöhe+mainTattr^.ta_YSize+4)
  AND (x<=xoff+3+mainwinwidth-2*3) AND 
   (y<=yoff+3*3+bhöhe+myTattr^.ta_YSize+4+mainTattr^.ta_YSize*anzlist+4)
  THEN
    ShowInfo(GetLocStr(INFOTEXT_ADDRESSFIELD))
  ELSE
  IF (x>=xoff+3) AND (y>=yoff+3)
  AND (x<=xoff+3+bbreite) AND (y<=yoff+3+bhöhe)
  THEN
    ShowInfo(GetLocStr(INFOTEXT_CREATE_ADDRESS))
  ELSE
  IF (x>=xoff+3+bbreite) AND (y>=yoff+3)
  AND (x<=xoff+3+2*bbreite) AND (y<=yoff+3+bhöhe)
  THEN
    ShowInfo(GetLocStr(INFOTEXT_CHANGE_ADDRESS))
  ELSE
  IF (x>=xoff+2*3+2*bbreite) AND (y>=yoff+3)
  AND (x<=xoff+2*3+3*bbreite) AND (y<=yoff+3+bhöhe) THEN
    ShowInfo(GetLocStr(INFOTEXT_DELETE_ADDRESS))
  ELSE
  IF (x>=xoff+2*3+3*bbreite) AND (y>=yoff+3)
  AND (x<=xoff+2*3+4*bbreite) AND (y<=yoff+3+bhöhe) THEN
    ShowInfo(GetLocStr(INFOTEXT_SEARCH_ADDRESS))
  ELSE
  IF (x>=xoff+3*3+4*bbreite) AND (y>=yoff+3)
  AND (x<=xoff+3*3+5*bbreite) AND (y<=yoff+3+bhöhe) THEN
    ShowInfo(GetLocStr(INFOTEXT_FLIP_ADDRESS))
  ELSE 
  IF (x>=xoff+3*3+5*bbreite) AND (y>=yoff+3)
  AND (x<=xoff+3*3+6*bbreite) AND (y<=yoff+3+bhöhe) THEN
    ShowInfo(GetLocStr(INFOTEXT_PREFS))    
  ELSE 
  IF (x>=xoff+4*3+6*bbreite) AND (y>=yoff+3)
  AND (x<=xoff+4*3+7*bbreite) AND (y<=yoff+3+bhöhe) THEN
    ShowInfo(GetLocStr(INFOTEXT_PRINT))
  ELSE  
    ShowInfo("");
END;

PROCEDURE IconifyMe;
VAR
  { ** Korrigiert 24.10.1995: War vorher vom Typ
    ** p_Message, was zu einem Absturz führte
    **} 
  dummymsg : p_AppMessage;
BEGIN
  iconified := TRUE;
  eigenname := holeEigenname;
  
  { ** Hier richtige Reihenfolge eingefügt
    ** Zuerst Gadget-Liste entfernen, dann
    ** die Menü-Leiste, dann alles weitere
    **}  
  err := RemoveGList(wp,wp^.FirstGadget,-1);
  ClearMenuStrip(wp);
  dummy := RemoveAppWindow(AppWin);
  MainWinLeft := wp^.LeftEdge;
  MainWinTop := wp^.TopEdge;
  mainwinwidth:=wp^.width-9;
  mainwinheight:=wp^.height-yoff-10;

  anzlist:=(mainwinheight-(4*3+bhöhe+MainTattr^.ta_YSize+4+4))
             DIV MainTattr^.ta_YSize; 
  {Bullshit! irgendwo ist beim iconify noch ein Fehler bei der Größenberechnung
********************************}
  CloseWindow(wp);
  FreeGadgets(gl); 
  FreeVisualInfo(vi);
  freeps;
  { ** Auf Nachricht vom AppIcon warten... ** }
  REPEAT
    dummymsg := p_AppMessage(WaitPort(AppPort));
    dummymsg := p_AppMessage(GetMsg(AppPort)); 
    IF dummymsg^.am_numargs > 0 THEN LoadFromAppIcon(dummymsg); 
    ReplyMsg(p_Message(dummymsg));
  UNTIL dummymsg^.am_Numargs=0;
  { ** AppIcon entfernen, Fenster öffnen und normal weiterarbeiten ** }
{  dummy:=RemoveAppIcon(myAppIcon);
  FreeDiskObject(dobj);
  dobj:=NIL;                       {uuups!}}
  getpubscr;
  mainwinopen;
  GT_RefreshWindow(wp,NIL);
  iconified:=FALSE;
  opentt;
END;
     
BEGIN
  iconified:=FALSE;
  oldclicked := -1;
  mainwinopen;
  IF FROMWB THEN 
  IF getwbargs THEN Dateiladen(FALSE) 
                ELSE IF autoload THEN DateiLaden(FALSE)
  ELSE IF autoload THEN DateiLaden(FALSE);  { knobel ;-) }
  IF os39 THEN HelpControl(wp,HC_GADGETHELP);
  GT_RefreshWindow(wp,NIL);
  done := FALSE;
  druckwin:=FALSE;
  REPEAT
    winmask := LONG(1) SHL LONG(wp^.UserPort^.mp_SigBit);
    AppSig := LONG(1) SHL LONG(AppPort^.mp_SigBit);
    signalmasc:=(winmask OR Appsig);
    mask := _Wait(signalmasc);
    IF (mask AND AppSig) = AppSig THEN
    BEGIN
      amsg := p_AppMessage(GetMsg(AppPort));
      WHILE amsg <> NIL DO
      BEGIN
        CASE amsg^.am_Type OF
          MTYPE_APPWINDOW:
            BEGIN
              l := TestAnzahl; 
              IF l <> 0 THEN
              BEGIN                   
                wba := amsg^.am_ArgList;
                oldlock := CurrentDir(wba^.wa_Lock);
                datei := wba^.wa_Name;
                dummy := GetCurrentDirName(^pfad,256);
                IF l = 1 THEN DateiLaden(FALSE) ELSE Anhaengen(FALSE);
                mylock := CurrentDir(oldlock);
              END;
            END;
          MTYPE_APPICON:
            BEGIN
              IF (amsg^.am_NumArgs = 0) AND (wp <> NIL) THEN i := ActivateWindow(wp)
              ELSE
              BEGIN
                FOR i := 1 TO amsg^.am_NumArgs DO
                BEGIN
                  l := TestAnzahl;  
                  IF l <> 0 THEN
                  BEGIN                   
                    wb2 := typ(amsg^.am_ArgList);
                    oldlock := CurrentDir(wb2^[i].wa_Lock); {Lock aufs Verzeichnis!}
                    datei := wb2^[i].wa_Name;
                    dummy := GetcurrentDirName(^pfad,256);
                    IF l = 1 THEN DateiLaden(FALSE) ELSE anhaengen(FALSE);
                    mylock := CurrentDir(oldlock);  
                  END;    
                END;        
              END;       
            END;    
        ELSE END;
        ReplyMsg(p_Message(amsg));
        amsg := p_AppMessage(GetMsg(AppPort));
      END;
    END ELSE IF (mask AND winmask) = winmask THEN
    BEGIN
       msg := GT_GetIMsg(wp^.UserPort);
       WHILE msg <> NIL DO
       BEGIN
         class := msg^.Class;
         code := msg^.Code;
         qual := msg^.Qualifier;
         secs := msg^.Seconds;
         mics := msg^.Micros;
         IF class IN [IDCMP_GADGETUP, IDCMP_GADGETDOWN, IDCMP_GADGETHELP] THEN
         BEGIN
           KlickG := msg^.IAddress;
           GadNum := KlickG^.GadgetID;
           IF DoubleClick(oldsecs,oldmics,secs,mics) THEN DoppelKlick := TRUE
           ELSE
           BEGIN
             oldsecs := secs;
             oldmics := mics;
             DoppelKlick := FALSE;
           END;
         END ELSE IF (class AND IDCMP_MOUSEMOVE) = IDCMP_MOUSEMOVE THEN
         BEGIN
           x := msg^.MouseX;
           y := msg^.MouseY;
         END; 
         GT_ReplyIMsg(msg);
         CASE class OF
{            IDCMP_MOUSEMOVE  : ShowInfoText;}
            IDCMP_GADGETHELP : Showinfotextnew;
            IDCMP_CLOSEWINDOW : done := TRUE;
            IDCMP_RAWKEY: 
           CASE code OF 
                76: BEGIN
                    IF anzahl>0 THEN
                     BEGIN
                     IF qual in [33281,33282,32770,32769] THEN
                      BEGIN
                       IF (Aktuellgewählt-anzlist+1>0) THEN
                        Aktuellgewählt:=aktuellgewählt-anzlist+1
                       ELSE aktuellgewählt:=0
                      END
                     ELSE
                      IF (AktuellGewählt-1>=0) THEN Dec(AktuellGewählt);
                     t[1] := TagItem(GTLV_Selected,AktuellGewählt);
                     { GTLV_MakeVisible (erst ab OS3.0 !!) }
                     t[2] := TagItem(GTLV_MakeVisible,AktuellGewählt);
                     t[3].ti_Tag := TAG_DONE;
                     GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
                     AktuellePerson := SucheNode(AktuellGewählt);
                     END;
                    END;
                77: BEGIN 
                   IF anzahl>0 THEN 
                    BEGIN
                     IF qual in [33281,33282,32770,32769] THEN
                      BEGIN
                       IF(Aktuellgewählt+Anzlist-1<=Anzahl-1) THEN
                       aktuellgewählt:=aktuellgewählt+anzlist-1
                       ELSE aktuellgewählt:=anzahl-1;
                      END
                     ELSE
                      IF (AktuellGewählt+1<=Anzahl-1) THEN Inc(AktuellGewählt);
                     t[1] := TagItem(GTLV_Selected,AktuellGewählt);
                     t[2] := TagItem(GTLV_MakeVisible,AktuellGewählt);
                     t[3].ti_Tag := TAG_DONE;
                     GT_SetGadgetAttrsA(mgad[1],wp,NIL,^t);
                     AktuellePerson := SucheNode(AktuellGewählt);
                    { GhostGadget(mgad[M_ÄNDERN],wp,FALSE);       
                     GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);}
                   END;
                  END; 
              ELSE END;
            IDCMP_MENUPICK:
              BEGIN
                mennum := MENUNUM(code);
                itnum  := ITEMNUM(code);
                sunum  := SUBNUM(code);
                CASE mennum OF
                  0 : CASE itnum OF
                        0 : BEGIN
                              SetBusyWindow(wp, MainReq);
                              DateiLaden(TRUE);
                              UnBusyWindow(wp, MainReq);
                            END;
                        1 : BEGIN
                             anhaengen(TRUE);
                            END; 
                        2 : BEGIN
                              SetBusyWindow(wp, MainReq);
                              DateiSpeichern(FALSE);
                              UnBusyWindow(wp, MainReq);
                            END;         
                        3 : BEGIN
                              SetBusyWindow(wp, MainReq);
                              DateiSpeichern(TRUE);
                              UnBusyWindow(wp, MainReq);
                            END;
                        5 : BEGIN
                              SetBusyWindow(wp, MainReq);
                              Über;
                              UnBusyWindow(wp, MainReq);
                            END;
                        7 : IconifyMe;       
                        8 : done := TRUE;
                      ELSE END; 
                  1 : CASE itnum OF
                        0 : BEGIN
                              SetBusyWindow(wp,MainReq);                         
                              AllesLöschen;
                              UnBusyWindow(wp, MainReq);
                            END;
                        2 : BEGIN
                              SetBusyWindow(wp,MainReq);                         
                              Voreinstellungen;
                              UnBusyWindow(wp, MainReq);
                            END;
                      ELSE END;
                  2 : CASE itnum OF
                        0 : BEGIN
                              Setbusywindow(wp,Mainreq);                              
                              serienbrief;
                              unbusywindow(wp,mainreq);
                            END;        
                        1 : BEGIN
                              Setbusywindow(wp,Mainreq);
                              etikettmodus;
                              unbusywindow(wp,mainreq);
                            END;
                        2 : BEGIN
                              Setbusywindow(wp,Mainreq);      
                              unbusywindow(wp,mainreq);
                            END;             
                      ELSE END;      
                  3 : CASE sunum OF
                        0: sortieren(TRUE,itnum); { goil gell ?}
                        1: sortieren(FALSE,itnum);
                        ELSE END;
                ELSE END;
              END;
            IDCMP_CHANGEWINDOW: mainchanged;
            IDCMP_GADGETUP:
              CASE GadNum OF
                M_LV :
                  BEGIN
                    AktuellePerson := SucheNode(code);
                    AktuellGewählt := code;
                    GhostGadget(mgad[M_ÄNDERN],wp,FALSE);
                    GhostGadget(mgad[M_LÖSCHEN],wp,FALSE);        
                    { ** Doppelklick auf einen Eintrag -> Eintrag edieren ** }    
                    IF (DoppelKlick) AND (AktuellGewählt = oldclicked) THEN
                    BEGIN
                      oldclicked := -1;
                      SetBusyWindow(wp,MainReq);
                      Edit(AktuellePerson,TRUE);
                      UnBusyWindow(wp,MainReq);
                    END ELSE oldclicked := code;
                  END;
                  
                M_NEU :
                  BEGIN
                    vonmain:=TRUE;
                    SetBusyWindow(wp,MainReq);
                    DPerson := NIL;
                    Edit(DPerson,FALSE);
                    UnBusyWindow(wp,MainReq);
                  END;
                  
                M_ÄNDERN :
                  BEGIN
               { Abfrage eingebaut... }    
               IF AktuellePerson <> NIL THEN
                    BEGIN   
                     vonmain:=TRUE;
                     SetBusyWindow(wp,MainReq);
                     Edit(AktuellePerson,TRUE);
                     UnBusyWindow(wp,MainReq);
                    END;   
                  END;
                  
                M_LÖSCHEN:
                  IF AktuellePerson <> NIL THEN DatensatzLöschen;
                  
                M_SUCHEN:
                  BEGIN
                   IF Anzahl > 0 THEN
                   BEGIN    
                     SetBusyWindow(wp,MainReq);
                     Suchen;
                     UnBusyWindow(wp,Mainreq);
                   END;  
                  END; 
      
                M_BLÄTTERN :
                  BEGIN
                  IF Anzahl > 0 THEN
                   BEGIN   
                    SetBusyWindow(wp,MainReq);
                    Blättern(AktuellePerson);
                    UnBusyWindow(wp,MainReq);
                   END;   
                  END;
                M_PREFS:
                  BEGIN
                   SetBusyWindow(wp,MainReq);
                   Voreinstellungen;
                   UnBusyWindow(wp,MainReq);    
                  END;      
              ELSE END;
         ELSE END;
         msg := GT_GetIMsg(wp^.UserPort);
       END;
    END
  UNTIL done;
  dummy := RemoveAppWindow(AppWin);
END;

PROCEDURE InitProgAdrs;
VAR
  b : STRING;
  x : STR;
BEGIN
  New(PNode);
  PNode^._anrede := "Herr";
  PNode^.Name := "Schotte";
  PNode^.Vorname := "Björn";
  PNode^.co := "";
  PNode^.Strasse := "Am Burkardstuhl 45";
  PNode^.Ort := "Himmelstadt";
  PNode^.Plz := "97267";
  PNode^.land := "Deutschland";
  PNode^.tel := "09364 89849";
  PNode^.fax := "";
  PNode^.geb := "30.09.1978";
  PNode^.EMail1 := "bjoern@baer.franken.de";
  PNode^.EMail2 := "ftp@baer.franken.de";
  PNode^.EMail3 := "";
  PNode^.kommentar := "Programmer of AddiPro";
  b := PNode^.name+", "+PNode^.vorname;
  x := b;
  NeuePerson(PNode,x);
  New(PNode);
  PNode^._anrede := "Herr";
  PNode^.Name := "Klein";
  PNode^.Vorname := "Michael";
  PNode^.co := "Røgersøft";
  PNode^.Strasse := "Am Wasserturm 6";
  PNode^.Ort := "Speyer";
  PNode^.Plz := "67346";
  PNode^.land := "Deutschland";
  PNode^.tel := "06232 77425";
  PNode^.fax := "";
  PNode^.geb := "02.05.1973";
  PNode^.EMail1 := "100.145849@germanynet.de";
  PNode^.EMail2 := "";
  PNode^.EMail3 := "";
  PNode^.kommentar := "Programmer of AddiPro";
  b := PNode^.name+", "+PNode^.vorname;
  x := b;
  NeuePerson(PNode,x);
  Anzahl := 2;
  AktuellePerson := p_Person(PList^.lh_Head);
  AktuellGewählt := 0;
END;

PROCEDURE ZeroVars;
BEGIN
  WaitPointer := NIL;
  mainwinheight  := 80;
  Anzahl         := 0;
  tattr          := TextAttr("topaz.font",8,0,0);
  AktuellePerson := NIL;
  AktuellGewählt := -1;
  pfad           := "";
  datei          := "";
  DruckerAusgabe := "PRT:";
  pubname        := "";
  passwort:='geht leider noch nicht !!!';
  ff := "";
  fd := "PRT:";
  ff1 := "";
  fd1 := "";
  ff2 := "";
  fd2 := "";
  FOR i := 1 TO 10 DO
    SelectTexte[i] := "Gruppe "+intstr(i);
  oldsecs := 0;
  oldmics := 0;
  AppPort := NIL;
  MainWinLeft := 0;
  MainWinTop := 10;
  MainWinWidth  := 458;
  EditWinLeft := 0;
  EditWinTop := 0;
  BlätterWinLeft := 0;
  BlätterWinTop := 0;
  EinstellWinLeft := 0;
  EinstellWinTop := 0;
  aslf_width:=200;
  aslf_height:=200;
  aslf_topedge:=0;
  aslf_leftedge:=0;
  editor:='c:ed';
  textanzeiger:='c:ppmore';   
  druckwinleft:=50;
  druckwintop:=100;
  Seriendruckwinleft:=50;
  Seriendruckwintop:=0;
  etikettdruckwinleft:=90;
  etikettdruckwintop:=0;
  Listendruckwinleft:=0;
  Listendruckwintop:=0;
  suchwinleft:=0;
  suchwintop:=0;
  Sortierwinleft:=0;
  sortierwintop:=0;
  suchbuf:='';
  oldinfotext := "";
  Suchpfadwinleft:=0;
  suchpfadwintop:=0;
  selectwinleft:=0;
  selectwintop:=0;
  wahlWinLeft:=0;
  wahlWinTop:=0;
  entwurfwinleft:=0;
  entwurfwintop:=0;
  suchmerk:=32769;
  verschluesseln:=FALSE;
  iconsave:=FALSE;
  autoload:=FALSE;
  start_iconified := FALSE;
  serdruck:=NIL;
  ps := NIL; wp := NIL; vi := NIL; wp1 := NIL; wp2 := NIL;
  MyAppIcon := NIL;
  neu_data := NIL; neus_data := NIL; löschen_data := NIL;
  löschens_data := NIL; blättern_data := NIL; blätterns_data := NIL;
  prefs_data := NIL; prefss_data := NIL; suchen_data := NIL;
  suchens_data := NIL; ändern_Data := NIL; änderns_data := NIL;
  serdruck1:=TRUE;
  fordruck1:=TRUE;
  loc:=NIL;
  listdruck1:=TRUE;
  etikettname:='';
  anzlist:=10;
  iconleiste:=FALSE;
 END;

{ -- Initialisiert alle Variablen -- }
PROCEDURE InitVars;
VAR s:STRING;
BEGIN
  IF NOT OS39 THEN
  BEGIN
    { ** Ab OS39 stellt die intuition.library eine Funktion zur Verfügung,
      ** mit der man einfach den Busy-Pointer setzen kann. Damit auch alle
      ** User <OS39 in den Genuß des Busy-Pointers kommen, wird der Pointer
      ** manuell gesetzt. } 
    WaitPointerData:=WaitPointerTyp($0000,$0000,
                                    $0400,$07C0,$0000,$07C0,$0100,$0380,$0000,$07E0,
                                    $07C0,$1FF8,$1FF0,$3FEC,$3FF8,$7FDE,$3FF8,$7FBE,
                                    $7FFC,$FF7F,$7EFC,$FFFF,$7FFC,$FFFF,$3FF8,$7FFE,
                                    $3FF8,$7FFE,$1FF0,$3FFC,$07C0,$1FF8,$0000,$07E0,
                                    $0000,$0000);
    WaitPointer    := AllocVec(72,MEMF_CHIP);
    IF WaitPointer = NIL THEN CleanUp(getlocstr(MSG_NO_MEMORY), 20);
    CopyMem(^WaitPointerData,WaitPointer,72);
  END;
  PList := NIL;
  New(PList);
  NewList(PList);
  InitProgAdrs;
  eigenname:=holeeigenname;
END;


PROCEDURE WBKram;
VAR s : STRING[10];
    i : INTEGER;
BEGIN
 pfad := FindToolType(dobj^.do_ToolTypes, "PFAD");
 pubname := FindToolType(dobj^.do_ToolTypes, "PUBSCREEN");
END;

PROCEDURE DeleteAnyPort(VAR port:p_MsgPort);
VAR
  msg : p_Message;
BEGIN
  Forbid;
  IF Port <> NIL THEN
  BEGIN
    msg := GetMsg(Port);
    WHILE msg <> NIL DO
    BEGIN
      ReplyMsg(msg);
      msg := GetMsg(Port);
    END;
    RemPort(Port);
    DeleteMsgPort(Port);
  END;
  Port := NIL;
  Permit;
END;

{ -- AppIcon/AppWindow-Port -- }
PROCEDURE InitAppPort;
BEGIN
  AppPort := CreateMsgPort;
  IF AppPort = NIL THEN
  BEGIN
    s := GetLocStr(MSG_NO_MSGPORT);
    i := MeldReq("AddiPro",s,"OK");
    HALT(20);
  END;
  AppPort^.mp_Node.ln_Name := AppName;
  AppPort^.mp_Node.ln_Pri  := 0;
  AppPort^.mp_SigTask      := FindTask(NIL);
  AddPort(AppPort);
END;

PROCEDURE DeleteAppPort;
BEGIN
  DeleteAnyPort(AppPort);
END;

PROCEDURE fastexit;
 BEGIN
  Cleanup('Shit !  Addipro System Error! ... try to free (nearly) all resources ',0);
 END;

{ -- Kleines Hauptprogramm -- }
BEGIN
  ZeroVars;
  InitProgramStrings;
  Versionsprüfung;
  OpenLibs;    
  belegelocqual;
  InitMainImages;
  opentt;
  InitVars;
  InitAppPort;
{  AddExitServer(DeleteAppPort);}
  WBKram;
  GetPubScr;
  IF fromwb THEN BEGIN
  dobj      := GetDiskObjectNew(eigenname);
  myappicon := AddAppIconA(0,0,'Addipro',AppPort,NIL,dobj,NIL);
  IF myappicon = NIL THEN
  BEGIN
    FreeDiskObject(dobj);
    CleanUp(GetLocStr(MSG_NO_MEMORY),20);
  END;
  END;
  LoadPrefs("ENV:addipro.env");
{  AddExitserver(fastexit);}
  Main;
  IF Anzahl > 0 THEN DeleteAllPersons;
  CleanUp("",0);
END.
