| /* | |
| * Copyright (c) 2007, 2022, 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 | |
| @key headful | |
| @bug 6187066 | |
| @summary Tests the Window.autoRequestFocus property for the Window.toFront() method. | |
| @library /java/awt/patchlib ../../regtesthelpers | |
| @build java.desktop/java.awt.Helper | |
| @build Util | |
| @run main AutoRequestFocusToFrontTest | |
| */ | |
| import java.awt.*; | |
| import test.java.awt.regtesthelpers.Util; | |
| public class AutoRequestFocusToFrontTest { | |
| static boolean haveDelays; | |
| static Frame auxFrame; | |
| static Frame frame; | |
| static Button frameButton; | |
| static Frame frame2; | |
| static Button frameButton2; | |
| static Frame frame3; | |
| static Button frameButton3; | |
| static Window window; | |
| static Button winButton; | |
| static Dialog dialog; | |
| static Button dlgButton; | |
| static Window ownedWindow; | |
| static Button ownWinButton; | |
| static Dialog ownedDialog; | |
| static Button ownDlgButton; | |
| static Dialog modalDialog; | |
| static Button modalDlgButton; | |
| static String toolkitClassName; | |
| static Robot robot = Util.createRobot(); | |
| public static void main(String[] args) { | |
| if (args.length != 0) { | |
| haveDelays = "delay".equals(args[0]) ? true : false; | |
| } | |
| AutoRequestFocusToFrontTest app = new AutoRequestFocusToFrontTest(); | |
| app.init(); | |
| app.start(); | |
| } | |
| public void init() { | |
| toolkitClassName = Toolkit.getDefaultToolkit().getClass().getName(); | |
| } | |
| static void recreateGUI() { | |
| if (auxFrame != null) { | |
| auxFrame.dispose(); | |
| frame.dispose(); | |
| frame2.dispose(); | |
| frame3.dispose(); | |
| window.dispose(); | |
| dialog.dispose(); | |
| ownedWindow.dispose(); | |
| ownedDialog.dispose(); | |
| modalDialog.dispose(); | |
| } | |
| auxFrame = new Frame("Auxiliary Frame"); | |
| frame = new Frame("Test Frame"); | |
| frameButton = new Button("button"); | |
| frame2 = new Frame("Test Frame 2"); | |
| frameButton2 = new Button("button"); | |
| frame3 = new Frame("Test Frame 3"); | |
| frameButton3 = new Button("button"); | |
| window = new Window(null); | |
| winButton = new Button("button"); | |
| dialog = new Dialog((Frame)null, "Test Dialog"); | |
| dlgButton = new Button("button"); | |
| ownedWindow = new Window(frame); | |
| ownWinButton = new Button("button"); | |
| ownedDialog = new Dialog(frame2, "Test Owned Dialog"); | |
| ownDlgButton = new Button("button"); | |
| modalDialog = new Dialog(frame3, "Test Modal Dialog"); | |
| modalDlgButton = new Button("button"); | |
| auxFrame.setBounds(100, 100, 300, 300); | |
| frame.setBounds(120, 120, 260, 260); | |
| frame.add(frameButton); | |
| frame2.setBounds(120, 120, 260, 260); | |
| frame2.add(frameButton2); | |
| frame3.setBounds(120, 120, 260, 260); | |
| frame3.add(frameButton3); | |
| window.setBounds(120, 120, 260, 260); | |
| window.add(winButton); | |
| dialog.setBounds(120, 120, 260, 260); | |
| dialog.add(dlgButton); | |
| ownedWindow.setBounds(140, 140, 220, 220); | |
| ownedWindow.add(ownWinButton); | |
| ownedDialog.setBounds(140, 140, 220, 220); | |
| ownedDialog.add(ownDlgButton); | |
| modalDialog.setBounds(140, 140, 220, 220); | |
| modalDialog.add(modalDlgButton); | |
| modalDialog.setModal(true); | |
| } | |
| public void start() { | |
| // 1. Simple Frame. | |
| ////////////////// | |
| recreateGUI(); | |
| Test.setWindows(frame, null, null); | |
| Test.test("Test stage 1 in progress", frameButton); | |
| // 2. Ownerless Window. | |
| ////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(window, null, null); | |
| Test.test("Test stage 2 in progress", winButton); | |
| // 3. Ownerless Dialog. | |
| ////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(dialog, null, null); | |
| Test.test("Test stage 3 in progress", dlgButton); | |
| // 4.1. Owner Frame (with owned Window). | |
| /////////////////////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(frame, null, new Window[] {ownedWindow, frame}); | |
| Test.test("Test stage 4.1 in progress", ownWinButton); | |
| // 4.2. Owned Window (with owner Frame). | |
| /////////////////////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(ownedWindow, null, new Window[] {ownedWindow, frame}); | |
| Test.test("Test stage 4.2 in progress", ownWinButton); | |
| // 5.1. Owner Frame (with owned Dialog). | |
| /////////////////////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(frame2, null, new Window[] {ownedDialog, frame2}); | |
| Test.test("Test stage 5.1 in progress", ownDlgButton); | |
| // 5.2. Owned Dialog (with owner Frame). | |
| /////////////////////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(ownedDialog, null, new Window[] {ownedDialog, frame2}); | |
| Test.test("Test stage 5.2 in progress", ownDlgButton); | |
| //////////////////////////////////////////////// | |
| // 6.1. Owned modal Dialog (with owner Frame). | |
| // Focused frame is excluded from modality. | |
| //////////////////////////////////////////////// | |
| recreateGUI(); | |
| auxFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE); | |
| Test.setWindows(modalDialog, modalDialog, new Window[] {modalDialog, frame3}); | |
| Test.test("Test stage 6.1 in progress", modalDlgButton); | |
| // 6.2. Owner Frame (with owned modal Dialog). | |
| // Focused frame is excluded from modality. | |
| //////////////////////////////////////////////// | |
| recreateGUI(); | |
| auxFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE); | |
| Test.setWindows(frame3, modalDialog, new Window[] {modalDialog, frame3}); | |
| Test.test("Test stage 6.2 in progress", modalDlgButton, true); | |
| /////////////////////////////////////////////////// | |
| // 7. Calling setVisible(true) for the shown Frame. | |
| /////////////////////////////////////////////////// | |
| recreateGUI(); | |
| Test.setWindows(frame, null, null); | |
| Test.setTestSetVisible(); | |
| Test.test("Test stage 7 in progress", frameButton); | |
| System.out.println("Test passed."); | |
| } | |
| static class Test { | |
| static Window testWindow; // a window to move to front with autoRequestFocus set | |
| static Window focusWindow; // a window to gain focus | |
| static Window[] showWindows; // windows to show, or null if only testWindow should be shown | |
| static boolean testSetVisible; | |
| static void setWindows(Window _testWindow, Window _focusWindow, Window[] _showWindows) { | |
| testWindow = _testWindow; | |
| focusWindow = _focusWindow; | |
| showWindows = _showWindows; | |
| } | |
| static void setTestSetVisible() { | |
| testSetVisible = true; | |
| } | |
| /* | |
| * @param msg notifies test stage number | |
| * @param testButton a button of the window (owner or owned) that is to be on the top of stack order | |
| * @param shouldFocusChange true for modal dialogs | |
| */ | |
| static void test(String msg, final Button testButton, boolean shouldFocusChange) { | |
| System.out.println(msg); | |
| showWindows(testWindow, showWindows, true); | |
| pause(100); | |
| ///////////////////////////////////////////////////////// | |
| // Test that calling toFront() doesn't cause focus change | |
| // when 'autoRequestFocus' is false. | |
| ///////////////////////////////////////////////////////// | |
| Runnable action = new Runnable() { | |
| public void run() { | |
| testWindow.setAutoRequestFocus(false); | |
| if (testSetVisible) { | |
| setVisible(testWindow, true); | |
| } else { | |
| toFront(testWindow); | |
| } | |
| } | |
| }; | |
| if (shouldFocusChange) { | |
| action.run(); | |
| Util.waitForIdle(robot); | |
| if (!focusWindow.isFocused()) { | |
| throw new TestFailedException("the window must gain focus on moving to front but it didn't!"); | |
| } | |
| } else if (TestHelper.trackFocusChangeFor(action, robot)) { | |
| throw new TestFailedException("the window shouldn't gain focus on moving to front but it did!"); | |
| } | |
| pause(100); | |
| /////////////////////////////////////////////////////// | |
| // Test that the window (or its owned window) is on top. | |
| /////////////////////////////////////////////////////// | |
| // The latest versions of Metacity (e.g. 2.16) have problems with moving a window to the front. | |
| if (Util.getWMID() != Util.METACITY_WM) { | |
| boolean performed = Util.trackActionPerformed(testButton, new Runnable() { | |
| public void run() { | |
| Util.clickOnComp(testButton, robot); | |
| } | |
| }, 1000, false); | |
| if (!performed) { | |
| // For the case when the robot failed to trigger ACTION_EVENT. | |
| System.out.println("(ACTION_EVENT was not generated. One more attemp.)"); | |
| performed = Util.trackActionPerformed(testButton, new Runnable() { | |
| public void run() { | |
| Util.clickOnComp(testButton, robot); | |
| } | |
| }, 1000, false); | |
| if (!performed) { | |
| throw new TestFailedException("the window moved to front is not on the top!"); | |
| } | |
| } | |
| } | |
| showWindows(testWindow, showWindows, false); | |
| ///////////////////////////////////////////////// | |
| // Test that calling toFront() focuses the window | |
| // when 'autoRequestFocus' is true. | |
| ///////////////////////////////////////////////// | |
| // Skip this stage for unfocusable window | |
| if (!testWindow.isFocusableWindow()) { | |
| return; | |
| } | |
| showWindows(testWindow, showWindows, true); | |
| pause(100); | |
| boolean gained = Util.trackWindowGainedFocus(testWindow, new Runnable() { | |
| public void run() { | |
| testWindow.setAutoRequestFocus(true); | |
| if (testSetVisible) { | |
| setVisible(testWindow, true); | |
| } else { | |
| toFront(testWindow); | |
| } | |
| } | |
| }, 1000, false); | |
| // Either the window or its owned window must be focused | |
| if (!gained && !testButton.hasFocus()) { | |
| throw new TestFailedException("the window should gain focus automatically but it didn't!"); | |
| } | |
| showWindows(testWindow, showWindows, false); | |
| } | |
| static void test(String msg, Button testButton) { | |
| test(msg, testButton, false); | |
| } | |
| private static void showWindows(Window win, Window[] wins, final boolean visible) { | |
| pause(100); | |
| if (wins == null) { | |
| wins = new Window[] {win}; // operate with 'win' | |
| } | |
| for (final Window w: wins) { | |
| if (visible) { | |
| if ((w instanceof Dialog) && ((Dialog)w).isModal()) { | |
| TestHelper.invokeLaterAndWait(new Runnable() { | |
| public void run() { | |
| w.setVisible(true); | |
| } | |
| }, robot); | |
| } else { | |
| setVisible(w, true); | |
| } | |
| } else { | |
| w.dispose(); | |
| } | |
| } | |
| setVisible(auxFrame, visible); | |
| if (visible) { | |
| if (!auxFrame.isFocused()) { | |
| Util.clickOnTitle(auxFrame, robot); | |
| Util.waitForIdle(robot); | |
| if (!auxFrame.isFocused()) { | |
| throw new Error("Test error: the frame couldn't be focused."); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| private static void setVisible(Window w, boolean b) { | |
| w.setVisible(b); | |
| try { | |
| Util.waitForIdle(robot); | |
| } catch (RuntimeException rte) { // InfiniteLoop | |
| rte.printStackTrace(); | |
| } | |
| robot.delay(200); | |
| } | |
| private static void toFront(Window w) { | |
| w.toFront(); | |
| Util.waitForIdle(robot); | |
| robot.delay(200); | |
| } | |
| private static void pause(int msec) { | |
| if (haveDelays) { | |
| robot.delay(msec); | |
| } | |
| } | |
| } | |
| class TestFailedException extends RuntimeException { | |
| TestFailedException(String msg) { | |
| super("Test failed: " + msg); | |
| } | |
| } |