/* $Id: ckmpri.c,v 1.5 91/12/15 23:17:46 rick Exp $
 * $Source: /uw/mackermit/RCS/ckmpri.c,v $
 *------------------------------------------------------------------
 * $Log:	ckmpri.c,v $
 * Revision 1.5  91/12/15  23:17:46  rick
 * ut9
 * 
 * Revision 1.4  91/10/13  13:44:33  rick
 * UT(7)
 * 
 * Revision 1.3  91/10/03  12:43:06  rick
 * UT(5)
 * 
 *------------------------------------------------------------------
 * $Endlog$
 */

/*
 * file ckmpri.c
 *
 * Module of mackermit containing code for handling printing.  This code was
 * originally put into ckmusr by John A. Oberschelp of Emory U.
 *
 */

/*
  Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New
  York.  Permission is granted to any individual or institution to use this
  software as long as it is not sold for profit.  This copyright notice must be
  retained.  This software may not be included in commercial products without
  written permission of Columbia University.
*/

#include "ckcdeb.h"
#include "ckcker.h"

#include "ckmdef.h"		/* General Mac defs */
#include "ckmres.h"		/* Mac resource equates */
#include "ckmasm.h"		/* new A8 and A9 traps */
#include "ckmcon.h"		/* for fonts */
#include "ckmptp.h"		/* ckm* Prototypes */


int		to_printer = FALSE;
int		to_screen = TRUE;
int		printer_is_on_line_num;
Handle	hPrintBuffer = 0L;
long	lPrintBufferSize;
long	lPrintBufferChars;
long	lPrintBufferAt;

extern	MenuHandle menus[];	/* handle on our menus */

DialogPtr	printingDialog;
DialogPtr	bufferingDialog;
DialogPtr	overflowingDialog;
DialogPtr	overflowedDialog;
DialogPtr	pauseDialog;

#define MIN(a,b) ((a)<(b))?(a):(b)
#define MAX(a,b) ((a)>(b))?(a):(b)

void
now_print()
{
    short itemhit;
	long index, length;
    /* CursHandle watchcurs; */

	if (lPrintBufferChars >= lPrintBufferSize) {
		overflowedDialog = GetNewDialog(OVERFLOWEDBOXID, NILPTR,
						(WindowPtr) - 1);
		circleOK(overflowedDialog);

		ModalDialog ((ModalFilterProcPtr) NILPROC, &itemhit);
		DisposDialog(overflowedDialog);
		if (itemhit == 2)	/* if Cancel */
		    return;
		if (itemhit == 3) {
			DisposHandle(hPrintBuffer);
			hPrintBuffer = 0L;
			lPrintBufferChars = 0L;
			updatepstat();
			return;
		}
	}

	if (lPrintBufferChars > lPrintBufferSize) {	/* if buffer wrapped */
		length = lPrintBufferSize;
		index = lPrintBufferAt;
	} else {
		length = lPrintBufferChars;
		index = 0L;
	}
	printer(hPrintBuffer, length, index, lPrintBufferSize);

	DisposHandle(hPrintBuffer);
	hPrintBuffer = 0L;
	lPrintBufferChars = 0L;
	updatepstat();
}


/*
 * printer
 * h - handle to text to print
 * length - number of chars in buffer
 * index - starting index in buffer
 * limit - buffer limit (to wrap index)
 */
printer (Handle h, long length, long index, long limit)
{
    char	PrintBufferChar;
    CursHandle	watchcurs;
    int		typeOfDriver;
    int		chrExtra;
    int		leftMargin;
    GrafPtr	oldPort;
    int		temp;
    TPPrPort	myPrPort;
    THPrint	PrintStuff;
    TPrStatus	myStRec;

	PrintStuff = (THPrint)NewHandle(sizeof(TPrint));
	GetPort(&oldPort);
	PrOpen();
	if (PrError() == noErr) {
		temp = PrValidate(PrintStuff);
		temp = PrJobDialog(PrintStuff);
		if (!temp) {
			PrClose();
			SetPort(oldPort);
			return;
		}
		printingDialog = GetNewDialog(PRINTINGBOXID, NILPTR,
					      (WindowPtr) - 1);
		DrawDialog (printingDialog);
		watchcurs = GetCursor(watchCursor);
		SetCursor(*watchcurs);

		myPrPort = PrOpenDoc(PrintStuff, nil, nil);
		typeOfDriver = ((*PrintStuff)->prStl.wDev) >> 8;
		if (typeOfDriver == 3) { /*laser*/
			TextFont(courier);
			TextSize(10);
			chrExtra = 0;
			leftMargin = 36;
		} else {
			TextFont(VT100FONT);
			TextSize(9);
			chrExtra = 1;
			leftMargin = 36;
		}

		printer_is_on_line_num = 1;
		PrOpenPage(myPrPort, nil);
		MoveTo(leftMargin, 1 * 12);

		do {
			if (PrError() != noErr) 
				break;
			PrintBufferChar = (*h)[index];
			switch (PrintBufferChar) {
			  case 13:
				if (++printer_is_on_line_num > 60) {
					PrClosePage(myPrPort);
					PrOpenPage(myPrPort, nil);
					printer_is_on_line_num = 1;
				}
				MoveTo(leftMargin, printer_is_on_line_num * 12);
			  break;

			  case 14:
				if (printer_is_on_line_num != 1) {
					PrClosePage(myPrPort);
					PrOpenPage(myPrPort, nil);
					printer_is_on_line_num = 1;
				}
				MoveTo(leftMargin, printer_is_on_line_num * 12);
			  break;

			  default:
				DrawChar(PrintBufferChar);
				Move(chrExtra, 0);
			  break;
			}

			if (++index == limit)		/* if time to wrap buffer */
				index = 0L;

		} while (--length);
		PrClosePage(myPrPort);

		PrCloseDoc(myPrPort);
		if ((PrError() == noErr) &&
			((**PrintStuff).prJob.bJDocLoop == bSpoolLoop))
			PrPicFile(PrintStuff, nil, nil, nil, &myStRec);
		if ((PrError() != noErr) && (PrError() != 128)) {
			printerr ("Printer error: ", PrError());
		}

		DisposDialog(printingDialog);
	}
	PrClose();
	SetPort(oldPort);
	InitCursor();
}


void
pr_stat()
{
    DialogPtr	printDialog;
    Str255	arg1, arg2, arg3;
    short	itemhit;


    printDialog = GetNewDialog(PRINTBOXID, NILPTR, (WindowPtr) - 1);
    circleOK(printDialog);

    NumToString(MAX(lPrintBufferChars - lPrintBufferSize, 0L), arg1);
    NumToString(MIN(lPrintBufferSize, lPrintBufferChars), arg2);
    NumToString(lPrintBufferSize, arg3);
    ParamText (arg1, arg2, arg3, "");

    do {
	ModalDialog ((ModalFilterProcPtr) NILPROC, &itemhit);

	switch (itemhit) {
	  case 1:
	  case 2:
	  case 3:
	  break;

	}
    } while (itemhit > 3);

    DisposDialog(printDialog);
}


/*
 * Junk so Emacs will set local variables to be compatible with Mac/MPW.
 * Should be at end of file.
 * 
 * Local Variables:
 * tab-width: 4
 * End:
 */
