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 static jdk.testlibrary.Asserts.*;
  25 
  26 import java.awt.*;
  27 import java.util.List;
  28 import java.util.ArrayList;
  29 
  30 public class BlockingWindowsTest {
  31 
  32     private TestDialog dialog, childDialog, secondDialog, dummyDialog, parentDialog;
  33     private TestFrame frame, secondFrame;
  34     private TestWindow window, childWindow;
  35 
  36     private static final int delay = 500;
  37     private final ExtendedRobot robot;
  38 
  39     private List<Window> allWindows;
  40 
  41     private Dialog hiddenDialog;
  42     private Frame  hiddenFrame;
  43 
  44     private Dialog.ModalityType modalityType;
  45 
  46     public enum DialogOwner {HIDDEN_DIALOG, NULL_DIALOG, HIDDEN_FRAME, NULL_FRAME, DIALOG, FRAME};
  47 
  48     private BlockingWindowsTest(Dialog.ModalityType modType,
  49                                 boolean             setModal,
  50                                 DialogOwner         owner) throws Exception {
  51 
  52         modalityType = modType;
  53         robot = new ExtendedRobot();
  54         EventQueue.invokeLater(() -> {
  55             createGUI(setModal, owner);
  56         });
  57     }
  58 
  59     public BlockingWindowsTest(
  60             Dialog.ModalityType modalityType, DialogOwner owner) throws Exception {
  61         this(modalityType, false, owner);
  62     }
  63 
  64     public BlockingWindowsTest(DialogOwner owner) throws Exception {
  65         this(null, true, owner);
  66     }
  67 
  68     private void createGUI(boolean     setModal,
  69                            DialogOwner owner) {
  70 
  71         allWindows = new ArrayList<>();
  72 
  73         if (owner != DialogOwner.DIALOG) {
  74             frame = new CustomFrame();
  75             frame.setLocation(50, 50);
  76             frame.setVisible(true);
  77             allWindows.add(frame);
  78         }
  79 
  80         switch (owner) {
  81             case DIALOG:
  82                 parentDialog = new ParentDialog((Dialog) null);
  83                 parentDialog.setLocation(50, 50);
  84                 parentDialog.setVisible(true);
  85                 allWindows.add(parentDialog);
  86                 dialog = new CustomDialog(parentDialog);
  87                 break;
  88             case FRAME:
  89                 dialog = new CustomDialog(frame);
  90                 break;
  91             case HIDDEN_DIALOG:
  92                 hiddenDialog = new Dialog((Frame) null);
  93                 dialog = new CustomDialog(hiddenDialog);
  94                 allWindows.add(hiddenDialog);
  95                 break;
  96             case NULL_DIALOG:
  97                 dialog = new CustomDialog((Dialog) null);
  98                 break;
  99             case HIDDEN_FRAME:
 100                 hiddenFrame = new Frame();
 101                 dialog = new CustomDialog(hiddenFrame);
 102                 allWindows.add(hiddenFrame);
 103                 break;
 104             case NULL_FRAME:
 105                 dialog = new CustomDialog((Frame) null);
 106                 break;
 107         }
 108 
 109         assertFalse(dialog == null, "error: null dialog");
 110 
 111         if (setModal) {
 112             dialog.setModal(true);
 113         } else if (modalityType != null) {
 114             dialog.setModalityType(modalityType);
 115         }
 116 
 117         dialog.setLocation(250, 50);
 118         allWindows.add(dialog);
 119 
 120         if (owner == DialogOwner.DIALOG) {
 121             window = new TestWindow(parentDialog);
 122         } else {
 123             window = new TestWindow(frame);
 124         }
 125 
 126         window.setLocation(50, 250);
 127         allWindows.add(window);
 128 
 129         if (owner == DialogOwner.DIALOG) {
 130             dummyDialog = new TestDialog(parentDialog);
 131         } else {
 132             dummyDialog = new TestDialog(frame);
 133         }
 134         dummyDialog.setLocation(450, 450);
 135         allWindows.add(dummyDialog);
 136 
 137         childWindow = new CustomWindow(dialog);
 138         childWindow.setLocation(450, 50);
 139         allWindows.add(childWindow);
 140 
 141         childDialog = new TestDialog(dialog);
 142         childDialog.setLocation(450, 250);
 143         allWindows.add(childDialog);
 144 
 145         if (owner == DialogOwner.DIALOG) {
 146             secondDialog = new CustomDialog(parentDialog);
 147         } else {
 148             secondDialog = new CustomDialog(frame);
 149         }
 150         if (setModal) {
 151             secondDialog.setModal(true);
 152         } else if (modalityType != null) {
 153             secondDialog.setModalityType(modalityType);
 154         }
 155 
 156         secondDialog.setLocation(50, 450);
 157         allWindows.add(secondDialog);
 158 
 159         secondFrame = new TestFrame();
 160         secondFrame.setLocation(250, 450);
 161         allWindows.add(secondFrame);
 162     }
 163 
 164     public void doTest() throws Exception {
 165 
 166         try {
 167 
 168             robot.waitForIdle(delay);
 169 
 170             if (parentDialog == null) { frame.clickOpenButton(robot); }
 171             else { parentDialog.clickOpenButton(robot); }
 172             robot.waitForIdle(delay);
 173 
 174             dialog.activated.waitForFlagTriggered();
 175             assertTrue(dialog.activated.flag(), "Dialog did not trigger " +
 176                 "Window Activated event when it became visible");
 177 
 178             dialog.closeGained.waitForFlagTriggered();
 179             assertTrue(dialog.closeGained.flag(), "The first button did not gain focus " +
 180                 "when the dialog became visible");
 181 
 182             assertTrue(dialog.closeButton.hasFocus(), "The first dialog button " +
 183                 "gained focus, but lost it afterwards");
 184 
 185             if (parentDialog == null) {
 186                 frame.checkBlockedFrame(robot, modalityType + " Dialog is visible.");
 187             } else {
 188                 parentDialog.checkBlockedDialog(robot, modalityType + " Dialog is visible.");
 189             }
 190 
 191             dialog.checkUnblockedDialog(robot, "A Frame is visible.");
 192 
 193             dialog.openClicked.reset();
 194             dialog.clickOpenButton(robot);
 195             robot.waitForIdle(delay);
 196 
 197             assertFalse(window.focusGained.flag(), "Window gained focus on becoming " +
 198                 "visible when Frame and Dialog are visible");
 199 
 200             window.checkBlockedWindow(robot,
 201                 "The parent of the Window is blocked by " + modalityType + " Dialog.");
 202 
 203             dummyDialog.checkBlockedDialog(robot,
 204                 "The parent of the Dialog is blocked by " + modalityType + " Dialog.");
 205 
 206             childDialog.checkUnblockedDialog(robot,
 207                 "The parent of the Dialog is " + modalityType + " Dialog");
 208 
 209             childWindow.checkUnblockedWindow(robot,
 210                 "The parent of the Window is " + modalityType + " Dialog");
 211 
 212             childWindow.openClicked.reset();
 213             childWindow.clickOpenButton(robot);
 214             robot.waitForIdle(delay);
 215 
 216             secondDialog.checkUnblockedDialog(robot,
 217                 "The dialog is " + modalityType + ", the parent of the dialog " +
 218                 "is blocked by another " + modalityType + " dialog.");
 219 
 220             secondFrame.checkBlockedFrame(robot,
 221                 modalityType + " dialog is displayed immediately after showing " +
 222                 "this frame. Another modal dialog is alreay visible");
 223 
 224             secondDialog.clickCloseButton(robot);
 225             robot.waitForIdle(delay);
 226 
 227             childWindow.checkUnblockedWindow(robot, "A blocking dialog was closed.");
 228             robot.waitForIdle(delay);
 229 
 230         } finally {
 231             EventQueue.invokeAndWait(this::closeAll);
 232         }
 233     }
 234 
 235     private void closeAll() {
 236         for (Window w: allWindows) {
 237             if (w != null) { w.dispose(); }
 238         }
 239     }
 240 
 241 
 242     class CustomFrame extends TestFrame {
 243 
 244         @Override
 245         public void doOpenAction() {
 246             if (dialog != null) { dialog.setVisible(true); }
 247         }
 248     }
 249 
 250     class CustomDialog extends TestDialog {
 251 
 252         public CustomDialog(Dialog dialog) {
 253             super(dialog);
 254         }
 255 
 256         public CustomDialog(Frame frame) {
 257             super(frame);
 258         }
 259 
 260         @Override
 261         public void doOpenAction() {
 262             if (window != null) { window.setVisible(true); }
 263             if (dummyDialog != null) { dummyDialog.setVisible(true); }
 264             if (childWindow != null) { childWindow.setVisible(true); }
 265             if (childDialog != null) { childDialog.setVisible(true); }
 266         }
 267 
 268         @Override
 269         public void doCloseAction() {
 270             this.dispose();
 271         }
 272     }
 273 
 274     class CustomWindow extends TestWindow {
 275 
 276         public CustomWindow(Window parent) {
 277             super(parent);
 278         }
 279 
 280         @Override
 281         public void doOpenAction() {
 282             if (secondFrame  != null) {  secondFrame.setVisible(true); }
 283             if (secondDialog != null) { secondDialog.setVisible(true); }
 284         }
 285     }
 286 
 287     class ParentDialog extends TestDialog {
 288 
 289         public ParentDialog(Dialog d) { super(d); }
 290 
 291         @Override
 292         public void doOpenAction() {
 293             if (dialog != null) {
 294                 dialog.setVisible(true);
 295             }
 296         }
 297     }
 298 }
 299