1 /* 2 * Copyright (c) 2007, 2008, 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 /* 25 @test %W% %E% 26 @bug 6598089 27 @summary Tests restoring focus on a single disabled coponent 28 @author Anton Tarasov: area=awt-focus 29 @library ../../regtesthelpers 30 @build Util 31 @run main RestoreFocusOnDisabledComponentTest 32 */ 33 34 import java.awt.*; 35 import java.awt.event.*; 36 import java.applet.Applet; 37 import test.java.awt.regtesthelpers.Util; 38 39 /* 40 * The bug is not reproducible on Windows. 41 */ 42 public class RestoreFocusOnDisabledComponentTest extends Applet { 43 Frame frame = new Frame("Frame") {public String toString() {return "FRAME";}}; 44 Button b0 = new Button("button0") {public String toString() {return "B-0";}}; 45 Button b1 = new Button("button1") {public String toString() {return "B-1";}}; 46 volatile int nFocused; 47 Robot robot; 48 49 public static void main(String[] args) { 50 RestoreFocusOnDisabledComponentTest app = new RestoreFocusOnDisabledComponentTest(); 51 app.init(); 52 app.start(); 53 } 54 55 public void init() { 56 robot = Util.createRobot(); 57 } 58 59 public void start() { 60 frame.add(b0); 61 frame.add(b1); 62 frame.setLayout(new FlowLayout()); 63 frame.pack(); 64 65 frame.setVisible(true); 66 67 Util.waitForIdle(robot); 68 KeyboardFocusManager.setCurrentKeyboardFocusManager(new DefaultKeyboardFocusManager() { 69 public boolean dispatchEvent(AWTEvent e) { 70 if (e.getID() == FocusEvent.FOCUS_GAINED) { 71 // Trying to emulate timings. b1 should be disabled just by the time it gets 72 // FOCUS_GAINED event. The latter is a result of disabling b0 that initiates 73 // focus auto transfer. 74 if (e.getSource() == b1) { 75 b1.setEnabled(false); 76 77 } else if (e.getSource() == b0) { 78 if (++nFocused > 10) { 79 nFocused = -1; 80 throw new TestFailedException("Focus went into busy loop!"); 81 } 82 } 83 } 84 return super.dispatchEvent(e); 85 } 86 }); 87 // Initiating focus auto transfer. 88 // Focus will be requested to b1. When FOCUS_GAINED is being dispatched to b1, it will 89 // be disabled. This will trigger focus restoring. Focus will be requested to b0 (the 90 // last opposite component). When FOCUS_GAINED is being dispatched to b0, it will 91 // also be disabled. However, the last opposite component (and the most recent focus owner) 92 // will still be b0. When DKFM initiates focus restoring it should detect restoring 93 // on the same component and break. 94 b0.setEnabled(false); 95 96 Util.waitForIdle(robot); 97 if (nFocused != -1) { 98 System.out.println("Test passed."); 99 } 100 } 101 } 102 103 class TestFailedException extends RuntimeException { 104 TestFailedException(String msg) { 105 super("Test failed: " + msg); 106 } 107 }