1/* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23import java.awt.Button; 24import java.awt.Component; 25import java.awt.Frame; 26import java.awt.GraphicsDevice; 27import java.awt.GraphicsEnvironment; 28import java.awt.KeyboardFocusManager; 29import java.awt.Window; 30import java.awt.event.ActionEvent; 31import java.awt.event.ActionListener; 32import java.awt.event.WindowAdapter; 33import java.awt.event.WindowEvent; 34import javax.swing.JOptionPane; 35import javax.swing.SwingUtilities; 36 37/** 38 * @test 39 * @bug 8138749 40 * @summary PrinterJob.printDialog() does not support multi-mon, 41 * always displayed on primary 42 * @run main/manual MultiMonPrintDlgTest 43 */ 44public class MultiMonPrintDlgTest implements ActionListener { 45 46 private static boolean testPassed; 47 private static Thread mainThread; 48 private static boolean testGeneratedInterrupt; 49 private static int sleepTime = 30000; 50 private static String message = "User has not executed the test"; 51 52 static Frame primaryFrame = null; 53 static Frame secFrame = null; 54 static GraphicsDevice gd[] = GraphicsEnvironment.getLocalGraphicsEnvironment(). 55 getScreenDevices(); 56 57 private static void init() throws Exception { 58 59 String[] instructions = 60 { 61 " This test should be running on a dual-monitor setup.", 62 "A frame will be created on each of the 2 monitor. ", 63 "Click the Print button on the frame displayed in the non-default monitor.", 64 "Please verify that page dialog followed by print dialog ", 65 " is displayed in the same screen", 66 "where the frame is located ie, in the non-default monitor.", 67 }; 68 69 SwingUtilities.invokeAndWait(() -> { 70 JOptionPane.showMessageDialog( 71 (Component) null, 72 instructions, 73 "information", JOptionPane.INFORMATION_MESSAGE); 74 }); 75 } 76 77 private void executeTest() { 78 79 GraphicsDevice defDev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 80 int x = 0; 81 Frame f = null; 82 for (x = 0; x < gd.length; x ++) { 83 if (gd[x] != defDev) { 84 secFrame = new Frame("Screen " + x + " - secondary", gd[x].getDefaultConfiguration()); 85 f = secFrame; 86 } else { 87 primaryFrame = new Frame("Screen " + x + " - primary", gd[x].getDefaultConfiguration()); 88 f = primaryFrame; 89 } 90 Button b = new Button("Print"); 91 b.addActionListener(this); 92 f.add("South", b); 93 f.addWindowListener (new WindowAdapter() { 94 public void windowClosing(WindowEvent we) { 95 ((Window) we.getSource()).dispose(); 96 } 97 }); 98 f.setSize(200, 200); 99 f.setVisible(true); 100 } 101 } 102 103 public void actionPerformed (ActionEvent ae) { 104 javax.print.attribute.PrintRequestAttributeSet prSet = 105 new javax.print.attribute.HashPrintRequestAttributeSet(); 106 java.awt.print.PrinterJob.getPrinterJob().pageDialog(prSet); 107 Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); 108 int dialogButton = JOptionPane.showConfirmDialog (w, 109 "Did the pageDialog shown in non-default monitor?", 110 null, JOptionPane.YES_NO_OPTION); 111 if(dialogButton == JOptionPane.NO_OPTION) { 112 fail("PageDialog is shown in wrong monitor"); 113 } else { 114 java.awt.print.PrinterJob.getPrinterJob().printDialog(prSet); 115 dialogButton = JOptionPane.showConfirmDialog (w, 116 "Did the printDialog shown in non-default monitor?", 117 null, JOptionPane.YES_NO_OPTION); 118 if(dialogButton == JOptionPane.NO_OPTION) { 119 fail("PrintDialog is shown in wrong monitor"); 120 } else { 121 pass(); 122 } 123 } 124 } 125 126 private static void dispose() { 127 primaryFrame.dispose(); 128 secFrame.dispose(); 129 } 130 131 public static synchronized void pass() { 132 testPassed = true; 133 testGeneratedInterrupt = true; 134 mainThread.interrupt(); 135 } 136 137 public static synchronized void fail(String msg) { 138 testPassed = false; 139 message = msg; 140 testGeneratedInterrupt = true; 141 mainThread.interrupt(); 142 } 143 144 public static void main (String args[]) throws Exception { 145 if (gd.length <= 1) { 146 System.out.println("This test should be run only on dual-monitor systems. Aborted!!"); 147 return; 148 } 149 init(); 150 MultiMonPrintDlgTest test = new MultiMonPrintDlgTest(); 151 test.executeTest(); 152 mainThread = Thread.currentThread(); 153 154 try { 155 mainThread.sleep(sleepTime); 156 } catch (InterruptedException ex) { 157 dispose(); 158 if (!testPassed && testGeneratedInterrupt) { 159 throw new RuntimeException(message); 160 } 161 } 162 if (!testGeneratedInterrupt) { 163 dispose(); 164 throw new RuntimeException(message); 165 } 166 } 167} 168