提交 2a081a4b 编写于 作者: J jgodinez

7183520: [macosx]Unable to print out the defined page for...

7183520: [macosx]Unable to print out the defined page for 2D_PrintingTiger/JTablePrintPageRangesTest.
Reviewed-by: bae, prr
上级 3d76b805
...@@ -36,6 +36,7 @@ import java.security.PrivilegedAction; ...@@ -36,6 +36,7 @@ import java.security.PrivilegedAction;
import javax.print.*; import javax.print.*;
import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.PageRanges;
import sun.java2d.*; import sun.java2d.*;
import sun.print.*; import sun.print.*;
...@@ -173,6 +174,19 @@ public class CPrinterJob extends RasterPrinterJob { ...@@ -173,6 +174,19 @@ public class CPrinterJob extends RasterPrinterJob {
if (nsPrintInfo != null) { if (nsPrintInfo != null) {
fNSPrintInfo = nsPrintInfo.getValue(); fNSPrintInfo = nsPrintInfo.getValue();
} }
PageRanges pageRangesAttr = (PageRanges)attributes.get(PageRanges.class);
if (isSupportedValue(pageRangesAttr, attributes)) {
SunPageSelection rangeSelect = (SunPageSelection)attributes.get(SunPageSelection.class);
// If rangeSelect is not null, we are using AWT's print dialog that has
// All, Selection, and Range radio buttons
if (rangeSelect == null || rangeSelect == SunPageSelection.RANGE) {
int[][] range = pageRangesAttr.getMembers();
// setPageRange will set firstPage and lastPage as called in getFirstPage
// and getLastPage
setPageRange(range[0][0] - 1, range[0][1] - 1);
}
}
} }
volatile boolean onEventThread; volatile boolean onEventThread;
...@@ -225,7 +239,6 @@ public class CPrinterJob extends RasterPrinterJob { ...@@ -225,7 +239,6 @@ public class CPrinterJob extends RasterPrinterJob {
* the end of the document. Note that firstPage * the end of the document. Note that firstPage
* and lastPage are 0 based page indices. * and lastPage are 0 based page indices.
*/ */
int numPages = mDocument.getNumberOfPages();
int firstPage = getFirstPage(); int firstPage = getFirstPage();
int lastPage = getLastPage(); int lastPage = getLastPage();
...@@ -242,42 +255,53 @@ public class CPrinterJob extends RasterPrinterJob { ...@@ -242,42 +255,53 @@ public class CPrinterJob extends RasterPrinterJob {
userCancelled = false; userCancelled = false;
} }
if (EventQueue.isDispatchThread()) { //Add support for PageRange
// This is an AWT EventQueue, and this print rendering loop needs to block it. PageRanges pr = (attributes == null) ? null
: (PageRanges)attributes.get(PageRanges.class);
int[][] prMembers = (pr == null) ? new int[0][0] : pr.getMembers();
int loopi = 0;
do {
if (EventQueue.isDispatchThread()) {
// This is an AWT EventQueue, and this print rendering loop needs to block it.
onEventThread = true;
printingLoop = AccessController.doPrivileged(new PrivilegedAction<SecondaryLoop>() {
@Override
public SecondaryLoop run() {
return Toolkit.getDefaultToolkit()
.getSystemEventQueue()
.createSecondaryLoop();
}
});
onEventThread = true; try {
// Fire off the print rendering loop on the AppKit thread, and don't have
printingLoop = AccessController.doPrivileged(new PrivilegedAction<SecondaryLoop>() { // it wait and block this thread.
@Override if (printLoop(false, firstPage, lastPage)) {
public SecondaryLoop run() { // Start a secondary loop on EDT until printing operation is finished or cancelled
return Toolkit.getDefaultToolkit() printingLoop.enter();
.getSystemEventQueue() }
.createSecondaryLoop(); } catch (Exception e) {
e.printStackTrace();
} }
}); } else {
// Fire off the print rendering loop on the AppKit, and block this thread
// until it is done.
// But don't actually block... we need to come back here!
onEventThread = false;
try { try {
// Fire off the print rendering loop on the AppKit thread, and don't have printLoop(true, firstPage, lastPage);
// it wait and block this thread. } catch (Exception e) {
if (printLoop(false, firstPage, lastPage)) { e.printStackTrace();
// Start a secondary loop on EDT until printing operation is finished or cancelled
printingLoop.enter();
} }
} catch (Exception e) {
e.printStackTrace();
} }
} else { if (++loopi < prMembers.length) {
// Fire off the print rendering loop on the AppKit, and block this thread firstPage = prMembers[loopi][0]-1;
// until it is done. lastPage = prMembers[loopi][1] -1;
// But don't actually block... we need to come back here!
onEventThread = false;
try {
printLoop(true, firstPage, lastPage);
} catch (Exception e) {
e.printStackTrace();
} }
} } while (loopi < prMembers.length);
} finally { } finally {
synchronized (this) { synchronized (this) {
// NOTE: Native code shouldn't allow exceptions out while // NOTE: Native code shouldn't allow exceptions out while
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册