| /* | |
| * Copyright (c) 2008, 2016, 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 4452384 | |
| @summary Tests that non-focusable windows doesn't generate any focus events when accessed. | |
| @author Denis.Mikhalkin: area=awt.focus | |
| @run main NoEventsTest | |
| */ | |
| import java.awt.*; | |
| import java.awt.event.*; | |
| import java.util.*; | |
| public class NoEventsTest extends Frame { | |
| public static final int DEF_WIDTH = 400, | |
| DEF_HEIGHT = 300, | |
| DEF_TOP = 1, | |
| DEF_LEFT = 100, | |
| DEF_ROW = 0, | |
| DEF_COL = 0; | |
| static boolean automatic = true; | |
| static Window[] windows; | |
| static Frame main_frame, jumpingFrame; | |
| static Button focus_button; | |
| static Robot robot; | |
| static void pause(int timeout) { | |
| Toolkit.getDefaultToolkit().sync(); | |
| robot.waitForIdle(); | |
| robot.delay(100); | |
| } | |
| static GlobalListener listener; | |
| public static void main(String[] args) { | |
| listener = new GlobalListener(); | |
| Toolkit.getDefaultToolkit().addAWTEventListener(listener, | |
| AWTEvent.FOCUS_EVENT_MASK | | |
| AWTEvent.WINDOW_EVENT_MASK); | |
| try{ | |
| robot = new Robot(); | |
| } catch(Exception e) {} | |
| // Create several pairs - focusable Frame with focusable component(button) and non-focusable: | |
| // window, resizable frame, non-resizable frame, dialog, non-resiable dialog | |
| main_frame = new Frame("focusable frame"); | |
| focus_button = new Button("button to focus"); | |
| main_frame.add(focus_button); | |
| main_frame.pack(); | |
| main_frame.setVisible(true); | |
| main_frame.setLocation(10, 600); | |
| main_frame.addWindowListener(new WindowAdapter() { | |
| public void windowClosing(WindowEvent e) { | |
| listener.report(); | |
| System.exit(0); | |
| } | |
| }); | |
| jumpingFrame = new Frame("Jumping frame"); | |
| jumpingFrame.setBounds(DEF_LEFT, DEF_TOP, DEF_WIDTH, DEF_HEIGHT); | |
| windows = new Window[7]; | |
| windows[0] = new TestWindow(0, 0, false, main_frame); | |
| //windows[1] = new TestWindow(2, 1, true, main_frame); | |
| windows[2] = new NoEventsTest(1, 0, false, true); | |
| windows[3] = new NoEventsTest(2, 0, false, false); | |
| //windows[4] = new Test(3, 0, true, true); | |
| windows[5] = new TestDialog(0, 1, false, true, main_frame); | |
| windows[6] = new TestDialog(1, 1, false, false, main_frame); | |
| if (!automatic) { | |
| int windowInd; | |
| for (windowInd = 0; windowInd < windows.length; windowInd++) { | |
| if (windows[windowInd] != null) { | |
| windows[windowInd].setVisible(true); | |
| } | |
| } | |
| } | |
| // Run the test | |
| // 1. Click on all controls, check for no focus events for non-focusable, right focus events for focusable | |
| // 2. Perform some action with control, check if it works | |
| if (automatic) { | |
| int windowInd; | |
| for (windowInd = 0; windowInd < windows.length; windowInd++) { | |
| if (windows[windowInd] != null) { | |
| windows[windowInd].setVisible(true); | |
| focus_button.requestFocus(); | |
| pause(1000); | |
| // Verify that click on non-focusable window causes no focus lost on active window | |
| performFocusClick(windows[windowInd]); | |
| focus_button.requestFocus(); | |
| pause(500); | |
| performActionClick(windows[windowInd]); | |
| // Verify that toFront, toBack doesn't cause non-focusable window to become active | |
| jumpingFrame.setVisible(true); | |
| pause(1000); | |
| jumpingFrame.toBack(); | |
| pause(500); | |
| jumpingFrame.toFront(); | |
| pause(500); | |
| windows[windowInd].toBack(); | |
| pause(500); | |
| windows[windowInd].toFront(); | |
| pause(500); | |
| // Verify that iconifiyng/deiconfiying and | |
| // zooming/unzooming doesn't cause non-focusable | |
| // window to become active | |
| if (windows[windowInd] instanceof Frame) { | |
| Frame toTest = (Frame)windows[windowInd]; | |
| // Deiconification currently doesn't work! | |
| // toTest.setExtendedState(Frame.ICONIFIED); | |
| // pause(500); | |
| // toTest.setExtendedState(Frame.NORMAL); | |
| pause(500); | |
| toTest.setExtendedState(Frame.MAXIMIZED_BOTH); | |
| pause(500); | |
| toTest.setExtendedState(Frame.NORMAL); | |
| } | |
| windows[windowInd].dispose(); | |
| jumpingFrame.dispose(); | |
| } | |
| } | |
| pause(1000); | |
| System.err.println("Test finished."); | |
| if (!listener.report()) { | |
| throw new RuntimeException("Test Failed. See error stream output for details"); | |
| } | |
| } | |
| } | |
| static void performFocusClick(Window parent) { | |
| if (parent == null) { | |
| return; | |
| } | |
| for (int compInd = 0; compInd < parent.getComponentCount(); compInd++) { | |
| Component child = parent.getComponent(compInd); | |
| if (child instanceof TestPanel) { | |
| TestPanel pan = (TestPanel)child; | |
| pan.performFocusClicks(robot); | |
| pause(100); | |
| } | |
| } | |
| } | |
| static void performActionClick(Window parent) { | |
| if (parent == null) { | |
| return; | |
| } | |
| for (int compInd = 0; compInd < parent.getComponentCount(); compInd++) { | |
| Component child = parent.getComponent(compInd); | |
| if (child instanceof TestPanel) { | |
| TestPanel pan = (TestPanel)child; | |
| pan.performActionClicks(robot); | |
| pause(100); | |
| } | |
| } | |
| } | |
| public NoEventsTest(int row, int col, boolean focusable, boolean resizable) { | |
| super("Frame" + row + "" + col); | |
| TestPanel panel = new TestPanel(row, col); | |
| if (NoEventsTest.automatic) { | |
| row = NoEventsTest.DEF_ROW; | |
| col = NoEventsTest.DEF_COL; | |
| } | |
| setName(getTitle()); | |
| add("Center", panel); | |
| Label l = new Label(getClass().getSuperclass().getName() + ", " + (focusable?"focusable":"non-focusable") + | |
| ", " + (resizable?"resizable":"non-resizable")); | |
| l.setBackground(Color.green); | |
| add("North", l); | |
| setBounds(NoEventsTest.DEF_LEFT + DEF_WIDTH*col, DEF_TOP + DEF_HEIGHT*row, DEF_WIDTH, DEF_HEIGHT); | |
| if (!focusable) { | |
| setFocusableWindowState(false); | |
| } | |
| if (!resizable) { | |
| setResizable(false); | |
| } | |
| // setVisible(true); | |
| } | |
| } | |
| class TestWindow extends Window { | |
| public TestWindow(int row, int col, boolean focusable, Frame owner) { | |
| super(owner); | |
| setName("Window" + row + "" + col); | |
| TestPanel panel = new TestPanel(row, col); | |
| if (NoEventsTest.automatic) { | |
| row = NoEventsTest.DEF_ROW; | |
| col = NoEventsTest.DEF_COL; | |
| } | |
| add("Center", panel); | |
| Label l = new Label(getClass().getSuperclass().getName() + ", " + (focusable?"focusable":"non-focusable") + | |
| ", " + (false?"resizable":"non-resizable")); | |
| l.setBackground(Color.green); | |
| add("North", l); | |
| setBounds(NoEventsTest.DEF_LEFT + NoEventsTest.DEF_WIDTH*col, NoEventsTest.DEF_TOP + NoEventsTest.DEF_HEIGHT*row, NoEventsTest.DEF_WIDTH, NoEventsTest.DEF_HEIGHT); | |
| if (!focusable) { | |
| setFocusableWindowState(false); | |
| } | |
| // setVisible(true); | |
| } | |
| } | |
| class TestDialog extends Dialog { | |
| public TestDialog(int row, int col, boolean focusable, boolean resizable, Frame owner) { | |
| super(owner); | |
| setName("Dialog" + row + "" + col); | |
| TestPanel panel = new TestPanel(row, col); | |
| if (NoEventsTest.automatic) { | |
| row = NoEventsTest.DEF_ROW; | |
| col = NoEventsTest.DEF_COL; | |
| } | |
| add("Center", panel); | |
| Label l = new Label(getClass().getSuperclass().getName() + ", " + (focusable?"focusable":"non-focusable") + | |
| ", " + (resizable?"resizable":"non-resizable")); | |
| l.setBackground(Color.green); | |
| add("North", l); | |
| setBounds(NoEventsTest.DEF_LEFT + NoEventsTest.DEF_WIDTH*col, NoEventsTest.DEF_TOP + NoEventsTest.DEF_HEIGHT*row, NoEventsTest.DEF_WIDTH, NoEventsTest.DEF_HEIGHT); | |
| if (!focusable) { | |
| setFocusableWindowState(false); | |
| } | |
| if (!resizable) { | |
| setResizable(false); | |
| } | |
| // setVisible(true); | |
| } | |
| } | |
| class TestPanel extends Panel { | |
| void clickComponent(Component comp, Robot robot) { | |
| if (comp instanceof Choice) { | |
| return; | |
| } | |
| Point compLoc = comp.getLocationOnScreen(); | |
| Dimension size = comp.getSize(); | |
| robot.mouseMove(compLoc.x + size.width/2, compLoc.y + size.height/2); | |
| robot.mousePress(InputEvent.BUTTON1_MASK); | |
| robot.mouseRelease(InputEvent.BUTTON1_MASK); | |
| } | |
| void performFocusClicks(Robot robot) { | |
| for (int childInd = 0; childInd < getComponentCount(); childInd++) { | |
| performFocusClick(getComponent(childInd), robot); | |
| } | |
| } | |
| void performFocusClick(Component comp, Robot robot) { | |
| clickComponent(comp, robot); | |
| } | |
| void performActionClicks(Robot robot) { | |
| for (int childInd = 0; childInd < getComponentCount(); childInd++) { | |
| performActionClick(getComponent(childInd), robot); | |
| } | |
| } | |
| void performActionClick(Component comp, Robot robot) { | |
| } | |
| public TestPanel(int row, int col) { | |
| setLayout(new FlowLayout()); | |
| Button b; | |
| add(b = new Button("press"+ row + "" + col)); | |
| b.setName(b.getLabel()); | |
| // b.addMouseListener(new MouseAdapter() { | |
| // public void mousePressed(MouseEvent e) { | |
| // System.err.println(e); | |
| // } | |
| // }); | |
| TextField t; | |
| add(t = new TextField("text" + row + "" + col)); | |
| t.setName(t.getText()); | |
| java.awt.List list = new java.awt.List(); | |
| add(list); | |
| list.setName("list"); | |
| list.add("one"); | |
| list.add("two"); | |
| list.add("three"); | |
| list.setMultipleMode(true); | |
| list.setName("list" + row + "" + col); | |
| Checkbox check = new Checkbox("checker"); | |
| add(check); | |
| check.setName("check" + row + "" + col); | |
| Choice choice = new Choice(); | |
| choice.add("one"); | |
| choice.add("two"); | |
| choice.add("three"); | |
| add(choice); | |
| choice.setName("choice" + row + "" + col); | |
| Canvas can = new Canvas() { | |
| public Dimension getPreferredSize() { | |
| return new Dimension(10, 10); | |
| } | |
| }; | |
| can.setBackground(Color.blue); | |
| add(can); | |
| can.setName("canvas" + row + "" + col); | |
| TextArea ta = new TextArea("text\ntttt\naaaa\nwwwww\nqqqqqq\neeeeee\nrrrrrr\nyyyyyy\nuuuuu", 3, 5); | |
| add(ta); | |
| ta.setName("textarea" + row + "" + col); | |
| Scrollbar bar = new Scrollbar(Scrollbar.HORIZONTAL); | |
| add(bar); | |
| bar.setName("scrollbar" + row + "" + col); | |
| CheckboxGroup group = new CheckboxGroup(); | |
| Checkbox ch1 = new Checkbox("one", group, true); | |
| Checkbox ch2 = new Checkbox("two", group, false); | |
| add(ch1); | |
| add(ch2); | |
| ch1.setName("checkbox1 " + row + "" + col); | |
| ch2.setName("checkbox2 " + row + "" + col); | |
| ScrollPane pane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); | |
| add(pane); | |
| Button bigButton = new Button("abc") { | |
| public Dimension getPreferredSize() { | |
| return new Dimension(100, 100); | |
| } | |
| }; | |
| pane.add(bigButton); | |
| bigButton.setName("bigbutton" + row + "" + col); | |
| } | |
| } | |
| class GlobalListener implements AWTEventListener { | |
| java.util.List errors = new java.util.LinkedList(); | |
| public boolean report() { | |
| if (errors.size() != 0) { | |
| System.err.println("Test FAILED"); | |
| } else { | |
| System.err.println("Test PASSED"); | |
| return true; | |
| } | |
| ListIterator iter = errors.listIterator(); | |
| while (iter.hasNext()) { | |
| System.err.println(iter.next()); | |
| } | |
| return false; | |
| } | |
| public GlobalListener() { | |
| } | |
| Window getWindowParent(Component comp) { | |
| while (comp != null && !(comp instanceof Window)) { | |
| comp = comp.getParent(); | |
| } | |
| return (Window)comp; | |
| } | |
| void reportError(AWTEvent e, String message) { | |
| String error = "ERROR: " + message + " : " + e; | |
| errors.add(error); | |
| System.err.println(error); | |
| } | |
| public void eventDispatched(AWTEvent e) { | |
| Component comp = (Component)e.getSource(); | |
| Window parent = getWindowParent(comp); | |
| if (!(e instanceof WindowEvent || e instanceof FocusEvent)) { | |
| System.err.println("Strange event " + e); | |
| } | |
| // Skip WINDOW_OPENED | |
| if (e.getID() == WindowEvent.WINDOW_CLOSING) { | |
| System.err.println(e); | |
| } | |
| switch (e.getID()) { | |
| case WindowEvent.WINDOW_OPENED: | |
| case WindowEvent.WINDOW_CLOSING: | |
| case WindowEvent.WINDOW_CLOSED: | |
| case WindowEvent.WINDOW_ICONIFIED: | |
| case WindowEvent.WINDOW_DEICONIFIED: | |
| case WindowEvent.WINDOW_STATE_CHANGED: | |
| return; | |
| case WindowEvent.WINDOW_LOST_FOCUS: { | |
| WindowEvent we = (WindowEvent)e; | |
| if (we.getOppositeWindow() != null && !we.getOppositeWindow().getFocusableWindowState()) { | |
| reportError(e, "frame lost focus because of non-focusable window"); | |
| } | |
| break; | |
| } | |
| } | |
| // Check that Window owner is focusable | |
| if (!parent.getFocusableWindowState()) { | |
| reportError(e, "focus event for component in non-focusable window " + parent.getName()); | |
| } | |
| if (!comp.isFocusable()) { | |
| reportError(e, "focus event for non-focusable component"); | |
| } | |
| // if (e instanceof WindowEvent || e instanceof FocusEvent) { | |
| // // System.err.println(e); | |
| // } | |
| } | |
| } |