/*
 * filereq.c   V1.5
 *
 * file requester stuff
 *
 * (c) 1991 by Stefan Becker
 *
 */
#include "ToolManager.h"

struct Library *AslBase; /* Library for file requester */
static struct EasyStruct SaveES={sizeof(struct EasyStruct),0,"Configuration",
                                 "The configuration has been changed.",
                                 "Save First|Continue|Cancel"};

/* Open a file requester */
BOOL ShowFileRequester(struct Window *w, char *hail, char **name, int type)
{
 struct FileRequester *req;
 char *cp,*dir,*file,*pat="~(#?.info)";
 UWORD flags1=0,flags2=0;
 BOOL rc=TRUE; /* means "User canceled" or error */

 /* Open ASL library */
 if (!(AslBase=OpenLibrary(AslName,0))) goto fre0;

 /* Get memory for dir string */
 if (!(dir=malloc(NAMELEN))) goto fre1;

 /* Get memory for file string */
 if (!(file=malloc(NAMELEN))) goto fre2;

 /* Split file name */
 cp=FilePart(*name);
 if (cp!=*name) strncpy(dir,*name,cp-*name);
 dir[cp-*name]='\0';
 strncpy(file,cp,NAMELEN);

 /* Set flags */
 switch(type)
  {
   case FREQ_SAVE:         /* Save requester, display no icons */
    flags1=FILF_PATGAD|FILF_SAVE;
    break;
   case FREQ_FILE:         /* File requester, display no icons */
    flags1=FILF_PATGAD;
    break;
   case FREQ_DIRS:         /* Directory requester, display no files */
    flags2=FIL1F_NOFILES;
    break;
   case FREQ_ICON:         /* Icon requester, display all files */
    pat="#?";
    break;
  }

 /* Alloc file requester structure */
 if (!(req=AllocAslRequestTags(ASL_FileRequest,ASL_Hail,hail,
                                               ASL_Window,w,
                                               ASL_LeftEdge,50,
                                               ASL_TopEdge,50,
                                               ASL_Dir,dir,
                                               ASL_File,file,
                                               ASL_FuncFlags,flags1,
                                               ASL_ExtFlags1,flags2,
                                               ASL_Pattern,pat,
                                               TAG_DONE)))
  goto fre3;

 /* Open file requester */
 if (AslRequest(req,NULL))
  if (((type==FREQ_DIRS) && *req->rf_Dir) || *req->rf_File) /* Valid name? */
   {
    /* Build complete name */
    if (req->rf_Dir)
     strncpy(dir,req->rf_Dir,NAMELEN);
    else
     dir[0]='\0';
    if (type!=FREQ_DIRS) AddPart(dir,req->rf_File,NAMELEN);

    *name=dir;    /* return buffer (MUST BE FREED BY CALLER!!) */
    rc=FALSE;                          /* User selected a file */
   }

 /* Free resources */
 FreeAslRequest(req);
fre3: free(file);
fre2: if (rc) free(dir); /* Buffer must be freed by caller! */
fre1: CloseLibrary(AslBase);
fre0: return(rc);
}

/* Put up a save config requester */
BOOL ShowSaveConfigRequester(struct Window *w)
{
 BOOL rc=FALSE; /* Means user clicked OK */

 /* If config has been changed, Ask if it should be saved */
 if (ConfigChanged)
  switch(EasyRequest(w,&SaveES,NULL,""))
   {
    case 0:                        /* User pressed "Cancel" */
     rc=TRUE;
     break;
    case 1:                        /* User pressed "Save First" */
     rc=WriteConfigFile(w,FALSE);
     break;
   }
 return(rc);
}
