--- /dev/null 2014-06-16 13:42:37.248095559 +0400 +++ new/test/java/awt/Modal/ModalExclusionTests/ExcludeFrameTest.java 2014-06-18 19:10:11.000000000 +0400 @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2007, 2014, 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. + */ + +import java.awt.*; +import java.awt.event.*; +import java.awt.print.*; + +import static jdk.testlibrary.Asserts.*; + + +public class ExcludeFrameTest implements AWTEventListener { + class CustomFrame extends TestFrame { + + @Override + public void doOpenAction() { + if (window != null) { + window.setVisible(true); + } + } + } + + class CustomDialog extends TestDialog { + + public CustomDialog(Frame frame) { + super(frame); + } + + @Override + public void doOpenAction() { + switch (childDialogType) { + case PRINT_SETUP: + PrinterJob.getPrinterJob().printDialog(); + break; + case PAGE_SETUP: + PrinterJob.getPrinterJob().pageDialog(new PageFormat()); + break; + case FILE_DIALOG: + fileDialog = new FileDialog((Frame) null); + fileDialog.setLocation(20, 200); + fileDialog.setVisible(true); + break; + } + } + } + + class CustomWindow extends TestWindow { + + public CustomWindow(Frame frame) { + super(frame); + } + + @Override + public void doOpenAction() { + if (dialog != null) { + dialog.setVisible(true); + } + } + } + + private TestDialog dialog; + private TestFrame frame; + private TestWindow window; + private FileDialog fileDialog; + + private boolean windowAppeared = false; + private final Object windowLock; + + private static final int delay = 1000; + private final ExtendedRobot robot; + + private final Dialog.ModalExclusionType exclusionType; + + public enum DialogToShow {PAGE_SETUP, PRINT_SETUP, FILE_DIALOG}; + private final DialogToShow childDialogType; + private String type; + + public ExcludeFrameTest(Dialog.ModalExclusionType exclType, + DialogToShow dialogType) throws Exception { + exclusionType = exclType; + childDialogType = dialogType; + + type = "File"; + if (dialogType == DialogToShow.PAGE_SETUP) { + type = "Page setup"; + } else if (dialogType == DialogToShow.PRINT_SETUP) { + type = "Print setup"; + } + + windowLock = new Object(); + robot = new ExtendedRobot(); + EventQueue.invokeAndWait( this::createGUI ); + } + + @Override + public void eventDispatched(AWTEvent event) { + if (event.getID() == WindowEvent.WINDOW_OPENED) { + windowAppeared = true; + synchronized (windowLock) { + windowLock.notifyAll(); + } + } + } + + private void createGUI() { + frame = new CustomFrame(); + frame.setLocation(20, 20); + frame.setModalExclusionType(exclusionType); + dialog = new CustomDialog(frame); + dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); + dialog.setLocation(220, 20); + window = new CustomWindow(frame); + window.setLocation(420, 20); + Toolkit.getDefaultToolkit().addAWTEventListener( + ExcludeFrameTest.this, AWTEvent.WINDOW_EVENT_MASK); + frame.setVisible(true); + } + + private void closeAll() { + if (dialog != null) { dialog.dispose(); } + if (frame != null) { frame.dispose(); } + if (window != null) { window.dispose(); } + if (fileDialog != null) { + fileDialog.dispose(); + } else { + robot.type(KeyEvent.VK_ESCAPE); + } + } + + public void doTest() throws Exception { + + robot.waitForIdle(delay); + + frame.clickOpenButton(robot); + robot.waitForIdle(delay); + + window.clickOpenButton(robot); + robot.waitForIdle(delay); + + dialog.clickOpenButton(robot); + robot.waitForIdle(delay); + + if (! windowAppeared) { + synchronized (windowLock) { + try { + windowLock.wait(10 * delay); + } catch (InterruptedException e) {} + } + } + + assertTrue(windowAppeared, type + " dialog didn't appear"); + + frame.toFront(); + robot.waitForIdle(delay); + + String excl = ""; + if (exclusionType == Dialog.ModalExclusionType.APPLICATION_EXCLUDE) { + excl = "Application"; + } else if (exclusionType == Dialog.ModalExclusionType.TOOLKIT_EXCLUDE) { + excl = "Toolkit"; + } + + frame.checkUnblockedFrame(robot, excl + " modal " + type + + " dialog should not block this modal excluded Frame"); + dialog.checkUnblockedDialog(robot, excl + " modal " + type + + " dialog should not block this modal excluded app. modal Dialog"); + window.checkUnblockedWindow(robot, excl + " modal " + type + + " dialog should not block this modal excluded Window"); + + robot.waitForIdle(); + closeAll(); + } +}