ocaml/maccaml/print.c

132 lines
4.2 KiB
C

/***********************************************************************/
/* */
/* Objective Caml */
/* */
/* Damien Doligez, projet Para, INRIA Rocquencourt */
/* */
/* Copyright 1999 Institut National de Recherche en Informatique et */
/* en Automatique. All rights reserved. This file is distributed */
/* under the terms of the GNU Library General Public License, with */
/* the special exception on linking described in file ../LICENSE. */
/* */
/***********************************************************************/
/* $Id$ */
#include "main.h"
static short (*get_npages) (THPrint printrec);
static short (*draw_page) (THPrint printrec, TPPrPort port, int pagenum);
static THPrint curjobprintrec = NULL;
/*
dojobdialog = 0 -> no job dialog (use default settings)
dojobdialog = 1 -> use job dialog
dojobdialog = 2 -> no job dialog (use previous dialog settings)
*/
static short print_loop (int dojobdialog, THPrint docprintrec)
{
short ncopies, fstpage, lstpage, npages;
OSErr err;
GrafPtr saveport;
TPPrPort printerport;
TPrStatus prstatus;
int copy, page, pgrun;
GetPort (&saveport);
PrOpen ();
err = PrError (); if (err != noErr) goto failed_PrOpen;
PrValidate (docprintrec);
err = PrError (); if (err != noErr) goto failed_PrValidate;
npages = (*get_npages) (docprintrec);
switch (dojobdialog){
case 0:
if (curjobprintrec != NULL) DisposeHandle ((Handle) curjobprintrec);
curjobprintrec = (THPrint) NewHandle (sizeof (TPrint));
if (curjobprintrec == NULL) goto failed_alloc_curjobprintrec;
PrintDefault (curjobprintrec);
PrJobMerge (curjobprintrec, docprintrec);
break;
case 1:
err = PrJobDialog (docprintrec);
if (err) goto failed_PrJobDialog;
if (curjobprintrec != NULL) DisposeHandle ((Handle) curjobprintrec);
curjobprintrec = docprintrec;
HandToHand ((Handle *) &curjobprintrec);
if (curjobprintrec == NULL) goto failed_alloc_curjobprintrec;
break;
case 2:
PrJobMerge (curjobprintrec, docprintrec);
break;
}
ncopies = (*docprintrec)->prJob.iCopies;
fstpage = (*docprintrec)->prJob.iFstPage;
lstpage = (*docprintrec)->prJob.iLstPage;
if (lstpage > npages) lstpage = npages;
/* XXX Should display a status dialog box and use a IdleProc function */
for (copy = 0; copy < ncopies; copy++){
printerport = PrOpenDoc (docprintrec, NULL, NULL);
err = PrError (); if (err != noErr) goto failed_PrOpenDoc;
pgrun = 0;
for (page = fstpage; page <= lstpage; page++){
if (pgrun >= iPFMaxPgs){
PrCloseDoc (printerport);
err = PrError (); if (err != noErr) goto failed_PrCloseDoc;
if ((*docprintrec)->prJob.bJDocLoop == bSpoolLoop){
PrPicFile (docprintrec, NULL, NULL, NULL, &prstatus);
}
printerport = PrOpenDoc (docprintrec, NULL, NULL);
err = PrError (); if (err != noErr) goto failed_PrOpenDoc;
pgrun = 0;
}
PrOpenPage (printerport, NULL);
err = PrError (); if (err != noErr) goto failed_PrOpenPage;
err = (*draw_page) (docprintrec, printerport, page);
if (err != noErr) goto failed_draw_page;
PrClosePage (printerport);
++ pgrun;
}
PrCloseDoc (printerport);
err = PrError (); if (err != noErr) goto failed_PrCloseDoc;
if ((*docprintrec)->prJob.bJDocLoop == bSpoolLoop){
PrPicFile (docprintrec, NULL, NULL, NULL, &prstatus);
}
}
PrClose ();
/*XXX close status dialog box here */
SetPort (saveport);
return noErr;
failed_draw_page:
PrClosePage (printerport);
/* fall through */
failed_PrOpenPage:
PrCloseDoc (printerport);
/* fall through */
failed_PrOpenDoc:
failed_PrCloseDoc:
failed_alloc_curjobprintrec:
failed_PrJobDialog:
failed_PrValidate:
PrClose ();
/* fall through */
failed_PrOpen:
return err;
}
void FilePageSetup (void)
{
XXX ();
}
void FilePrint (void)
{
XXX ();
}