/* prf.h V1.1 */
/* 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 DEFAULT_LINES     66L
#define DEFAULT_LMARGIN    0L
#define DEFAULT_RMARGIN  128L
#define DEFAULT_QUALITY    0L
#define DEFAULT_PITCH      1L
#define DEFAULT_CPI        2L
#define DEFAULT_FLAGS    (FLAG_DRAFT | FLAG_PITCH8 | FLAG_15CPI | FLAG_DISPLAY)
#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 FLAG_DATE                              1
#define FLAG_TIME                              (1 << 1)
#define FLAG_FILE                              (1 << 2)
#define FLAG_PAGE                              (1 << 3)
#define FLAG_LINE                              (1 << 4)
#define FLAG_CRLF                              (1 << 5)
#define FLAG_FF                                (1 << 6)
#define FLAG_PRINT                             (1 << 7)
#define FLAG_DRAFT                             (1 << 8)
#define FLAG_LQ                                (1 << 9)
#define FLAG_IMMEDIATE                         (1 << 10)
#define FLAG_OPENWINDOW                        (1 << 11)
#define FLAG_PITCH6                            (1 << 12)
#define FLAG_PITCH8                            (1 << 13)
#define FLAG_10CPI                             (1 << 14)
#define FLAG_12CPI                             (1 << 15)
#define FLAG_15CPI                             (1 << 16)
#define FLAG_DISPLAY                           (1 << 17)

#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"

#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_CRLF             '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_CRLF_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_CRLF_OFF      43L
#define CMD_PAGE_OFF      44L
#define CMD_LINE_OFF      45L
#define CMD_SAVEPREFS     46L
#define CMD_STATUS        47L
#define CMD_VERSION       48L

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

#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_CRLF          "crlf"
#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 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_CRLF                                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_Linesperpage                        19
#define GD_cpi                                 20
#define GD_Lmargin                             21
#define GD_Rmargin                             22
#define GD_Saveprefs                           23
#define GD_PPrint                              24

#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 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;
        ULONG                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;
       };

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



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

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


/* 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 OpenApp(struct prf_info *);
void CloseApp(struct prf_info *);
long HandleAmsg(struct prf_info *);
void ChangeApp(struct prf_info *);

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

long HandleImsg(struct prf_info *);

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

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

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


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

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



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

long DoCommand(struct prf_info *,long);

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

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

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

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

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* prf_print.c */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* protos */
void PrintQueue(struct prf_info *);

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


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

