#include "exec/types.h"


/*Die Datenstruktur und die einstellbaren Flags wurden vom
FileRequester Aufruf der REQUESTER.Library übernommen, so daß
eine Umstellung auf den RCT-File-Requester sehr einfach gemacht
werden kann.*/

/* Definitionen für RCT-FileRequester */

/* DSIZE ist die Definition für die Größe des Pfadnamen-Arrays.		*/
/* FCHARS steht für die Größe des Dateinamen-Arrays.						*/
/* WILDLENGTH ist die länge des Stings für den Hide- und Showtext.	*/

/* Durch folgende Flags kann das Aussehen und die Art des Requesters */
/* verändert werden: 																*/

/* FRQCACHINGM 	 Wenn das eingelesene Verzeichnis
						 zwischengespeichert und beim nächsten Aufruf
						 des Requesters wieder aufgerufen werden soll */
/* FRQABSOLUTEXYM  in den Felder WindowLeftEdge, WindowTopEdge
						 werden Koordianten angegeben anderenfalls wird
						 der Requester zentiert */
/* FRQCACHEPURGEM  Das zwischengespeicherte Verzeichnis wird
						 neu geladen wenn sich das Datum des Verzeichnisses geändert hat */
/* FRQNOHALFCACHEM Die eingelesenen Dateien werden nicht bis zum
						 nächsten Aufruf zwischengespeichert, wenn sie nicht vollständig
						 eingelesen werden konnten */
/* FRQNOSORTM		 Die Dateinamen sollen unsortiert angezeigt
						 werden */
/* FRQNODRAGM		 Der Requester kann nciht verschoben oder in
						 den Hinter-/Vordergrund geholt werden */
/* FRQSAVINGM		 Im "OK-Gadget" wird der Text "SAVE" angezeigt */
/* FRQLOADINGM 	 Im "OK-Gadget" wird der text "LOAD" angezeigt */
/* FRQNODEPTHM 	 Das Fenster soll zwar verschiebbar aber nicht
						 in der Vorder-/Hintergrund stellbar sein. */


#ifndef	DSIZE
#define	DSIZE 130
#define	FCHARS	30
#endif	/* ifndef DSIZE */

#define	WILDLENGTH	30

#define	FRQSHOWINFOB	  0
#define	FRQEXTSELECTB	  1
#define	FRQCACHINGB 	  2
#define	FRQGETFONTSB	  3
#define	FRQINFOGADGETB   4
#define	FRQHIDEWILDSB	  5
#define	FRQABSOLUTEXYB   6
#define	FRQCACHEPURGEB   7
#define	FRQNOHALFCACHEB  8
#define	FRQNOSORTB		  9
#define	FRQNODRAGB		 10
#define	FRQSAVINGB		 11
#define	FRQLOADINGB 	 12
#define	FRQDIRONLYB 	 13
#define	FRQNODEPTHB 	 14

#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)
#define	FRQNODEPTHM 	(1<<FRQNODEPTHB)



/* Die Struktur sieht folgendermaßen aus: */


struct RCTFileRequester
  {
  UWORD	 VersionNumber;		 /* Die Versionsnummer der
											 Library, die beim Programmieren verwendet wird */

  char	 *Title; 				 /* Entweder der Fenstertitel oder
											 ein besonderes Requestergadget */
  char	 *Dir;					 /* Pfad-Array (DSIZE+1) */
  char	 *File;					 /* Dateiname-Array (FCHARS+1) */
  char	 *PathName; 			 /* Pfad- und Dateinamen-Array (DSIZE+FCHARS+2) */

  struct Window *Window;		 /* Window in dem der Requester
											 angezeigt werden soll oder NULL */
  UWORD	 reserved;				 /* wird ignoriert */
  UWORD	 numlines;				 /* wird ignoriert */
  UWORD	 numcolumns;			 /* wird ignoriert */
  UWORD	 devcolumns;
  ULONG	 Flags;					 /* Definitionen der Flags siehe
											 oben */
  UWORD	 dirnamescolor;		 /* wird ignoriert */
  UWORD	 filenamescolor;		 /* wird ignoriert */
  UWORD	 devicenamescolor;	 /* wird ignoriert */
  UWORD	 fontnamescolor;		 /* wird ignoriert */
  UWORD	 fontsizescolor;		 /* wird ignoriert */

  UWORD	 detailcolor;			 /* wird ignoriert */
  UWORD	 blockcolor;			 /* wird ignoriert */
  UWORD	 gadgettextcolor; 	 /* wird ignoriert */
  UWORD	 textmessagecolor;	 /* wird ignoriert */
  UWORD	 stringnamecolor; 	 /* wird ignoriert */
  UWORD	 stringgadgetcolor;	 /* wird ignoriert */
  UWORD	 boxbordercolor;		 /* wird ignoriert */
  UWORD	 gadgetboxcolor;		 /* wird ignoriert */

  UWORD	 FRU_Stuff[18];		 /* Reserviert, sollte NULL sein */
  struct DateStamp DirDateStamp; /* wird ignoriert */

  UWORD	 WindowLeftEdge;		 /* Diese beiden Felder werden
											 benutzt, um den Requester zu */
  UWORD	 WindowTopEdge;		 /* positionieren. */

  UWORD	 FontYSize; 			 /* wird ignoriert */
  UWORD	 FontStyle; 			 /* wird ignoriert */

  ULONG	 *reserved1;			 /* Reserviert */
  char	 Hide[WILDLENGTH+2];  /* Wildcards Text für Dateien die
											 nicht angezeigt werden sollen */
  char	 Show[WILDLENGTH+2];  /* Wildcards Text für Dateien die
											 angezeigt werden sollen */
  WORD	 FileBufferPos;		 /* Werte für Stringgadgets */
  WORD	 FileDispPos;
  WORD	 DirBufferPos;
  WORD	 DirDispPos;
  WORD	 HideBufferPos;
  WORD	 HideDispPos;
  WORD	 ShowBufferPos;
  WORD	 ShowDispPos;

 /**; 	  Die nachfolgenden Felder sind Privat und sollten aus
			  Ihren Programmen nie angesprochen oder genutzt werden */

  APTR	 privat1;
  APTR	 privat2;
  APTR	 privat3;
  char	 privat4[DSIZE+2];
																										  /* directory we have file names for. */
  struct FileInfoBlock	  *privat6;
  WORD	 privat7;
  WORD	 privat8;
  WORD	 privat9;
  WORD	 privat10;
  };



/* ************* Prototyps aus RCT Library *********** */

/* Allgemeine Resource-Funktionen */

LONG *rctload( char *pfad);
BOOL rctfree( void *base);
void *rctaddr( void *base, long art, long id);

/* Allgemeine Funktionen */

void waitall(struct MsgPort *port, struct IntuiMessage *mess);
unsigned int *getpattern( void *base, long index);

/* Requester Funktionen */

BOOL reqcenter( void *base, struct Requester *req, struct Window *win);
BOOL reqdraw( void *base, struct Requester *req, struct Window *win);
BOOL reqend( void *base, struct Requester *req, struct Window *win);
LONG getreqstruct( void *base, struct Requester *req, long item);
BOOL setreqstruct( void *base, struct Requester *req, long item, long wert);
BOOL setreqtext( void *base, struct Requester *req, long id, char *text);
char *getreqtext( void *base, struct Requester *req, long id);
LONG gettextstruct( void *base, struct Requester *req, long id, long item);
BOOL settextstruct( void *base, struct Requester *req, long id, long item, long wert);
BOOL setgadtext( void *base, struct Requester *req, long id, char *text);
char *getgadtext( void *base, struct Requester *req, long id);
long getgadstruct( void *base, struct Requester *req, long id, long item);
BOOL setgadstruct( void *base, struct Requester *req, long id, long item, long wert);
BOOL redrawgadgets( void *base, struct Requester *req, long id);
BOOL redrawgad( void *base, struct Requester *req, long id, long anzahl);
BOOL aktivegad( void *base, struct Requester *req, long id);
BOOL setstrgadtext( void *base, struct Requester *req, long id, char *text);
char *getstrgadtext( void *base, struct Requester *req, long id);
LONG getstrgadstruct( void *base, struct Requester *req, long id, long item);
BOOL setstrgadstruct( void *base, struct Requester *req, long id, long item, long wert);
BOOL setpropgadstruct( void *base, struct Requester *req, long id, long item, LONG wert);
LONG getpropgadstruct( void *base, struct Requester *req, long id, long item);
struct Window *reqdrawwindow( void *base, struct Requester *req, struct Screen *scr, char *titel);
struct Window *gaddrawwindow( void *base, struct Requester *req, struct Screen *scr, char *titel, unsigned long IDCMP, unsigned long Flags);
unsigned short reqwait( void *base, struct Requester *req, ULONG *class);


/* Menü-Funktionen */

BOOL menudraw( void *base, struct Menu *men, struct Window *win);
BOOL menuend( void *base, struct Menu *men, struct Window *win);
BOOL setmenutitle( void *base, struct Menu *men, long id, char *text);
char *getmenutitle( void *base, struct Menu *men, long id);
BOOL setmenustruct( void *base, struct Menu *men, long id, long item, void *wert);
short getmenustruct( void *base, struct Menu *men, long id, long item);
BOOL setmenuitext( void *base, struct Menu *men, long id, long nid, char *text);
char *getmenuitext( void *base, struct Menu *men, long id, long nid);
BOOL setmenuitemstruct( void *base, struct Menu *men, long id, long nid, long item, void *wert);
void *getmenuitemstruct( void *base, struct Menu *men, long id, long nid, long item);
BOOL setmenustext( void *base, struct Menu *men, long id, long nid, long sid, char *text);
char *getmenustext( void *base, struct Menu *men, long id, long nid, long sid);
BOOL setmenusubstruct( void *base, struct Menu *men, long id, long nid, long sid, long item, void *wert);
LONG getmenusubstruct( void *base, struct Menu *men, long id, long nid, long sid, long item);

/* Screen-Funktionen */

struct Screen *showscreen(void *base, USHORT mod, USHORT depth, UBYTE *tit);
void remscreen( void *base, struct Screen *screen);

/* Alarm und File-Requester */

int form_alert( long md, char *str);
int filer(struct RCTFileRequester *filreq);
void filercachefree( struct RCTFileRequester *myreq);


/* Pragmas */

#pragma amicall(RctBase,  30, rctload( a0))
#pragma amicall(RctBase,  36, rctfree( a0))
#pragma amicall(RctBase,  42, rctaddr( a0, d0, d1))
#pragma amicall(RctBase,  48, reqcenter( a0, a1, a2))
#pragma amicall(RctBase,  54, reqdraw( a0, a1, a2))
#pragma amicall(RctBase,  60, reqend( a0, a1, a2))
#pragma amicall(RctBase,  66, getreqstruct( a0, a1, d0))
#pragma amicall(RctBase,  72, setreqstruct( a0, a1, d0, d1))
#pragma amicall(RctBase,  78, setreqtext( a0, a1, d0, a2))
#pragma amicall(RctBase,  84, getreqtext( a0, a1, d0))
#pragma amicall(RctBase,  90, gettextstruct( a0, a1, d0, d1))
#pragma amicall(RctBase,  96, settextstruct( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 102, setgadtext( a0, a1, d0, a2))
#pragma amicall(RctBase, 108, getgadtext( a0, a1, d0))
#pragma amicall(RctBase, 114, getgadstruct( a0, a1, d0, d1))
#pragma amicall(RctBase, 120, setgadstruct( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 126, redrawgadgets( a0, a1, d0))
#pragma amicall(RctBase, 132, redrawgad( a0, a1, d0, d1))
#pragma amicall(RctBase, 138, aktivegad( a0, a1, d0))
#pragma amicall(RctBase, 144, setstrgadtext( a0, a1, d0, a2))
#pragma amicall(RctBase, 150, getstrgadtext( a0, a1, d0))
#pragma amicall(RctBase, 156, setstrgadstruct( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 162, getstrgadstruct( a0, a1, d0, d1))
#pragma amicall(RctBase, 168, setpropgadstruct( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 174, getpropgadstruct( a0, a1, d0, d1))

#pragma amicall(RctBase, 180, menudraw( a0, a1, a2))
#pragma amicall(RctBase, 186, menuend( a0, a1, a2))
#pragma amicall(RctBase, 192, setmenutitle( a0, a1, d0, a2))
#pragma amicall(RctBase, 198, getmenutitle( a0, a1, d0))
#pragma amicall(RctBase, 204, setmenustruct( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 210, getmenustruct( a0, a1, d0, d1))
#pragma amicall(RctBase, 216, setmenuitext( a0, a1, d0, d1, a2))
#pragma amicall(RctBase, 222, getmenuitext( a0, a1, d0, d1))
#pragma amicall(RctBase, 228, setmenuitemstruct( a0, a1, d0, d1, d2, d3))
#pragma amicall(RctBase, 234, getmenuitemstruct( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 240, setmenustext( a0, a1, d0, d1, d2, a2))
#pragma amicall(RctBase, 246, getmenustext( a0, a1, d0, d1, d2))
#pragma amicall(RctBase, 252, setmenusubstruct( a0, a1, d0, d1, d2, d3, d4))
#pragma amicall(RctBase, 258, getmenusubstruct( a0, a1, d0, d1, d2, d3))

#pragma amicall(RctBase, 264, reqdrawwindow( a0, a1, a2, a3))
#pragma amicall(RctBase, 270, reqwait( a0, a1, a2))
#pragma amicall(RctBase, 276, showscreen( a0, d0, d1, a1))
#pragma amicall(RctBase, 282, remscreen( a0, a1))

#pragma amicall(RctBase, 288, form_alert( d0, a0))
#pragma amicall(RctBase, 294, filer( a0))
#pragma amicall(RctBase, 300, filercachefree( a0))
#pragma amicall(RctBase, 306, waitall( a0, a1))
#pragma amicall(RctBase, 312, gaddrawwindow( a0, a1, a2, a3, d0, d1))
#pragma amicall(RctBase, 318, getpattern( a0, d0))

