1 /*
   2  * Copyright (c) 2007, 2014, 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 import java.awt.*;
  25 import java.awt.event.*;
  26 import java.awt.print.*;
  27 
  28 import static jdk.testlibrary.Asserts.*;
  29 
  30 
  31 public class ExcludeDialogTest implements AWTEventListener {
  32 
  33     class ParentDialog extends TestDialog {
  34 
  35         public ParentDialog() {
  36             super((Frame) null);
  37         }
  38 
  39         @Override
  40         public void doOpenAction() {
  41             if (window != null) {
  42                 window.setVisible(true);
  43             }
  44         }
  45     }
  46 
  47     class CustomDialog extends TestDialog {
  48 
  49         public CustomDialog(Dialog dialog) {
  50             super(dialog);
  51         }
  52 
  53         @Override
  54         public void doOpenAction() {
  55 
  56             switch (childDialogType) {
  57                 case PRINT_SETUP:
  58                     PrinterJob.getPrinterJob().printDialog();
  59                     break;
  60                 case PAGE_SETUP:
  61                     PrinterJob.getPrinterJob().pageDialog(new PageFormat());
  62                     break;
  63                 case FILE_DIALOG:
  64                     fileDialog = new FileDialog((Dialog) null);
  65                     fileDialog.setLocation(20, 200);
  66                     fileDialog.setVisible(true);
  67                     break;
  68             }
  69         }
  70     }
  71 
  72     class CustomWindow extends TestWindow {
  73 
  74         public CustomWindow(Dialog parent) {
  75             super(parent);
  76         }
  77 
  78         @Override
  79         public void doOpenAction() {
  80             if (dialog != null) {
  81                 dialog.setVisible(true);
  82             }
  83         }
  84     }
  85 
  86     private TestWindow window;
  87     private TestDialog dialog;
  88     private ParentDialog parent;
  89     private FileDialog fileDialog;
  90 
  91     private static final int delay = 1000;
  92 
  93     private final ExtendedRobot robot;
  94 
  95     private boolean windowAppeared = false;
  96     private final Object windowLock;
  97 
  98     private final Dialog.ModalExclusionType exclusionType;
  99 
 100     public enum DialogToShow {PAGE_SETUP, PRINT_SETUP, FILE_DIALOG};
 101     private DialogToShow childDialogType;
 102     private String type;
 103 
 104     @Override
 105     public void eventDispatched(AWTEvent event) {
 106         if (event.getID() == WindowEvent.WINDOW_OPENED) {
 107             windowAppeared = true;
 108             synchronized (windowLock) {
 109                 windowLock.notifyAll();
 110             }
 111         }
 112     }
 113 
 114     ExcludeDialogTest(Dialog.ModalExclusionType exclType,
 115                       DialogToShow dialogType) throws Exception {
 116         exclusionType = exclType;
 117         childDialogType = dialogType;
 118 
 119         type = "File";
 120         if (dialogType == DialogToShow.PAGE_SETUP) {
 121             type = "Page setup";
 122         } else if (dialogType == DialogToShow.PRINT_SETUP) {
 123             type = "Print setup";
 124         }
 125 
 126         robot = new ExtendedRobot();
 127         windowLock = new Object();
 128         EventQueue.invokeAndWait( this::createGUI );
 129     }
 130 
 131     private void createGUI() {
 132         parent = new ParentDialog();
 133         parent.setLocation(20, 20);
 134         parent.setModalExclusionType(exclusionType);
 135         dialog = new CustomDialog(parent);
 136         dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
 137         dialog.setLocation(220, 20);
 138         window = new CustomWindow(parent);
 139         window.setLocation(420, 20);
 140         Toolkit.getDefaultToolkit().addAWTEventListener(
 141             ExcludeDialogTest.this, AWTEvent.WINDOW_EVENT_MASK);
 142         parent.setVisible(true);
 143     }
 144 
 145     private void closeAll() {
 146         if (dialog != null) { dialog.dispose(); }
 147         if (parent != null) { parent.dispose(); }
 148         if (window != null) { window.dispose(); }
 149         if (fileDialog != null) {
 150             fileDialog.dispose();
 151         } else {
 152             robot.type(KeyEvent.VK_ESCAPE);
 153         }
 154     }
 155 
 156     public void doTest() throws Exception {
 157 
 158         robot.waitForIdle(delay);
 159 
 160         parent.clickOpenButton(robot);
 161         robot.waitForIdle(delay);
 162 
 163         window.clickOpenButton(robot);
 164         robot.waitForIdle(delay);
 165 
 166         dialog.clickOpenButton(robot);
 167         robot.waitForIdle(delay);
 168 
 169         if (! windowAppeared) {
 170             synchronized (windowLock) {
 171                 try {
 172                     windowLock.wait(10 * delay);
 173                 } catch (InterruptedException e) {}
 174             }
 175         }
 176 
 177         assertTrue(windowAppeared, type + " dialog didn't appear");
 178 
 179         parent.toFront();
 180         robot.waitForIdle(delay);
 181 
 182         String excl = "";
 183         if (exclusionType == Dialog.ModalExclusionType.APPLICATION_EXCLUDE) {
 184             excl = "Application";
 185         } else if (exclusionType == Dialog.ModalExclusionType.TOOLKIT_EXCLUDE) {
 186             excl = "Toolkit";
 187         }
 188 
 189         parent.checkUnblockedDialog(robot, excl + " modal " + type + 
 190                 " dialog should not block this modal excluded Dialog");
 191         dialog.checkUnblockedDialog(robot, excl + " modal " + type +
 192                 " dialog should not block this modal excluded app. modal Dialog");
 193         window.checkUnblockedWindow(robot, excl + " modal " + type + 
 194                 " dialog should not block this modal excluded Window");
 195 
 196         robot.waitForIdle();
 197         closeAll();
 198     }
 199 }