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