From ac5928bc2a50c90dcfd9b16263f7e625dfa76913 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Wed, 3 Aug 2016 14:45:25 +0530 Subject: [PATCH] 6575247: Banner checkbox in PrinterJob print dialog doesn't work Reviewed-by: prr, jdv --- .../share/classes/sun/print/PSPrinterJob.java | 30 ++-- .../classes/sun/print/RasterPrinterJob.java | 6 + .../classes/sun/print/ServiceDialog.java | 4 +- .../unix/classes/sun/print/UnixPrintJob.java | 30 +++- .../java/awt/print/PrinterJob/BannerTest.java | 160 ++++++++++++++++++ 5 files changed, 210 insertions(+), 20 deletions(-) create mode 100644 jdk/test/java/awt/print/PrinterJob/BannerTest.java diff --git a/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java b/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java index 511fd3a6195..abe8bd9ab7a 100644 --- a/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java +++ b/jdk/src/java.desktop/share/classes/sun/print/PSPrinterJob.java @@ -105,6 +105,7 @@ import java.nio.file.Files; //REMIND: Remove use of this class when IPPPrintService is moved to share directory. import java.lang.reflect.Method; +import javax.print.attribute.standard.JobSheets; /** * A class which initiates and executes a PostScript printer job. @@ -1573,10 +1574,10 @@ public class PSPrinterJob extends RasterPrinterJob { private String[] printExecCmd(String printer, String options, boolean noJobSheet, - String banner, int copies, String spoolFile) { + String jobTitle, int copies, String spoolFile) { int PRINTER = 0x1; int OPTIONS = 0x2; - int BANNER = 0x4; + int JOBTITLE = 0x4; int COPIES = 0x8; int NOSHEET = 0x10; int pFlags = 0; @@ -1592,8 +1593,8 @@ public class PSPrinterJob extends RasterPrinterJob { pFlags |= OPTIONS; ncomps+=1; } - if (banner != null && !banner.equals("")) { - pFlags |= BANNER; + if (jobTitle != null && !jobTitle.equals("")) { + pFlags |= JOBTITLE; ncomps+=1; } if (copies > 1) { @@ -1603,23 +1604,29 @@ public class PSPrinterJob extends RasterPrinterJob { if (noJobSheet) { pFlags |= NOSHEET; ncomps+=1; + } else if (getPrintService(). + isAttributeCategorySupported(JobSheets.class)) { + ncomps+=1; // for jobsheet } - String osname = System.getProperty("os.name"); - if (osname.equals("Linux") || osname.contains("OS X")) { + String osname = System.getProperty("os.name"); + if (osname.equals("Linux") || osname.contains("OS X")) { execCmd = new String[ncomps]; execCmd[n++] = "/usr/bin/lpr"; if ((pFlags & PRINTER) != 0) { execCmd[n++] = "-P" + printer; } - if ((pFlags & BANNER) != 0) { - execCmd[n++] = "-J" + banner; + if ((pFlags & JOBTITLE) != 0) { + execCmd[n++] = "-J" + jobTitle; } if ((pFlags & COPIES) != 0) { execCmd[n++] = "-#" + copies; } if ((pFlags & NOSHEET) != 0) { execCmd[n++] = "-h"; + } else if (getPrintService(). + isAttributeCategorySupported(JobSheets.class)) { + execCmd[n++] = "-o job-sheets=standard"; } if ((pFlags & OPTIONS) != 0) { execCmd[n++] = new String(options); @@ -1632,14 +1639,17 @@ public class PSPrinterJob extends RasterPrinterJob { if ((pFlags & PRINTER) != 0) { execCmd[n++] = "-d" + printer; } - if ((pFlags & BANNER) != 0) { - execCmd[n++] = "-t" + banner; + if ((pFlags & JOBTITLE) != 0) { + execCmd[n++] = "-t" + jobTitle; } if ((pFlags & COPIES) != 0) { execCmd[n++] = "-n" + copies; } if ((pFlags & NOSHEET) != 0) { execCmd[n++] = "-o nobanner"; + } else if (getPrintService(). + isAttributeCategorySupported(JobSheets.class)) { + execCmd[n++] = "-o job-sheets=standard"; } if ((pFlags & OPTIONS) != 0) { execCmd[n++] = "-o" + options; diff --git a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java index cd6793a8786..e2813a59544 100644 --- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java +++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java @@ -1271,6 +1271,12 @@ public abstract class RasterPrinterJob extends PrinterJob { JobSheets jobSheets = (JobSheets)attributes.get(JobSheets.class); if (jobSheets != null) { noJobSheet = jobSheets == JobSheets.NONE; + } else { + JobSheets js = (JobSheets)getPrintService(). + getDefaultAttributeValue(JobSheets.class); + if (js != null && js.equals(JobSheets.NONE)) { + noJobSheet = true; + } } JobName jobName = (JobName)attributes.get(JobName.class); diff --git a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java index 58565e11d9b..ba2f6370150 100644 --- a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java +++ b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java @@ -2759,10 +2759,10 @@ public class ServiceDialog extends JDialog implements ActionListener { if (js == null) { js = (JobSheets)psCurrent.getDefaultAttributeValue(jsCategory); if (js == null) { - js = JobSheets.NONE; + js = JobSheets.STANDARD; } } - cbJobSheets.setSelected(js != JobSheets.NONE); + cbJobSheets.setSelected(js != JobSheets.NONE && jsSupported); cbJobSheets.setEnabled(jsSupported); // setup JobPriority spinner diff --git a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java b/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java index a0891b4b4ff..7d79243d393 100644 --- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java +++ b/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java @@ -126,6 +126,11 @@ public class UnixPrintJob implements CancelablePrintJob { mDestination = ((IPPPrintService)service).getDest(); } mDestType = UnixPrintJob.DESTPRINTER; + JobSheets js = (JobSheets)(service. + getDefaultAttributeValue(JobSheets.class)); + if (js != null && js.equals(JobSheets.NONE)) { + mNoJobSheet = true; + } } public PrintService getPrintService() { @@ -848,10 +853,10 @@ public class UnixPrintJob implements CancelablePrintJob { private String[] printExecCmd(String printer, String options, boolean noJobSheet, - String banner, int copies, String spoolFile) { + String jobTitle, int copies, String spoolFile) { int PRINTER = 0x1; int OPTIONS = 0x2; - int BANNER = 0x4; + int JOBTITLE = 0x4; int COPIES = 0x8; int NOSHEET = 0x10; int pFlags = 0; @@ -868,8 +873,8 @@ public class UnixPrintJob implements CancelablePrintJob { pFlags |= OPTIONS; ncomps+=1; } - if (banner != null && !banner.equals("")) { - pFlags |= BANNER; + if (jobTitle != null && !jobTitle.equals("")) { + pFlags |= JOBTITLE; ncomps+=1; } if (copies > 1) { @@ -879,6 +884,9 @@ public class UnixPrintJob implements CancelablePrintJob { if (noJobSheet) { pFlags |= NOSHEET; ncomps+=1; + } else if (getPrintService(). + isAttributeCategorySupported(JobSheets.class)) { + ncomps+=1; } if (PrintServiceLookupProvider.osname.equals("SunOS")) { ncomps+=1; // lp uses 1 more arg than lpr (make a copy) @@ -888,15 +896,18 @@ public class UnixPrintJob implements CancelablePrintJob { if ((pFlags & PRINTER) != 0) { execCmd[n++] = "-d" + printer; } - if ((pFlags & BANNER) != 0) { + if ((pFlags & JOBTITLE) != 0) { String quoteChar = "\""; - execCmd[n++] = "-t " + quoteChar+banner+quoteChar; + execCmd[n++] = "-t " + quoteChar+jobTitle+quoteChar; } if ((pFlags & COPIES) != 0) { execCmd[n++] = "-n " + copies; } if ((pFlags & NOSHEET) != 0) { execCmd[n++] = "-o nobanner"; + } else if (getPrintService(). + isAttributeCategorySupported(JobSheets.class)) { + execCmd[n++] = "-o job-sheets=standard"; } if ((pFlags & OPTIONS) != 0) { execCmd[n++] = "-o " + options; @@ -907,14 +918,17 @@ public class UnixPrintJob implements CancelablePrintJob { if ((pFlags & PRINTER) != 0) { execCmd[n++] = "-P" + printer; } - if ((pFlags & BANNER) != 0) { - execCmd[n++] = "-J " + banner; + if ((pFlags & JOBTITLE) != 0) { + execCmd[n++] = "-J " + jobTitle; } if ((pFlags & COPIES) != 0) { execCmd[n++] = "-#" + copies; } if ((pFlags & NOSHEET) != 0) { execCmd[n++] = "-h"; + } else if (getPrintService(). + isAttributeCategorySupported(JobSheets.class)) { + execCmd[n++] = "-o job-sheets=standard"; } if ((pFlags & OPTIONS) != 0) { execCmd[n++] = "-o" + options; diff --git a/jdk/test/java/awt/print/PrinterJob/BannerTest.java b/jdk/test/java/awt/print/PrinterJob/BannerTest.java new file mode 100644 index 00000000000..85f3329a36c --- /dev/null +++ b/jdk/test/java/awt/print/PrinterJob/BannerTest.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 6575247 + * @summary Verifies if Banner page is printed + * @requires (os.family == "linux" | os.family == "solaris") + * @run main/manual BannerTest + */ + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import static java.awt.print.Printable.NO_SUCH_PAGE; +import static java.awt.print.Printable.PAGE_EXISTS; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + + +public class BannerTest implements Printable { + private static Thread mainThread; + private static boolean testPassed; + private static boolean testGeneratedInterrupt; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + doTest(BannerTest::printTest); + }); + mainThread = Thread.currentThread(); + try { + Thread.sleep(180000); + } catch (InterruptedException e) { + if (!testPassed && testGeneratedInterrupt) { + throw new RuntimeException("Banner page did not print"); + } + } + if (!testGeneratedInterrupt) { + throw new RuntimeException("user has not executed the test"); + } + } + + private static void printTest() { + PrinterJob job = PrinterJob.getPrinterJob(); + if (job.getPrintService() == null) { + System.out.println("No printers. Test cannot continue"); + return; + } + job.setPrintable(new BannerTest()); + if(job.printDialog()) { + try { + job.print(); + } catch (PrinterException e) { + e.printStackTrace(); + fail(); + } + } + } + + public static synchronized void pass() { + testPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + } + + public static synchronized void fail() { + testPassed = false; + testGeneratedInterrupt = true; + mainThread.interrupt(); + } + + private static void doTest(Runnable action) { + String description + = " A print dialog will be shown.\n" + + " Click on the \"Appearance\" tab.\n " + + " Select the \"Banner page\" checkbox.\n" + + " Click on Print, and check if Banner page is printed.\n " + + " If Banner page is printed, press PASS else press FAIL"; + + final JDialog dialog = new JDialog(); + dialog.setTitle("printBannerTest"); + JTextArea textArea = new JTextArea(description); + textArea.setEditable(false); + final JButton testButton = new JButton("Start Test"); + final JButton passButton = new JButton("PASS"); + passButton.setEnabled(false); + passButton.addActionListener((e) -> { + dialog.dispose(); + pass(); + }); + final JButton failButton = new JButton("FAIL"); + failButton.setEnabled(false); + failButton.addActionListener((e) -> { + dialog.dispose(); + fail(); + }); + testButton.addActionListener((e) -> { + testButton.setEnabled(false); + action.run(); + passButton.setEnabled(true); + failButton.setEnabled(true); + }); + JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(textArea, BorderLayout.CENTER); + JPanel buttonPanel = new JPanel(new FlowLayout()); + buttonPanel.add(testButton); + buttonPanel.add(passButton); + buttonPanel.add(failButton); + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + dialog.add(mainPanel); + dialog.pack(); + dialog.setVisible(true); + dialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.out.println("main dialog closing"); + testGeneratedInterrupt = false; + mainThread.interrupt(); + } + }); + } + + @Override + public int print(Graphics g, PageFormat pf, int pi) + throws PrinterException { + System.out.println("pi = " + pi); + g.drawString("Testing", 100, 100); + if (pi == 1) + return NO_SUCH_PAGE; + return PAGE_EXISTS; + } +}