
/* reqlibrary.h © 1988/1989 reserved by Colin Fox and Bruce Dawson */

#ifndef REQLIBRARY_H
#define REQLIBRARY_H

#define	REQVERSION	1


#define	NUMPAIRS	10

struct GadgetBlock
	{
	struct Gadget		Gadget;
	struct Border		Border;
	WORD				Pairs[NUMPAIRS];
	struct IntuiText	Text;
	};

struct StringBlock
	{
	struct Gadget		Gadget;
	struct StringInfo	Info;
	struct Border		Border;
	WORD				Pairs[NUMPAIRS];
	};

struct PropBlock
	{
	struct Gadget		Gadget;
	struct PropInfo		Info;
	struct Image		Image;
	};

struct ScrollBlock
	{
	struct Gadget		ArrowUpLt;
	struct Image		ImageUpLt;
	struct Gadget		ArrowDnRt;
	struct Image		ImageDnRt;
	struct PropBlock	Prop;
	};

struct TwoImageGadget
	{
	struct Gadget		Gadget;
	struct Image		Image1;
	struct Image		Image2;
	};

#define	ATTITUDEB	16

#define	HORIZSLIDER		(0L<<ATTITUDEB)	/*;which way the slider stands*/
#define	VERTSLIDER		(1L<<ATTITUDEB)	/*;This is so that it bypasses all gadget flags.*/



/*;         This structure is use with the TextRequester function.*/

struct TRStructure
	{
	char	*Text;			/* ;This is the message text, including printf() style formatting if desired.*/
	char	*Controls;		/* ;This is the address of the parameter list, if printf() style formatting is used.*/
	struct Window	*Window;/* ;This is an optional (zero if not used) pointer to a window on the screen you*/
							/* ;would like the requester to show up on.*/
	char	*MiddleText;	/* ;If non-zero, this is the text for the gadget in the lower middle (returns 2).*/
	char	*PositiveText;	/* ;If non-zero, this is the text for the gadget in the lower left hand corner (returns 1).*/
	char	*NegativeText;	/* ;If non-zero, this is the text for the gadget in the lower right (returns 0).*/
	char	*Title;			/* ;This is the title for the window.*/
	WORD	KeyMask;		/* ;This is the qualifier mask for the keyboard shortcuts.*/
							/* ;Use $FFFF to allow any qualifiers (or none).*/
							/* ;Zero means that no keyboard shortcuts are allowed.*/
	WORD	textcolor;		/* ;Color of the text.  Uses color 1 if no color specified. */
	WORD	detailcolor;	/* ;Detail and block color, as in a NewWindow structure.  If */
	WORD	blockcolor;		/* ;both are left zero, block pen will be set to 1. */
	WORD	versionnumber;	/* ;Make SURE this is set to zero. */
	LONG	rfu1;			/* ;Make SURE you leave these two zeroed also. */
	LONG	rfu2;			/* ;Make SURE you leave these two zeroed also. */
	};

/* NOTE:

    The  control  values  mentioned above are used if you choose to insert
printf  style directives in your strings and should contain the address of
a list of control parameters, usually on the stack.
    */



/*;         Remember,   if  you  don't  want  to  go  through  the  hassle  of */
/*; initializing a ExtendedColorRequester structure, you can always just call */
/*; ColorRequester  (as opposed to ExtendedColorRequester).  ColorRequester */
/*; just  takes  a  single  parameter, in D0, the color that should start out */
/*; being highlit.  It returns a single value, the color that was selected at */
/*; the end.

/*;         This structure is for use with the ExtendedColorRequester (_not_, */
/*; the ColorRequester) function. */

struct ExtendedColorRequester
	{
	LONG	defcolor;		/*;The color that is initially highlit. */
	APTR	window;			/*;The window the 'requester' opens up in. */
	LONG	rfu1;			/*;Who knows what these will be used for, */
	LONG	rfu2;			/*;but I'm sure we'll think of something. */
	LONG	rfu3;			/*;Until then, just keep these zeroed. */
	LONG	rfu4;			/*;Okay? */
	LONG	rfu5;
	};



/*;         This structure is for use with the GetLong function.*/

#define	GLNODEFAULTB	0	/*;Set this bit in the flags if you don't want a default*/
							/*;value to show up in the get long string gadget.  For*/
							/*;some things this is much better than having a zero*/
							/*;show up.*/

#define	GLNODEFAULTM	(1<<GLNODEFAULTB)

struct GetLongStruct
	{
	char	*titlebar;
	LONG	defaultval;
	LONG	minlimit;
	LONG	maxlimit;
	LONG	result;
	struct Window	*window;
	WORD	versionnumber;	/* ;Make SURE this is set to zero. */
	LONG	flags;			/* Some, uh flags.  See above for bit definitions. */
	LONG	rfu2;			/* ;Make SURE you leave these two zeroed also. */
	};



#ifndef	DSIZE
#define	DSIZE	130
#define	FCHARS	30
#endif
#define	WILDLENGTH	30

#define	FRQSHOWINFOB	0	/*;Set this in Flags if you want .info files to show.  They default to hidden.*/
#define	FRQEXTSELECTB	1	/*;Set this in Flags if you want extended select.  Default is not.*/
#define	FRQCACHINGB		2	/*;Set this in Flags if you want directory caching.  Default is not.*/
#define	FRQGETFONTSB	3	/*;Set this in Flags if you want a font requester rather than a file requester.*/
#define	FRQINFOGADGETB	4	/*;Set this in Flags if you want a hide-info files gadget.*/
#define	FRQHIDEWILDSB	5	/*;Set this in Flags if you DON'T want 'show' and 'hide' string gadgets.*/
#define	FRQABSOLUTEXYB	6	/*;Use absolute x,y positions rather than centering on mouse.*/
#define	FRQCACHEPURGEB	7	/*;Purge the cache whenever the directory date stamp changes if this is set.*/
#define	FRQNOHALFCACHEB	8	/*;Don't cache a directory unless it is completely read in when this is set.*/
#define	FRQNOSORTB		9	/*;Set this in Flags if you DON'T want sorted directories.*/
#define	FRQNODRAGB		10	/*;Set this in Flags if you DON'T want a drag bar and depth gadgets.*/
#define	FRQSAVINGB		11	/*;Set this bit if you are selecting a file to save to.*/
#define	FRQLOADINGB		12	/*;Set this bit if you are selecting a file(s) to load from.*/
							/*;These two bits (save and load) aren't currently used for*/
							/*;anything, but they may be in the future, so you should*/
							/*;remember to set them.  Also, these bits make it easier if*/
							/*;somebody wants to customize the file requester for their*/
							/*;machine.  They can make it behave differently for loading*/
							/*;vs saving.*/
#define	FRQDIRONLYB		13	/*;Allow the user to select a directory, rather than a file. */

#define	FRQSHOWINFOM	(1<<FRQSHOWINFOB)
#define	FRQEXTSELECTM	(1<<FRQEXTSELECTB)
#define	FRQCACHINGM		(1<<FRQCACHINGB)
#define	FRQGETFONTSM	(1<<FRQGETFONTSB)
#define	FRQINFOGADGETM	(1<<FRQINFOGADGETB)
#define	FRQHIDEWILDSM	(1<<FRQHIDEWILDSB)
#define	FRQABSOLUTEXYM	(1<<FRQABSOLUTEXYB)
#define	FRQCACHEPURGEM	(1<<FRQCACHEPURGEB)
#define	FRQNOHALFCACHEM	(1<<FRQNOHALFCACHEB)
#define	FRQNOSORTM		(1<<FRQNOSORTB)
#define	FRQNODRAGM		(1<<FRQNODRAGB)
#define	FRQSAVINGM		(1<<FRQSAVINGB)
#define	FRQLOADINGM		(1<<FRQLOADINGB)
#define	FRQDIRONLYM		(1<<FRQDIRONLYB)

struct ESStructure
	{
	struct ESStructure	*NextFile;
	WORD	NameLength;			/* Length of thefilename field, not including the terminating zero. */
	WORD	Pad;
	APTR	Node;				/* For internal use only. */
	char	thefilename[1];		/* This is a variable size field. */
	};

struct FileRequester
	{
	UWORD	VersionNumber;				/* Make sure this is zeroed for now. */

	char	*Title;						/* Hailing text */
	char	*Dir;						/* Directory array (DSIZE+1) */
	char	*File;						/* Filename array (FCHARS+1) */

	char	*PathName;					/* Complete path name array (DSIZE+FCHARS+2) */

	struct Window	*Window;			/* Window requesting or NULL */


	UWORD	MaxExtendedSelect;			/* Zero implies a maximum of 65535, as long as FRQEXTSELECT is set.*/
	UWORD	numlines;					/* Number of lines in file window. */
	UWORD	numcolumns;					/* Number of columns in file window. */
	UWORD	devcolumns;
	ULONG	Flags;						/* Various - umm - flags.  See above for more info. */
	UWORD	dirnamescolor;			/* These five colors will all default */
	UWORD	filenamescolor;			/* to color one if you don't specify */
	UWORD	devicenamescolor;		/* a color (ie; if you specify color zero). */
	UWORD	fontnamescolor;			/* If you want color zero to be used, specify */
	UWORD	fontsizescolor;			/* color 32, or some other too large number */
									/* which mods down to zero. */

	UWORD	detailcolor;			/* If both of these colors are specified as */
	UWORD	blockcolor;				/* zero then the block pen will be set to one. */

	UWORD	gadgettextcolor;		/* The color for the text of the five boolean gadgets.  Defaults to 1. */
	UWORD	textmessagecolor;		/* The color for the message at the screen top.  Defaults to 1. */
	UWORD	stringnamecolor;		/* The color for the words Drawer, File, Hide and Show.  Defaults to 3. */
	UWORD	stringgadgetcolor;		/* The color for the borders of the string gadgets.  Defaults to 3. */
									/* Unfortunately it is not possible to specify */
									/* the color of the actual text in an Intuition */
									/* string gadget. */
	UWORD	boxbordercolor;			/* The color for the boxes around the file and directory areas.  Defaults to 3. */
	UWORD	gadgetboxcolor;			/* The color for the boxes around the five boolean gadgets.  Defaults to 3. */

	UWORD	FRU_Stuff[18];				/* This area, which is reserved for */
										/* future use, should all be zero. */

	struct DateStamp	DirDateStamp;	/* A copy of the cached directories date stamp. */
										/* There should never be any need to change this. */

	UWORD	WindowLeftEdge;			/* These two fields are only used when the */
	UWORD	WindowTopEdge;			/* FRQABSOLUTEXY flag is set.  They specify */
									/* the location of the upper left hand */
									/* corner of the window. */

	UWORD	FontYSize;				/* These fields are used to return the selected */
	UWORD	FontStyle;				/* font size and style, only applicable when the */
									/* font bit is set. */

	/*If you set the extended select bit and the user extended selects, the list of filenames will start from here.*/
	struct ESStructure *ExtendedSelect;
	char	Hide[WILDLENGTH+2];		/* The wildcards text. */
	char	Show[WILDLENGTH+2];		/* More wildcards text. */
	WORD	FileBufferPos;			/* Various fields taken from the various */
	WORD	FileDispPos;			/* string gadgets so that the cursor */
	WORD	DirBufferPos;			/* can be returned to the same position */
	WORD	DirDispPos;				/* on subsequent calls. */
	WORD	HideBufferPos;
	WORD	HideDispPos;
	WORD	ShowBufferPos;
	WORD	ShowDispPos;

/**;      The  following  fields are PRIVATE!  Don't go messing with them or
; wierd  things may/will happen.  If this isn't enough of a warning, go read
; the one in intuition.h, that should scare you off.**/

	APTR	Memory;						/* Memory allocate for dir entries. */
	APTR	Memory2;					/* More memory, used for hidden files. */
	APTR	Lock;
	char	PrivateDirBuffer[DSIZE+2];	/* Used for keeping a record of which */
										/* directory we have file names for. */
	struct FileInfoBlock	*FileInfoBlock;
	WORD	NumEntries;
	WORD	NumHiddenEntries;
	WORD	filestartnumber;
	WORD	devicestartnumber;
	};



/*        This is used with the RealTimeScroll function. */

struct ScrollStruct
 	{
	ULONG	TopEntryNumber;			/*;This is the ordinal number of the first*/
									/*;displayed entry.*/
	ULONG	NumEntries;				/*;This is the total number of entries in*/
									/*;the list.*/
	UWORD	LineSpacing;			/*;This is how many pixels high each entry is.*/
	ULONG	NumLines;				/*;This is how many entries can be displayed simultaneously.*/
	struct Gadget	*PropGadget;	/*;This is a pointer to the prop gadget being monitored.*/

	void	(*RedrawAll)();			/*;This routine is used to redraw all of the*/
									/*;entries when the user moves far enough*/
									/*;that scrolling will take too long.*/

	void	(*ReadMore)();			/*;An optional routine that is called when*/
									/*;the scroll routine is waiting for movement.*/
									/*;This allows reading of new data while real*/
									/*;time scrolling.*/
	void	(*ScrollAndDraw)();		/*;This routine is called when the data needs*/
									/*;to be scrolled and updated.  This routine is*/
									/*;passed four long parameters (on the stack and*/
									/*;in D0-D3) which are, respectively:*/
									/*;D0 - entry number of first line to be drawn.*/
									/*;D1 - pixel offset to draw first line at.*/
									/*;D2 - amount to scroll before doing any drawing.*/
									/*;D3 - number of lines of data to draw.*/
	WORD	versionnumber;			/*;Make SURE this is set to zero. */
	LONG	rfu1;					/*;Make SURE you leave these two zeroed also. */
	LONG	rfu2;					/*;Make SURE you leave these two zeroed also. */
	};





struct chipstuff
	{
	char	ArrowUp[20];		/* 16 pixels wide, 10 pixels high. */
	char	ArrowDown[20];		/* 16 pixels wide, 10 pixels high. */
	char	ArrowLeft[18];		/* 16 pixels wide, 9 pixels high. */
	char	ArrowRight[18];		/* 16 pixels wide, 9 pixels high. */
	char	Letter_R[20];		/* 16 pixels wide, 10 pixels high. */
	char	Letter_G[20];		/* 16 pixels wide, 10 pixels high. */
	char	Letter_B[20];		/* 16 pixels wide, 10 pixels high. */
	char	Letter_H[20];		/* 16 pixels wide, 10 pixels high. */
	char	Letter_S[20];		/* 16 pixels wide, 10 pixels high. */
	char	Letter_V[20];		/* 16 pixels wide, 10 pixels high. */
	};

struct ReqLib
	{
	struct Library RLib;
	struct AbsExecBase		*SysLib;
	struct DosBase			*DosLib;
	struct IntuitionBase	*IntuiLib;
	struct GfxBase			*GfxLib;
	APTR					SegList;
	struct chipstuff		*Images;
	BYTE					Flags;
	BYTE					Pad;
	char					*ConsoleDev;	/* Not really a char*, but it should work */
	struct	IOStdReq		*ConsoleHandle;
	};


#endif
