/* prf.h V091 */
/* 9-3-92 */

#include <devices/printer.h>
/*
#define DEUTSCH
 */
            /* to create an english executable remove the line above */

#ifdef DEUTSCH
#include "prf.deutsch.h"
#else
#include "prf.english.h"
#endif
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Define's */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

#define SYSTEM_VERSION    37L
#define STR_SIZE         256
#define SWD_WIDTH        338
#define SWD_HEIGHT       180
#define DEFAULT_LINES     66L
#define DEFAULT_LMARGIN    0L
#define DEFAULT_RMARGIN  128L
#define DEFAULT_QUALITY    0L
#define DEFAULT_PITCH      1L
#define DEFAULT_CPI        2L
#define FILE_UNKNOWN       0L
#define FILE_TEXT          1L
#define FILE_ILBM          2L
#define FILE_FTXT          3L
#define FILE_PROG          4L
#define FILE_ICON          5L
#define FILE_DIR           6L


#define TOOLTYPE_WD        "WINDOW"
#define TOOLTYPE_FLAGS     "FLAGS"
#define TOOLTYPE_HEAD      "HEADLINE"
#define TOOLTYPE_FOOT      "FOOTLINE"
#define TOOLTYPE_LINES     "LINES"
#define TOOLTYPE_RMARGIN   "RMARGIN"
#define TOOLTYPE_LMARGIN   "LMARGIN"

/* iconinfo */

#define ITYPE_TOOL        " Tool     "
#define ITYPE_DISK        " Disk     "
#define ITYPE_DRAWER      " Drawer   "
#define ITYPE_PROJECT     " Project  "
#define ITYPE_GARBAGE     " Trashcan "
#define ITYPE_DEVICE      " Device   "
#define ITYPE_APP         " AppIcon  "
#define ITYPE_UNKNOWN     " Unknown  "

#define CLI_WD               'w'
#define CLI_DRAFT            'a'
#define CLI_LQ               'q'
#define CLI_PAGE             'p'
#define CLI_DATE             'd'
#define CLI_LINE             'l'
#define CLI_FF               'f'
#define CLI_FFPAGE           'c'
#define CLI_10CPI            '0'
#define CLI_12CPI            '2'
#define CLI_15CPI            '5'
#define CLI_PITCH6           '6'
#define CLI_PITCH8           '8'
#define CLI_FILE             'n'
#define CLI_TIME             't'


#define CMD_NEUTRAL         0L
#define CMD_PRINT           1L
#define CMD_CHANGEAPP       2L
#define CMD_QUIT            3L
#define CMD_INSERTHEAD      4L
#define CMD_INSERTTAIL      5L
#define CMD_REMOVE          6L
#define CMD_FILEREQ         7L
#define CMD_DISPLAY         8L
#define CMD_STR_INSERT      9L
#define CMD_OPENPWD        10L
#define CMD_CLOSEPWD       11L
#define CMD_ABOUT          12L
#define CMD_HEAD           13L
#define CMD_FOOT           14L
#define CMD_DATE_ON        15L
#define CMD_TIME_ON        16L
#define CMD_NAME_ON        17L
#define CMD_FF_ON          18L
#define CMD_FFPAGE_ON      19L
#define CMD_PAGE_ON        20L
#define CMD_LINE_ON        21L
#define CMD_PITCH6         22L
#define CMD_PITCH8         23L
#define CMD_HEADL          24L
#define CMD_FOOTL          25L
#define CMD_RESETALL       26L
#define CMD_CLEARLIST      27L
#define CMD_OPENWD         28L
#define CMD_CLOSEWD        29L
#define CMD_RXQUIT         30L
#define CMD_10CPI          31L
#define CMD_12CPI          32L
#define CMD_15CPI          33L
#define CMD_LINES          34L
#define CMD_DRAFT          35L
#define CMD_LQ             36L
#define CMD_LMARGIN        37L
#define CMD_RMARGIN        38L
#define CMD_DATE_OFF       39L
#define CMD_TIME_OFF       40L
#define CMD_NAME_OFF       41L
#define CMD_FF_OFF         42L
#define CMD_FFPAGE_OFF     43L
#define CMD_PAGE_OFF       44L
#define CMD_LINE_OFF       45L
#define CMD_SAVEPREFS      46L
#define CMD_STATUS         47L
#define CMD_VERSION        48L
#define CMD_SP_FILES_ON    49L
#define CMD_SP_RESET_ON    50L
#define CMD_SP_WINDOW_ON   51L
#define CMD_SP_COMMENT_ON  52L
#define CMD_SP_PRINT_ON    53L
#define CMD_SP_FILES_OFF   54L
#define CMD_SP_RESET_OFF   55L
#define CMD_SP_WINDOW_OFF  56L
#define CMD_SP_COMMENT_OFF 57L
#define CMD_SP_PRINT_OFF   58L
#define CMD_SP_START_OFF   59L
#define CMD_SP_START_ON    60L
#define CMD_SP_ICON_OFF    61L
#define CMD_SP_ICON_ON     62L
#define CMD_ICONINFO       63L
#define CMD_ICONGFX        64L
#define CMD_ICONNONE       65L
#define CMD_PROGINFO       66L
#define CMD_PROGICON       67L
#define CMD_PROGNONE       68L
#define CMD_ICONALL        69L
#define CMD_PROGALL        70L
#define CMD_CLOSEPRINTER   71L
#define CMD_SP_LINES_ON    72L
#define CMD_SP_LINES_OFF   73L



/* rexx commands */
#define RXPORTNAME         "PRINTFILES"
#define RX_ERRORLEVEL      5L
#define RX_VERSION_STR     T_PRF T_VERSION

#define T_RX_AD            "address " RXPORTNAME " "
#define T_RX_RESET         "reset"
#define T_RX_CLEAR         "clear"
#define T_RX_INSFILE       "insfile"
#define T_RX_REMFILE       "remfile"
#define T_RX_OPENWINDOW    "openwindow"
#define T_RX_CLOSEWINDOW   "closewindow"
#define T_RX_QUIT          "quit"
#define T_RX_PAGE          "page"
#define T_RX_FILE          "filename"
#define T_RX_TIME          "time"
#define T_RX_DATE          "date"
#define T_RX_LINE          "line"
#define T_RX_FF            "ff"
#define T_RX_FFPAGE        "fpage"
#define T_RX_HEAD          "headline"
#define T_RX_FOOT          "footline"
#define T_RX_LINES         "lines"
#define T_RX_RMARGIN       "rmargin"
#define T_RX_LMARGIN       "lmargin"
#define T_RX_DRAFT         "draft"
#define T_RX_LQ            "lq"
#define T_RX_PITCH6        "6li"
#define T_RX_PITCH8        "8li"
#define T_RX_10CPI         "10cpi"
#define T_RX_12CPI         "12cpi"
#define T_RX_15CPI         "15cpi"
#define T_RX_ON            "on"
#define T_RX_OFF           "off"
#define T_RX_CONTROL       "control"
#define T_RX_PREFS         "prefs"
#define T_RX_PRINT         "print"
#define T_RX_SAVEPREFS     "saveprefs"
#define T_RX_STATUS        "status"
#define T_RX_VERSION       "version"
#define T_RX_ERROR         "Unknown command"
#define T_RX_PMSG          "printing"
#define T_RX_WMSG          "waiting"
#define T_RX_ICON          "icon"
#define T_RX_INFO          "text"
#define T_RX_GFX           "icon"
#define T_RX_ALL           "all"
#define T_RX_PROG          "prog"
#define T_RX_CGFX          "image"
#define T_RX_IGNORE        "ignore"


#define RX_CMD_NEUTRAL     0
#define RX_CMD_ON          1

#define GD_PwdButton                           0
#define GD_About                               1
#define GD_Headline                            2
#define GD_Footline                            3
#define GD_Date                                4
#define GD_Time                                5
#define GD_Filename                            6
#define GD_Pagenumber                          7
#define GD_Linenumber                          8
#define GD_FFPAGE                              9
#define GD_FF                                  10
#define GD_Gadget11                            11
#define GD_List                                12
#define GD_Filereq                             13
#define GD_Remove                              14
#define GD_Print                               15
#define GD_quit                                16

#define GD_Quality                             17
#define GD_Pitch                               18
#define GD_cpi                                 19
#define GD_Linesperpage                        20
#define GD_Lmargin                             21
#define GD_Rmargin                             22
#define GD_Icons                               23
#define GD_Progs                               24
#define GD_Saveprefs                           25
#define GD_PPrint                              26
#define GD_include_comment                     27
#define GD_include_files                       28
#define GD_include_window                      29
#define GD_include_reset                       30
#define GD_include_print                       31
#define GD_include_start                       32
#define GD_include_icon                        33
#define GD_include_lines                       34

#define PGD GD_Quality

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Data structure definition */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

union PrinterIO
      {
       struct IOStdReq     ios;
       struct IODRPReq     iodrp;
       struct IOPrtCmdReq  iopc;
      };

struct FileNameNode
       {
        struct Node fnn_Node;
        char        fnn_Name[STR_SIZE];
       };

struct BitMapHeader
        {
         UWORD w, h;
         UWORD x, y;
         UBYTE nPlanes;
         UBYTE masking;
         UBYTE compression;
         UBYTE pad1;
         UWORD transparentColor;
         UBYTE xAspect, yAspect;
         WORD pageWidth, pageHeight;
        };

struct ILBM_info
        {
         struct RastPort     rp;
         struct BitMapHeader header;
         struct BitMap       bmap;
         ULONG  camg;
         struct ColorMap *cm;
         UWORD  cmap[256];
        };


struct prf_info
       {
        struct Screen       *PubScr;
        APTR                 VisualInfo;
        struct Window       *Swd;
        struct Window       *Pwd;
        struct IntuiMessage *imsg;
        struct AppMessage   *amsg;
        struct RexxMsg      *rmsg;
        union  PrinterIO    *PIO;
        struct MsgPort      *rexxPort;
        struct MsgPort      *appPort;
        struct MsgPort      *prtPort;
        struct AppWindow    *aWnd;
        struct AppIcon      *aicon;
        struct AppMenuItem  *amenu;
        struct Gadget       *SGlist;
        struct Gadget       *PGlist;
        struct Gadget       *SGadgets[17];
        struct Gadget       *PGadgets[20];
        struct List          FileList;
        ULONG                Lines;
        ULONG                Lmargin;
        ULONG                Rmargin;
        ULONG                Columns;
        ULONG                signals;
        struct
             {
              unsigned  date       :1;
              unsigned  time       :1;
              unsigned  file       :1;
              unsigned  page       :1;
              unsigned  line       :1;
              unsigned  ffpage     :1;
              unsigned  ff         :1;
              unsigned  print      :1;
              unsigned  draft      :1;
              unsigned  lq         :1;
              unsigned  immediate  :1;
              unsigned  openwindow :1;
              unsigned  display    :1;
              unsigned  sp_files   :1;
              unsigned  sp_reset   :1;
              unsigned  sp_window  :1;
              unsigned  sp_comment :1;
              unsigned  sp_print   :1;
              unsigned  sp_start   :1;
              unsigned  sp_icon    :1;
              unsigned  sp_lines   :1;
              unsigned  icon       :2;
              unsigned  prog       :2;
              unsigned  pitch      :2;
              unsigned  cpi        :2;
             }flags;
        ULONG                BarHeight;
        UBYTE                Headline[STR_SIZE];
        UBYTE                Footline[STR_SIZE];
        UBYTE                Statusline[STR_SIZE];
        UBYTE                Insertline[STR_SIZE];
        APTR                 Special1;
        APTR                 Special2;
        APTR                 Special3;
        APTR                 Special4;
        struct ILBM_info     ilbm;
        ULONG                device;
        UBYTE                FileReqDir[STR_SIZE];
        UBYTE                SaveReqDir[STR_SIZE];
        UWORD                fw,fh;
       };

union wbstart
      {
       char **args;
       struct WBStartup *msg;
      };



/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_main.c  */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

/* protos */
void  main(int,union wbstart);
long  __regargs OpenLibs(struct prf_info *);
void  __regargs CloseLibs(struct prf_info *);
void  __regargs Prf_Reset(struct prf_info *);
void  __regargs SetPrfSignals(struct prf_info *);
long  __regargs HandleMsgs(struct prf_info *);


/* vars */
extern long                  _stack;
extern char                 *_procname;
extern long                   priority;
extern long                  _BackGroundIO;
extern BPTR                  _Backstdout;
extern struct GfxBase       *GfxBase;
extern struct IntuitionBase *IntuitionBase;
extern struct Library       *WorkBenchBase;
extern struct Library       *GadToolsBase;
extern struct Library       *AslBase;
extern struct Library       *IconBase;
extern struct RxsLib        *RexxSysBase;
extern struct TextAttr       topaz8;
extern char                 *dayname[];
extern char                 *monthname[];



/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_apphandler.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs OpenApp(struct prf_info *);
void __regargs CloseApp(struct prf_info *);
long __regargs HandleAmsg(struct prf_info *);
void __regargs ChangeApp(struct prf_info *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_imsghandler.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs HandleImsg(struct prf_info *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_swd.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs OpenSwd(struct prf_info *);
void __regargs CloseSwd(struct prf_info *);
long __regargs OpenPwd(struct prf_info *);
void __regargs  ClosePwd(struct prf_info *);
void __regargs RefreshSwd(struct prf_info *);
void __regargs RefreshPwd(struct prf_info *);

/* vars */
extern struct TagItem    SwdTags[];
extern struct TagItem    PwdTags[];


/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_list.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

void __regargs InsertName(struct prf_info *);
void __regargs RemoveName(struct prf_info *);
void __regargs AttachList(struct prf_info *);
void __regargs DetachList(struct prf_info *);



/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_docommand.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs DoCommand(struct prf_info *,long);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_filereq.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

void __regargs Prf_FileReq(struct prf_info *);
void __regargs Prf_SavePrefs(struct prf_info *,UBYTE *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf.rexx.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs HandleRexxMsg(struct prf_info *);
void __regargs AttemptOpenRexx(struct prf_info *);
void __regargs CloseRexx(struct prf_info *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_print.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */
void __regargs PrintQueue(struct prf_info *);
void __regargs PrintSettings(struct prf_info *, FILE *);
long __regargs BuildStatusline(struct prf_info *,UBYTE *);

/* vars */
extern char                 *dayname[];
extern char                 *monthname[];


/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_gfx.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs PrintIconGfx(struct prf_info *,UBYTE *);
long __regargs PrintGfxGfx(struct prf_info  *,UBYTE *);
long __regargs OpenPrinter(struct prf_info *);
void __regargs ClosePrinter(struct prf_info *);
void __regargs free_planes(struct prf_info *);
long __regargs get_planes(struct prf_info *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf.info.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */

long __regargs PrintProgInfo(struct prf_info *,UBYTE *);
long __regargs PrintIconInfo(struct prf_info *,UBYTE *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_saveprefs.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */
void  __regargs SavePreferences(struct prf_info *,UBYTE *);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

