/******************************************************************************

    MODULE
	Request.c

    DESCRIPTION
	Command frontend for the different ReqTools Requesters

    NOTES
	Needs ReqTools.library >=v38

    BUGS
	none known

    TODO
	split for filereq

    EXAMPLES

    SEE ALSO

    INDEX

    HISTORY
	11-09-94 b_noll created
	14-09-94 b_noll command documentation
	21-09-94 b_noll added DEFCMD/DEFHELP-support
	24-09-94 b_noll "ReqCheck()" as macro
	01-10-94 b_noll introduced DEFMESSAGE

******************************************************************************/


/**************************************
	      Includes
**************************************/

#include <exec/types.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <libraries/reqtools.h>

#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/reqtools.h>

/* #include "xdme_base.h" */
#include "defs.h"

/**************************************
	    Global Variables
**************************************/

Prototype char ReqString[];

/**************************************
      Internal Defines & Structures
**************************************/


/**************************************
	   Internal Variables
**************************************/

char ReqString[MAXLINELEN];
long ReqResult;
DEFMESSAGE( _REQ_needing_reqtools, "%s:\n`reqtools.library' is needed for that Command!\n" )
//const char *ReqE_NoReqLib = _REQ_needing_reqtools;
#define ReqE_NoReqLib _REQ_needing_reqtools

/**************************************
	   Internal Prototypes
**************************************/


/**************************************
		 Macros
**************************************/

#define ReqCheck()                  \
    if (!ReqToolsBase) {            \
	error (ReqE_NoReqLib,av[0]);\
	return RET_FAIL;	    \
    } /* if */


/**************************************
	     Implementation
**************************************/


/***************************************************
		XDME COMMAND INTERFACE 11 Sep 1994
***************************************************/

/*
*!
*! >REQSTRING Title/A,Text/A,Gadgets/A,InitValue/A
*!
*!  Interface to the ReqTools StringRequester
*!  Opens a synchroneous ReqTools Requester
*!  with the given values
*!
*!  The Result is written into ReqResult
*!  Cancelling the Requester sets globalflags.Abortcommand;
*!
*!  gadgets = "|"-separated List of Strings
*!
*/
/*DEFHELP #cmd requester REQSTRING title format gadgets defvalue - display a synch ReqTools StringRequest; the result is put in $REQRESULT. */
DEFUSERCMD("reqstring",     4, CF_COK|CF_VWM|CF_ICO, int, do_reqstring, (void),)
{
    char *title   = av[1];
    char *format  = av[2];
    char *gadgets = av[3];
    char *value   = av[4];

    ReqCheck();

    strcpy (ReqString, value);
    ReqResult = rtGetString (ReqString, sizeof(ReqString), title, NULL,
	RTGS_GadFmt, gadgets,
	(format && *format)? RTGS_TextFmt: TAG_IGNORE, format,

	TAG_END);
    if (ReqResult == FALSE)
	SET_ABORTION( 1 );
    return RET_SUCC;
} /* do_reqstring */

/*
*!
*! >REQNUMBER Title/A,Text/A,Gadgets/A,InitValue/N/A,Minimum/N/A,Maximum/N/A
*!
*!  Interface to the ReqTools NumberRequester
*!  Opens a synchroneous ReqTools Requester
*!  with the given values
*!
*!  The Result is written into ReqResult
*!  Cancelling the Requester sets globalflags.Abortcommand;
*!
*!  gadgets = "|"-separated List of Strings
*!
*/
/*DEFHELP #cmd requester REQNUMBER title format gadgets defvalue min max - display a synch ReqTools NumberRequest; the result is put in $REQRESULT. */
DEFUSERCMD("reqnumber",     6, CF_COK|CF_VWM|CF_ICO, int, do_reqnumber, (void),)
{
    char *title   = av[1];
    char *format  = av[2];
    char *gadgets = av[3];
    char *value   = av[4];
    char *minimum = av[5];
    char *maximum = av[6];

    ULONG longnum = atol(value);

    ReqCheck();

    ReqResult = rtGetLong (&longnum, title, NULL,
	RTGL_Min,     atol(minimum),
	RTGL_Max,     atol(maximum),
	RTGL_GadFmt,  gadgets,
	(format && *format)? RTGL_TextFmt: TAG_IGNORE, format,

	RT_Window, active_window(), TAG_END);
    if (ReqResult == FALSE)
	SET_ABORTION( 1 );
    else
	strcpy (ReqString, ltostr(longnum));
    return RET_SUCC;
} /* do_reqnumber */

/*
*!
*! >REQPALETTE Title/A,InitValue/N/A
*!
*!  Interface to the ReqTools PaletteRequester
*!  Opens a synchroneous ReqTools Requester
*!  with the given values
*!
*!  The Result is written into ReqResult
*!  Cancelling the Requester sets globalflags.Abortcommand;
*!
*/
/*DEFHELP #cmd requester REQPALETTE title defvalue - display a synch ReqTools PaletteRequest; the result is put in $REQRESULT. */
DEFUSERCMD("reqpalette",    2, CF_COK|CF_VWM|CF_ICO, int, do_reqpalette, (void),)
{
    char *title = av[1];
    char *value = av[2];

    ReqCheck();

    ReqResult = rtPaletteRequest(title, NULL,
	RTPA_Color, atol(value),

	RT_Window, active_window(), TAG_END);
    if (ReqResult == -1)
	SET_ABORTION( 1 );
    else
	strcpy (ReqString, ltostr(ReqResult));
    return RET_SUCC;
} /* do_reqpalette */


/*
*!
*! >REQUEST Title/A,Text/A,Gadgets/A
*!
*!  Interface to the ReqTools EZ Requester
*!  Opens a synchroneous ReqTools Requester
*!  with the given values
*!
*!  The Result is written into ReqResult
*!
*!  gadgets = "|"-separated List of Strings
*!
*/
/*DEFHELP #cmd requester REQUEST title body gadgets - display a synch ReqTools EZRequest; the result is put in $REQRESULT. */
DEFUSERCMD("request",       3, CF_COK|CF_VWM|CF_ICO, int, do_request, (void),)
{
    char *title   = av[1];
    char *body	  = av[2];
    char *gadgets = av[3];

    ReqCheck();

    ReqResult = rtEZRequestTags(body, gadgets, NULL, NULL,
	RTEZ_ReqTitle, title,

	RT_Window, active_window(), TAG_END);
    strcpy (ReqString, ltostr(ReqResult));
    return RET_SUCC;
} /* do_request */

/*
*!
*! >REQFILE Title/A,Flags/A,InitValue/A
*!
*!  Interface to the ReqTools FileRequester
*!  Opens a synchroneous ReqTools Requester
*!  with the given values
*!
*!  The Result is written into ReqResult
*!  Cancelling the Requester sets globalflags.Abortcommand;
*!
*!  flags = [PSD]*;
*!	     P=Pattern On; S=Save Mode; D=Director Mode;
*!
*/
/*DEFHELP #cmd requester REQFILE title flags defvalue - display a synch ReqTools FileRequest; the result is put in $REQRESULT. */
DEFUSERCMD("reqfile",       3, CF_COK|CF_VWM|CF_ICO, int, do_reqfile, (void),)
{
    char *title = av[1];
    char *flags = av[2];
    char *value = av[3];
    unsigned long flg = FREQF_NOBUFFER;
    struct rtFileRequester *filereq;
    char *dir;

    ReqCheck();

    while (*flags)
	switch (*(flags++)) {
	case 's':
	case 'S':
	    flg |= FREQF_SAVE;
	    break;
	case 'd':
	case 'D':
	    flg |= FREQF_NOFILES;
	    break;
	case 'p':
	case 'P':
	    flg |= FREQF_PATGAD;
	    break;
	default:
DEFMESSAGE( _REQ_unknown_flag, "%s:\nUnknown Flag `%c'")
	    error (_REQ_unknown_flag, av[0], *flags);
	    return RET_FAIL;
	}

    if (!(dir = malloc(PATHSIZE))) {
	nomemory();
	return RET_FAIL;
    } /* if */

    splitpath (value, tmp_buffer, dir);

    if ((filereq = rtAllocRequestA (RT_FILEREQ, NULL))) {

	rtChangeReqAttr (filereq,
		RTFI_Dir, dir,
		(flg & FREQF_PATGAD)? RTFI_MatchPat: TAG_IGNORE, pattern,
		TAG_DONE);

	ReqResult = rtFileRequest (filereq, tmp_buffer, title,
	    RTFI_Flags, flg,
	    RT_Window,	 active_window(),
	    RTFI_Height, Ep->config.aslheight,
	    TAG_END);

	if (ReqResult) {
	    strcpy (ReqString, filereq->Dir);
	    AddPart(ReqString, tmp_buffer, sizeof(ReqString));
	} else
	    SET_ABORTION( 1 );
	rtFreeRequest (filereq);
    } else
	nomemory();

    free(dir);

    return RET_SUCC;
} /* do_reqfile */

/* ;
int do_reqchoice (void)
{
    char *title = av[1];

    ReqCheck();

    ...

    return RET_SUCC;
} /* do_reqchoice */


#if 0
 /*DEFHELP #cmd requester REQFONT title flags defvalue - display a synch ReqTools FontRequest; the result is put in $REQRESULT. */
 DEFUSERCMD("reqfont2", 3, CF_VWM|CF_ICO|CF_COK, void, do_reqfont2, (void),)
{
    struct rtFontRequester *fontreq;
    char *title = av[1];
    char *flags = av[2];
    char *value = av[3];
    char *style = "";
    unsigned long flg = 0;
    unsigned long stl = FS_NORMAL;
    unsigned long hig = 0;

    ReqCheck();

    while (*flags)
	switch (*(flags++) | 32) {
	case 'f':
	    flg |= FREQF_FIXEDWIDTH;
	    break;
	case 'c':
	    flg |= FREQF_SCALE;
	    break;
	case 's':
	    flg |= FREQF_STYLE;
	    break;
	default:
DEFMESSAGE( _REQ_unknown_flag, "%s:\nUnknown Flag `%c'")
	    error (_REQ_unknown_flag, av[0], *flags);
	    return RET_FAIL;
	}

#if 0
    while (*style)
	switch (*(style++) | 32) {
	case 'b':
	    stl |= FSF_BOLD;
	    break;
	case 'i':
	    stl |= FSF_ITALIC;
	    break;
	case 'u':
	case '_':
	    stl |= FSF_UNDERLINED;
	    break;
	default:
DEFMESSAGE( _REQ_unknown_style, "%s:\nUnknown style `%c'")
	    error (_REQ_unknown_style, av[0], *flags);
	    return RET_FAIL;
	}

    if (stl && !(flg & FREQF_STYLE)) {
DEFMESSAGE( _REQ_using_styles_wo_styleflag, "%s:\nUsing Fontstyles w/ the Styleflag unset")
	error (_REQ_using_styles:wo_styleflag, av[0]);
	return RET_FAIL;
    }
#endif

    sscanf (value, "%s %ld", &ReqString[2], &ReqResult);

    if ((fontreq = rtAllocRequestA (RT_FONTREQ, NULL))) {

	rtChangeReqAttr (fontreq,
		stl? RTFO_FontStyle:  TAG_IGNORE, stl,
		RTFO_FontHeight,  ReqResult,
		RTFO_FontName,	  &ReqString[2],
		TAG_DONE);

	ReqResult = rtFontRequest (fontreq, title,
	    RTFO_MinHeight, 6,
	    RTFO_MaxHeight, 24,
	    RTFO_Flags,     flg,

	    RT_Window,	 active_window(),
	    RTFO_Height, Ep->config.aslheight,
	    TAG_END);

	if (ReqResult) {
	    FONT *font;
	    font = (FONT *)GetFont (fontreq->Attr.ta_Name, (short)fontreq->Attr.ta_YSize );
	    if (font)
		CloseFont (font);
	    else
		SET_ABORTION( 1 );

	    sprintf (ReqString, "%s %d",
				    fontreq->Attr.ta_Name,
				    (int)fontreq->Attr.ta_YSize );
	} else
	    SET_ABORTION(Ep,1);

	rtFreeRequest (fontreq);
    } else
	nomemory ();

} /* do_reqfont */
#endif






#ifdef SPC_VAR

global const str reqresult = %{
    reference = "ReqString";
    help      = %[
	Result of the recent call to any of the commands Request, ReqString,
	ReqNumber, ReqPalette or ReqFile, assuming the requester command was
	not aborted nor cancelled.
    %];
%};

#endif

/******************************************************************************
*****  END Request.c
******************************************************************************/
