< prev index next >
modules/javafx.graphics/src/main/java/com/sun/prism/j2d/print/J2DPrinterJob.java
Print this page
*** 43,52 ****
--- 43,53 ----
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Window;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
+ import javax.print.attribute.PrintRequestAttribute;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.ResolutionSyntax;
import javax.print.attribute.Size2DSyntax;
import javax.print.attribute.standard.Chromaticity;
import javax.print.attribute.standard.Copies;
*** 74,86 ****
--- 75,94 ----
import com.sun.javafx.print.PrintHelper;
import com.sun.javafx.print.PrinterImpl;
import com.sun.javafx.print.PrinterJobImpl;
import com.sun.javafx.scene.NodeHelper;
import com.sun.javafx.sg.prism.NGNode;
+ import com.sun.javafx.stage.WindowHelper;
+ import com.sun.javafx.tk.TKStage;
import com.sun.javafx.tk.Toolkit;
+
import com.sun.prism.j2d.PrismPrintGraphics;
+ import java.lang.reflect.Constructor;
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
+
public class J2DPrinterJob implements PrinterJobImpl {
javafx.print.PrinterJob fxPrinterJob;
java.awt.print.PrinterJob pJob2D;
javafx.print.Printer fxPrinter;
*** 88,97 ****
--- 96,124 ----
private JobSettings settings;
private PrintRequestAttributeSet printReqAttrSet;
private volatile Object elo = null;
+ static private Class onTopClass = null;
+ PrintRequestAttribute getAlwaysOnTop(final long id) {
+ return AccessController.doPrivileged(
+ (PrivilegedAction<PrintRequestAttribute>) () -> {
+
+ PrintRequestAttribute alwaysOnTop = null;
+ try {
+ if (onTopClass == null) {
+ onTopClass = Class.forName("sun.print.DialogOnTop");
+ }
+ Constructor<PrintRequestAttribute> cons =
+ onTopClass.getConstructor(long.class);
+ alwaysOnTop = cons.newInstance(id);
+ } catch (Throwable t) {
+ }
+ return alwaysOnTop;
+ });
+ }
+
public J2DPrinterJob(javafx.print.PrinterJob fxJob) {
fxPrinterJob = fxJob;
fxPrinter = fxPrinterJob.getPrinter();
j2dPrinter = getJ2DPrinter(fxPrinter);
*** 101,140 ****
pJob2D.setPrintService(j2dPrinter.getService());
} catch (PrinterException pe) {
}
printReqAttrSet = new HashPrintRequestAttributeSet();
printReqAttrSet.add(DialogTypeSelection.NATIVE);
-
j2dPageable = new J2DPageable();
pJob2D.setPageable(j2dPageable);
}
public boolean showPrintDialog(Window owner) {
if (jobRunning || jobDone) {
return false;
}
if (GraphicsEnvironment.isHeadless()) {
return true;
}
boolean rv = false;
syncSettingsToAttributes();
if (!Toolkit.getToolkit().isFxUserThread()) {
rv = pJob2D.printDialog(printReqAttrSet);
} else {
! // If we are on the event thread, we need to check whether we are
! // allowed to call a nested event handler.
if (!Toolkit.getToolkit().canStartNestedEventLoop()) {
! throw new IllegalStateException("Printing is not allowed during animation or layout processing");
}
rv = showPrintDialogWithNestedLoop(owner);
}
if (rv) {
updateSettingsFromDialog();
}
return rv;
}
private class PrintDialogRunnable implements Runnable {
--- 128,194 ----
pJob2D.setPrintService(j2dPrinter.getService());
} catch (PrinterException pe) {
}
printReqAttrSet = new HashPrintRequestAttributeSet();
printReqAttrSet.add(DialogTypeSelection.NATIVE);
j2dPageable = new J2DPageable();
pJob2D.setPageable(j2dPageable);
}
+ private void setEnabledState(Window owner, boolean state) {
+ if (owner == null) {
+ return;
+ }
+ final TKStage stage = WindowHelper.getPeer(owner);
+ if (stage == null) { // just in case.
+ return;
+ }
+ Application.invokeAndWait(() -> stage.setEnabled(state));
+ }
+
public boolean showPrintDialog(Window owner) {
if (jobRunning || jobDone) {
return false;
}
if (GraphicsEnvironment.isHeadless()) {
return true;
}
+ if (onTopClass != null) {
+ printReqAttrSet.remove(onTopClass);
+ }
+ if (owner != null) {
+ long id = WindowHelper.getPeer(owner).getRawHandle();
+ PrintRequestAttribute alwaysOnTop = getAlwaysOnTop(id);
+ if (alwaysOnTop != null) {
+ printReqAttrSet.add(alwaysOnTop);
+ }
+ }
+
boolean rv = false;
syncSettingsToAttributes();
+ try {
+ setEnabledState(owner, false);
if (!Toolkit.getToolkit().isFxUserThread()) {
rv = pJob2D.printDialog(printReqAttrSet);
} else {
! // If we are on the event thread, we need to check whether
! // we are allowed to call a nested event handler.
if (!Toolkit.getToolkit().canStartNestedEventLoop()) {
! throw new IllegalStateException(
! "Printing is not allowed during animation or layout processing");
}
rv = showPrintDialogWithNestedLoop(owner);
}
if (rv) {
updateSettingsFromDialog();
}
+ } finally {
+ setEnabledState(owner, true);
+ }
return rv;
}
private class PrintDialogRunnable implements Runnable {
*** 169,191 ****
return false;
}
if (GraphicsEnvironment.isHeadless()) {
return true;
}
boolean rv = false;
syncSettingsToAttributes();
if (!Toolkit.getToolkit().isFxUserThread()) {
PageFormat pf = pJob2D.pageDialog(printReqAttrSet);
rv = pf != null;
} else {
! // If we are on the event thread, we need to check whether we are
! // allowed to call a nested event handler.
if (!Toolkit.getToolkit().canStartNestedEventLoop()) {
! throw new IllegalStateException("Printing is not allowed during animation or layout processing");
}
rv = showPageDialogFromNestedLoop(owner);
}
if (rv) {
updateSettingsFromDialog();
}
return rv;
}
--- 223,263 ----
return false;
}
if (GraphicsEnvironment.isHeadless()) {
return true;
}
+
+ if (onTopClass != null) {
+ printReqAttrSet.remove(onTopClass);
+ }
+ if (owner != null) {
+ long id = WindowHelper.getPeer(owner).getRawHandle();
+ PrintRequestAttribute alwaysOnTop = getAlwaysOnTop(id);
+ if (alwaysOnTop != null) {
+ printReqAttrSet.add(alwaysOnTop);
+ }
+ }
+
boolean rv = false;
syncSettingsToAttributes();
+ try {
+ setEnabledState(owner, false);
if (!Toolkit.getToolkit().isFxUserThread()) {
PageFormat pf = pJob2D.pageDialog(printReqAttrSet);
rv = pf != null;
} else {
! // If we are on the event thread, we need to check whether
! // we are allowed to call a nested event handler.
if (!Toolkit.getToolkit().canStartNestedEventLoop()) {
! throw new IllegalStateException(
! "Printing is not allowed during animation or layout processing");
}
rv = showPageDialogFromNestedLoop(owner);
}
+ } finally {
+ setEnabledState(owner, true);
+ }
if (rv) {
updateSettingsFromDialog();
}
return rv;
}
< prev index next >