#include "define.h"
#include <obdefs.h>                /* OBJECT DEFINTIONS              */
#include <gemdefs.h>               /* GEM DEFINITIONS                */
#include <osbind.h>                /* BIOS/GEMDOS/XBIOS FUNCTIONS    */
#include <vdibind.h>               /* VDI DECLERATIONS AND BINDINGS  */
#include <aesbind.h>               /* BINDINGS FOR AES               */
#include <stdio.h>                 /* STANDARD I/O ROUTINES          */
#include "cled.h"
#include "rpcfg.h"

int space[48]= {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
};
int graph[3] = {45,0,0};               /* Size of graphic and one blank column */
int leftb[8] = {6,0,255,0,0,0,0,0};    /* Size 6, vertical bar, far left */
int rightb[8]= {6,0,0,0,0,0,0,255};    /* Size 6, vertical bar, far right */
int nline[2] = {10,13};                /* New line */

extern char data[3][40];               /* storage for graphic data         */
extern char songs[16][47];             /* storage for songs & labels       */


extern struct COMMAND print_codes[11];     /* Array to hold printer commands */
extern char print_name[80];                /* Printers name */ 
extern int coloura,quality;                 /* Have we got colour, nlq? 0=No */

/****************************************************************************
SUBROUTINE  : print_setup            VERSION  : 1.1
AUTHOR      : ROBERT ALLEY           DATE     : 02/07/90
DESCRIPTION : Do a dialog box to get printer setup info.
LOGIC USED  : STEP 1.   Get address of dialog, pass side1 and side2 as well
                        as their lengths for ftexts, get dialogs centred 
                        co-ords, set aside space for dialog, draw it.  While
                        value returned is less than the exit values : set 
                        colour or style based on return.  Unset both exit 
                        buttons.  Free the memory allocated.  Return the
                        exit status.
RETURNS     : val          I        Exit status (DOPRINT or NOPRINT).
PARAMETERS  : colour       *I       Pointer to colour to print in.
              style        *I       Pointer to print style to use.
              side1,side2  *CH      Side labels
VARIABLES   : dialog       *OBJECT  Dialog to form
              val          I        Value returned from dialog
              cx,cy,cw,ch  I        Co-ords of centered dialog box.
NOTES       : Form_dial changed (zeros before cx,cy etc. instead of after)
              to fix non-removal bug.
USAGE       : print_steup(&colour,&style);
****************************************************************************/
print_setup(colour,style,side1,side2)
int *style,*colour;
char *side1,*side2;
{
   OBJECT *dialog;
   int val=0;
   int cx, cy, cw, ch;

   rsrc_gaddr(0, PRINT, (OTYPE) &dialog);
   print_name[40]=0;
   ((TEDINFO *)dialog[PRNTNAME].ob_spec)->te_ptext=print_name;
   ((TEDINFO *)dialog[PRNTNAME].ob_spec)->te_txtlen =strlen(print_name);
   if (coloura==0) {
      objc_change(dialog,CBLACK,0,0,0,0,0,DISABLED,0);
      objc_change(dialog,CBLUE,0,0,0,0,0,DISABLED,0);
      objc_change(dialog,CRED,0,0,0,0,0,DISABLED,0);
   }
   else {
      objc_change(dialog,CBLACK,0,0,0,0,0,SELECTED,0);
      objc_change(dialog,CBLUE,0,0,0,0,0,NORMAL,0);
      objc_change(dialog,CRED,0,0,0,0,0,NORMAL,0);
      *colour=CBLACK;
   }
   if (quality==0) {
      objc_change(dialog,NLQ,0,0,0,0,0,DISABLED,0);
      objc_change(dialog,DRAFT,0,0,0,0,0,DISABLED,0);
   }
   else {
      objc_change(dialog,NLQ,0,0,0,0,0,SELECTED,0);
      objc_change(dialog,DRAFT,0,0,0,0,0,NORMAL,0);
      *style=NLQ;
   }
   ((TEDINFO *)dialog[SIDE1].ob_spec)->te_ptext = side1;
   ((TEDINFO *)dialog[SIDE1].ob_spec)->te_txtlen = 9;
   ((TEDINFO *)dialog[SIDE2].ob_spec)->te_ptext = side2;
   ((TEDINFO *)dialog[SIDE2].ob_spec)->te_txtlen = 9;
   form_center(dialog, &cx, &cy, &cw, &ch);
   form_dial(FMD_START, 0,0,0,0,cx, cy, cw, ch);
   objc_draw(dialog, 0, 10, cx, cy, cw, ch);
   while (val < DOPRINT) {
      val=form_do(dialog, 0);
      if ((val==NLQ)||(val==DRAFT))
         *style=val;
      if ((val >=CBLUE)&&(val <=CBLACK))
         *colour=val;
  }
   objc_change(dialog,NOPRINT,0,0,0,0,0,0,1);
   objc_change(dialog,DOPRINT,0,0,0,0,0,0,1);
   form_dial(FMD_FINISH, 0,0,0,0,cx, cy, cw, ch);
   return val;
}

/****************************************************************************
SUBROUTINE  : print                  VERSION  : 1.0
AUTHOR      : ROBERT ALLEY           DATE     : ??/??/89
DESCRIPTION : Print string on printer.
LOGIC USED  : STEP 1.   Loop from 0 to length, print corresponding char.
PARAMETERS  : string       C81  String to be printed
              length       I    Numbers of characters to print.
VARIABLES   : loop         I    Loop counter.
              out          I    Current character being printed.
USAGE       : print(string,length);
****************************************************************************/
print (string,length)

int string[81];
int  length;
{
   int loop;
   int out;

   for (loop = 0;loop < length; loop++) {
      out = string[loop];
      Cprnout(out);
   }
}

/****************************************************************************
SUBROUTINE  : printc                 VERSION  : 1.0
AUTHOR      : ROBERT ALLEY           DATE     : 11/07/90
DESCRIPTION : Print a command on the printer.
LOGIC USED  : STEP 1.   Loop from 0 to length, print corresponding char.
PARAMETERS  : string       C81  String to be printed
              length       I    Numbers of characters to print.
VARIABLES   : loop         I    Loop counter.
              out          I    Current character being printed.
USAGE       : print(string,length);
****************************************************************************/
printc (command,var)

struct COMMAND command;
int var;

{
   int loop;
   int out;
   
   for (loop = 0;loop < command.length; loop++) {
      out=*command.list++;
      if (out==0x80) Cprnout(var);
      else Cprnout(out);
   }
}
/***************************************************************************
SUBROUTINE  : print_label            VERSION  : 1.2
AUTHOR      : ROBERT ALLEY           DATE     : 02/07/90
DESCRIPTION : Print the cassette label on the line printer.
LOGIC USED  : STEP 1.   While printer not ready, check its status, if
                        not ready, ask user if they want to quit.  If they
                        do return.  While status is print, get printer set 
                        up info, if they said print, print.  Ask if they want
                        to do another.
VARIABLES   : colour       I        Colour to print in.
              style        I        Style to print in.
              status       I        Status of print (1=do print,  any 
                                     other = dont)
              side1,side2  CH       Headings for the two sides
              label        CH       Current heading being printed
              loop,outloop I        loop counters
REQD. SUBPG.: print_setup
              print
USAGE       : print_label();
****************************************************************************/
print_label()
{
   static int colour=CBLACK;
   static int style=NLQ;
   static char side1[9]="SIDE 1",side2[9]="SIDE 2";
   char label[19];   
   int status=1;
   int loop,outloop,abort;
   long printred=0L;

   while (printred==0L) {
      printred=Bcostat(0);
      if (printred==0L) {
         abort=form_alert(1,"[1][Printer Not Ready|Check power, online,|connections etc.][Retry|Abort]");
         if (abort==2) return(0);
      }
   }
   while (status==1) {
      status=print_setup(&colour,&style,side1,side2);
      if (status==DOPRINT) {
            if (coloura==1) {
               switch (colour) {
                   case CBLACK :
                                printc(print_codes[0],0);
                                break;
                   case CBLUE  :
                                printc(print_codes[2],0);
                                break;
                   case CRED   :
                                printc(print_codes[1],0);
                                break;
               }
            }
            if (quality==1) {
               switch (style) {
                   case NLQ    :
                               printc(print_codes[5],0);
                               break;
                   case DRAFT  :
                               printc(print_codes[6],0);
                               break;
               }
            }
            printc(print_codes[4],0);
            printc(print_codes[7],0);
            printc(print_codes[3],23);
            print(space,48);
            printc(print_codes[8],0);
            print(nline,2);
            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            print(nline,2);
            for(outloop=0; outloop<3;outloop++) {
               printc(print_codes[9],0);
               print(leftb,8);
               if (outloop==1) {
                  sprintf(label,"     %8.8s     ",side1);
                  for (loop=0;loop<18; Cprnout( (int)label[loop++] ));
               }
               else 
                  print(space,18);
               printc(print_codes[9],0);
               print(graph,3);
               for(loop=0; loop<40; loop++)
                  Cprnout(data[outloop][loop]);
               Cprnout(0); Cprnout(0); Cprnout(0); Cprnout(0);
               if (outloop==1) {
                  sprintf(label,"    %8.8s       ",side2);
                  for (loop=0;loop<19; Cprnout( (int)label[loop++] ));
               }
               else
                  print(space,19);
               printc(print_codes[9],0);
               print(rightb,8);
               print(nline,2);
            }
            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            Cprnout(13);
            printc(print_codes[7],0);
            print(space,48);
            printc(print_codes[8],0);
            print(nline,2);
            printc(print_codes[3],16);

            for (loop=0;loop<13;loop++) {           /* print songs */
               printc(print_codes[9],0);
               print(leftb,8);
               print(space,22);
               printc(print_codes[10],0);
               print(space,23);
               printc(print_codes[9],0);
               print(rightb,8);
               print(nline,2);
               printc(print_codes[9],0);
               print(leftb,8);
               for (outloop=0;outloop<22;outloop++)
                  Cprnout(songs[loop][outloop]);
               printc(print_codes[10],0);
               for (outloop=23;outloop<46;outloop++)
                  Cprnout(songs[loop][outloop]);
               printc(print_codes[9],0);
               print(rightb,8);
               print(nline,2);
            }
                                                /* print bot of songs */
            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            Cprnout(13);
            printc(print_codes[7],0);
            print(space,48);
            printc(print_codes[8],0);
            print(nline,2);
              
            printc(print_codes[3],23);
                                                /* print top of spine */
            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            print(nline,2);
                                                 /* print spine */
            printc(print_codes[9],0);
            print(leftb,8);
            for (outloop=0;outloop<46;outloop++)
               Cprnout(songs[14][outloop]);
            printc(print_codes[9],0);
            print(rightb,8);
            print(nline,2);

            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            print(nline,2);
            
            printc(print_codes[9],0);
            print(leftb,8);
            for (outloop=0;outloop<46;outloop++)
               Cprnout(songs[15][outloop]);
            printc(print_codes[9],0);
            print(rightb,8);
            print(nline,2);

                               /* print bot of spine */
            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            Cprnout(13);
            printc(print_codes[7],0);
            print(space,48);
            printc(print_codes[8],0);
            print(nline,2);

            for(loop=0;loop<4;loop++) {           /* print tail */
               printc(print_codes[9],0);
               print(leftb,8);
               print(space,46);
               printc(print_codes[9],0);
               print(rightb,8);
               print(nline,2);
            }

                                 /* print bot of label */
            printc(print_codes[9],0);
            print(leftb,8);
            print(space,46);
            printc(print_codes[9],0);
            print(rightb,8);
            Cprnout(13);
            printc(print_codes[7],0);
            print(space,48);
            printc(print_codes[8],0);
            print(nline,2);

            status=form_alert(2,"[0][Print again][Yes|No]");
      }
   }
}

