summaryrefslogtreecommitdiffstats
path: root/maccaml/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'maccaml/print.c')
-rw-r--r--maccaml/print.c105
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 ();