diff options
Diffstat (limited to 'maccaml/print.c')
-rw-r--r-- | maccaml/print.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/maccaml/print.c b/maccaml/print.c index 469ddc02a..d7dbf5fa4 100644 --- a/maccaml/print.c +++ b/maccaml/print.c @@ -13,6 +13,111 @@ #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 (); |