--- /dev/null 2018-05-25 11:37:39.280540387 -0700 +++ new/test/jdk/java/awt/print/Dialog/DialogOwnerTest.java 2018-06-05 12:26:21.928041688 -0700 @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2018, 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 8203796 + @run main/manual DialogOwnerTest + @summary Test DialogOwner API +*/ + +import java.util.ArrayList; +import java.util.List; +import java.awt.GraphicsConfiguration; +import java.awt.GridLayout; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.print.PrinterJob; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.ServiceUI; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.standard.DialogOwner; +import javax.print.attribute.standard.DialogTypeSelection; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +public class DialogOwnerTest extends JPanel { + + static final int NONE = 0x0; + static final int PRINT = 0x1; + static final int PAGE = 0x2; + static final int SWING2D = 0x4; + static final int NATIVE2D = 0x8; + static final int SERVICEUI = 0x10; + + static final int ONTOP = 0x20; + static final int OWNED = 0x40; + + static PrintService[] services = + PrintServiceLookup.lookupPrintServices(null, null); + + public static void main(String[] args) { + if (services.length == 0) { + System.out.println("No printers, exiting"); + return; + } else { + service = PrinterJob.getPrinterJob().getPrintService(); + } + SwingUtilities.invokeLater(() -> { + createUI(); + }); + while (!testFinished) { + try { + Thread.sleep(1000); + } catch (InterruptedException e){ + } + } + if (!testPassed) { + throw new RuntimeException("TEST FAILED."); + } + } + + + static final String otherText = + "This window is used to test on top behaviour\n" + + "For tests that are 'Owned' or 'On Top' the dialog\n" + + "must always stay above this window. Verify this\n " + + "by moving the dialog so that it partially obscures\n" + + "this window and then trying to raise this window."; + + static final String instructions = + " Instructions\n" + + "This tests that a print dialog stays on top of either another\n" + + "window, or on top of all windows.\n" + + "For Owned tests the window titled 'Owner Window' should always \n" + + "stay behind the print dialog.\n" + + "For On Top tests all windows should stay behind the owner window.\n" + + "This test tracks if you have checked all the scenarios and will\n" + + "not allow the test to pass unless you have visited them all.\n"; + + static PrintService service; + + public DialogOwnerTest() { + super(); + //setLayout(new GridLayout(24, 1)); + } + + static boolean isNative(int flags) { + return (flags & NATIVE2D) != 0; + } + + static boolean isCommon(int flags) { + return (flags & SWING2D) != 0; + } + + static boolean is2D(int flags) { + return (flags & SWING2D|NATIVE2D) != 0; + } + + static boolean isPage(int flags) { + return (flags & PAGE ) != 0; + } + + static JFrame frame; + static JFrame other; + static JButton pass; + static ArrayList panelList = new ArrayList(); + static volatile boolean testPassed, testFinished; + + int testCount = 0; + List testList = new ArrayList(); + + static void createUI() { + other = new JFrame("Owner Window"); + JTextArea otherTextArea = new JTextArea(otherText, 10, 40); + other.add(otherTextArea); + other.pack(); + other.setVisible(true); + other.setLocation(800, 100); + + frame = new JFrame("Test Dialog Owner"); + frame.pack(); + JTextArea instructionsPanel = new JTextArea(instructions, 10, 50); + instructionsPanel.setEditable(false); + frame.add("North", instructionsPanel); + DialogOwnerTest test = new DialogOwnerTest(); + + test.addTest("Owned Swing Print", OWNED, frame, PRINT|SWING2D); + test.addTest("On Top Swing Print", ONTOP, null, PRINT|SWING2D); + + test.addTest("Owned Swing Page", OWNED, frame, PAGE|SWING2D); + test.addTest("On Top Swing Page", ONTOP, null, PAGE|SWING2D); + + test.addTest("Owned javax.print", OWNED, frame, PRINT|SERVICEUI); + test.addTest("On Top javax.print", OWNED, null, PRINT|SERVICEUI); + + test.addTest("Owned Native Print", OWNED, frame, PRINT|NATIVE2D); + test.addTest("On Top Native Print", OWNED, null, PRINT|NATIVE2D); + + test.addTest("Owned Native Page", OWNED, frame, PAGE|NATIVE2D); + test.addTest("On Top Native Page", OWNED, null, PAGE|NATIVE2D); + + test.setLayout(new GridLayout(panelList.size()+2, 1)); + + pass = new JButton("Pass"); + pass.setEnabled(false); + pass.addActionListener((ActionEvent e) -> { + if (test.testList.size() > 0) { + return; + } + frame.dispose(); + other.dispose(); + System.out.println("User says test passed."); + testPassed = true; + testFinished = true; + }); + + JButton fail = new JButton("Fail"); + fail.addActionListener((ActionEvent e) -> { + frame.dispose(); + other.dispose(); + System.out.println("User says test failed."); + testPassed = false; + testFinished = true; + }); + + JPanel p = new JPanel(); + p.add(pass); + p.add(fail); + test.add(p); + + + for (JPanel panel : panelList) { + test.add(panel); + } + + frame.add("Center", test); + frame.pack(); + frame.setLocation(0,0); + frame.setVisible(true); + } + + boolean isSupported(PrintRequestAttributeSet aset, + int ownerFlags, Window owner, int dlgFlags) { + + boolean supported = true; + DialogOwner ownerAttr = null; + if (ownerFlags != NONE) { + if (ownerFlags == ONTOP) { + ownerAttr = new DialogOwner(); + } else if (ownerFlags == OWNED) { + ownerAttr = new DialogOwner(owner); + } + aset.add(ownerAttr); + } + if (is2D(dlgFlags)) { + DialogTypeSelection dst = null; + if (isNative(dlgFlags)) { + dst = DialogTypeSelection.NATIVE; + } else if (isCommon(dlgFlags)) { + dst = DialogTypeSelection.COMMON; + } + if (dst != null && + !service.isAttributeValueSupported(dst, null, aset)) { + //System.out.println("This DialogType not supported"); + supported = false; + } + if (dst != null) { + aset.add(dst); + } + if (ownerAttr != null && + !service.isAttributeValueSupported(ownerAttr, null, aset)) { + //System.out.println("This DialogOwner not supported"); + supported = false; + } + } + return supported; + } + + void addTest(String title, int ownerFlags, Window owner, int dlgFlags) { + + PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + if (!isSupported(aset, ownerFlags, owner, dlgFlags)) { + return; + } + + // if we are here then this is supportable and worth testing + // and the attribute set is configured. + + String label = title + " Dialog"; + JButton button = new JButton(label); + JCheckBox tested = new JCheckBox("Tested"); + tested.setEnabled(false); + JPanel panel = new JPanel(); + panel.add(tested); + panel.add(button); + panelList.add(panel); + //add(panel); + testList.add(title); + if (++testCount != testList.size()) { + throw new RuntimeException("Test titles must be unique"); + } + + button.addActionListener((ActionEvent e) -> { + tested.setSelected(true); + testList.remove(title); + if (testList.isEmpty()) { + pass.setEnabled(true); + } + + if (is2D(dlgFlags)) { + PrinterJob job = PrinterJob.getPrinterJob(); + if (isPage(dlgFlags)) { + job.pageDialog(aset); + } else { + job.printDialog(aset); + } + } else { + GraphicsConfiguration gc = null; + int x = 0, y = 0; + ServiceUI.printDialog(gc, x, y, services, services[0], null,aset); + } + }); + } +}