jdk-24/test/jdk/java/awt/Modal/NonModalDialogReceiveEventsAfterModalTest.java
Abhishek Kumar 41ba05e450 8306850: Open source AWT Model related tests
Reviewed-by: serb, azvegint
2023-04-27 15:59:42 +00:00

189 lines
6.3 KiB
Java

/*
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
@test
@bug 4256692
@summary Showing a non modal dialog after a modal dialog allows both to receive events
@key headful
@run main NonModalDialogReceiveEventsAfterModalTest
*/
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
public class NonModalDialogReceiveEventsAfterModalTest implements Runnable
{
Frame modalParentFrame, nonModalParentFrame;
Dialog modalDialog, nonModalDialog;
volatile public static boolean passed = true;
volatile public static String errorMessage = null;
Robot r = null;
volatile Point loc = null;
public static void main(String args[]) throws Exception {
NonModalDialogReceiveEventsAfterModalTest test = new NonModalDialogReceiveEventsAfterModalTest();
test.start();
}
public void start() throws Exception {
// create an independent top level frame to be the
// parent of the modal dialog and show it
try {
r = new Robot();
EventQueue.invokeAndWait(() -> {
modalParentFrame = new Frame("Parent of modal dialog");
modalParentFrame.setBounds(100, 100, 200, 200);
modalParentFrame.setLayout(new BorderLayout());
modalParentFrame.setVisible(true);
// create an independent top level frame to be the
// parent of the non-modal dialog and show it
nonModalParentFrame = new Frame("Parent of non-modal dialog");
nonModalParentFrame.setBounds(400, 100, 200, 200);
nonModalParentFrame.setLayout(new BorderLayout());
nonModalParentFrame.setVisible(true);
// create the non-modal dialog and kick off a
// thread to show it in 1 second
nonModalDialog = new Dialog(nonModalParentFrame, "Non modal", false);
nonModalDialog.setBounds(400, 150, 100, 100);
nonModalDialog.addMouseMotionListener(new TestMouseMotionAdapter());
nonModalDialog.addFocusListener(new TestFocusAdapter());
new Thread(this).start();
// create the modal dialog and show it from this thread
modalDialog = new Dialog(modalParentFrame, "Modal", true);
modalDialog.setBounds(100, 400, 100, 100);
modalDialog.setVisible(true);
});
} finally {
EventQueue.invokeAndWait(() -> {
if (modalParentFrame != null) {
modalParentFrame.dispose();
}
if (nonModalParentFrame != null) {
nonModalParentFrame.dispose();
}
if (modalDialog != null) {
modalDialog.dispose();
}
if (nonModalDialog != null) {
nonModalDialog.dispose();
}
});
}
}
// This is the implementation of Runnable and is
// used to show the non-modal dialog in 1 second
public void run() {
r.delay(1000);
r.waitForIdle();
//show the non modal dialog
nonModalDialog.setVisible(true);
r.delay(1000);
r.waitForIdle();
test();
}
private void test() {
// mouse, focus, activate events triggering
r.delay(500);
loc = nonModalDialog.getLocationOnScreen();
r.delay(500);
r.mouseMove(loc.x + (int) (nonModalDialog.getWidth() / 2), loc.y + (int) (nonModalDialog.getHeight() / 2));
r.delay(100);
r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
r.delay(100);
r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
r.delay(100);
r.mouseMove(loc.x - 100, loc.y - 100);
r.waitForIdle();
// dispose modal window in order to finish test
modalDialog.dispose();
// check test result
if (!passed) {
throw new RuntimeException("test failed: " + errorMessage);
}
}
public static void testFailed(String message) {
passed = false;
errorMessage = message;
}
}
class TestMouseMotionAdapter extends MouseMotionAdapter {
public void mouseClicked(MouseEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("mouseClicked");
}
public void mouseEntered(MouseEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("mouseEntered");
}
public void mouseExited(MouseEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("mouseExited");
}
public void mousePressed(MouseEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("mousePressed");
}
public void mouseReleased(MouseEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("mouseReleased");
}
}
class TestFocusAdapter extends FocusAdapter {
public void focusGained(FocusEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("focusGained");
}
public void focusLost(FocusEvent e){
NonModalDialogReceiveEventsAfterModalTest.testFailed("focusLost");
}
}