/*
 * Copyright (c) 2011, 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 6502052
 * @summary Menu cells must resize if font changes (XToolkit)
 * @requires os.family == "linux"
 * @library /java/awt/regtesthelpers
 * @build PassFailJFrame
 * @run main/manual CellsResize
 */

import java.awt.Button;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuComponent;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.PopupMenu;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CellsResize {
    private static Frame frame;
    private static MenuBar menuBar;
    private static PopupMenu popupMenu;
    private static Menu barSubMenu;
    private static Menu popupSubMenu;
    private static boolean fontMultiplied = false;

    public static void main(String[] args) throws Exception {
        String INSTRUCTIONS = """
                1. Open all nested menus in menu bar.
                2. Click on "popup-menu" button to show popup-menus.
                3. Open all nested menus in popup-menu.
                4. Click on "big-font" button (to make all menus have a
                    bigger font).
                5. Open all nested menus again (as described in 1, 2, 3).
                6. If all menu items use a bigger font now and their labels fit
                into menu-item size, press "pass", otherwise press "fail".
                """;

        PassFailJFrame.builder()
                .title("Test Instructions")
                .instructions(INSTRUCTIONS)
                .rows((int) INSTRUCTIONS.lines().count() + 2)
                .columns(35)
                .testUI(CellsResize::createUI)
                .logArea(5)
                .build()
                .awaitAndCheck();
    }

    public static Frame createUI () {
        if (!checkToolkit()) {
            new RuntimeException("Toolkit check failed.");
        }
        frame = new Frame("MenuBar Cell Resize Test");

        popupMenu = new PopupMenu();
        popupMenu.add(createMenu(false));

        frame.add(popupMenu);

        menuBar = new MenuBar();
        menuBar.add(createMenu(true));

        frame.setMenuBar(menuBar);

        Button bp = new Button("popup-menu");
        bp.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
                popupMenu.show(e.getComponent(), e.getX(), e.getY());
            }
        });

        Button bf = new Button("big-font");
        bf.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
                bigFont();
            }
        });

        Panel panel = new Panel();
        panel.setLayout(new GridLayout(2, 1));
        panel.add(bp);
        panel.add(bf);

        frame.add(panel);
        frame.setSize(300, 300);
        return frame;
    }

    static boolean checkToolkit() {
        String toolkitName = Toolkit.getDefaultToolkit().getClass().getName();
        return toolkitName.equals("sun.awt.X11.XToolkit");
    }

    static Menu createMenu(boolean bar) {
        Menu menu1 = new Menu("Menu-1");
        Menu menu11 = new Menu("Menu-11");
        menu1.add(menu11);
        if (bar) {
            barSubMenu = menu11;
        } else {
            popupSubMenu = menu11;
        }
        menu11.add(new MenuItem("MenuItem"));
        return menu1;
    }

    static void bigFont() {
        if (fontMultiplied) {
            return;
        } else {
            fontMultiplied = true;
        }

        multiplyFont(barSubMenu, 7);
        multiplyFont(popupSubMenu, 7);

        // NOTE: if previous two are moved below following
        // two, they get their font multiplied twice.

        multiplyFont(menuBar, 5);
        multiplyFont(popupMenu, 5);
    }

    static void multiplyFont(MenuComponent comp, int times) {
        Font font = comp.getFont();
        float size = font.getSize() * times;
        comp.setFont(font.deriveFont(size));
    }
}