#include <exec/exec.h>
#include <exec/execbase.h>
#include <libraries/dosextens.h>
#include <libraries/dos.h>
#include <libraries/reqbase.h>
#include <libraries/arpbase.h>
#include <intuition/preferences.h>
#include <intuition/intuition.h>
#include <graphics/gfx.h>
#include <intuition/intuitionbase.h>

#include"print.h"
#include"iconify.h"
#include"icon.h"

struct IntuitionBase *IntuitionBase;
struct ArpBase *ArpBase;
struct ReqBase	*ReqBase;
/*#define DEBUG1.5 1L */

struct IntuiMessage *msg, *GetMsg();
struct Gadget *igad = 0L;
		 long  gadid = 0L;		
		 long size;
UBYTE *pt;

ULONG le, te;

ULONG class, code;
char filename[132];

ULONG ARPREQUEST = 0L;

void *OpenLibrary();
struct Window *mw, *OpenWindow();

struct FileRequester *fr, *ArpAllocFreq();

struct reqFileRequester reqreq;
char reqdirname[300], reqfilename[60];
char  reqpathname[370];

struct Preferences *prefs, *GetPrefs();

extern void *AllocMem();

extern long BIGFONT, SMALLFONT, MEDFONT, FILENAMES, PAGENUMBERING;
extern long LQ ,  LOUD;
extern long NOTUSA, plength ; 
extern long HAVE_PRINTED_ONE , RESET , JAMMED_LINES ;
extern long DONT_TRANSFORM;
extern long OFFSET;
extern long tabsize, offset, indent;
extern struct Image icon;

/* getprefs coded 18-dec-90
	by hoover
*/
void get_prefs()
{
	prefs = AllocMem(sizeof(struct Preferences), MEMF_CLEAR);
	if(!GetPrefs(prefs, sizeof(struct Preferences)  ) )
		close_all("Could not find preferences!", 1L);

	RemoveGList(mw, &cpigad, -1L);

	if(prefs->PrintSpacing == SIX_LPI)
		{
		JAMMED_LINES = 0L;
		lpigad.GadgetText = &jammed_linestext;
		}
	else
		{
		JAMMED_LINES = 1L;
		lpigad.GadgetText = &nojammed_linestext;
		}

	switch(prefs->PrintPitch)
		{
		case PICA:
			BIGFONT = 1L;
			MEDFONT = SMALLFONT = 0L;
			cpigad.GadgetText = &i10cpitext;
			break;

		case ELITE:
			BIGFONT = SMALLFONT =0L;
			MEDFONT = 1L;
			cpigad.GadgetText = &i12cpitext;
			break;

		case FINE:
			BIGFONT = MEDFONT = 0L;
			SMALLFONT = 1L;
			cpigad.GadgetText = &i15cpitext;
			break;

		case default:
			break;
		}
	
	if(prefs->PrintQuality == DRAFT)
		{
		LQ = 0L;
		nlqgad.GadgetText = &nonlqtext;
		}
	else
		{
		LQ = 1;
		nlqgad.GadgetText = &nlqtext;
		}

	indent = prefs->PrintLeftMargin;
	sprintf(indstring, "%ld", indent);

	plength = prefs->PaperLength;

	if(prefs)
		FreeMem(prefs, sizeof(struct Preferences));

	AddGList(mw, &cpigad, 1L, 130867, NULL);
	RefreshGadgets(mw->FirstGadget, mw, NULL);
	return;
	}

/* preview performs a preview on the file to print and
	returns a string suitable for printf) 
*/
preview(name)
UBYTE *name;
{
	struct FileInfoBlock *fb = NULL ;
	struct FileLock *fl=NULL;

	long hours,mins,secs;


	fl = (struct FileLock *) ArpLock(name, ACCESS_READ);
	if(!fl)
		{
		SimpleRequest("Can't lock file %s!", name);
		return;
		}
	/* Memory will be released on CloseLibrary(ArpBase) */
	fb = (struct FileInfoBlock *) ArpAllocMem(sizeof(struct FileInfoBlock),\
																	MEMF_CLEAR|MEMF_CHIP);

	if(!fb)
		{
		SimpleRequest("No memory for FileInfoBlock!");
		return;
		}
	if(!Examine(fl, fb))
		{
		SimpleRequest("Examine of %s failed.",name);
		return;
		}

	size = fb -> fib_Size;
	if(LQ)
		secs = size /   80;
	else
		secs = size / 240;

	if(!LOUD)
	secs *= 2;
  
	SimpleRequest("Filename : %s\nFilesize : %ld bytes.\n\
Est. time: %ld min %ld sec.", fb->fib_FileName,size,secs / 60L,secs%60L);
	
	return;
}

		


void inprint()
{


	le = te = 50L;


	reqreq.PathName = reqpathname;
	reqreq.Dir = reqdirname;
	reqreq.File = reqfilename;
	reqreq.dirnamescolor = 2;
	reqreq.devicenamescolor = 2;	
	reqreq.Flags = FRQCACHINGM;
	fr = ArpAllocFreq();


	mw = OpenWindow(&printwindow);
	if(!mw)
		close_all("Unable to open Window!",1L);
	PrintIText(mw->RPort, &IntuiTextList1, 0L, 0L);


	for(;;)
		{
		WaitPort(mw->UserPort);
		msg = GetMsg(mw->UserPort);
		class = msg->Class;
		code = msg->Code;

		igad = (struct Gadget *) msg -> IAddress;
		gadid = igad -> GadgetID;
		ReplyMsg(msg);

		if(class == GADGETUP )
			{


			switch(gadid)
				{
				long okay = 0L;

				case HELPGADGET:
									if(!ARPREQUEST) {
										reqreq.Title = "Choose preview file";
										if(FileRequester(&reqreq))
											preview(reqpathname);
										break;
										}
									else 
										{
										fr->fr_Hail = (BYTE *) "Choose preview file";
										pt = (UBYTE *)FileRequest(fr);
										if(pt)
											{
											strcpy(filename,fr->fr_Dir);
											TackOn(filename,fr->fr_File);
											preview(filename);
											break;
											}
										break;
										}
				case REQGAD:
									RemoveGadget(mw, &reqgad);
									if(ARPREQUEST)
										{
										reqgad.GadgetText = &noarptext;
										ARPREQUEST = 0L;
										goto fuckoff10;
										}
									else
										{
										RemoveGadget(mw, &reqgad);
										reqgad.GadgetText = &arptext;
										ARPREQUEST = 1L;
										}
fuckoff10:
									AddGadget(mw, &reqgad, -1L);
									RefreshGadgets(&reqgad, mw, 0L);
									break;
		
				case INFOGADGET:
										info();
										break;

				case PREFGADGET:
										get_prefs();
										break;

				case SLEEPGADGET: CloseWindowSafely(mw,NULL);
										SetTaskPri(FindTask(0L), -10L);
										okay = \
										iconify(&le,&te,101,80,NULL,&icon,ICON_IMAGE);
										SetTaskPri(FindTask(0L), 0L);
										if(okay)
											{
											mw = OpenWindow(&printwindow);
											if(!mw)
												close_all("Unable to open Window!",1L);
											PrintIText(mw->RPort, &IntuiTextList1, 0L, 0L);
											}
										else
											close_all("Internal iconify error!");
										break;

				case NOISYGADGET:	RemoveGadget(mw, &nogad);
										if(LOUD)
											{	
											nogad.GadgetText = &quiettext;
											LOUD = 0L;
											goto fuckoff;
											}
										if(!LOUD)
											{
											nogad.GadgetText = &noisytext;
											LOUD = 1L;
											}
fuckoff:
										AddGadget(mw, &nogad, -1L);
										RefreshGadgets(&nogad,mw,0L);
										break;

			case QUITGADGET:
							         if(TwoGadRequest("Really quit Print?"))
											{
											if(HAVE_PRINTED_ONE)
											  clean_printer();
											close_all("",0L);
											}
										else
											break;

				case PRINTGADGET:	
										if(ARPREQUEST)
											{
											fr->fr_Hail	= (BYTE *) "Choose File to print";
											pt = (UBYTE *)FileRequest(fr);
											if(pt)
												{
												strcpy(filename,fr->fr_Dir);
												TackOn(filename,fr->fr_File);
													RemoveGadget(mw, &printgad); 
													printgad.GadgetText = &waittext;
													AddGadget(mw, &printgad, -1L);
													RefreshGadgets(mw->FirstGadget,mw,0L);

													init_printer();
													print_file(filename);
													HAVE_PRINTED_ONE = 1L;

												RemoveGadget(mw, &printgad);
												printgad.GadgetText = &printtext;
												AddGadget(mw, &printgad, -1L); 
												RefreshGadgets(&printgad,mw,0L); 
												}
											pt = (UBYTE *) NULL;	
											}
										else
											{
											reqreq.Title =  "Choose file to print";
											if (FileRequester(&reqreq))
												{
												RemoveGadget(mw, &printgad); 
												printgad.GadgetText = &waittext;
												AddGadget(mw, &printgad, -1L);
												RefreshGadgets(mw->FirstGadget,mw,0L);
												init_printer(); 
												print_file(reqpathname); 
												HAVE_PRINTED_ONE = 1L;

												RemoveGadget(mw, &printgad);
												printgad.GadgetText = &printtext;
												AddGadget(mw, &printgad, -1L); 
												RefreshGadgets(&printgad,mw,0L); 
												}
											}
										break;

					case PAGENOGADGET:
										RemoveGadget(mw, &pngad);
										if(PAGENUMBERING)
												{	
												pngad.GadgetText = &nopagenotext;
												PAGENUMBERING = 0L;
												goto fuckoff1;
												}
											if(!PAGENUMBERING)
												{
												pngad.GadgetText = &pagenotext;
												PAGENUMBERING  = 1L;
												}
fuckoff1:
											AddGadget(mw, &pngad, -1L);
											RefreshGadgets(&pngad,mw,0L);
											break;

					case FILENAMEGADGET:
											RemoveGadget(mw, &fngad);
											if(FILENAMES)
												{	
												fngad.GadgetText = &nofilenametext;
												FILENAMES = 0L;
												goto fuckoff2;
												}
											if(!FILENAMES)
												{
												fngad.GadgetText = &filenametext;
												FILENAMES  = 1L;
												}
						
fuckoff2:
											AddGadget(mw, &fngad, -1L);
											RefreshGadgets(&fngad,mw,0L);
											break;

					case RESETGADGET:
											RemoveGadget(mw, &resgad);
											if(RESET)
												{	
												resgad.GadgetText = &noresettext;
												RESET = 0L;
												goto fuckoff3;
												}
											if(!RESET)
												{
												resgad.GadgetText = &resettext;
												RESET  = 1L;
												}
						
fuckoff3:
											AddGadget(mw, &resgad, -1L);
											RefreshGadgets(&resgad,mw,0L);
											break;
					case IBMGADGET:	
											RemoveGadget(mw, &ibmgad);
											if(DONT_TRANSFORM)
												{	
												ibmgad.GadgetText = &nodont_transformtext;
												DONT_TRANSFORM = 0L;
												goto fuckoff4;
												}
											if(!DONT_TRANSFORM)
												{
												ibmgad.GadgetText = &dont_transformtext;
												DONT_TRANSFORM  = 1L;
												}
						
fuckoff4:
											AddGadget(mw, &ibmgad, -1L);
											RefreshGadgets(&ibmgad,mw,0L);
											break;

					case NLQGADGET:
											RemoveGadget(mw, &nlqgad);
											if(LQ)
												{	
												nlqgad.GadgetText = &nonlqtext;
												LQ = 0L;
												goto fuckoff5;
												}
											if(!LQ)
												{
												nlqgad.GadgetText = &nlqtext;
												LQ  = 1L;
												}
						
fuckoff5:
											AddGadget(mw, &nlqgad, -1L);
											RefreshGadgets(&nlqgad,mw,0L);
											break;

					case LPIGADGET:
											RemoveGadget(mw, &lpigad);
											if(JAMMED_LINES)
												{	
												lpigad.GadgetText = &nojammed_linestext;
												JAMMED_LINES = 0L;
												goto fuckoff6;
												}
											if(!JAMMED_LINES)
												{
												lpigad.GadgetText = &jammed_linestext;
												JAMMED_LINES  = 1L;
												}
						
fuckoff6:
											AddGadget(mw, &lpigad, -1L);
											RefreshGadgets(&lpigad,mw,0L);
											break;


					case OFFGADGET:	offset = atoi(offstring);
											OFFSET = 1L;
											break;

					case TABGADGET:	tabsize = atoi(tabstring);
											break;
					case INDGADGET:	indent = atoi(indstring);
											break;
					case CFGADGET:		scan_file(cfstring);
											break;

					case CPIGADGET:	RemoveGadget(mw, &cpigad);
											if (BIGFONT)
												{
												BIGFONT =  0L;
						 						cpigad.GadgetText = &i15cpitext;
												SMALLFONT = 1L;
												goto finalfuckoff;
												}
											if(SMALLFONT)
												{
												SMALLFONT = 0L;
												MEDFONT = 1L;
												cpigad.GadgetText = &i12cpitext;
												goto finalfuckoff;
												}
											if(MEDFONT)
												{
												MEDFONT = 0L;
												BIGFONT = 1L;
												cpigad.GadgetText = &i10cpitext;
												}
finalfuckoff:
											AddGadget(mw, &cpigad, 1L);
											RefreshGadgets(&cpigad,mw,0L);
											break;

					case default:		break; 
					} /* End switch()*/
				}	
			}
		}		
