/*
 * Copyright (c) 2001, 2024, 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
 * @bug 4396407
 * @summary Tests that after a proxied window is hidden, focus is being restored correctly
 * @library /java/awt/regtesthelpers
 * @build PassFailJFrame
 * @run main/manual ProxiedWindowHideTest
*/

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import javax.swing.Box;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class ProxiedWindowHideTest {

    private static final String INSTRUCTIONS = """
           You will see a JFrame.
           Click on JComboBox, list will expand then select any item in it.
           After selection, list should collapse.
           Click on Button('Push').
           If you are able to make it focused by mouse click,
           (black rectangle will appear around it) the test is PASSED,
           otherwise the test is FAILED.""";

    public static void main(String[] args) throws Exception {
        PassFailJFrame.builder()
                .title("ProxiedWindowHideTest Instructions")
                .instructions(INSTRUCTIONS)
                .rows((int) INSTRUCTIONS.lines().count() + 2)
                .columns(35)
                .testUI(ProxiedWindowHideTest::createTestUI)
                .build()
                .awaitAndCheck();
    }

    private static JFrame createTestUI() {
        JFrame frame = new JFrame("ProxiedWindowHideTest frame");
        String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
        JComboBox cb = new JComboBox(petStrings);

        cb.setLightWeightPopupEnabled(false);
        Container parent = Box.createVerticalBox();
        parent.add(new Button("Push"));
        parent.add(cb);
        frame.add(parent, BorderLayout.CENTER);
        frame.pack();
        return frame;
    }

}

