1 /*
   2  * Copyright (c) 2007, 2016, 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  */
  23 
  24 /*
  25  * @test
  26  * @bug 6365992 6379599 8137137
  27  * @summary REG: Showing and disposing a native print dialog makes the main
  28  *  frame inactive, Win32
  29  * @run main/manual RestoreActiveWindowTest
  30  */
  31 import java.awt.Frame;
  32 import java.awt.Button;
  33 import java.awt.GridBagLayout;
  34 import java.awt.Panel;
  35 import java.awt.TextArea;
  36 import java.awt.GridLayout;
  37 import java.awt.GridBagConstraints;
  38 import java.awt.Color;
  39 import java.awt.event.ActionEvent;
  40 import java.awt.event.ActionListener;
  41 import java.awt.event.WindowAdapter;
  42 import java.awt.event.WindowEvent;
  43 import java.awt.print.PrinterJob;
  44 import java.awt.print.PageFormat;
  45 
  46 public class RestoreActiveWindowTest implements ActionListener {
  47 
  48     private static Frame mainFrame;
  49     private static Button printDialogButton;
  50     private static Button pageDialogButton;
  51     private static Frame instructionFrame;
  52     private static GridBagLayout layout;
  53     private static Panel mainControlPanel;
  54     private static Panel resultButtonPanel;
  55     private static TextArea instructionTextArea;
  56     private static Button passButton;
  57     private static Button failButton;
  58     private static Thread mainThread = null;
  59     private static boolean testPassed = false;
  60     private static boolean isInterrupted = false;
  61     private static final int testTimeOut = 300000;
  62     private static String testFailMessage;
  63     
  64     public void createAndShowGUI() {
  65         mainFrame = new Frame("Test");
  66         mainFrame.setSize(200, 200);
  67         mainFrame.setLocationRelativeTo(null);
  68         mainFrame.setLayout(new GridLayout(2, 1));
  69 
  70         printDialogButton = new Button("show a native print dialog");
  71         pageDialogButton = new Button("show a native page dialog");
  72         printDialogButton.addActionListener(new ActionListener() {
  73             @Override
  74             public void actionPerformed(ActionEvent ae) {
  75                 PrinterJob.getPrinterJob().printDialog();
  76                 setButtonEnable(true);
  77                 testFailMessage = "Print dialog test failed.";
  78             }
  79         });
  80         pageDialogButton.addActionListener(new ActionListener() {
  81             @Override
  82             public void actionPerformed(ActionEvent ae) {
  83                 PrinterJob.getPrinterJob().pageDialog(new PageFormat());
  84                 setButtonEnable(true);
  85                 testFailMessage = "Page dialog test failed.";
  86             }
  87         });
  88 
  89         mainFrame.add(printDialogButton);
  90         mainFrame.add(pageDialogButton);
  91         mainFrame.setVisible(true);
  92         
  93        mainFrame.addWindowListener(new WindowAdapter() {
  94             public void windowClosing(WindowEvent we) {
  95                 cleanUp();
  96                 throw new RuntimeException("User has closed the test window "
  97                         + "without clicking Pass or Fail.");
  98             }
  99         });
 100     }
 101 
 102     private void createInstructionUI() {
 103         instructionFrame = new Frame("Native Print Dialog and Page Dialog");
 104         layout = new GridBagLayout();
 105         mainControlPanel = new Panel(layout);
 106         resultButtonPanel = new Panel(layout);
 107 
 108         GridBagConstraints gbc = new GridBagConstraints();
 109         String instructions
 110                 = "\nINSTRUCTIONS:\n"
 111                 + "\n   1. Click on the 'show a native print dialog' button. A "
 112                 + "native print dialog will come up."
 113                 + "\n   2. Click on the 'Cancel' button on Mac OS X or "
 114                 + "'close'(X) on other paltforms. Dialog will be closed."
 115                 + "\n   3. After the dialog is closed another window should "
 116                 + "become the active window."
 117                 + "\n   4. If there no any active window then the test has "
 118                 + "failed. Click on 'Fail' Button."
 119                 + "\n   5. Click on the 'show a native page dialog' button. A "
 120                 + "native page dialog will come up."
 121                 + "\n   6. Click on the 'Cancel' button on Mac OS X or "
 122                 + "'close'(X) on other paltforms. Dialog will be closed."
 123                 + "\n   7. After the dialog is closed another window should "
 124                 + "become the active window."
 125                 + "\n   8. If there no any active window then the test has "
 126                 + "failed. Click on 'Fail' Button."
 127                 + "\n   9. Test Passed. Click on 'Pass' Button.";
 128 
 129         instructionTextArea = new TextArea(13, 80);
 130         instructionTextArea.setText(instructions);
 131         instructionTextArea.setEnabled(false);
 132         instructionTextArea.setBackground(Color.white);
 133 
 134         gbc.gridx = 0;
 135         gbc.gridy = 0;
 136         gbc.weightx = 0.5;
 137         gbc.fill = GridBagConstraints.HORIZONTAL;
 138         mainControlPanel.add(instructionTextArea, gbc);
 139 
 140         passButton = new Button("Pass");
 141         passButton.setName("Pass");
 142         passButton.addActionListener((ActionListener) this);
 143 
 144         failButton = new Button("Fail");
 145         failButton.setName("Fail");
 146         failButton.addActionListener((ActionListener) this);
 147 
 148         setButtonEnable(false);
 149                 
 150         gbc.gridx = 0;
 151         gbc.gridy = 0;
 152         resultButtonPanel.add(passButton, gbc);
 153         gbc.gridx = 1;
 154         gbc.gridy = 0;
 155         resultButtonPanel.add(failButton, gbc);
 156         gbc.gridx = 0;
 157         gbc.gridy = 1;
 158         mainControlPanel.add(resultButtonPanel, gbc);
 159 
 160         instructionFrame.add(mainControlPanel);
 161         instructionFrame.pack();
 162         instructionFrame.setVisible(true);
 163     }
 164 
 165     @Override
 166     public void actionPerformed(ActionEvent ae) {
 167         if (ae.getSource() instanceof Button) {
 168             Button btn = (Button) ae.getSource();
 169             switch (btn.getName()) {
 170                 case "Pass":
 171                     testPassed = true;
 172                     isInterrupted = true;
 173                     mainThread.interrupt();
 174                     break;
 175                 case "Fail":
 176                     testPassed = false;
 177                     isInterrupted = true;
 178                     mainThread.interrupt();
 179                     break;
 180             }
 181         }
 182     }
 183     
 184     private static void setButtonEnable(boolean status) {
 185         passButton.setEnabled(status);
 186         failButton.setEnabled(status);
 187     }
 188 
 189     private static void cleanUp() {
 190         mainFrame.dispose();
 191         instructionFrame.dispose();
 192     }
 193 
 194     public static void main(String args[]) {
 195         RestoreActiveWindowTest printDialogs = new RestoreActiveWindowTest();
 196         printDialogs.createInstructionUI();
 197         printDialogs.createAndShowGUI();
 198 
 199         mainThread = Thread.currentThread();
 200         try {
 201             mainThread.sleep(testTimeOut);
 202         } catch (InterruptedException ex) {
 203             if (!testPassed) {
 204                 throw new RuntimeException(testFailMessage);
 205             }
 206         } finally {
 207             cleanUp();
 208         }
 209 
 210         if (!isInterrupted) {
 211             throw new RuntimeException("Test Timed out after "
 212                     + testTimeOut / 1000 + " seconds");
 213         }
 214     }
 215 }