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 } |