
process_icons(wbargs, numargs)
struct  WBArg *wbargs;
int     numargs;
{
struct DiskObject *dob;
struct FileLock *fl,*duplock;
int i;

for(i=numargs; i; i--, wbargs++) /* Falls mehrere Icons angewählt wurden */
  {
  if (fl=(struct FileLock *)CurrentDir(wbargs->wa_Lock))
    {
    if(strlen(wbargs->wa_Name))  /*Project oder ToolIcon haben hier einen Namen*/
      {
      if(dob=(struct DiskObject *)GetDiskObject(wbargs->wa_Name))
        {
        if (dob->do_Type==WBPROJECT)
          {
          ClearList();
          ChangeDefaultProject(dob,wbargs->wa_Name);
          }
        FreeDiskObject(dob);
        }
      }
    else                        /* Lock aber kein Name ? dann ist es ein */
      {                         /* Verzeichnis  */
      if(duplock=(struct FileLock *)DupLock(wbargs->wa_Lock))
        {
        ClearList();
        ScanDirforDirs(duplock);
        UnLock((BPTR)duplock);
        }
      }
    CurrentDir((BPTR)fl);
    }
  }  
}

ChangeDefaultProject(dob,name)
struct DiskObject *dob;
char *name;
{
extern struct Window  *mw;
extern struct Gadget  *Gadgets[];
extern struct List  foundproj;
extern struct Remember *remember;
extern struct TagItem LVGadgetTags;
extern struct IntuiText     itext;
extern char *olddefproj;
extern char *newdefproj;
char * oldTool;

char *projname;
struct Node *node;


/**********************************************************************/
/*Bei Bedarf gefundenes DefaultProject in die Liste der DefaultProject*/
/*eintragen.                                                          */
/**********************************************************************/

if(!FindName(&foundproj,(STRPTR)dob->do_DefaultTool)&&strlen(dob->do_DefaultTool))
    {

    /* Falls das gefundene Defaultproject noch nicht in der Liste eingetragen war */
    /* wird hier Speicher für struct Node geholt ... */

    node=(struct Node *)AllocRemember(&remember, sizeof(struct Node), MEMF_CLEAR);

    /* Speicher für den Namen ... */

    projname=(char *)AllocRemember(&remember, strlen(dob->do_DefaultTool)+1, MEMF_CLEAR);

    /* ... der Name wird kopiert */

    strcpy(projname, dob->do_DefaultTool);

    /* ... und der neue Knoten in die Liste eingetragen. */

    GT_SetGadgetAttrs(LV_GAD, mw, NULL, GTLV_Labels    ,~0,
                                        LAYOUTA_SPACING, 1,
                                        TAG_DONE);

    node->ln_Name=projname;
    AddTail(&foundproj, node);

    /* Abschließend noch den Inhalt des LISTVIEW_KIND-Gadgets neu zeichnen */

    GT_SetGadgetAttrs(LV_GAD, mw, NULL, GTLV_Labels    ,&foundproj,
                                        LAYOUTA_SPACING, 1,
                                        TAG_DONE);
    }

/***********************************************************************/
/*  Falls das gefundene DefaultProject identisch mit dem zu suchenden  */
/*  ist, wird es ersetzt.                                              */
/***********************************************************************/

    if(0L==stricmp(dob->do_DefaultTool,&olddefproj))
      {
      /* Ist es kein 0L-String */
      if (strlen(&newdefproj))
        {
        /* User informieren */
        itext.IText = (UBYTE *)"Ersetzen...";
        PrintIText(mw->RPort, &itext, 0L, 0L);

        /* Ich muß den alten Eintrag behalten, damit ich ihn nach PutDiskObject */
        /* wieder in die dob-Struktur eintragen kann.                           */
        /* Wenn ich das nicht tue, kommt FreeDiskObject() durcheinander und     */
        /* zerschreibt mir meinen Speicher.                                     */

        oldTool=dob->do_DefaultTool;
        dob->do_DefaultTool=(char *)&newdefproj;

        if(!PutDiskObject(name, dob))
           Printf("%ld",IoErr());

        dob->do_DefaultTool=oldTool;

        GT_SetGadgetAttrs(LV_GAD, mw, NULL, GTLV_Labels    ,~0,
                                            LAYOUTA_SPACING, 1,
                                            TAG_DONE);

        if (node=FindName(&foundproj,(STRPTR)dob->do_DefaultTool))
            Remove(node);

        /* Abschließend noch den Inhalt des LISTVIEW_KIND-Gadgets neu zeichnen */

        GT_SetGadgetAttrs(LV_GAD, mw, NULL, GTLV_Labels    ,&foundproj,
                                            LAYOUTA_SPACING, 1,
                                            TAG_DONE);

      
     }    
    }
}





ScanDirforDirs(dirlock)
struct FileLock *dirlock;
{
register  struct FileInfoBlock *finfo;
register  struct FileLock      *newlock,*oldlock;

    ScanDirforIcons();

    if (finfo = (struct FileInfoBlock *)                       /*Speicher für folgendes*/
       AllocMem (sizeof (struct FileInfoBlock), MEMF_PUBLIC))  /*Examine bereitstellen */
      {
      if (Examine((BPTR)dirlock,finfo))
        {
          while (ExNext((BPTR)dirlock,finfo))  /* das neue Dir durchforsten */
            {
            if (finfo->fib_DirEntryType > 0)   /* ist's ein Dir ? */
              {
              if(newlock=(struct FileLock *)Lock(finfo->fib_FileName, ACCESS_READ))
                {
                oldlock = (struct FileLock *)CurrentDir((BPTR)newlock); /* alten Lock auf's Dir   */
                ScanDirforDirs (newlock);                               /* und nach weiteren Dirs durchsuchen */
                CurrentDir((BPTR)oldlock);
                UnLock((BPTR)newlock);
                }
              else
                /* Keinen Lock auf finfo->fib_FileName erhalten */
                /* Benutzer sollte informiert werden            */
                /* Für jetzt reicht mir ein DisplayBeep()       */
                
                DisplayBeep(0L);
              }
            }
        }
      }
    FreeMem(finfo,sizeof(struct FileInfoBlock));        /* Der Speicher für den FileInfoBlock */
}

ScanDirforIcons()
{
struct DiskObject *dob;
char *infofile;
char *punktpointer;


   while(infofile=(BYTE *)scdir("*.info"))
        {
        punktpointer=(char *)strrchr(infofile, (LONG) '.');
        *punktpointer=0;
        if(dob=(struct DiskObject *)GetDiskObject(infofile))
          {
          if (dob->do_Type==WBPROJECT)
               {
               ChangeDefaultProject(dob,infofile);
               }
          FreeDiskObject(dob);  
          }
        }
}

ClearList()
{
extern struct List  foundproj;
extern struct Remember *remember;
extern struct Window  *mw;
extern struct Gadget  *Gadgets[];
extern struct TagItem LVGadgetTags;

        GT_SetGadgetAttrs(LV_GAD, mw, NULL, GTLV_Labels    ,~0,
                                            LAYOUTA_SPACING, 1,
                                            TAG_DONE);

        if (remember) FreeRemember(&remember, TRUE);
        NewList(&foundproj);

        GT_SetGadgetAttrs(LV_GAD, mw, NULL, GTLV_Labels    ,&foundproj,
                                            LAYOUTA_SPACING, 1,
                                            TAG_DONE);
}
