(* ------------------------------------------------------------------------
  :Program.       ReqTools
  :Contents.      Interface to Nico François' reqtools.library
  :Author.        Kai Bolay [kai] (C-Version by Nico François)
  :Address.       Hoffmannstraße 168
  :Address.       D-7250 Leonberg 1 (Germany)
  :Address.       UUCP: ...!cbmvax!cbmehq!cbmger!depot1!amokle!kai
  :Address.       FIDO: 2:247/706.3
  :History.       v1.0 [kai] 22-Nov-91 (translated from C)
  :History.       v1.0m [Frank Lömker] 24-Feb-92 Umsetzung nach Modula
  :Copyright.     Freeware
  :Language.      Modula-2
  :Translator.    M2Amiga V4.0d
  :Remark.        Thanks to Nico for his great library
  :Bugs.          ReqTools/Arq should support each other
  :Bugs.          Font-Hook: ta.name can contain odd pointer :-(
------------------------------------------------------------------------ *)

(*
**  Filename: reqtools.mod
**  Release: 1.0
**  Revision: 37.3
**
**  Modula interface.
**
**  (C) Copyright 1991 Nico François
**      All Rights Reserved
*)

DEFINITION MODULE ReqTools{"reqtools.library",37};

FROM IntuitionD IMPORT IntuitionBasePtr,WindowPtr,ScreenPtr,NewWindow;
FROM GraphicsD IMPORT GfxBasePtr,TextFontPtr,TextAttr;
FROM DosD IMPORT DosLibraryPtr;
FROM ExecD IMPORT Library,LibraryPtr;
FROM SYSTEM IMPORT ADDRESS,SHORTSET,LONGSET,BPTR;
FROM UtilityD IMPORT HookPtr,TagItem,TagItemPtr,Tag,tagUser;

TYPE STRPTR=ADDRESS;
CONST
  ReqToolsName = "reqtools.library";
  ReqToolsVersion = 37;

TYPE
  ReqToolsBasePtr = POINTER TO ReqToolsBase;

VAR reqToolsVersion:INTEGER;
    reqToolsBase:ReqToolsBasePtr;

TYPE
  ReqToolsBase = RECORD
    libNode: Library;
    flags: SHORTSET;
    pad: ARRAY [0..2] OF SHORTINT;
    segList: BPTR;
    (* The following library bases may be read and used by your program *)
    intuitionBase: IntuitionBasePtr;
    gfxBase: GfxBasePtr;
    dosBase: DosLibraryPtr;
    (* Next two library bases are only (and always) valid on Kickstart 2.0!
       (1.3 version of reqtools also initializes these when run on 2.0) *)
    gadToolsBase: LibraryPtr;
    utilityBase: LibraryPtr;
  END;

CONST
  (* types of requesters, for AllocRequestA() *)
  TypeFileReq = 0;
  TypeReqInfo = 1;
  TypeFontReq = 2;

(***********************
*                      *
*    File requester    *
*                      *
***********************)

(* structure _MUST_ be allocated with AllocRequest() *)

TYPE
  FileRequesterPtr = POINTER TO FileRequester;
  FileRequester = RECORD
    reqPos: LONGINT;
    leftOffset: INTEGER;
    topOffset: INTEGER;
    flags: LONGSET;
    hook: HookPtr;
    dir: STRPTR;                (* READ ONLY! Change with ChangeReqAttrA()! *)
    matchPat: STRPTR;           (* READ ONLY! Change with ChangeReqAttrA()! *)
    defaultFont: TextFontPtr;
    waitPointer: ADDRESS;
    (* Lots of private data follows! HANDS OFF :-) *)
  END;

(* returned by FileRequestA() if multiselect is enabled,
   free list with FreeFileList() *)

  FileListPtr = POINTER TO FileList;
  FileList = RECORD
    next: FileListPtr;
    strLen: LONGINT;  (* -1 for directories *)
    name: STRPTR;
  END;

(***********************
*                      *
*    Font requester    *
*                      *
***********************)

(* structure _MUST_ be allocated with AllocRequest() *)

  FontRequesterPtr = POINTER TO FontRequester;
  FontRequester = RECORD
    reqPos: LONGINT;
    leftOffset: INTEGER;
    topOffset: INTEGER;
    flags: LONGSET;
    hook: HookPtr;
    attr: TextAttr;  (* READ ONLY! *)
    defaultFont: TextFontPtr;
    waitPointer: ADDRESS;
    (* Lots of private data follows! HANDS OFF :-) *)
  END;

(***********************
*                      *
*    Requester Info    *
*                      *
***********************)

  (* for EZRequestA(), GetLongA(), GetStringA() and PaletteRequestA(),
   _MUST_ be allocated with AllocRequest() *)

  ReqInfoPtr = POINTER TO ReqInfo;
  ReqInfo = RECORD
    reqPos: LONGINT;
    leftOffset: INTEGER;
    topOffset: INTEGER;
    width: LONGINT;              (* not for EZRequestA() *)
    reqTitle: STRPTR;            (* currently only for EZRequestA() *)
    flags: LONGSET;              (* only for EZRequestA() *)
    defaultFont: TextFontPtr;    (* currently only for PaletteRequestA() *)
    waitPointer: ADDRESS;
    (* structure may be extended in future *)
  END;

(***********************
*                      *
*     Handler Info     *
*                      *
***********************)

(* for ReqHandlerA(), will be allocated for you when you use
   the ReqHandler tag, never try to allocate this yourself! *)

  HandlerInfoPtr = POINTER TO HandlerInfo;
  HandlerInfo = RECORD
    private1: LONGINT;
    waitMask: LONGSET;
    doNotWait: LONGINT (* LONGBOOL *); (* ? *)
    (* Private data follows, HANDS OFF :-) *)
  END;

(* possible return codes from ReqHandlerA() *)
CONST
  CallHandler = 080000000H;


(*************************************
*                                    *
*                TAGS                *
*                                    *
*************************************)

  TagBase = tagUser;

  (*** tags understood by most requester functions ***)
   (* optional pointer to window *)
  Window = TagBase+1;
   (* idcmp flags requester should abort on (useful for IDCMP_DISKINSERTED) *)
  IDCMPFlags = TagBase+2;
   (* position of requester window (see below) - default REQPOS_POINTER *)
  ReqPos = TagBase+3;
   (* signal mask to wait for abort signal *)
  LeftOffset = TagBase+4;
   (* topedge offset of requester relative to position specified by ReqPos *)
  TopOffset = TagBase+5;
   (* name of public screen to put requester on (Kickstart 2.0 only!) *)
  PubScrName = TagBase+6;
   (* address of screen to put requester on *)
  Screen = TagBase+7;
   (* tagdata must hold the address of (!) an APTR variable *)
  DoReqHandler = TagBase+8;
   (* font to use when screen font is rejected, _MUST_ be fixed-width font!
    (struct TextFont *, not struct TextAttr *!)
    - default GfxBase->DefaultFont *)
  DefaultFont = TagBase+9;
   (* boolean to set the standard wait pointer in window - default FALSE *)
  WaitPointer = TagBase+10;

  (*** tags specific to EZRequestA ***
  *)
   (* title of requester window - default "Request" or "Information" *)
  ezReqTitle = TagBase+20;
   (* TagBase+21 reserved *)
   (* various flags (see below) *)
  ezFlags = TagBase+22;
   (* default response (activated by pressing RETURN) - default TRUE *)
  ezDefaultResponse = TagBase+23;

(*** tags specific to GetLongA ***
*)
   (* minimum allowed value - default MININT *)
  glMin = TagBase+30;
   (* maximum allowed value - default MAXINT *)
  glMax = TagBase+31;
   (* suggested width of requester window (in pixels) *)
  glWidth = TagBase+32;
   (* boolean to show the default value - default TRUE *)
  glShowDefault = TagBase+33;

(*** tags specific to GetStringA ***
*)
   (* suggested width of requester window (in pixels) *)
  gsWidth = glWidth;
   (* allow empty string to be accepted - default FALSE *)
  gsAllowEmpty = TagBase+80;

(*** tags specific to FileRequestA ***
*)
   (* various flags (see below) *)
  fiFlags = TagBase+40;
   (* suggested height of file requester *)
  fiHeight = TagBase+41;
   (* replacement text for 'Ok' gadget (max 6 chars) *)
  fiOkText = TagBase+42;

(*** tags specific to FontRequestA ***
*)
   (* various flags (see below) *)
  foflags = fiFlags;
   (* suggested height of font requester *)
  foHeight = fiHeight;
   (* replacement text for 'Ok' gadget (max 6 chars) *)
  foOkText = fiOkText;
   (* suggested height of font sample display - default 24 *)
  foSampleHeight= TagBase+60;
   (* minimum height of font displayed *)
  foMinHeight = TagBase+61;
   (* maximum height of font displayed *)
  foMaxHeight = TagBase+62;
   (* [TagBase+63 to TagBase+66 used below] *)

(*** tags for ChangeReqAttrA ***
*)
   (* file requester - set directory *)
  fiDir = TagBase+50;
   (* file requester - set wildcard pattern *)
  fiMatchPat = TagBase+51;
   (* file requester - add a file or directory to the buffer *)
  fiAddEntry = TagBase+52;
   (* file requester - remove a file or directory from the buffer *)
  fiRemoveEntry = TagBase+53;
   (* font requester - set font name of selected font *)
  foFontName = TagBase+63;
   (* font requester - set font size *)
  foFontHeight = TagBase+64;
   (* font requester - set font style *)
  foFontStyle = TagBase+65;
   (* font requester - set font flags *)
  foFontFlags = TagBase+66;

(*** tags for PaletteRequestA ***
*)
   (* initially selected color - default 1 *)
  paColor = TagBase+70;

(*** tags for ReqHandlerA ***
*)
   (* end requester by software control, set tagdata to REQ_CANCEL, REQ_OK or
    in case of EZRequest to the return value *)
  rhEndRequest = TagBase+60;

(*** tags for AllocRequestA ***)
  (* no tags defined yet *)


(************
* ReqPos *
************)
  ReqPosPointer = 0;
  ReqPosCenterWin = 1;
  ReqPosCenterScr = 2;
  ReqPosTopLeftWin = 3;
  ReqPosTopLeftScr = 4;

(******************
* RTRH_EndRequest *
******************)
  ReqCancel = 0;
  ReqOK = 1;

(***************************************
* flags for RTFI_Flags and RTFO_Flags  *
* or filereq->Flags and fontreq->Flags *
***************************************)
  fReqNoBuffer = 2;
  fReqDoWildFunc = 11;

(*****************************************
* flags for RTFI_Flags or filereq->Flags *
*****************************************)
  fReqMultiSelect = 0;
  fReqSave = 1;
  fReqNoFiles = 3;
  fReqPatGad = 4;
  fReqSelectDirs = 12;

(*****************************************
* flags for RTFO_Flags or fontreq->Flags *
*****************************************)
  fReqFixedWidth = 5;
  fReqColorFonts = 6;
  fReqChangePalette = 7;
  fReqLeavePalette = 8;
  fReqScale = 9;
  fReqStyle = 10;

(*****************************************
* flags for RTEZ_Flags or reqinfo->Flags *
*****************************************)
  ezReqNoReturnKey = 0;
  ezReqLamigaQual = 1;
  ezReqCenterText = 2;

(********
* hooks *
********)
  ReqHookWildFile = 0;
  ReqHookWildFont = 1;

PROCEDURE AllocRequestA (type{0}: LONGINT;
                         tagList{8}: TagItemPtr): ADDRESS;        CODE -30;
PROCEDURE AllocRequest (type{0}: LONGINT;
                        tag1{8}: TagItemPtr): ADDRESS;            CODE -30;
PROCEDURE FreeRequest (req{9}: ADDRESS);                          CODE -36;
PROCEDURE FreeReqBuffer (req{9}: ADDRESS);                        CODE -42;
PROCEDURE ChangeReqAttrA (req{9}: ADDRESS;
                          tagList{8}: TagItemPtr);                CODE -48;
PROCEDURE ChangeReqAttr (req{9}: ADDRESS;
                         tag1{8}: TagItemPtr);                    CODE -48;
PROCEDURE FileRequestA (fileReq{9}: FileRequesterPtr;
                (*VAR*) fileName{10}: ADDRESS (*ARRAY OF CHAR*);
                        title{11}: ADDRESS (*ARRAY OF CHAR*);
                        tagList{8}: TagItemPtr): BOOLEAN;         CODE -54;
PROCEDURE FileRequest (fileReq{9}: FileRequesterPtr;
               (*VAR*) fileName{10}: ADDRESS (*ARRAY OF CHAR*);
                       title{11}: ADDRESS (*ARRAY OF CHAR*);
                       tag1{8}: TagItemPtr): BOOLEAN;             CODE -54;
PROCEDURE FreeFileList (fileList{8}: FileListPtr);                CODE -60;

(* Die nächsten 6 Prozeduren können nicht direkt aus Modula benutzt werden,
   da sie das Register A4 benötigen. Statt dessen können die Prozeduren aus
   ReqToolsSupport benutzt werden. *)

PROCEDURE EZRequestA (bodyfmt{9}, gadfmt{10}: ADDRESS (*ARRAY OF CHAR*);
                      reqInfo{11}: ReqInfoPtr;
                      argarray{12}: ADDRESS;
                      tagList{8}: TagItemPtr): LONGINT;           CODE -66;
PROCEDURE EZRequestTags (bodyfmt{9}, gadfmt{10}: ADDRESS (*ARRAY OF CHAR*);
                         reqInfo{11}: ReqInfoPtr;
                         argarray{12}: ADDRESS;
                         tag1{8}: TagItemPtr):LONGINT;            CODE -66;
PROCEDURE EZRequest (bodyfmt{9}, gadfmt{10}: ADDRESS (*ARRAY OF CHAR*);
                     reqInfo{11}: ReqInfoPtr;
                     tagList{8}: TagItemPtr;
                     argarray{12}: ADDRESS (*LONGINT*)): LONGINT; CODE -66;
(* Without result.... *)
PROCEDURE vEZRequestA (bodyfmt{9}, gadfmt{10}: ADDRESS (*ARRAY OF CHAR*);
                       reqInfo{11}: ReqInfoPtr;
                       argarray{12}: ADDRESS;
                       tagList{8}: TagItemPtr);                   CODE -66;
PROCEDURE vEZRequestTags (bodyfmt{9}, gadfmt{10}: ADDRESS (*ARRAY OF CHAR*);
                          reqInfo{11}: ReqInfoPtr;
                          argarray{12}: ADDRESS;
                          tag1{8}: TagItemPtr);                   CODE -66;
PROCEDURE vEZRequest (bodyfmt{9}, gadfmt{10}: ADDRESS (*ARRAY OF CHAR*);
                      reqInfo{11}: ReqInfoPtr;
                      tagList{8}: TagItemPtr;
                      argarray{12}: ADDRESS (*LONGINT*));         CODE -66;
PROCEDURE GetStringA ((*VAR*) buffer{9}: ADDRESS (*ARRAY OF CHAR*);
                      maxchars{0}: LONGINT;
                      title{10}: ADDRESS (*ARRAY OF CHAR*);
                      reqInfo{11}: ReqInfoPtr;
                      tagList{8}: TagItemPtr): BOOLEAN;           CODE -72;
PROCEDURE GetString ((*VAR*) buffer{9}: ADDRESS (*ARRAY OF CHAR*);
                     maxchars{0}: LONGINT;
                     title{10}: ADDRESS (*ARRAY OF CHAR*);
                     reqInfo{11}: ReqInfoPtr;
                     tag1{8}: TagItemPtr): BOOLEAN;               CODE -72;
PROCEDURE GetLongA (VAR long{9}: LONGINT; title{10}: ADDRESS (*ARRAY OF CHAR*);
                    reqInfo{11}: ReqInfoPtr;
                    tagList{8}: TagItemPtr): BOOLEAN;             CODE -78;
PROCEDURE GetLong (VAR long{9}: LONGINT; title{10}: ADDRESS (*ARRAY OF CHAR*);
                   reqInfo{11}: ReqInfoPtr;
                   tag1{8}: TagItemPtr): BOOLEAN;                 CODE -78;
PROCEDURE FontRequestA (fontReq{9}: FontRequesterPtr;
                        title{11}: ADDRESS (*ARRAY OF CHAR*);
                        tagList{8}: TagItemPtr): BOOLEAN  ;       CODE -96;
PROCEDURE FontRequest (fontReq{9}: FontRequesterPtr;
                       title{11}: ADDRESS (*ARRAY OF CHAR*);
                       tag1{8}: TagItemPtr):BOOLEAN  ;            CODE -96;
PROCEDURE PaletteRequestA (title{10}: ADDRESS (*ARRAY OF CHAR*);
                           reqInfo{11}: ReqInfoPtr;
                           tagList{8}: TagItemPtr): LONGINT;      CODE -102;
PROCEDURE PaletteRequest (title{10}: ADDRESS (*ARRAY OF CHAR*);
                          reqInfo{11}: ReqInfoPtr;
                          tag1{8}: TagItemPtr): LONGINT;          CODE -102;
PROCEDURE ReqHandlerA (hinfo{9}: HandlerInfoPtr;
                       sigs{0}: LONGSET;
                       tagList{8}: TagItemPtr): LONGINT;          CODE -108;
PROCEDURE ReqHandler (hinfo{9}: HandlerInfoPtr;
                      sigs{0}: LONGSET;
                      tag1{8}: TagItemPtr): LONGINT;              CODE -108;
PROCEDURE SetWaitPointer (window{8}: WindowPtr);                  CODE -114;
PROCEDURE GetVScreenSize (screen{8}: ScreenPtr;
                          VAR width{9},height{10}: LONGINT);      CODE -120;
PROCEDURE SetReqPosition (reqpos{0}: LONGINT;
                          VAR nw{8}: NewWindow;
                          screen{9}: ScreenPtr;
                          window{10}: WindowPtr);                 CODE -126;
PROCEDURE Spread ((*VAR*) posarray{8}: ADDRESS (*ARRAY OF LONGINT*);
                  sizearray{9}: ADDRESS (*ARRAY OF LONGINT*);
                  totalsize{0}, min{1}, max{2}, num{3}: LONGINT); CODE -132;
PROCEDURE ScreenToFrontSafely (screen{8}: ScreenPtr);             CODE -138;

END ReqTools.
