1/*
2 * Copyright (c) 2017, 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/* @test
25   @bug 8173145
26   @summary Menu is activated after using mnemonic Alt/Key combination
27   @modules java.desktop/com.sun.java.swing.plaf.windows
28   @run main Test8173145
29*/
30
31import java.awt.*;
32import java.awt.event.KeyEvent;
33import java.lang.reflect.InvocationTargetException;
34
35import javax.swing.*;
36
37public class Test8173145 {
38
39    private volatile static JButton btn;
40    private volatile static boolean uiCreated;
41
42    public static void main(String[] args) throws InvocationTargetException, InterruptedException, AWTException {
43        SwingUtilities.invokeAndWait(new Runnable() {
44            @Override
45            public void run() {
46                try {
47                    uiCreated = createGUI();
48                } catch (Exception e) {
49                    e.printStackTrace();
50                }
51            }
52        });
53
54        if (uiCreated) {
55            test();
56        } else {
57            //no windows l&f, skip the test
58        }
59    }
60
61    private static void test() {
62        final Robot robot;
63        try {
64            robot = new Robot();
65        } catch (AWTException e) {
66            throw new RuntimeException(e);
67        }
68        robot.setAutoDelay(100);
69        robot.waitForIdle();
70
71        robot.keyPress(KeyEvent.VK_ALT);
72        robot.keyPress(KeyEvent.VK_M);
73        robot.keyRelease(KeyEvent.VK_M);
74        robot.keyRelease(KeyEvent.VK_ALT);
75
76        Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
77
78        if (focusOwner != btn) {
79            throw new RuntimeException("Wrong focus owner");
80        }
81    }
82
83    private static boolean createGUI() {
84        try {
85            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
86        } catch (Exception e) {
87            return false;
88        }
89        JFrame f = new JFrame();
90
91        JPanel panel = new JPanel();
92        btn = new JButton("Mmmmm");
93        btn.setMnemonic(KeyEvent.VK_M);
94        btn.setDisplayedMnemonicIndex(0);
95        panel.add(btn);
96
97        JTextField tf = new JTextField();
98        tf.setColumns(10);
99        panel.add(tf);
100
101        f.setJMenuBar(getMenuBar());
102        f.add(panel);
103        f.pack();
104        f.setVisible(true);
105        tf.requestFocus();
106        return true;
107    }
108
109    static JMenuBar getMenuBar() {
110        JMenuBar menuBar;
111        JMenu menu;
112
113        menuBar = new JMenuBar();
114
115        menu = new JMenu("Menu");
116        menuBar.add(menu);
117
118        JMenuItem mi = new JMenuItem("test");
119        menu.add(mi);
120
121        return menuBar;
122    }
123}
124