< prev index next >
modules/javafx.graphics/src/main/java/com/sun/prism/j2d/print/J2DPrinterJob.java
Print this page
@@ -43,10 +43,11 @@
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,13 +75,20 @@
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,10 +96,29 @@
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,40 +128,67 @@
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 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");
+ 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,23 +223,41 @@
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 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");
+ 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 >