#include "amytree.h"
#include "NewGUI.h"
#include "AMLOCALE.h"
#include <xpk/xpk.h>
#include <clib/xpkmaster_protos.h>
#include <clib/alib_protos.h>
#include <pragmas/xpkmaster_lib.h>
#include <prog_bar.h>

#define VER_STRING "AmyTree 2.2b © Cervo Antonio 1997"
#define PASSWORD "AmyTree by Cervo Antonio"

char version[]="\0$VER: AmyTree2.1b";


typedef struct { char name[20];
                 char surname[20];
                 char password[40];
               } utente;
             
struct Menu *CreateLocMenus(struct NewMenu *newMenus, ULONG tag, ...);
struct Gadget *CreateLocGadget(ULONG kind, struct Gadget *previous,
                              struct NewGadget *newGad, ULONG tag, ...);

struct DiskObject *diskobj;
struct AppIcon *appicon;

struct Library *XpkBase=NULL;

struct NewMenu GadMenu[] = {
                            { NM_TITLE, (STRPTR)MSG_PROJECT_MENU, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_LOAD, "L", 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_SAVE, "S", 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_SAVEXPK, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_SAVEDEFAULT, 0, 0, 0, 0,},
                            {   NM_ITEM,  NM_BARLABEL,      0 ,0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_NEWTREE, "M", 0, 0, 0,},
                            {   NM_ITEM,  NM_BARLABEL,      0 ,0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_INFO,  0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_ATO,  0, 0, 0, 0,},
                            {   NM_ITEM,  NM_BARLABEL,      0 ,0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PROJECT_QUIT, "Q", 0, 0, 0,},
                            { NM_TITLE, (STRPTR)MSG_ACTIONS_MENU , 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_ACTIONS_OPEN , 0, 0, 0, 0,},
                            {   NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_ACTIONS_CLOSE, 0, 0, 0, 0,},
                            {   NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PREFS_ICON,"I", 0, 0, 0,},
                            {   NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PREFS_FLUSH,"F",0, 0, 0,},
                            {   NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_CLONE, 0, 0, 0, 0,},
                            { NM_TITLE, (STRPTR)MSG_PREFS_MENU, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PREFS_NOSCROLLER,"R",CHECKIT|MENUTOGGLE,0,0,},
                            {   NM_ITEM, (STRPTR)MSG_PREFS_DIRSIZE,"D",CHECKIT|MENUTOGGLE,0,0,},
                            {   NM_ITEM, (STRPTR)MSG_PREFS_DIM,"T",CHECKIT|MENUTOGGLE,0,0,},
                            {   NM_ITEM, NM_BARLABEL, 0, 0, 0, 0,},          
                            {   NM_ITEM, (STRPTR)MSG_PREFS_SET,0, 0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_CONFIG, 0, 0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_XPK,"X",0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_EXT,"E",0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_DAT,"Y",0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_FONTS, 0, 0, 0, 0,},
                            {   NM_ITEM, (STRPTR)MSG_PREFS_FAST,0, 0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_FAST1, 0, 0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_FAST2, 0, 0, 0, 0,},
                            {    NM_SUB, (STRPTR)MSG_PREFS_FAST3, 0, 0, 0, 0,},
                            { NM_END, 0,       0 , 0, 0, 0},
                           };

void stampanodo(node *dire);

APTR       vi;
UWORD      pbar=0;
short int  ndir=0,maxliv=0;
short int  xb=16,yb=19,y=19;        /* xb,yb = coord. x e y di partenza, y = riga di partenza */
short int  xw=352, yw=160, xoff=24; /* xw,yw = larghezza e altezza finestra virtuale, xoff = sfasamento padre - figlio */
short int  ox=12,ox1,oy=19,oy1;     /* ox,ox1,oy,oy1 = zona visibile della finestra virtuale */
short int  topy,boty;
node       *result=NULL,*olddire=NULL, *listdire=NULL;
STRPTR     showername=NULL, playername=NULL, userprg1=NULL, userprg2=NULL,
           userprg3=NULL,userprg4=NULL,userprg5=NULL,userprg6=NULL,
           userprg7=NULL,userprg8=NULL;
STRPTR     userprgname1=NULL,userprgname2=NULL,userprgname3=NULL,userprgname4=NULL;
STRPTR     userprgname5=NULL,userprgname6=NULL,userprgname7=NULL,userprgname8=NULL;
STRPTR     fastbutton1_txt=NULL, fastbutton2_txt=NULL, fastbutton3_txt=NULL;
STRPTR     fast1_txt=NULL, fast2_txt=NULL, fast3_txt=NULL;
STRPTR     paramshow=NULL, paramplay=NULL, paramusr1=NULL, paramusr2=NULL, paramusr3=NULL,
           paramusr4=NULL, paramusr5=NULL, paramusr6=NULL, paramusr7=NULL, paramusr8=NULL;
lista_nodi *ln=NULL,*pln=NULL,*pn=NULL;
LONG       recl=1;
char       lof=-1,filename_sel[400];
BOOL       chkscr=TRUE, chksiz=FALSE, winopen;
struct     LocaleInfo locale;
short int  dim=TreD;
utente     *user;
char       titlewin[80];
BOOL       RegOK=FALSE;
STRPTR     packMethod=NULL;
LONG       PackMode=-1;
lst_list   *ExtList=NULL,*DTPList=NULL;
char stnum[20];

void   OpenMainWindow(void);
void   app_clean_up(void);
UWORD  GenTreeAsl(node **root, node **dire);
UWORD  GenTreeTmp(node **root, node **dire, STRPTR dir);
void   SaveAscii(node *root);
void   AggSizeGad(void);
void   RemSizeGad(void);
LONG   easyreq(STRPTR,STRPTR);
utente * ReadKey(void);
BOOL   CheckPass(utente *);
void   UnregMsg(void);
void   Crack(void);
void   InfoATO(void);
void   showlist(lst_list *);
void   HandleXpkWindow(struct Screen *customscreen,LONG left,LONG top,APTR userdata);
void   HandleExtWin(struct Screen *customscreen,LONG left,LONG top,lst_list *);
int    HandleIDatWin(struct Screen *customscreen,LONG left,LONG top,char *userdata);
void   HandleDT_Prefs(struct Screen *customscreen,LONG left,LONG top,lst_list *userdata);
void   LoadExtList(lst_list *);
void   SaveExtList(lst_list *);
void   LoadTypesList(lst_list *DTPList);
void   SaveTypesList(lst_list *DTPList);
void   riconfile(lst_list *, char *);
void   RicDataTypes(STRPTR filename);
void   CloneTree(node *root, int);
void   Clone(STRPTR dirname, node *root, PBAR *);
struct Window * OpenBarWin(PBAR **bar,int size);
STRPTR SetFastButton(void);
node * Scorri(node *);

void main(int argc, char *argv[])
{
   BPTR   lock;
   ULONG  imsgClass,imsgSecs,imsgMicr;
   UWORD  imsgCode,MouseX,MouseY,totalnode=0,iap=0,icl=0;
   ULONG  winsig,appwinsig,sigr;
   ULONG  menu, item, sub, stsec=0, stmic=0, lvsec=0, lvmic=0;
   BOOL   done=FALSE,def=TRUE;
   node   *root=NULL,*dire=NULL; 
   struct Gadget *gad;
   char   dirnamebuf[400],tt=0,tt1=0;
   struct FileInfoBlock *FIB;
 

   if(!(WorkbenchBase=OpenLibrary("workbench.library",0L))) ERRORE("non riesco ad aprire workbench.library");
   if(!(DataTypesBase=OpenLibrary("datatypes.library",0L))) ERRORE("non riesco ad aprire datatypes.library");
   if(!(AslBase=OpenLibrary("asl.library",0L))) ERRORE("non riesco ad aprire asl.library");   
   if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L))) ERRORE("non riesco ad aprire intuition.library");
   if(!(GadToolsBase=(struct Library *)OpenLibrary("gadtools.library",0L))) ERRORE("non riesco ad aprire gadtols.library");
   if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L))) ERRORE("non riesco ad aprire graphics.library");  
   if(!(UtilityBase=(struct Library *)OpenLibrary("utility.library",0L))) ERRORE("non riesco ad aprire utility.library");
   if(!(IconBase=(struct Library *)OpenLibrary("icon.library",0L))) ERRORE("non riesco ad aprire icon.library");
   if(!(LocaleBase=(struct Library *)OpenLibrary("locale.library",38))){ locale.li_LocaleBase=NULL; printf("\nporc!\n"); }
   else{
       catalog = OpenCatalogA(NULL,"AmyTree.catalog",NULL);
       locale.li_LocaleBase=LocaleBase; 
   }
   locale.li_Catalog=catalog;
   XpkBase=OpenLibrary(XPKNAME,0L);

   
   if((diskfont=OpenDiskFont(&xen8))==NULL) ERRORE("Installare il font XEN 8");
   tfont=xen8;  
   gfont=xen8;

   if((showername=(STRPTR)malloc(256))==NULL) ERRORE("Out of memory!");
   if((playername=(STRPTR)malloc(256))==NULL) ERRORE("Out of memory!");
   if((userprg1=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg2=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg3=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg4=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg5=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg6=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg7=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((userprg8=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((fast1_txt=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((fast2_txt=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if((fast3_txt=(STRPTR)malloc(256))==NULL)   ERRORE("Out of memory!");
   if(XpkBase) if((packMethod=(STRPTR)malloc(6))==NULL)   ERRORE("Out of memory!");

   if(XpkBase) strcpy(packMethod,"----");   
   strcpy(showername,"--------");
   strcpy(playername,"--------");  
   strcpy(userprg1,"--------");
   strcpy(userprg2,"--------");
   strcpy(userprg3,"--------");
   strcpy(userprg4,"--------");
   strcpy(userprg5,"--------");
   strcpy(userprg6,"--------");
   strcpy(userprg7,"--------");
   strcpy(userprg8,"--------");
   strcpy(fast1_txt,"--------");
   strcpy(fast2_txt,"--------");
   strcpy(fast3_txt,"--------");

   ExtList=MakeList();
   DTPList=MakeList();

   if(argc==2){ 
      if((lock=Lock(argv[1],ACCESS_READ))==0){
         printf("***Errore: controllare che la directory %s esista\n",argv[1]);
         exit(1);
      }
      FIB=AllocDosObject(DOS_FIB,NULL);
      if(Examine(lock,FIB)==0){
         printf("\n***Errore: non riesco a ottenere informazioni su %s\n",argv[1]);
         UnLock(lock);
         FreeDosObject(DOS_FIB, FIB);
         exit(2);
      }
      if(FIB->fib_DirEntryType<0){
         printf("***Errore: il file specificato non è una directory\n");
         UnLock(lock);
         FreeDosObject(DOS_FIB, FIB);
         exit(3);
      }
      dire=root=crea_tree(lock,argv[1],0);
      if(root) {xc(root)=xb; yc(root)=yb;}
      gen_coo(figlio(root));
      UnLock(lock); 
      FreeDosObject(DOS_FIB, FIB);
      def=FALSE;
   }


/*********************************************************/
/*                    CHECK KEY                          */
/*********************************************************/
   strcpy(titlewin,VER_STRING); 
   if((user=ReadKey()))
      if(CheckPass(user)){
         strcat(titlewin,"  reg. to ");
         strcat(titlewin,user->name);
         strcat(titlewin," ");
         strcat(titlewin,user->surname);
         RegOK=TRUE;
      }
      else{ strcat(titlewin," * CRACK! *"); Crack(); }
   else strcat(titlewin,"  * UNREGISTERED *");
/*********************************************************/

   if(RegOK){ 
      leggi_prefs();
      LoadExtList(ExtList);
      LoadTypesList(DTPList);
   }
      

   port=CreateMsgPort();  
   OpenMainWindow();

   winsig =    1L << w->UserPort->mp_SigBit;
   appwinsig = 1L << port->mp_SigBit; 

   NewList(&lista_files);
   ox1=ox+xw; oy1=oy+yw;
   topy=16; boty=yw+yb;
   maxliv=0; 
   max_liv(root);
   if(root) init_wintree(root,totalnode=ndir+1,maxliv+1,root);

   if((def)&&(RegOK)){
      node *lt;
      lt=load_tree_new("progdir:DEFAULT.TREE");
      if(lt){
         dire=root=lt;
         xc(root)=xb; yc(root)=yb;
         gen_coo(figlio(root));
         maxliv=0; max_liv(root);
         init_wintree(root,totalnode=ndir+1,maxliv+1,root);
      }
   }

   while (!done){
      sigr=Wait( winsig | appwinsig );   
      if((sigr & winsig)&&(winopen)){ 
         while ((winopen)&&(imsg=GT_GetIMsg(w->UserPort))) {
            imsgClass = imsg->Class;
            imsgCode = imsg->Code;
            imsgSecs = imsg->Seconds;
            imsgMicr = imsg->Micros;
            MouseX = imsg->MouseX;
            MouseY = imsg->MouseY;        
            gad=(struct Gadget *)imsg->IAddress;
            GT_ReplyIMsg(imsg);

            switch (imsgClass) {
               case IDCMP_CLOSEWINDOW: if(easyreq(GetString(&locale,MSG_SURE),GetString(&locale,MSG_YESNO))) done=TRUE; 
                                       if(!RegOK) UnregMsg();
                                       break; 
               case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
                                         DrawBevelBox(w->RPort,0,195,316,48,
                                                      GT_VisualInfo, vi,
                                                      TAG_DONE);
                                         DrawBevelBox(w->RPort,8,199,196,40,
                                                      GT_VisualInfo, vi,
                                                      GTBB_Recessed, TRUE,
                                                      TAG_DONE);                
                                         DrawBevelBox(w->RPort,9,200,194,38,
                                                      GT_VisualInfo, vi,
                                                      GTBB_FrameType, BBFT_ICONDROPBOX,
                                                      TAG_DONE);                
                                         GT_EndRefresh(w,TRUE);
                                         break;
               case IDCMP_MENUPICK: while(imsgCode!=MENUNULL){
                                       MItem=ItemAddress(MyMenu, imsgCode);
                                       menu=MENUNUM(imsgCode);
                                       item=ITEMNUM(imsgCode);
                                       sub=SUBNUM(imsgCode);
                                       if(menu==0)
                                          switch(item){
                                             case 0 :{ 
                                                        char filename[108];
                                                        if(AslRequest(FileReqLoad,MyTagsLoad)!=NULL){
                                                           node *lt;
                                                           strcpy(filename,FileReqLoad->rf_Dir);
                                                           if(AddPart(filename,FileReqLoad->rf_File,108)==0) ERRORE("FATAL AddPart");
                                                           ndir=0;
                                                           lt=load_tree_new(filename);                                                           
                                                           if(lt){
                                                              del_tree(root);
                                                              ox=12; oy=y=19;
                                                              ox1=ox+xw; oy1=oy+yw; 
                                                              dire=root=lt;
                                                              xc(root)=xb; yc(root)=yb;
                                                              gen_coo(figlio(root));
                                                              maxliv=0; max_liv(root);
                                                              init_wintree(root,totalnode=ndir+1,maxliv+1,root);
                                                           }
                                                         }
                                                      }
                                                      break;
                                            case 1 :  if(RegOK) save_tree(root,NULL,FALSE);
                                                      else UnregMsg();
                                                      break;
                                            case 2 :  if(RegOK){
                                                         if(XpkBase){
                                                            if(PackMode<0){
                                                                easyreq("Xpk prefs not found!\nPlease configure it now.","OK");
                                                                HandleXpkWindow(PubScreen,-1,-1,NULL);
                                                                WritePrefs();
                                                            }
                                                            save_tree(root,NULL,TRUE);
                                                         }
                                                      }
                                                      else UnregMsg();
                                                      break;
                                            case 3 :  if(RegOK) save_tree(root,"DEFAULT.tree",FALSE);
                                                      else UnregMsg();
                                                      break;
                                            case 5 : if(totalnode=GenTreeAsl(&root,&dire)){
                                                        maxliv=0; max_liv(root);
                                                        init_wintree(root,totalnode,maxliv+1,root);
                                                     }
                                                     break;
                                            case 7 : InfoWindow();
                                                     break;     
                                            case 8 : InfoATO();
                                                     break;
                                            case 10 :if(easyreq(GetString(&locale,MSG_SURE),GetString(&locale,MSG_YESNO))) done=TRUE; 
                                                     if(!RegOK) UnregMsg();
                                                     break;
                                      }
                                      if(menu==1)
                                        switch(item){
                                           case 0:if(root!=NULL)
                                                     if(easyreq(GetString(&locale,MSG_SURE),GetString(&locale,MSG_YESNO))){
                                                        int oldir=ndir;
                                                        SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                                        if(espandi_tutto(root)){
                                                           agg_scroller(totalnode+=(ndir-oldir),root,dire);
                                                           if(!visibile(dire)){
                                                              ULONG top=((yc(dire)-yb)/8);
                                                              if((totalnode-top)<20) top=totalnode-20;
                                                              GT_SetGadgetAttrs(ScrollerVert, w, NULL, 
                                                                                GTSC_Top, top,
                                                                                TAG_DONE);
                                                              oy=8*top+yb; oy1=oy+yw;
                                                              clearwin(w);
   	                                                      stampa_wintree(root,dim,dire);
                                                            print_text2(dire,2);
                                                           }
                                                           Num_dirs(ndir);    
                                                        }
                                                        SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                                     }
                                                   break;
                                           case 2:if(root!=NULL)
                                                     if(easyreq(GetString(&locale,MSG_SURE),GetString(&locale,MSG_YESNO))){
                                                        iap=chiudi_tutto(root);
                                                        dire=root;
                                                        ox=12; oy=y=yb;
                                                        ox1=ox+xw; oy1=oy+yw;
                                                        agg_scroller(totalnode-=iap,root,dire);
                                                        GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                                                                          GTSC_Top,0, 
                                                                          TAG_DONE); 
                                                        agg_button(dire);
                                                        Num_dirs((ndir-=iap));
                                                     }
                                                  break;
                                             case 4 : if(!RegOK){ UnregMsg(); break; }
                                                      diskobj=GetDiskObjectNew("progdir:amytree");
                                                      appicon=AddAppIcon(1,0,"AmyTree",port,NULL,diskobj,TAG_DONE);
                                                      app_clean_up();
                                                      chksiz=FALSE;
                                                      break;  
                                             case 6 : SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                                      FlushIBuffer(root);
                                                      SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                                      break;   
                                             case 8 : if(root) CloneTree(root,totalnode);
                                                      else easyreq("Clone what?","OK! Sorry");
                                                      break;
                                         }
                                      if(menu==2)
                                         switch(item){
                                            case 0 : if(chkscr==TRUE) chkscr=FALSE;
                                                     else chkscr=TRUE;
                                                     break;
                                            case 1 : if(!RegOK){ UnregMsg(); break; }
                                                     if(chksiz){ 
                                                        chksiz=FALSE;
                                                        RemSizeGad();
                                                        GT_SetGadgetAttrs(View_String, w, NULL,
                                                                          GTST_String, fullpath(dire),
                                                                          TAG_DONE);
                                                     }
                                                     else{
                                                         chksiz=TRUE;
                                                         AggSizeGad();
                                                         agg_button(dire);
                                                     }
                                                     break;
                                            case 2 : if(dim==TreD) dim=DueD;
                                                     else dim=TreD; 
                                                     if(root){
                                                        clearwin(w);
                                                        stampa_wintree(root,dim,dire);
                                                        print_text2(dire,2); 
                                                     }
                                                     break;  

                                             case 4: switch(sub){
                                                        case 0: if(!RegOK) { UnregMsg(); break; }
                                                                if((RegOK)&&(!(user=ReadKey()))) Crack();
                                                                else                                                     
                                                                   if(CheckPass(user)){
                                                                      Handleprefwin(PubScreen,-1,-1,NULL);
                                                                      WritePrefs();
                                                                      AggUserGad();
                                                                   }
                                                                   else Crack();
                                                                break;
                                                       case 1: if(XpkBase){
                                                                   HandleXpkWindow(PubScreen,-1,-1,NULL);
                                                                   WritePrefs();
                                                                 }
                                                                 else easyreq("Xpk Libraries not Found!","ok");
                                                               break;
                                                       case 2: HandleExtWin(PubScreen,-1,-1,ExtList);
                                                               break;
                                                       case 3: HandleDT_Prefs(PubScreen,-1,-1,DTPList);
                                                               break;
                                                       case 4:{ BOOL success;
                                                                success=AslRequest(FontReq,FTags);
                                                                if(success){
                                                                   if((diskfont=OpenDiskFont(&(FontReq->fo_Attr)))==NULL) ERRORE("Font selezionato");
                                                                       switch(FontReq->fo_DrawMode){
                                                                              case 0: if(root==NULL) break;
                                                                                      tfont=FontReq->fo_Attr;
                                                                                      tfont.ta_Name=(STRPTR)malloc(strlen(FontReq->fo_Attr.ta_Name)+1);
                                                                                      strcpy(tfont.ta_Name,FontReq->fo_Attr.ta_Name);
                                                                                      clearwin(w);
                                                                                      y=19;
                                                                                      gen_coo(figlio(root));
                                                                                      stampa_wintree(root,dim,dire);
                                                                                      print_text2(dire,2);
                                                                                      break;
                                                                              case 1: easyreq(GetString(&locale,MSG_ALERTFONT),"OK");
                                                                                       break;   
                                                                      }  
                                                                   }  
                                                                }       
                                                                break;
                                                             }
                                                             break;
                                              case 5: switch(sub){
                                                         case 0: {
                                                                   STRPTR fb;
                                                                   fb=SetFastButton();
                                                                   if(!fb) break;
                                                                   strcpy(fast1_txt,fb); 
                                                                   fastbutton1_txt=FilePart(fast1_txt);
                                                                   if(*(fastbutton1_txt)=='\0') fastbutton1_txt=fast1_txt;
                                                                   if(strlen(fastbutton1_txt)>10){
                                                                      char tmp[30];
                                                                      strcpy(tmp,fastbutton1_txt);
                                                                      fastbutton1_txt=(char *)malloc(11);
                                                                      strcpy(fastbutton1_txt,leftcar(tmp,10));
                                                                   }
                                                                   WritePrefs();
                                                                   AggUserGad();
                                                                 }
                                                                 break;
                                                         case 1: {
                                                                   STRPTR fb;
                                                                   fb=SetFastButton();
                                                                   if(!fb) break;
                                                                   strcpy(fast2_txt,fb); 
                                                                   fastbutton2_txt=FilePart(fast2_txt);
                                                                   if(*(fastbutton2_txt)=='\0') fastbutton2_txt=fast2_txt;                                                                 
                                                                   if(strlen(fastbutton2_txt)>10){
                                                                      char tmp[30];
                                                                      strcpy(tmp,fastbutton2_txt);
                                                                      fastbutton2_txt=(char *)malloc(11);
                                                                      strcpy(fastbutton2_txt,leftcar(tmp,10));
                                                                   }
                                                                   WritePrefs();
                                                                   AggUserGad();
                                                                 }
                                                                 break;
                                                         case 2: {
                                                                   STRPTR fb;
                                                                   fb=SetFastButton();
                                                                   if(!fb) break;
                                                                   strcpy(fast3_txt,fb); 
                                                                   fastbutton3_txt=FilePart(fast3_txt);
                                                                   if(*(fastbutton3_txt)=='\0') fastbutton3_txt=fast3_txt;
                                                                   if(strlen(fastbutton3_txt)>10){
                                                                      char tmp[30];
                                                                      strcpy(tmp,fastbutton3_txt);
                                                                      fastbutton3_txt=(char *)malloc(11);
                                                                      strcpy(fastbutton3_txt,leftcar(tmp,10));
                                                                   }
                                                                   WritePrefs();
                                                                   AggUserGad();
                                                                 }
                                                                 break;
                                                      }
                                                      break;
                                         }
                                      if(winopen) imsgCode=MItem->NextSelect;
                                      else imsgCode=MENUNULL;
                                    }
                                    break;


               case IDCMP_MOUSEBUTTONS:if((imsgCode==SELECTDOWN)&&(root!=NULL))
                                           if((MouseX>=6)&&(MouseY>=20+BARH(PubScreen))&&
                                              (MouseX<=400)&&(MouseY<=179+BARH(PubScreen))){
                                              int p;
                                              result=NULL; 
                                              p=TBH(PubScreen);
                                              cerca_node(MouseY-yb+oy-p,root);

                                              if(visibile(result)) 
                                                 if(result!=NULL){                                                  
                                                    if(visibile(dire)) print_text2(dire,0);
                                                    olddire=dire;
                                                    dire=result;
                                                    print_text2(dire,2);
                                                    if(dire->flag1!=0)                                                        
                                                       switch(++tt){       
                                                           case 1: stsec=imsgSecs; stmic=imsgMicr; break;
                                                           case 2: if(olddire==dire){
                                                                      if(DoubleClick(stsec,stmic,imsgSecs,imsgMicr))
                                                                         if((iap=apri_dir(fullpath(dire),dire,recl))!=0){
                                                                            agg_scroller(totalnode+=iap,root,dire);  
                                                                            Num_dirs(ndir);
                                                                         }
                                                                         else
                                                                           if((icl=chiudi_dir(dire))!=0){
                                                                              agg_scroller(totalnode-=icl,root,dire);
                                                                              Num_dirs((ndir-=icl));
                                                                           }  
                                                                   }       
                                                                   tt=0; break;
                                                       }
                                                    agg_button(dire);
                                                 }
                                           }                                        
                                        break;
               case IDCMP_MOUSEMOVE:
                    if(chkscr)
                       switch(gad->GadgetID){
                       case SCROLLER    :{ int oyold=oy,sy;
                                        if((gad==ScrollerVert)&&(root!=NULL)){
                                           oy=8*imsgCode+yb;
                                           oy1=oy+yw;
                                           if((sy=oy-oyold)<-160) sy=160;     
                                           ScrollWindowRaster(w,0,sy,16,19,368,178);
                                           stampa_wintree(root,dim,dire);
//                                           if(visibile(dire)) print_text2(dire,2);
                                         }
                                         if((gad==ScrollerOriz)&&(root!=NULL)){
                                            ox=xoff*imsgCode+12;
                                            ox1=ox+xw;
                                            clearwin(w);
                                            stampa_wintree(root,dim,dire);
//                                            if(visibile(dire)) print_text2(dire,2);
                                         }  
                                         agg_button(dire);
                                         }
                                         break; 
                      }
                   break;
               case IDCMP_GADGETUP:
                    switch(gad->GadgetID){
                      case STRING    : if(gad==View_String){
                                          struct FileInfoBlock *FIB=NULL;
                                          BPTR lock;      
                                          char name[400];
                                          FIB=AllocDosObject(DOS_FIB,NULL);
                                          strcpy(name,getstring(View_String));
                                          if((lock=Lock(name,ACCESS_READ))==0){
                                               DisplayBeep(w->WScreen);
                                               easyreq(GetString(&locale,MSG_FILENOTFOUND),"ok");
                                               GT_SetGadgetAttrs(View_String, w, NULL,
                                                                 GTST_String, fullpath(dire),
                                                                 TAG_DONE);
                                          }
                                          else{
                                             if(Examine(lock,FIB)==0) ERRORE("Fatal Examine");
                                             if(FIB->fib_DirEntryType<0){  
                                                DisplayBeep(w->WScreen);
                                                easyreq(GetString(&locale,MSG_PLAINFILE),"OK");
                                                GT_SetGadgetAttrs(View_String, w, NULL,
                                                                  GTST_String, fullpath(dire),
                                                                  TAG_DONE);
                                             }
                                             else{
                                                del_tree(root);
                                                ox=12; oy=y=19; ndir=0;
                                                olddire=NULL;
                                                dire=root=crea_tree(lock,name,0);
                                                gen_coo(figlio(root));
                                                ox1=ox+xw; oy1=oy+yw; 
                                                maxliv=0; max_liv(root);
                                                init_wintree(root,totalnode=ndir+1,maxliv+1,root);
                                             }
                                          }
                                          UnLock(lock);
                                          FreeDosObject(DOS_FIB, FIB);
                                       }
                                       break;   
                      case LISTVIEW  : {
                                          struct Node *items;
                                          UWORD ucode;
                                          int i;
                                          switch(++tt1){
                                             case 1: lvsec=imsgSecs; lvmic=imsgMicr; ucode=imsgCode;
                                                     break;
                                             case 2: if(ucode == imsgCode)
                                                        if(DoubleClick(lvsec,lvmic,imsgSecs,imsgMicr)){
                                                           SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                                           riconfile(ExtList,filename_sel); 
                                                           SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                                         }
                                                         else { lvsec=imsgSecs; lvmic=imsgMicr; ucode=imsgCode; tt1=1; 
                                                                break; }
                                                      tt1=0;
                                                      break;
                                          }
                                          items=lista_files.lh_Head;
                                          for(i=0;i<imsgCode;i++) items=items->ln_Succ;
                                          strcpy(filename_sel,fullpath(dire));
                                          AddPart(filename_sel,items->ln_Name,400);
                                        }
                                        break;
                      case BUTTON    :if(gad==newtree_gad){
                                        if(totalnode=GenTreeAsl(&root,&dire)){
                                            maxliv=0; max_liv(root);
                                            init_wintree(root,totalnode,maxliv+1,root);
                                        }
                                        break;
                                      }
                                      if(gad==clone_gad){
                                         if(root) CloneTree(root,totalnode);
                                         else easyreq("Clone what?","OK! Sorry");
                                         break;
                                      }
                                      if(gad==dimdir_gad){
                                         if(!RegOK){ UnregMsg(); break; }
                                         if(chksiz==TRUE){ 
                                            chksiz=FALSE;
                                            RemSizeGad();
                                            GT_SetGadgetAttrs(View_String, w, NULL,
                                                              GTST_String, fullpath(dire),
                                                              TAG_DONE);
                                         }
                                         else{
                                            chksiz=TRUE;
                                            AggSizeGad();
                                            agg_button(dire);
                                         }
                                         break;
                                      }
                                      if(gad==OpenBranch){
                                         if((iap=apri_dir(fullpath(dire),dire,1000))!=0){
                                            agg_scroller(totalnode+=iap,root,dire);  
                                            agg_button(dire);
                                            Num_dirs(ndir);
                                        }
                                        break;
                                      }
                                      if(gad==on_off){ listga((lof=-lof),dire); break; }
                                      if(gad==ViewButton){ 
                                         SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                         viewfile(filename_sel);
                                         SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);    
                                         break;
                                       }
                                       if(gad==InfoButton){ info_window(filename_sel); break; }
                                       if(gad==ApriButton){                                         
                                          if((iap=apri_dir(fullpath(dire),dire,recl))!=0){ 
                                             agg_scroller(totalnode+=iap,root,dire);  
                                             agg_button(dire);
                                             Num_dirs(ndir);
                                           }               
                                           break;
                                       }                          
                                       if(gad==ChiudiButton){
                                         if((icl=chiudi_dir(dire))!=0){
                                             agg_scroller(totalnode-=icl,root,dire);
                                             agg_button(dire);
                                             Num_dirs((ndir-=icl));
                                          }
                                          break;
                                       }
                                       if(gad==CercaButton){                                
                                          BOOL cont=TRUE;
                                          STRPTR str=NULL;
                                          if(!RegOK) { UnregMsg(); break; }
                                          if((str=cerca())!=NULL){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             cerca_node_1(str,root); pln=pn;
                                             do{                                             
                                                if(pn!=NULL){
                                                   GT_SetGadgetAttrs(ScrollerOriz, w, NULL,
                                                                     GTSC_Top, 0,
                                                                     TAG_DONE);
                                                   ox=12; ox1=ox+xw;                                                        
                                                   print_text2(dire,0);
                                                   olddire=dire;
                                                   dire=pn->fnode;
                                                   if(!visibile(dire)){
                                                      ULONG top=((yc(dire)-yb)/8);
                                                      if((totalnode-top)<20) top=totalnode-20;
                                                      GT_SetGadgetAttrs(ScrollerVert, w, NULL, 
                                                                        GTSC_Top, top,                                                              
                                                                        TAG_DONE);
                                                      oy=8*top+yb; oy1=oy+yw;
                                                      if(!visibilex(dire)){
                                                         top=((xc(dire)-xb)/24);  
                                                         if((maxliv+1-top)<10) top=(maxliv+1)-10;
                                                         GT_SetGadgetAttrs(ScrollerOriz, w, NULL, 
                                                                           GTSC_Top, top, 
                                                                           TAG_DONE);
                                                         ox=xoff*top+xb; ox1=ox+xw;
                                                      }
                                                   }
                                                   clearwin(w);
                                                   stampa_wintree(root,dim,dire);
                                                   print_text2(dire,2);                                                   
                                                   agg_button(dire);
                                                   cont=easyreq(GetString(&locale,MSG_SEARCH),GetString(&locale,MSG_YESNO));
                                                   pn=pn->succ;
				               } 
                                               else { DisplayBeep(w->WScreen); cont=FALSE; }
                                             }
                                             while(cont);  
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                             free(str); free_list();
			                  }
                                         break;
                                       }                                        
                                       if(gad==ShowButton){
                                          if(strcmp(showername,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,0);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELSHOW),"OK"); 
                                          break;
                                       }
                                       if(gad==PlayButton){
                                          if(strcmp(playername,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,1);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELPLAY),"OK"); 
                                          break;
                                       }
                                       if(gad==UserButton1){
                                          if(strcmp(userprg1,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,2);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK"); 
                                          break;
                                       }
                                       if(gad==UserButton2){
                                          if(strcmp(userprg2,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,3);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       }  
                                       if(gad==UserButton3){
                                          if(strcmp(userprg3,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,4);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       }  
                                       if(gad==UserButton4){
                                          if(strcmp(userprg4,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,5);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       }  
                                       if(gad==UserButton5){
                                          if(strcmp(userprg5,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,6);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       }
                                       if(gad==UserButton6){
                                          if(strcmp(userprg6,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,7);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       }  
                                       if(gad==UserButton7){
                                          if(strcmp(userprg7,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,8);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       }  
                                       if(gad==UserButton8){
                                          if(strcmp(userprg8,"--------")!=0){
                                             SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                             esegui(filename_sel,9);
                                             SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                          }
                                          else easyreq(GetString(&locale,MSG_SELUSR),"OK");
                                          break;
                                       } 
                                      if(gad==IconButton){
                                         if(!RegOK){ UnregMsg(); break; }
                                         diskobj=GetDiskObjectNew("progdir:amytree");
                                         appicon=AddAppIcon(1,0,"AmyTree",port,NULL,diskobj,TAG_DONE);
                                         app_clean_up();
                                         chksiz=FALSE;
                                         break;
                                      }  
                                      if((gad==SysButton)&&(fastbutton1_txt)){
                                         UWORD nd;
                                         if((nd=GenTreeTmp(&root,&dire,fast1_txt))){
                                            totalnode=nd;
                                            maxliv=0; max_liv(root);
                                            init_wintree(root,totalnode,maxliv+1,root);
                                         }
                                         break;
                                      }
                                      if((gad==WorkButton)&&(fastbutton2_txt)){
                                         UWORD nd;
                                         if((nd=GenTreeTmp(&root,&dire,fast2_txt))){
                                            totalnode=nd;
                                            maxliv=0; max_liv(root);
                                            init_wintree(root,totalnode,maxliv+1,root);
                                         }
                                         break;
                                      }
                                      if((gad==CDButton)&&(fastbutton3_txt)){
                                         UWORD nd;
                                         if((nd=GenTreeTmp(&root,&dire,fast3_txt))){
                                            totalnode=nd;
                                            maxliv=0; max_liv(root);
                                            init_wintree(root,totalnode,maxliv+1,root);
                                         }
                                         break;
                                      }
                                      break;
                    case SCROLLER    :
                                     if((gad==ScrollerVert)&&(root!=NULL)&&(!chkscr)){
                                        oy=8*imsgCode+yb;
                                        oy1=oy+yw;
                                        clearwin(w);
                                        stampa_wintree(root,dim,dire);
//                                        if(visibile(dire)) print_text2(dire,2);
//                                        if(visibilex(dire)) print_text2(dire,2);
                                      }

                                      if((gad==ScrollerOriz)&&(root!=NULL)){
                                         ox=xoff*imsgCode+12;
                                         ox1=ox+xw;
                                         clearwin(w);
                                         stampa_wintree(root,dim,dire);
//                                         if(visibile(dire)) print_text2(dire,2);                                              
                                      }  
                                      agg_button(dire);
                                      break; 
                    case INTEGER     :
                                       if(gad==Rec_Lev)
                                          recl=((struct StringInfo *)gad->SpecialInfo)->LongInt;
                                       if(recl<1){
                                          recl=1;
                                          GT_SetGadgetAttrs(Rec_Lev, w, NULL,
                                                            GTIN_Number, recl,
                                                            TAG_DONE);
                                       }
                                       break;
                      default        : break;
                    }
                    break;


                case IDCMP_RAWKEY:
                if (imsgCode & 0x80){ agg_button(dire); break;}
                if(dire!=NULL){
		    switch (imsgCode)
		    {                                                
                        case CURSORRIGHT: if((iap=apri_dir(fullpath(dire),dire,recl))!=0){
                                             agg_scroller(totalnode+=iap,root,dire);  
                                             agg_button(dire);
                                             Num_dirs(ndir);
                                          }
                                          else{
                                           int oyold=oy,sy;
                                           if(visibile(dire)) print_text2(dire,0);
                                           if(figlio(dire)) dire=figlio(dire);
                                           if(visibile(dire)) print_text2(dire,2);
                                           else
                                              if(yc(dire)>oy){
                                                 oy+=8;                                                                                                            
                                                 oy1=oy+yw;
                                                 if((sy=oy-oyold)<-160) sy=160;     
                                                 ScrollWindowRaster(w,0,sy,16,19,368,178);
                                                 stampa_wintree(root,dim,dire);
                                                 GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                                                                   GTSC_Top, (oy-yb)/8,
                                                                   TAG_DONE);
                                              }
                                         }
                                         break;

                        case CURSORDOWN:{
                                           int oyold=oy,sy;                                           
                                           if(visibile(dire)) print_text2(dire,0);
                                           if(figlio(dire)) dire=figlio(dire);
                                           else if(frasucc(dire)) dire=frasucc(dire);
                                                else{  BYTE c=1;
                                                       node *tmp=dire;
                                                       while(c){
                                                          if(padre(tmp)){
                                                             tmp=padre(tmp);
                                                             if(frasucc(tmp)){ 
                                                                dire=frasucc(tmp); 
                                                                c=0; 
                                                             }
                                                          }
                                                          else c=0;
                                                       }
                                                }     
                                           if(visibile(dire)) print_text2(dire,2);
                                           else
                                              if(yc(dire)>oy){
                                                 oy+=8;                                                                                                            
                                                 oy1=oy+yw;
                                                 if((sy=oy-oyold)<-160) sy=160;     
                                                 ScrollWindowRaster(w,0,sy,16,19,368,178);
                                                 stampa_wintree(root,dim,dire);
                                                 GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                                                                   GTSC_Top, (oy-yb)/8,
                                                                   TAG_DONE);
                                              }
                                           break;
                                        }
                        case CURSORUP:{
                                           int oyold=oy,sy;
                                           if(visibile(dire)) print_text2(dire,0);
                                           if(fraprec(dire))
                                              if(figlio(fraprec(dire))) dire=Scorri(figlio(fraprec(dire)));
                                              else dire=fraprec(dire);
                                           else if(padre(dire)) dire=padre(dire);
                                           if(visibile(dire)) print_text2(dire,2);
                                           else
                                              if(yc(dire)<oy){
                                                 oy-=8;                                                                                                            
                                                 oy1=oy+yw;
                                                 if((sy=oy-oyold)<-160) sy=160;     
                                                 ScrollWindowRaster(w,0,sy,16,19,368,178);
                                                 stampa_wintree(root,dim,dire);
                                                 GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                                                                   GTSC_Top, (oy-yb)/8,
                                                                   TAG_DONE);
                                             }
                                           break;

                                       }
                        case CURSORLEFT:/* SIN va sul padre */
                             if((icl=chiudi_dir(dire))!=0){
                                agg_scroller(totalnode-=icl,root,dire);
                                agg_button(dire);
                                Num_dirs((ndir-=icl));
                             } 
                             else                             
                             if(padre(dire)!=NULL){ 
                                if(visibile(dire)) print_text2(dire,0);
                                dire=padre(dire);
                                if(visibile(dire)) print_text2(dire,2);                                          
                                else{
                                   if(!visibiley(dire)){ oy-=(oy-yc(dire)); oy1=oy+yw;}
                                      if(!visibilex(dire)){ ox-=xoff; ox1=ox+xw; }
                                   clearwin(w);
                                   stampa_wintree(root,dim,dire);
                                 }         
                                 GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                                                   GTSC_Top, (oy-yb)/8,
                                                   TAG_DONE);
                                 GT_SetGadgetAttrs(ScrollerOriz, w, NULL,
                                                   GTSC_Top, (ox-12)/24,
                                                   TAG_DONE);                   
                             }
                             break;                      
                   } 
//                  agg_button(dire);
                  }
                  break;

/* 
               case IDCMP_VANILLAKEY:
                  if(dire!=NULL){
   		     switch (imsgCode){
//                        case '0': stampanodo(dire); break;                
                        case 'O':
        			case 'o': if((iap=apri_dir(fullpath(dire),dire,recl))!=0){
                                     agg_scroller(totalnode+=iap,root,dire);  
                                     agg_button(dire);
                                     Num_dirs(ndir);
                                  }
                                  break;
                        case 'C':
                        case 'c': if((icl=chiudi_dir(dire))!=0){
                                     agg_scroller(totalnode-=icl,root,dire);
                                     agg_button(dire);
                                     Num_dirs((ndir-=icl));
                                  }
                                  break;
                        case 's':
                        case 'S':{
                                  BOOL cont=TRUE;
                                  STRPTR str=NULL;
                                  if((str=cerca())!=NULL){
                                     SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
                                     cerca_node_1(str,root); pln=pn;
                                     do{                                             
                                        if(pn!=NULL){
                                           GT_SetGadgetAttrs(ScrollerOriz, w, NULL,
                                                             GTSC_Top, 0,
                                                             TAG_DONE);
                                           ox=12; ox1=ox+xw;
                                           print_text2(dire,0);
                                           olddire=dire;
                                           dire=pn->fnode;
                                           if(!visibile(dire)){
                                              ULONG top=((yc(dire)-yb)/8);
                                              if((totalnode-top)<20) top=totalnode-20;
                                              GT_SetGadgetAttrs(ScrollerVert, w, NULL, 
                                                                GTSC_Top, top,                                                              
                                                                TAG_DONE);
                                              oy=8*top+yb; oy1=oy+yw;
                                              if(!visibilex(dire)){
                                                 top=((xc(dire)-xb)/24);  
                                                 if((maxliv+1-top)<10) top=(maxliv+1)-10;
                                                 GT_SetGadgetAttrs(ScrollerOriz, w, NULL, 
                                                                   GTSC_Top, top, 
                                                                   TAG_DONE);
                                                 ox=xoff*top+xb; ox1=ox+xw;
                                              }
                                        }
                                        clearwin(w);
                                        stampa_wintree(root,dim,dire);
                                        print_text2(dire,2);                                                   
                                        agg_button(dire);
                                        cont=easyreq(GetString(&locale,MSG_SEARCH),GetString(&locale,MSG_YESNO));
                                        pn=pn->succ;
				        } 
                                        else { DisplayBeep(w->WScreen); cont=FALSE; }
                                     }
                                     while(cont);  
                                     SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
                                     free(str); free_list();
			            }
                                   }
                                    break;
                        case 'l':
                        case 'L': listga((lof=-lof),dire); break;
                        case 32 : if((iap=apri_dir(fullpath(dire),dire,1000))!=0){
                                     agg_scroller(totalnode+=iap,root,dire);  
                                     agg_button(dire);
                                     Num_dirs(ndir);
                                  }
                                  break;                        
                        case 13 : if((iap=apri_dir(fullpath(dire),dire,recl))!=0){
                                     agg_scroller(totalnode+=iap,root,dire);  
                                     Num_dirs(ndir);
                                     agg_button(dire);
                                  }
                                  else
                                    if((icl=chiudi_dir(dire))!=0){
                                       agg_scroller(totalnode-=icl,root,dire);
                                       Num_dirs((ndir-=icl));
                                      agg_button(dire);
                                    }
                                  break;  
                    } 
                 }
*/
            }
      }
    }
  
    if(sigr & appwinsig){
       amsg=(struct AppMessage *) GetMsg(port);
       argptr=amsg->am_ArgList;
       switch(amsg->am_Type){
                case AMTYPE_APPWINDOW : del_tree(root);
                                        ox=12; oy=y=19; ndir=0;
                                        NameFromLock(argptr->wa_Lock,dirnamebuf,400);
                                        olddire=NULL;
                                        dire=root=crea_tree(argptr->wa_Lock,dirnamebuf,0);
                                        gen_coo(figlio(root));
                                        ox1=ox+xw; oy1=oy+yw; 
                                        maxliv=0; max_liv(root);
                                        init_wintree(root,totalnode=ndir+1,maxliv+1,root);
                                        break;
                case AMTYPE_APPICON  :

                                      if(amsg->am_NumArgs!=0){
                                           del_tree(root);
                                           ox=12; oy=y=19; ndir=0;
                                           NameFromLock(argptr->wa_Lock,dirnamebuf,400);
                                           olddire=NULL;
                                           dire=root=crea_tree(argptr->wa_Lock,dirnamebuf,0);
                                           gen_coo(figlio(root));
                                           ox1=ox+xw; oy1=oy+yw; 
                                           maxliv=0; max_liv(root);
                                        }

                                        RemoveAppIcon(appicon);
                                        appicon=NULL;
                                        OpenMainWindow();
                                        winsig =    1L << w->UserPort->mp_SigBit;
                                        if(root){
                                           ULONG top=((yc(dire)-yb)/8);
                                           init_wintree(root,totalnode=ndir+1,maxliv+1,dire);
                                           GT_SetGadgetAttrs(ScrollerVert, w, NULL, 
                                                             GTSC_Top, top,         
                                                             TAG_DONE);
                                           if((maxliv+1-top)<10) top=(maxliv+1)-10;
                                              GT_SetGadgetAttrs(ScrollerOriz, w, NULL, 
                                                                GTSC_Top, top, 
                                                                TAG_DONE);
                                           if(lof==1){
                                              listdire=NULL;
                                              GT_SetGadgetAttrs(filelist,w,NULL,
                                                                GA_Disabled,FALSE,
                                                                TAG_DONE);
                                              agg_listview(dire);
                                           }                               
                                        }
                                        break;                                        
      }
       while(amsg = (struct AppMessage *)GetMsg(port))
                               ReplyMsg((struct Message *)amsg);
    }            
  }
  if(root) del_tree(root); 
  clean_up();
}

void OpenMainWindow(void)
{
   PubScreen=LockPubScreen(NULL);
   crea_gadget();  

   MyMenu=CreateLocMenus(GadMenu,
                         GTMN_NewLookMenus,TRUE,
                         TAG_DONE);
  
   w=OpenWindowTags(NULL,
                    WA_Left,0,
                    WA_Top,0,
                    WA_Width,640,
                    WA_Height,256+PubScreen->Font->ta_YSize-8,
                    WA_MinWidth,422,
                    WA_MinHeight,207+PubScreen->Font->ta_YSize-8,
                    WA_MaxWidth,640,
                    WA_MaxHeight,256+PubScreen->Font->ta_YSize-8,
                    WA_Flags,WFLG_DRAGBAR|WFLG_SMART_REFRESH
                            |WFLG_ACTIVATE|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET
                            |WFLG_REPORTMOUSE|WFLG_NEWLOOKMENUS
                            |WFLG_SIZEGADGET|WFLG_GIMMEZEROZERO,
                    WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE
                            |IDCMP_GADGETUP|IDCMP_GADGETDOWN
                            |IDCMP_MENUPICK|IDCMP_CLOSEWINDOW|IDCMP_INTUITICKS
                            |IDCMP_RAWKEY|IDCMP_IDCMPUPDATE
                            |IDCMP_REFRESHWINDOW|IDCMP_NEWSIZE,
                    WA_Title,titlewin,
                    WA_Gadgets,MyGadList,
                    TAG_DONE);


   UnlockPubScreen(NULL,PubScreen);
   SetMenuStrip(w, MyMenu);

   DrawBevelBox(w->RPort,0,14,383,172,
                GTBB_FrameType, BBFT_ICONDROPBOX,
                GT_VisualInfo, vi,
                TAG_DONE);

   DrawBevelBox(w->RPort,0,195,316,48,
                GT_VisualInfo, vi,
                TAG_DONE);

   DrawBevelBox(w->RPort,8,199,196,40,
                GT_VisualInfo, vi,
                GTBB_Recessed, TRUE,
                TAG_DONE);                

   DrawBevelBox(w->RPort,9,200,194,38,
                GT_VisualInfo, vi,
                GTBB_FrameType, BBFT_ICONDROPBOX,
                TAG_DONE);                


   GT_RefreshWindow(w,NULL);

   apw=AddAppWindow(1,0,w,port,TAG_DONE);
   winopen=TRUE;
   chkscr=TRUE;
   SetAPen(w->RPort,1);

   FileReqLoad=AllocAslRequest(ASL_FileRequest,MyTagsLoad);
   FileReqSave=AllocAslRequest(ASL_FileRequest,MyTagsSave);
   FileGenTree=AllocAslRequest(ASL_FileRequest,MyTagsGenTree);
   FileVis=AllocAslRequest(ASL_FileRequest,MyTagsVis);  
   FontReq=AllocAslRequest(ASL_FontRequest,FTags);
}

void app_clean_up(void)
{
  if(FileReqLoad)   FreeFileRequest(FileReqLoad);
  if(FileReqSave)   FreeFileRequest(FileReqSave);
  if(FileGenTree)   FreeFileRequest(FileGenTree);
  if(FileVis)       FreeFileRequest(FileVis);  
  if(FontReq)       FreeAslRequest(FontReq);
  if(apw)           RemoveAppWindow(apw);
  if(MyMenu)        ClearMenuStrip(w);
  if(MyMenu)        FreeMenus(MyMenu);
  if(w)             CloseWindow(w);
  if(MyGadList)     FreeGadgets(MyGadList);
  if(vi)            FreeVisualInfo(vi);
  winopen=FALSE;
}

void clean_up(void)
{
  if(diskfont)      CloseFont(diskfont);
  if(rem_key)       FreeRemember(&rem_key,TRUE);
  if(FileReqLoad)   FreeFileRequest(FileReqLoad);
  if(FileReqSave)   FreeFileRequest(FileReqSave);
  if(FileGenTree)   FreeFileRequest(FileGenTree);
  if(FileVis)       FreeFileRequest(FileVis);  
  if(FontReq)       FreeAslRequest(FontReq);
  if(port)          DeleteMsgPort(port);
  if(diskobj)       FreeDiskObject(diskobj);
  if(appicon)       RemoveAppIcon(appicon);
  if(apw)           RemoveAppWindow(apw);
  if(MyMenu)        ClearMenuStrip(w);
  if(MyMenu)        FreeMenus(MyMenu);      
  if(w)             CloseWindow(w);
//  if(PubScreen)     UnlockPubScreen(NULL,PubScreen); /* non piu' necessario in questa posizione */
  if(MyGadList)     FreeGadgets(MyGadList);
  if(vi)            FreeVisualInfo(vi);
  if(IconBase)      CloseLibrary(IconBase);
  if(WorkbenchBase) CloseLibrary(WorkbenchBase);
  if(DataTypesBase) CloseLibrary(DataTypesBase);
  if(AslBase)       CloseLibrary(AslBase);
  if(GfxBase)       CloseLibrary((struct Library *)GfxBase);
  if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  if(UtilityBase)   CloseLibrary(UtilityBase);
  if(GadToolsBase)  CloseLibrary(GadToolsBase);
  if(LocaleBase) {  CloseCatalog(catalog); 
                    CloseLibrary(LocaleBase); }
  if(XpkBase) CloseLibrary(XpkBase);  
}

void ERRORE(STRPTR error)
{
  EasyRequest(w,&FATAL_ERROR,NULL,error);
  clean_up();
  exit(101);
} 

void info_window(STRPTR path){
  struct FileInfoBlock *FIB=NULL;
  struct DateTime data;
  BPTR lock=NULL;
  unsigned char strdate[30],strtime[20];
  desc_type info;

  FIB=AllocDosObject(DOS_FIB,NULL);

  if(lock=Lock(path,ACCESS_READ)){
    Examine(lock,FIB);
    
    data.dat_Stamp=FIB->fib_Date;
    data.dat_Format=FORMAT_DOS;
    data.dat_Flags=DTF_SUBST;
    data.dat_StrDay=NULL;
    data.dat_StrDate=(unsigned char *)&strdate;
    data.dat_StrTime=(unsigned char *)&strtime;
    if(!DateToStr(&data)) ERRORE("Fatal DateToStr");
 
    info=info_file(path);
     
 
    EasyRequest(w,&infofile,NULL, 
                FIB->fib_FileName,           
                FIB->fib_Size,
                FIB->fib_NumBlocks,
                strdate,
                strtime,
                FIB->fib_Comment,
                info.description,
                info.type);  
    }
    else easyreq("No info available.","OK");
           

    FreeDosObject(DOS_FIB, FIB);
    if(lock) UnLock(lock);
}

desc_type info_file(STRPTR path){
  struct DataTypeHeader *dth;
  struct DataType *dtn;
  STRPTR tdesc;
  STRPTR gdesc;
  UWORD ttype;
  BPTR lock;
  desc_type info; 

  if(lock=Lock(path,ACCESS_READ)){
     if(dtn=ObtainDataTypeA(DTST_FILE,(APTR)lock,NULL)){
        dth=dtn->dtn_Header;
        ttype=dth->dth_Flags & DTF_TYPE_MASK;
        tdesc=GetDTString(ttype+DTMSG_TYPE_OFFSET);
        gdesc=GetDTString(dth->dth_GroupID);

        if((info.description=(STRPTR)malloc(strlen(dth->dth_Name)+1))==NULL) ERRORE("Out of memory!");
        strcpy(info.description,dth->dth_Name);
        if((info.type=(STRPTR)malloc(strlen(tdesc)+1))==NULL) ERRORE("Out of memory!");
        strcpy(info.type,tdesc);
        ReleaseDataType(dtn);
     }
  }
  else ERRORE("Fatal Lock");
  UnLock(lock);
  return info;
}

STRPTR _fgets(STRPTR buf , int n, FILE *fp)
{
   STRPTR tmp;
   tmp=fgets(buf,n,fp);
   if(tmp!=NULL) tmp[strlen(tmp)-1]='\0';
   return tmp;
}

void init_wintree(node *root, UWORD totalnode, UWORD maxlivel, node *dire){
  clearwin(w);
  GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                    GTSC_Total,totalnode, 
                    GTSC_Visible, 20,
                    GTSC_Top, 0,
                    TAG_DONE);
  GT_SetGadgetAttrs(ScrollerOriz, w, NULL,
                    GTSC_Total,maxlivel, 
                    GTSC_Visible, 10,
                    GTSC_Top, 0,
                    TAG_DONE);
  GT_SetGadgetAttrs(CercaButton, w, NULL,
                    GA_Disabled, FALSE,
                    TAG_DONE);
  GT_SetGadgetAttrs(View_String, w, NULL,
                    GA_Disabled, FALSE,
                    TAG_DONE);
  Num_dirs(ndir);
  stampa_wintree(root,dim,dire);
  print_text2(dire,2);
  agg_button(dire);
}

void agg_scroller(UWORD totalnode, node *root, node *dire){
  y=19; 
  gen_coo(figlio(root));
  GT_SetGadgetAttrs(ScrollerVert, w, NULL,
                    GTSC_Total,totalnode, 
                    TAG_DONE); 
  maxliv=0; max_liv(root);                                 
  GT_SetGadgetAttrs(ScrollerOriz, w, NULL,
                    GTSC_Total,maxliv+1, 
                    TAG_DONE);
  clearwin(w);
  stampa_wintree(root,dim,dire);
}

void agg_button(node *dire){
  if(dire==NULL) return;
  if(chksiz){
     if(size(dire)<0) size(dire)=GetSizeDir(dire);
     stci_d(stnum,size(dire));
     GT_SetGadgetAttrs(SizeGadget, w, NULL,
                       GTTX_Text, stnum, 
                       TAG_DONE);
  }

  GT_SetGadgetAttrs(View_String, w, NULL,
                    GTST_String, fullpath(dire),
                    TAG_DONE);
  switch(dire->flag1){
    case 0: GT_SetGadgetAttrs(ApriButton, w, NULL,
                              GA_Disabled, TRUE,
                              TAG_DONE);
            GT_SetGadgetAttrs(OpenBranch, w, NULL,
                              GA_Disabled, TRUE,
                              TAG_DONE);
            GT_SetGadgetAttrs(ChiudiButton, w, NULL,
                              GA_Disabled, TRUE,
                              TAG_DONE);
            break;
    case 1: GT_SetGadgetAttrs(ApriButton, w, NULL,
                              GA_Disabled, FALSE,
                              TAG_DONE);
            GT_SetGadgetAttrs(OpenBranch, w, NULL,
                              GA_Disabled, FALSE,
                              TAG_DONE);
            GT_SetGadgetAttrs(ChiudiButton, w, NULL,
                              GA_Disabled, TRUE,
                              TAG_DONE);
            break;
    case 2: GT_SetGadgetAttrs(ApriButton, w, NULL,
                              GA_Disabled, TRUE,
                              TAG_DONE);
            GT_SetGadgetAttrs(OpenBranch, w, NULL,
                              GA_Disabled, TRUE,
                              TAG_DONE);
            GT_SetGadgetAttrs(ChiudiButton, w, NULL,
                              GA_Disabled, FALSE,
                              TAG_DONE);
            break;
  }

  if(lof>0) agg_listview(dire);
}

void listga(char lof, node *dire)
{
   if(lof==1){
      GT_SetGadgetAttrs(filelist,w,NULL,
                        GA_Disabled,FALSE,
                        TAG_DONE);
      agg_listview(dire);
   }
   else{ 
      GT_SetGadgetAttrs(filelist,w,NULL,
                        GTLV_Labels, NULL,
                        TAG_DONE);
      GT_SetGadgetAttrs(filelist,w,NULL,
                        GA_Disabled,TRUE,
                        GTLV_Labels, ~0,
                        TAG_DONE);
      agg_listga(TRUE);
      listdire=NULL;
   }
}

void agg_listview(node *dire)
{

   if(listdire==dire) return;
   listdire=dire;
   GT_SetGadgetAttrs(filelist,w,NULL,
                     GTLV_Labels, NULL,
                     TAG_DONE);

   GT_SetGadgetAttrs(filelist,w,NULL,
                     GTLV_Labels, ~0,
                     TAG_DONE);
   agg_listga(TRUE);
  if(lof>0){
     FreeRemember(&rem_key,TRUE);
     NewList(&lista_files);
     rem_key=NULL;
     if(crea_listafiles(dire)==-1) return;
     if(rem_key!=NULL){  
        Ordina_lista(&lista_files);
        GT_SetGadgetAttrs(filelist,w,NULL,
                          GTLV_Labels, &lista_files,
                          GTLV_Selected, 0,
                          TAG_DONE);
        agg_listga(FALSE);
        strcpy(filename_sel,fullpath(dire));
        AddPart(filename_sel,lista_files.lh_Head->ln_Name,400);
     }
   }
}

int crea_listafiles(node *dire)
{
   int i=0;
   struct Node *nodo;
   lst_list *pfiles;

   if(!dire->list){
      BPTR lock;
      struct FileInfoBlock *FIB=NULL;
      if((lock=Lock(fullpath(dire),ACCESS_READ))==0){          
//         easyreq(GetString(&locale,MSG_ERRTREE),"OK"); 
         return -1;
      }
      FIB=AllocDosObject(DOS_FIB,NULL);
      if(Examine(lock,FIB)==0) ERRORE("Fatal Examine");  
      pfiles=MakeList();
      while(ExNext(lock,FIB))
         if(FIB->fib_DirEntryType<0){
            PlainFile *entryfile;
            i++;
            nodo = (struct Node *)AllocRemember(&rem_key,sizeof(struct Node),MEMF_CLEAR);
            if(nodo==NULL) ERRORE("Fine memoria");
            nodo->ln_Name=(STRPTR)AllocRemember(&rem_key,(strlen(FIB->fib_FileName)+1),NULL);
            if(nodo->ln_Name==NULL) ERRORE("Fine memoria");
            strcpy(nodo->ln_Name,FIB->fib_FileName);
            AddTail(&lista_files,nodo);

            entryfile=(PlainFile *)malloc(sizeof(PlainFile));
            strcpy(entryfile->name,FIB->fib_FileName);
/*
            entryfile->protection=FIB->fib_Protection;
            entryfile->size=FIB->fib_Size;
            entryfile->blocks=FIB->fib_NumBlocks;
            entryfile->date=FIB->fib_Date;
            strcpy(entryfile->note,FIB->fib_Comment);
*/
            ADDTAIL(pfiles,entryfile);
         }
      UnLock(lock);
      FreeDosObject(DOS_FIB, FIB);
      dire->plfiles=pfiles; 
      dire->nf=NO_ENTRY(pfiles); 
      dire->list=TRUE;
   }      
   else{
      PlainFile *nod=HEAD(dire->plfiles,PlainFile);
      while(nod!=NULL){
         i++;
         nodo = (struct Node *)AllocRemember(&rem_key,sizeof(struct Node),MEMF_CLEAR);
         if(nodo==NULL) ERRORE("Fine memoria");
         nodo->ln_Name=(STRPTR)AllocRemember(&rem_key,108,NULL);
         if(nodo->ln_Name==NULL) ERRORE("Fine memoria");
         strcpy(nodo->ln_Name,(const char*)(NODE(nod,PlainFile)->name));
         AddTail(&lista_files,nodo);
         nod=SUCC(nod,PlainFile);
      }
   }
   return i;
}



/*
int crea_listafiles(node *dire)
{
   int i=0;
   BPTR lock;
   struct FileInfoBlock *FIB=NULL;
   struct Node *nodo;

   if((lock=Lock(fullpath(dire),ACCESS_READ))==0){
            easyreq(GetString(&locale,MSG_ERRTREE),"OK");
            return -1;
   }
   FIB=AllocDosObject(DOS_FIB,NULL);
   if(Examine(lock,FIB)==0) ERRORE("Fatal Examine");  
   while(ExNext(lock,FIB))
      if(FIB->fib_DirEntryType<0){
         i++;
         nodo = (struct Node *)AllocRemember(&rem_key,sizeof(struct Node),MEMF_CLEAR);
         if(nodo==NULL) ERRORE("Fine memoria");
         nodo->ln_Name=(STRPTR)AllocRemember(&rem_key,(strlen(FIB->fib_FileName)+1),NULL);
         if(nodo->ln_Name) ERRORE("Fine memoria");
         strcpy(nodo->ln_Name,FIB->fib_FileName);
         AddTail(&lista_files,nodo);
      }
   UnLock(lock);
   FreeDosObject(DOS_FIB, FIB);  
   return i;
}
*/

void agg_listga(BOOL stato)
{
   GT_SetGadgetAttrs(ShowButton, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(PlayButton, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton1, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton2, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton3, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton4, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton5, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton6, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton7, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(UserButton8, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(ViewButton, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
   GT_SetGadgetAttrs(InfoButton, w, NULL,
                     GA_Disabled, stato,
                     TAG_DONE);
}


void scegli_vis(SHORT s)
{
//  FileVis=AllocAslRequest(ASL_FileRequest,MyTagsVis);  
  if(AslRequest(FileVis,MyTagsVis)!=NULL)
    switch(s){
       case 0: strcpy(showername,FileVis->rf_Dir);
               AddPart(showername,FileVis->rf_File,512);
               break;
       case 1: strcpy(playername,FileVis->rf_Dir);
               AddPart(playername,FileVis->rf_File,512);
               break;
       case 2: strcpy(userprg1,FileVis->rf_Dir);
               AddPart(userprg1,FileVis->rf_File,512);
               userprgname1=FilePart(userprg1);
               break;
       case 3: strcpy(userprg2,FileVis->rf_Dir);
               AddPart(userprg2,FileVis->rf_File,512);
               userprgname2=FilePart(userprg2);
               break;
       case 4: strcpy(userprg3,FileVis->rf_Dir);
               AddPart(userprg3,FileVis->rf_File,512);
               userprgname3=FilePart(userprg3);
               break;
       case 5: strcpy(userprg4,FileVis->rf_Dir);
               AddPart(userprg4,FileVis->rf_File,512);
               userprgname4=FilePart(userprg4);
               break;
       case 6: strcpy(userprg5,FileVis->rf_Dir);
               AddPart(userprg5,FileVis->rf_File,512);
               userprgname5=FilePart(userprg5);               
               break;
       case 7: strcpy(userprg6,FileVis->rf_Dir);
               AddPart(userprg6,FileVis->rf_File,512);
               userprgname6=FilePart(userprg6);
               break;
       case 8: strcpy(userprg7,FileVis->rf_Dir);
               AddPart(userprg7,FileVis->rf_File,512);
               userprgname7=FilePart(userprg7);
               break;
       case 9: strcpy(userprg8,FileVis->rf_Dir);
               AddPart(userprg8,FileVis->rf_File,512);
               userprgname8=FilePart(userprg8);
               break;

    }    
//  FreeFileRequest(FileVis);  
  WritePrefs();
} 

void WritePrefs(void)
{
  FILE *fp; 
  DeleteFile(PREFS);
  fp=fopen(PREFS,"w");
  fprintf(fp,"VIS\n%s\n",showername);
  fprintf(fp,"PLA\n%s\n",playername);
  fprintf(fp,"USR1\n%s\n",userprg1); 
  fprintf(fp,"USR2\n%s\n",userprg2);
  fprintf(fp,"USR3\n%s\n",userprg3);
  fprintf(fp,"USR4\n%s\n",userprg4);
  fprintf(fp,"USR5\n%s\n",userprg5);
  fprintf(fp,"USR6\n%s\n",userprg6);
  fprintf(fp,"USR7\n%s\n",userprg7);
  fprintf(fp,"USR8\n%s\n",userprg8);
  fprintf(fp,"FAS1\n%s\n",fast1_txt);
  fprintf(fp,"FAS2\n%s\n",fast2_txt);
  fprintf(fp,"FAS3\n%s\n",fast3_txt);
  if(packMethod) fprintf(fp,"PMET\n%s\n",packMethod);
  if(XpkBase)    fprintf(fp,"PMOD\n%d\n",PackMode);
  if(paramshow)  fprintf(fp,"PSHOW\n%s\n",paramshow);
  if(paramplay)  fprintf(fp,"PPLAY\n%s\n",paramplay);
  if(paramusr1)  fprintf(fp,"PUSR1\n%s\n",paramusr1);
  if(paramusr2)  fprintf(fp,"PUSR2\n%s\n",paramusr2);
  if(paramusr3)  fprintf(fp,"PUSR3\n%s\n",paramusr3);
  if(paramusr4)  fprintf(fp,"PUSR4\n%s\n",paramusr4);
  if(paramusr5)  fprintf(fp,"PUSR5\n%s\n",paramusr5);
  if(paramusr6)  fprintf(fp,"PUSR6\n%s\n",paramusr6);
  if(paramusr7)  fprintf(fp,"PUSR7\n%s\n",paramusr7);
  if(paramusr8)  fprintf(fp,"PUSR8\n%s\n",paramusr8);
  fclose(fp);                        
}

void leggi_prefs(void){
  FILE *fp;
  char buf[400];
  STRPTR tmp;
  if((fp=fopen(PREFS,"r"))!=NULL){
    while((tmp=_fgets(buf,400,fp))!=NULL){
      if((!strcmp(tmp,"PMET"))&&(packMethod)) strcpy(packMethod,_fgets(buf,400,fp));
      if(!strcmp(tmp,"PMOD")) PackMode=atoi(_fgets(buf,400,fp));    	
      if(strcmp(tmp,"VIS")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0)
           strcpy(showername,tmp);
      if(strcmp(tmp,"PLA")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0)
           strcpy(playername,tmp);
      if(strcmp(tmp,"USR1")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg1,tmp);
           userprgname1=FilePart(userprg1);
        }
      if(strcmp(tmp,"USR2")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg2,tmp);
           userprgname2=FilePart(userprg2);
        }
      if(strcmp(tmp,"USR3")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg3,tmp);
           userprgname3=FilePart(userprg3);
        }
      if(strcmp(tmp,"USR4")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg4,tmp);
           userprgname4=FilePart(userprg4);
        }      
      if(strcmp(tmp,"USR5")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg5,tmp);
           userprgname5=FilePart(userprg5);
        }
      if(strcmp(tmp,"USR6")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg6,tmp);
           userprgname6=FilePart(userprg6);
        }
      if(strcmp(tmp,"USR7")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg7,tmp);
           userprgname7=FilePart(userprg7);
        }
      if(strcmp(tmp,"USR8")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(userprg8,tmp);
           userprgname8=FilePart(userprg8);
        }      
      if(strcmp(tmp,"FAS1")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(fast1_txt,tmp);
           fastbutton1_txt=FilePart(fast1_txt);
           if(*(fastbutton1_txt)=='\0') fastbutton1_txt=fast1_txt;
           if(strlen(fastbutton1_txt)>10){
              char tmp[30];
              strcpy(tmp,fastbutton1_txt);
              fastbutton1_txt=(char *)malloc(11);
              strcpy(fastbutton1_txt,leftcar(tmp,10));
           }
        }      
      if(strcmp(tmp,"FAS2")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(fast2_txt,tmp);
           fastbutton2_txt=FilePart(fast2_txt);
           if(*(fastbutton2_txt)=='\0') fastbutton2_txt=fast2_txt;
           if(strlen(fastbutton2_txt)>10){
              char tmp[30];
              strcpy(tmp,fastbutton2_txt);
              fastbutton2_txt=(char *)malloc(11);
              strcpy(fastbutton2_txt,leftcar(tmp,10));
           }
        }      
      if(strcmp(tmp,"FAS3")==0)
        if(strcmp((tmp=_fgets(buf,400,fp)),"--------")!=0){
           strcpy(fast3_txt,tmp);
           fastbutton3_txt=FilePart(fast3_txt);
           if(*(fastbutton3_txt)=='\0') fastbutton3_txt=fast3_txt;
           if(strlen(fastbutton3_txt)>10){
              char tmp[30];
              strcpy(tmp,fastbutton3_txt);
              fastbutton3_txt=(char *)malloc(11);
              strcpy(fastbutton3_txt,leftcar(tmp,10));
           }
        }      
      if(strcmp(tmp,"PSHOW")==0){
         tmp=_fgets(buf,400,fp);
         paramshow=(STRPTR)malloc(100);
         strcpy(paramshow,tmp);
      }
      if(strcmp(tmp,"PPLAY")==0){
         tmp=_fgets(buf,400,fp);
         paramplay=(STRPTR)malloc(100);
         strcpy(paramplay,tmp);
      }
      if(strcmp(tmp,"PUSR1")==0){
         tmp=_fgets(buf,400,fp);
         paramusr1=(STRPTR)malloc(100);
         strcpy(paramusr1,tmp);
      }
      if(strcmp(tmp,"PUSR2")==0){
         tmp=_fgets(buf,400,fp);
         paramusr2=(STRPTR)malloc(100);
         strcpy(paramusr2,tmp);
      }
      if(strcmp(tmp,"PUSR3")==0){
         tmp=_fgets(buf,400,fp);
         paramusr3=(STRPTR)malloc(100);
         strcpy(paramusr3,tmp);
      }
      if(strcmp(tmp,"PUSR4")==0){
         tmp=_fgets(buf,400,fp);
         paramusr4=(STRPTR)malloc(100);
         strcpy(paramusr4,tmp);
      }
      if(strcmp(tmp,"PUSR5")==0){
         tmp=_fgets(buf,400,fp);
         paramusr5=(STRPTR)malloc(100);
         strcpy(paramusr5,tmp);
      }
      if(strcmp(tmp,"PUSR6")==0){
         tmp=_fgets(buf,400,fp);
         paramusr6=(STRPTR)malloc(100);
         strcpy(paramusr6,tmp);
      }
      if(strcmp(tmp,"PUSR7")==0){
         tmp=_fgets(buf,400,fp);
         paramusr7=(STRPTR)malloc(100);
         strcpy(paramusr7,tmp);
      }
      if(strcmp(tmp,"PUSR8")==0){
         tmp=_fgets(buf,400,fp);
         paramusr8=(STRPTR)malloc(100);
         strcpy(paramusr8,tmp);
      }
    }
  }
  fclose(fp);
}

void esegui(STRPTR filename, short s)
{
     unsigned char buf[512];
     STRPTR prm=NULL;
     switch(s){
        case 0: strcpy(buf,showername);
                if(paramshow){ prm=(STRPTR)malloc(100); strcpy(prm,paramshow); }
                break;
        case 1: strcpy(buf,playername);
                if(paramplay){ prm=(STRPTR)malloc(100); strcpy(prm,paramplay); }
                break;
        case 2: strcpy(buf,userprg1);
                if(paramusr1){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr1); }
                break;
        case 3: strcpy(buf,userprg2);
                if(paramusr2){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr2); }
                break;
        case 4: strcpy(buf,userprg3);
                if(paramusr3){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr3); }
                break;
        case 5: strcpy(buf,userprg4);
                if(paramusr4){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr4); }
                break;
        case 6: strcpy(buf,userprg5);
                if(paramusr5){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr5); }
                break;
        case 7: strcpy(buf,userprg6);
                if(paramusr6){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr6); }
                break;
        case 8: strcpy(buf,userprg7);
                if(paramusr7){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr7); }
                break;
        case 9: strcpy(buf,userprg8);
                if(paramusr8){ prm=(STRPTR)malloc(100); strcpy(prm,paramusr8); }
                break;

     }
     if(prm){ strcat(buf," "); strcat(buf,prm); }
     strcat(buf," \"");
     strcat(buf,filename);
     strcat(buf,"\"");
     strcat(buf," > NIL:");
     if(Execute(buf,NULL,NULL)==FALSE) DisplayBeep(w->WScreen);
     if(prm) free(prm);
}

STRPTR leftcar(STRPTR stringa, int nc){
  char *result=NULL;
  if((nc<1)||(nc>(strlen(stringa)))) return NULL;
  if((result=(char *)malloc(nc+1))==NULL) return NULL;
  result[nc--]='\0';
  for(;nc>=0;nc--) result[nc]=stringa[nc];
  return result;
}
   
void crea_gadget(void)
{
    MyGadList=NULL;
    vi=GetVisualInfo(PubScreen,TAG_DONE);

    /* Creazione dei dati necessari al gadtools */


    PrevGad=CreateContext(&MyGadList);

    NewGad.ng_VisualInfo=vi;
    NewGad.ng_TextAttr=&gfont;

    /***  SCROLLER  ***/

    NewGad.ng_LeftEdge=383;
    NewGad.ng_TopEdge=14;
    NewGad.ng_Width=16;
    NewGad.ng_Height=172;
    NewGad.ng_GadgetText=NULL;
    NewGad.ng_GadgetID = SCROLLER;

    ScrollerVert=PrevGad=CreateGadget(SCROLLER_KIND, PrevGad, &NewGad,
                                      GTSC_Visible, 20,
                                      PGA_Freedom, LORIENT_VERT,
                                      GA_RelVerify, TRUE,
                                      TAG_DONE);

    NewGad.ng_LeftEdge=0;
    NewGad.ng_TopEdge=186;
    NewGad.ng_Width=383;
    NewGad.ng_Height=8;
    NewGad.ng_GadgetText=NULL;
    NewGad.ng_GadgetID = SCROLLER;
        
    ScrollerOriz=PrevGad=CreateGadget(SCROLLER_KIND, PrevGad, &NewGad,
                                      GTSC_Visible, 10,
                                      PGA_Freedom, LORIENT_HORIZ,
                                      GA_RelVerify, TRUE,
                                      TAG_DONE);

    /* BUTTON GADGET */

    NewGad.ng_LeftEdge=17;
    NewGad.ng_TopEdge=204;
    NewGad.ng_Width=80;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=GetString(&locale,MSG_OPENNODE);
    NewGad.ng_Flags=PLACETEXT_IN;
    NewGad.ng_GadgetID = BUTTON;

        

    ApriButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                       GA_Disabled, TRUE,
                                       TAG_DONE);

    NewGad.ng_LeftEdge=17;
    NewGad.ng_TopEdge=220;
    NewGad.ng_Width=80;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=GetString(&locale,MSG_OPENBRANCH);
    NewGad.ng_Flags=PLACETEXT_IN;
    NewGad.ng_GadgetID = BUTTON;

    OpenBranch=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                       GA_Disabled, TRUE,
                                       TAG_DONE);

    NewGad.ng_LeftEdge=115;
    NewGad.ng_TopEdge=204;
    NewGad.ng_Width=80;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText= GetString(&locale,MSG_CLOSENODE); 

    ChiudiButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                         GA_Disabled, TRUE,
                                         TAG_DONE);

    NewGad.ng_LeftEdge=115;
    NewGad.ng_TopEdge=220;
    NewGad.ng_Width=80;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText= GetString(&locale,MSG_SEARCHGAD);

    CercaButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                        GA_Disabled,TRUE,
                                        TAG_DONE);

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=207;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_VIEWDT);

    ViewButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                    GA_Disabled,TRUE,
                                    TAG_DONE);

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=195;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText="Info";

    InfoButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                    GA_Disabled,TRUE,
                                    TAG_DONE);

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=219;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_SHOW);

    ShowButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                       GA_Disabled,TRUE,
                                       TAG_DONE);

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=231;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_PLAY);

    PlayButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                       GA_Disabled,TRUE,
                                       TAG_DONE);

    NewGad.ng_LeftEdge=316;
    NewGad.ng_TopEdge=231;
    NewGad.ng_Width=84;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_LISTFILE);
  
    on_off=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                TAG_DONE);

    NewGad.ng_LeftEdge=316;
    NewGad.ng_TopEdge=195;
    NewGad.ng_Width=84;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_PROJECT_NEWTREE);
  
    newtree_gad=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=316;
    NewGad.ng_TopEdge=207;
    NewGad.ng_Width=84;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_DIMDIR);
  
    dimdir_gad=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                   TAG_DONE);

    NewGad.ng_LeftEdge=316;
    NewGad.ng_TopEdge=219;
    NewGad.ng_Width=84;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=GetString(&locale,MSG_CLONE);
  
    clone_gad=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                   TAG_DONE);



    /* NUMBER_DISPLAY GADGET */


    NewGad.ng_LeftEdge=248;
    NewGad.ng_TopEdge=204;
    NewGad.ng_Width=48;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="DIR";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = NUMBER;

    Num_Dirs=PrevGad=CreateGadget(NUMBER_KIND, PrevGad, &NewGad,                         
                                  GTNM_Border, TRUE, 
                                  GTNM_Clipped, TRUE,               
                                  TAG_DONE);

/*
    NewGad.ng_LeftEdge=318;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=66; 
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=NULL;
    NewGad.ng_GadgetID = TEXT;

    SizeGadget=PrevGad=CreateGadget(TEXT_KIND, PrevGad, &NewGad,
                                    GTTX_Border, FALSE,                         
                                    GTTX_Clipped, TRUE,
                                    TAG_DONE);
*/

    NewGad.ng_LeftEdge=248;
    NewGad.ng_TopEdge=220;
    NewGad.ng_Width=48;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="R.";
    NewGad.ng_Flags=PLACETEXT_LEFT;
    NewGad.ng_GadgetID = INTEGER;

    Rec_Lev=PrevGad=CreateGadget(INTEGER_KIND, PrevGad, &NewGad,                         
                                 GTIN_Number, recl,
		                           GTIN_MaxChars, 3,
                    			      STRINGA_Justification, GACT_STRINGCENTER,                         
                                 TAG_DONE);


    NewGad.ng_LeftEdge=0;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=383;
//    NewGad.ng_Width=311;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=NULL;
    NewGad.ng_GadgetID = STRING;
 
    View_String=PrevGad=CreateGadget(STRING_KIND, PrevGad, &NewGad,
                                     GTST_MaxChars,400,
//                                     GA_Disabled, TRUE,
                                     TAG_DONE);

  /* LISTVIEW */

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=14;
    NewGad.ng_Width=218;
    NewGad.ng_Height=180;
    NewGad.ng_GadgetText=NULL;
    NewGad.ng_GadgetID = LISTVIEW;

    filelist=PrevGad=CreateGadget(LISTVIEW_KIND, PrevGad, &NewGad,
                                  GTLV_Labels, ~0,
                                  GTLV_ShowSelected, NULL,
                                  GA_Disabled, TRUE,
                                  TAG_DONE);


    NewGad.ng_LeftEdge=383;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=17;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText="I";
    NewGad.ng_Flags=PLACETEXT_IN;
    NewGad.ng_GadgetID = BUTTON;

    IconButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                    TAG_DONE);


/* ------------- User Gadget ------------- */

    NewGad.ng_LeftEdge=472;
    NewGad.ng_TopEdge=195;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname1;
    NewGad.ng_Flags=PLACETEXT_IN;
    NewGad.ng_GadgetID = BUTTON;

    UserButton1=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=472;
    NewGad.ng_TopEdge=207;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname2;
    UserButton2=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=472;
    NewGad.ng_TopEdge=219;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname3;

    UserButton3=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=472;
    NewGad.ng_TopEdge=231;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname4;

    UserButton4=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=544;
    NewGad.ng_TopEdge=195;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname5;

    UserButton5=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=544;
    NewGad.ng_TopEdge=207;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname6;

    UserButton6=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=544;
    NewGad.ng_TopEdge=219;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname7;

    UserButton7=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=544;
    NewGad.ng_TopEdge=231;
    NewGad.ng_Width=72;
    NewGad.ng_Height=12;
    NewGad.ng_GadgetText=userprgname8;

    UserButton8=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                     GA_Disabled,TRUE,
                                     TAG_DONE);

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=72;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=fastbutton1_txt;

    SysButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                   TAG_DONE);

    NewGad.ng_LeftEdge=473;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=72;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=fastbutton2_txt;

    WorkButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                    TAG_DONE);
    NewGad.ng_LeftEdge=545;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=72;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=fastbutton3_txt;

    CDButton=PrevGad=CreateGadget(BUTTON_KIND, PrevGad, &NewGad,
                                  TAG_DONE);

}

void Ordina_lista(struct List *lista)
{
   struct Node *i,*j;
   STRPTR tmp;   
   if(lista->lh_Head->ln_Succ)
      for(i=lista->lh_TailPred;i!=lista->lh_Head;i=i->ln_Pred)
         for(j=lista->lh_Head;j!=i;j=j->ln_Succ)
            if(stricmp(j->ln_Name,j->ln_Succ->ln_Name)>0){
               tmp=j->ln_Name;
               j->ln_Name=j->ln_Succ->ln_Name;
               j->ln_Succ->ln_Name=tmp;
            }
}

void AggSizeGad(void)
{
   UWORD pos;
   struct Gadget *Prev=NULL, *TMP=NULL;

   Prev=CreateContext(&TMP);

   if((pos=RemoveGadget(w,View_String))){
      NewGad.ng_LeftEdge=0;
      NewGad.ng_TopEdge=0;
      NewGad.ng_Width=311;
      NewGad.ng_Height=14;
      NewGad.ng_GadgetText=NULL;
      NewGad.ng_GadgetID = STRING;
 
      View_String=CreateGadget(STRING_KIND, Prev, &NewGad,
                               GTST_MaxChars,400,
                               TAG_DONE);

      AddGadget(w,View_String,pos);

      NewGad.ng_LeftEdge=318;
      NewGad.ng_TopEdge=0;
      NewGad.ng_Width=66; 
      NewGad.ng_Height=14;
      NewGad.ng_GadgetText=NULL;
      NewGad.ng_GadgetID = TEXT;

      SizeGadget=CreateGadget(TEXT_KIND, Prev, &NewGad,
                              GTTX_Border, FALSE,                         
                              GTTX_Clipped, TRUE,
                              TAG_DONE);

      AddGadget(w,SizeGadget,pos+1);

      EraseRect(w->RPort, 307, 0, 382, 13);
      RefreshGList(View_String,w,NULL,2);
      GT_RefreshWindow(w,NULL);

      DrawBevelBox(w->RPort,311,0,72,14,
                   GTBB_FrameType, BBFT_RIDGE,
                   GT_VisualInfo, vi,
                   TAG_DONE);
   }
}

void RemSizeGad(void)
{
   UWORD pos;
   struct Gadget *Prev=NULL, *TMP=NULL;

   Prev=CreateContext(&TMP);
   if((pos=RemoveGadget(w,SizeGadget)))
      if((pos=RemoveGadget(w,View_String))){      
         NewGad.ng_LeftEdge=0;
         NewGad.ng_TopEdge=0;
         NewGad.ng_Width=383;
         NewGad.ng_Height=14;
         NewGad.ng_GadgetText=NULL;
         NewGad.ng_GadgetID = STRING;
 
         View_String=CreateGadget(STRING_KIND, Prev, &NewGad,
                                  GTST_MaxChars,400,
                                  TAG_DONE);

         AddGadget(w,View_String,pos);

         EraseRect(w->RPort, 307, 0, 382, 13);
         RefreshGList(View_String,w,NULL,1);
         GT_RefreshWindow(w,NULL);

      }   
}

void AggUserGad(void)
{
   UWORD pos;
   struct Gadget *Prev=NULL, *agglist=NULL;
   pos=RemoveGList(w,UserButton1,-1);

   Prev=CreateContext(&agglist);

   NewGad.ng_LeftEdge=472;
   NewGad.ng_TopEdge=195;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname1;
   NewGad.ng_Flags=PLACETEXT_IN;
   NewGad.ng_GadgetID = BUTTON;

   UserButton1=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);

   NewGad.ng_LeftEdge=472;
   NewGad.ng_TopEdge=207;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname2;

   UserButton2=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);
   NewGad.ng_LeftEdge=472;
   NewGad.ng_TopEdge=219;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname3;

   UserButton3=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                    TAG_DONE);

   NewGad.ng_LeftEdge=472;
   NewGad.ng_TopEdge=231;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname4;

   UserButton4=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);
   NewGad.ng_LeftEdge=544;
   NewGad.ng_TopEdge=195;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname5;

   UserButton5=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);

   NewGad.ng_LeftEdge=544;
   NewGad.ng_TopEdge=207;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname6;

   UserButton6=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);

   NewGad.ng_LeftEdge=544;
   NewGad.ng_TopEdge=219;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname7;
        
   UserButton7=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);

   NewGad.ng_LeftEdge=544;
   NewGad.ng_TopEdge=231;
   NewGad.ng_Width=72;
   NewGad.ng_Height=12;
   NewGad.ng_GadgetText=userprgname8;

   UserButton8=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);

    NewGad.ng_LeftEdge=400;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=72;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=fastbutton1_txt;

    SysButton=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                TAG_DONE);

    NewGad.ng_LeftEdge=473;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=72;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=fastbutton2_txt;

    WorkButton=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                                 TAG_DONE);
    NewGad.ng_LeftEdge=545;
    NewGad.ng_TopEdge=0;
    NewGad.ng_Width=72;
    NewGad.ng_Height=14;
    NewGad.ng_GadgetText=fastbutton3_txt;

    CDButton=Prev=CreateGadget(BUTTON_KIND, Prev, &NewGad,
                               TAG_DONE);

   AddGList(w,UserButton1,pos,-1,NULL);
   if(lof!=1){
      GT_SetGadgetAttrs(UserButton1, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton2, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton3, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton4, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton5, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton6, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton7, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);
      GT_SetGadgetAttrs(UserButton8, w, NULL,
                        GA_Disabled, TRUE,
                        TAG_DONE);

   }

   RefreshGList(UserButton1,w,NULL,-1);
   GT_RefreshWindow(w,NULL);
}

UWORD GenTreeAsl(node **root, node **dire)
{
  BPTR lockdir;
  char dirname[400];
  UWORD totalnode=0;
  if(AslRequest(FileGenTree,MyTagsGenTree)!=NULL){
     lockdir=Lock(FileGenTree->rf_Dir,ACCESS_READ);
     NameFromLock(lockdir,dirname,400);
     SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
     del_tree(*root);
     ox=12; oy=y=yb; ndir=0;
     ox1=ox+xw; oy1=oy+yw;
     (*dire)=(*root)=crea_tree(lockdir,dirname,0);
     gen_coo(figlio((*root)));
     UnLock(lockdir);
     SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
     return (totalnode=ndir+1);
  }
  return totalnode;
}

STRPTR SetFastButton(void)
{
   if(AslRequest(FileGenTree,MyTagsGenTree)!=NULL)
      return FileGenTree->rf_Dir;
   return NULL;
}

UWORD GenTreeTmp(node **root, node **dire, STRPTR dir)
{
  BPTR lockdir;
  char dirname[400];
  UWORD totalnode=0;
  if((lockdir=Lock(dir,ACCESS_READ))){
     NameFromLock(lockdir,dirname,400);                                                        
     SetWindowPointer(w,WA_BusyPointer,TRUE,TAG_DONE);
     del_tree(*root);
     ox=12; oy=y=yb; ndir=0;
     ox1=ox+xw; oy1=oy+yw;
     (*dire)=(*root)=crea_tree(lockdir,dirname,0);
     gen_coo(figlio((*root)));
     UnLock(lockdir);
     SetWindowPointer(w,WA_Pointer,NULL,TAG_DONE);
     return (totalnode=ndir+1);
  }
  return totalnode; 
}

LONG easyreq(STRPTR label, STRPTR sel)
{  
   LONG r=0;
   struct EasyStruct req= { sizeof(struct EasyStruct),
                               0,
                               NULL,
                               NULL,
                               NULL };

   req.es_TextFormat=label;
   req.es_GadgetFormat=sel;

   r=EasyRequest(w,&req,NULL,NULL);
   return r;
}

struct Menu *CreateLocMenus(struct NewMenu *newMenus, ULONG tag, ...)
{
UWORD           i=0;
struct NewMenu *nm=newMenus;
struct Menu    *menus;

 while (nm[i++].nm_Type != NM_END);

 if (!(nm = AllocVec(sizeof(struct NewMenu)*i,MEMF_CLEAR|MEMF_PUBLIC)))
     return(NULL);

 while (i--)
 {
     nm[i] = newMenus[i];
     if(nm[i].nm_Label != NM_BARLABEL)
        nm[i].nm_Label = GetString(&locale,(LONG)nm[i].nm_Label);
 }

 if(menus = CreateMenusA(nm,(struct TagItem *)&tag))
   if(!(LayoutMenus(menus,vi,GTMN_NewLookMenus,TRUE,
                                        TAG_DONE)))
     {
         FreeMenus(menus);
         menus = NULL;
     }
 
 FreeVec(nm);     

 return(menus);
}
   
utente * ReadKey(void)
{
   utente *user=NULL;   
   BPTR f;
   LONG br;
   int i;
   char *p;
   f=Open("progdir:AmyTree.key",MODE_OLDFILE);
   if(f){
      user=(utente *)malloc(sizeof(utente));
      br=Read(f,user,sizeof(utente));
      p=(char *)user;
      for(i=0;i<sizeof(utente);i++) *(p+i)-=2; 
      Close(f);
   }   
   return user;
}
   
BOOL CheckPass(utente *user)
{
   STRPTR crypt,password,username;
   char buffer[20],usra[20],usrb[20];

   if(user==NULL) return FALSE;

   password=(STRPTR)malloc(20);
   strcpy(password,PASSWORD);   

   strcpy(usra,user->name);
   strcpy(usrb,user->surname);

   usra[3]='\0';
   usrb[3]='\0';

   username=(STRPTR)calloc(10,sizeof(char));

   strcat(username,usra);
   strcat(username,usrb);


   crypt=ACrypt(buffer,password,username);

   if(strcmp(user->password,crypt)==0) return TRUE;
   return FALSE;
}

void UnregMsg(void)
{
   easyreq("Sorry this is an unregistered version.\nThis option is disabled.\nPlease register.\nRead .guide for registration\n\nacervo@oneonline.it","OK");
}        

void Crack(void)
{ 
   easyreq("THIS IS AN ILLEGAL VERSION OF AMYTREE\nREGISTER! IF DO YOU WANT USE IT","CRACK!");
   printf("\n***************************************");
   printf("\n*       CRACK VERSION DETECTED!       *");
   printf("\n*  ---- BREAK PROGRAM AMYTREE -----   *");
   printf("\n*        RESET YOUR MACHINE           *");
   printf("\n***************************************\n");
   exit(1);
}

void InfoATO(void)
{
  easyreq("This software was translated with the help of ATO\nthe Amiga Translators Organization.\n\nContact ATO:\n\nvia mail at ato-info@ato.vapor.com\nvia Web  at ato.vapor.com/ato","OK");
}

/*
void showlist(lst_list *lfiles)
{
  if(ISEMPTY(lfiles)) printf("\n\nLISTA VUOTA!");
  else
      {
        PlainFile *nod=HEAD(lfiles,PlainFile);
        while(nod!=NULL){
           printf("\n%s",NODE(nod,PlainFile)->name);
           nod=SUCC(nod,PlainFile);
         }
      }
}

void stampanodo(node *dire)
{
   if(dire){
      printf("\nnome     : %s",name(dire));
      printf("\npadre    : %s",name(padre(dire)));
      printf("\nfiglio   : "); 
      if(figlio(dire)) printf("%s",name(figlio(dire))); else printf("NULL");
      printf("\nfratello : "); 
      if(frasucc(dire)) printf("%s",name(frasucc(dire))); else printf("NULL");
      printf("\npath     : %s",fullpath(dire));
      printf("\nflag     : %d",dire->flag1);
      printf("\nlivello  : %d",dire->liv);
   }
}
*/

void riconfile(lst_list *ExtList, char *filename)
{
   exts *nod;
   char *token,ext[10],buf[255],t_ext[80];
   BOOL ef=TRUE;

   stcgfe(ext,filename);
   if(NO_ENTRY(ExtList)){
      nod=HEAD(ExtList,exts);
      while(nod&&ef){
         strcpy(t_ext,nod->extension);
         token=strtok(t_ext,"|");
         while(token){            
            if(!stricmp(token,ext)){
               strcpy(buf,nod->prog);
               strcat(buf," \"");
               strcat(buf,filename);
               strcat(buf,"\" > NIL:");
               Execute(buf,NULL,NULL);
               ef=FALSE;
               break;
            }
            token=strtok(NULL,"|");
         }
         nod=SUCC(nod,exts);
      }      
   }
//   if(ef) viewfile(filename);     
   if(ef) RicDataTypes(filename);     
}    

void RicDataTypes(STRPTR filename)
{
    desc_type info;
    dtprogs *nod;
    char buf[80],exbuf[255];   
    BOOL ef=TRUE;
    int s=0;

    info=info_file(filename);
    strcpy(buf,info.description);
    strcat(buf," - ");
    strcat(buf,info.type);

    nod=HEAD(DTPList,dtprogs);
    while(nod){
       if(!strcmp(buf, nod->type)){ ef=FALSE; break; }
       nod=SUCC(nod,dtprogs);
    }          
    if(ef)
       if((s=HandleIDatWin(PubScreen,-1,-1,buf))){
          SaveTypesList(DTPList);
          nod=TAIL(DTPList,dtprogs);
       }
    if((!ef)||(s)){
       strcpy(exbuf,nod->prog);
       strcat(exbuf," \"");
       strcat(exbuf,filename);
       strcat(exbuf,"\"");
//       strcat(exbuf,"\" > NIL:");
       Execute(exbuf,NULL,NULL);          
   }
}      

void CloneTree(node *root, int totalnode)
{
   PBAR *bar;
   char dir[400];   
   struct Window *win;
   if(AslRequest(FileGenTree,MyTagsGenTree)!=NULL){
     strcpy(dir,FileGenTree->rf_Dir);
     win=OpenBarWin(&bar,totalnode);
     Clone(dir,figlio(root),bar);
     FreeProgBar(bar);
     CloseWindow(win);      
   }
}     

void Clone(STRPTR dirname, node *root, PBAR *bar)
{
   BPTR lock;
   char dir[400];
   
   if(root){
      strcpy(dir,dirname);
      if(AddPart(dir,name(root),400)) 
         if(lock=CreateDir(dir)){ 
            UpdateProgBar(bar,++pbar);  
            UnLock(lock);
         }
/*
         else{
            easyreq("Error Lock","Ops!");
            return;
         }
*/
      Clone(dir,figlio(root),bar);
      Clone(dirname,frasucc(root),bar);
   }
}

struct Window * OpenBarWin(PBAR **bar,int size)
{
   struct Window *win;      
   pbar=0;   
   win=OpenWindowTags(NULL,
                      WA_Left,200,
                      WA_Top,100,
                      WA_Width,309,
                      WA_Height,27+PubScreen->Font->ta_YSize-8,
                      WA_Flags,WFLG_DRAGBAR|WFLG_SMART_REFRESH
                              |WFLG_ACTIVATE,                           
                      WA_IDCMP,IDCMP_ACTIVEWINDOW,                           
                      WA_Title,"Wait Please...",
                      TAG_DONE);
 
   *bar=CreateProgBar(win,PubScreen->WBorLeft,TBH(PubScreen),300,14,size,NULL);

   
   return win;
}           
      
node * Scorri(node *dire)
{
   if(frasucc(dire)) dire=Scorri(frasucc(dire));
   if(figlio(dire)) dire=Scorri(figlio(dire));
   return dire;
}      
