1 /*
2  * Copyright (c) 2007, 2018, 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 static jdk.test.lib.Asserts.*;
26 
27 // DD: Dialog -> Dialog
28 
29 public class BlockingDDTest {
30 
31     private TestDialog parent, dialog;
32 
33     private static final int delay = 1000;
34     private final ExtendedRobot robot;
35 
36     private final Dialog.ModalityType modalityType;
37     private final boolean setModal;
38 
BlockingDDTest(Dialog.ModalityType modType, boolean modal)39     private BlockingDDTest(Dialog.ModalityType modType, boolean modal) throws Exception {
40 
41         modalityType = modType;
42         setModal = modal;
43         robot = new ExtendedRobot();
44         createGUI();
45     }
46 
BlockingDDTest(Dialog.ModalityType modType)47     public BlockingDDTest(Dialog.ModalityType modType) throws Exception {
48         this(modType, false);
49     }
50 
BlockingDDTest()51     public BlockingDDTest() throws Exception {
52         this(null, true);
53     }
54 
55 
showParent()56     private void showParent() {
57 
58         parent = new TestDialog((Frame) null);
59         parent.setTitle("Parent");
60         parent.setLocation(50, 50);
61         parent.setVisible(true);
62     }
63 
showChild()64     private void showChild() {
65 
66         dialog = new TestDialog(parent);
67         if (setModal) {
68             dialog.setModal(true);
69         } else if (modalityType != null) {
70             dialog.setModalityType(modalityType);
71         }
72 
73         dialog.setLocation(250, 50);
74         dialog.setVisible(true);
75     }
76 
77 
createGUI()78     private void createGUI() throws Exception {
79 
80         EventQueue.invokeAndWait(this::showParent);
81         robot.waitForIdle(delay);
82         EventQueue.invokeLater(this::showChild);
83         robot.waitForIdle(delay);
84     }
85 
doTest()86     public void doTest() throws Exception {
87 
88         try {
89             dialog.activated.waitForFlagTriggered();
90             assertTrue(dialog.activated.flag(), "Dialog did not trigger " +
91                 "Window Activated event when it became visible");
92 
93             dialog.closeGained.waitForFlagTriggered();
94             assertTrue(dialog.closeGained.flag(), "the 1st Dialog button " +
95                 "did not gain focus when it became visible");
96 
97             assertTrue(dialog.closeButton.hasFocus(), "the 1st Dialog button " +
98                 "gained the focus but lost it afterwards");
99 
100             dialog.checkUnblockedDialog(robot, "Modal Dialog shouldn't be blocked.");
101 
102             if ((modalityType == Dialog.ModalityType.APPLICATION_MODAL) ||
103                 (modalityType == Dialog.ModalityType.DOCUMENT_MODAL) ||
104                 (modalityType == Dialog.ModalityType.TOOLKIT_MODAL) ||
105                 dialog.isModal())
106             {
107                 parent.checkBlockedDialog(robot,
108                     "Dialog is the parent of a visible " + modalityType + " Dialog.");
109             } else {
110                 parent.checkUnblockedDialog(robot,
111                     "Dialog is the parent of a visible " + modalityType + " Dialog.");
112             }
113 
114             robot.waitForIdle(delay);
115         } finally {
116             EventQueue.invokeAndWait(this::closeAll);
117         }
118     }
119 
closeAll()120     private void closeAll() {
121         if (parent != null) { parent.dispose(); }
122         if (dialog != null) { dialog.dispose(); }
123     }
124 }
125