1/*
2 * Copyright (c) 2014, 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
24import javax.swing.*;
25import java.awt.event.ActionEvent;
26import java.awt.event.KeyEvent;
27
28/*
29  @test
30  @key headful
31  @bug 8031485 8058193
32  @summary Combo box consuming escape and enter key events
33  @author Petr Pchelko
34  @library ../../../../lib/testlibrary/
35  @build ExtendedRobot
36  @run main ConsumedKeyTest
37*/
38public class ConsumedKeyTest {
39    private static volatile JFrame frame;
40    private static volatile boolean passed;
41
42    public static void main(String... args) throws Exception {
43        test(KeyEvent.VK_ESCAPE);
44        test(KeyEvent.VK_ENTER);
45    }
46
47    private static void test(final int key) throws Exception {
48        passed = false;
49        try {
50            SwingUtilities.invokeAndWait(() -> {
51                frame = new JFrame();
52                JComboBox<String> combo = new JComboBox<>(new String[]{"one", "two", "three"});
53                JPanel panel = new JPanel();
54                panel.add(combo);
55                combo.requestFocusInWindow();
56                frame.setBounds(100, 150, 300, 100);
57                addAction(panel, key);
58                frame.add(panel);
59                frame.setVisible(true);
60            });
61
62            ExtendedRobot robot = new ExtendedRobot();
63            robot.waitForIdle();
64            robot.type(key);
65            robot.waitForIdle();
66            if (!passed) {
67                throw new RuntimeException("FAILED: " + KeyEvent.getKeyText(key) + " was consumed by combo box");
68            }
69        } finally {
70            if (frame != null) {
71                frame.dispose();
72            }
73        }
74
75    }
76
77    private static void addAction(JComponent comp, final int key) {
78        KeyStroke k = KeyStroke.getKeyStroke(key, 0);
79        Object actionKey = "cancel";
80        comp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(k, actionKey);
81        Action cancelAction = new AbstractAction() {
82            @Override
83            public void actionPerformed(ActionEvent ev) {
84                passed = true;
85            }
86        };
87        comp.getActionMap().put(actionKey, cancelAction);
88    }
89
90}
91