src/macosx/native/sun/awt/CPrinterJob.m

Print this page




 506 
 507     static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormat", "(I)Ljava/awt/print/PageFormat;");
 508     static JNF_MEMBER_CACHE(jm_getPageFormatArea, sjc_CPrinterJob, "getPageFormatArea", "(Ljava/awt/print/PageFormat;)Ljava/awt/geom/Rectangle2D;");
 509     static JNF_MEMBER_CACHE(jm_getPrinterName, sjc_CPrinterJob, "getPrinterName", "()Ljava/lang/String;");
 510     static JNF_MEMBER_CACHE(jm_getPageable, sjc_CPrinterJob, "getPageable", "()Ljava/awt/print/Pageable;");
 511 
 512     jboolean retVal = JNI_FALSE;
 513 
 514 JNF_COCOA_ENTER(env);
 515     // Get the first page's PageFormat for setting things up (This introduces
 516     //  and is a facet of the same problem in Radar 2818593/2708932).
 517     jobject page = JNFCallObjectMethod(env, jthis, jm_getPageFormat, 0); // AWT_THREADING Safe (!appKit)
 518     if (page != NULL) {
 519         jobject pageFormatArea = JNFCallObjectMethod(env, jthis, jm_getPageFormatArea, page); // AWT_THREADING Safe (!appKit)
 520 
 521         PrinterView* printerView = [[PrinterView alloc] initWithFrame:JavaToNSRect(env, pageFormatArea) withEnv:env withPrinterJob:jthis];
 522         [printerView setFirstPage:firstPage lastPage:lastPage];
 523 
 524         NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr(JNFCallLongMethod(env, jthis, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
 525 




 526         // <rdar://problem/4156975> passing jthis CPrinterJob as well, so we can extract the printer name from the current job
 527         javaPageFormatToNSPrintInfo(env, jthis, page, printInfo);
 528 
 529         // <rdar://problem/4093799> NSPrinterInfo is not correctly set to the selected printer
 530         // from the Java side of CPrinterJob. Had always assumed the default printer was the one we wanted.
 531         jobject printerNameObj = JNFCallObjectMethod(env, jthis, jm_getPrinterName);
 532         if (printerNameObj != NULL) {
 533             NSString *printerName = JNFJavaToNSString(env, printerNameObj);
 534             if (printerName != nil) {
 535                 NSPrinter *printer = [NSPrinter printerWithName:printerName];
 536                 if (printer != nil) [printInfo setPrinter:printer];
 537             }
 538         }
 539 
 540         // <rdar://problem/4367998> JTable.print attributes are ignored
 541         jobject pageable = JNFCallObjectMethod(env, jthis, jm_getPageable); // AWT_THREADING Safe (!appKit)
 542         javaPrinterJobToNSPrintInfo(env, jthis, pageable, printInfo);
 543 
 544         PrintModel* printModel = [[PrintModel alloc] initWithPrintInfo:printInfo];
 545 
 546         (void)[printModel runPrintLoopWithView:printerView waitUntilDone:blocks withEnv:env];
 547 
 548         // Only set this if we got far enough to call runPrintLoopWithView, or we will spin CPrinterJob.print() forever!
 549         retVal = JNI_TRUE;
 550 
 551         [printModel release];
 552         [printerView release];
 553 
 554         if (page != NULL)
 555         {
 556             (*env)->DeleteLocalRef(env, page);
 557         }
 558 
 559         if (pageFormatArea != NULL)
 560         {
 561             (*env)->DeleteLocalRef(env, pageFormatArea);
 562         }
 563     }




 506 
 507     static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormat", "(I)Ljava/awt/print/PageFormat;");
 508     static JNF_MEMBER_CACHE(jm_getPageFormatArea, sjc_CPrinterJob, "getPageFormatArea", "(Ljava/awt/print/PageFormat;)Ljava/awt/geom/Rectangle2D;");
 509     static JNF_MEMBER_CACHE(jm_getPrinterName, sjc_CPrinterJob, "getPrinterName", "()Ljava/lang/String;");
 510     static JNF_MEMBER_CACHE(jm_getPageable, sjc_CPrinterJob, "getPageable", "()Ljava/awt/print/Pageable;");
 511 
 512     jboolean retVal = JNI_FALSE;
 513 
 514 JNF_COCOA_ENTER(env);
 515     // Get the first page's PageFormat for setting things up (This introduces
 516     //  and is a facet of the same problem in Radar 2818593/2708932).
 517     jobject page = JNFCallObjectMethod(env, jthis, jm_getPageFormat, 0); // AWT_THREADING Safe (!appKit)
 518     if (page != NULL) {
 519         jobject pageFormatArea = JNFCallObjectMethod(env, jthis, jm_getPageFormatArea, page); // AWT_THREADING Safe (!appKit)
 520 
 521         PrinterView* printerView = [[PrinterView alloc] initWithFrame:JavaToNSRect(env, pageFormatArea) withEnv:env withPrinterJob:jthis];
 522         [printerView setFirstPage:firstPage lastPage:lastPage];
 523 
 524         NSPrintInfo* printInfo = (NSPrintInfo*)jlong_to_ptr(JNFCallLongMethod(env, jthis, sjm_getNSPrintInfo)); // AWT_THREADING Safe (known object)
 525 
 526         // <rdar://problem/4367998> JTable.print attributes are ignored
 527         jobject pageable = JNFCallObjectMethod(env, jthis, jm_getPageable); // AWT_THREADING Safe (!appKit)
 528         javaPrinterJobToNSPrintInfo(env, jthis, pageable, printInfo);
 529 
 530         // <rdar://problem/4156975> passing jthis CPrinterJob as well, so we can extract the printer name from the current job
 531         javaPageFormatToNSPrintInfo(env, jthis, page, printInfo);
 532 
 533         // <rdar://problem/4093799> NSPrinterInfo is not correctly set to the selected printer
 534         // from the Java side of CPrinterJob. Had always assumed the default printer was the one we wanted.
 535         jobject printerNameObj = JNFCallObjectMethod(env, jthis, jm_getPrinterName);
 536         if (printerNameObj != NULL) {
 537             NSString *printerName = JNFJavaToNSString(env, printerNameObj);
 538             if (printerName != nil) {
 539                 NSPrinter *printer = [NSPrinter printerWithName:printerName];
 540                 if (printer != nil) [printInfo setPrinter:printer];
 541             }
 542         }
 543 




 544         PrintModel* printModel = [[PrintModel alloc] initWithPrintInfo:printInfo];
 545 
 546         (void)[printModel runPrintLoopWithView:printerView waitUntilDone:blocks withEnv:env];
 547 
 548         // Only set this if we got far enough to call runPrintLoopWithView, or we will spin CPrinterJob.print() forever!
 549         retVal = JNI_TRUE;
 550 
 551         [printModel release];
 552         [printerView release];
 553 
 554         if (page != NULL)
 555         {
 556             (*env)->DeleteLocalRef(env, page);
 557         }
 558 
 559         if (pageFormatArea != NULL)
 560         {
 561             (*env)->DeleteLocalRef(env, pageFormatArea);
 562         }
 563     }