package adhoc.closed;

import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;

public class DisplayModeNoRefreshTest extends Frame {

    public DisplayModeNoRefreshTest() {
        super("DisplayModeNoRefreshTest");
        GraphicsDevice gd =
                GraphicsEnvironment.getLocalGraphicsEnvironment().
                        getDefaultScreenDevice();
        if (!gd.isFullScreenSupported()) {
            System.out.println("Full Screen is not supported, test considered passed.");
            return;
        }
        setBackground(Color.green);
        DisplayMode origMode = gd.getDisplayMode();
        gd.setFullScreenWindow(this);
        DisplayMode dlMode = getNoRefreshDisplayMode(gd.getDisplayModes());
        if (dlMode != null) {
            System.out.println("Selected Display Mode: " +
                    " Width " + dlMode.getWidth() +
                    " Height " + dlMode.getHeight() +
                    " BitDepth " + dlMode.getBitDepth() +
                    " Refresh Rate " + dlMode.getRefreshRate());
            try {
                if (gd.isDisplayChangeSupported()) {
                    System.out.println("isDisplayChangeSupported is true");
                    gd.setDisplayMode(dlMode);
                } else {
                    System.out.println("isDisplayChangeSupported is not " + "false");
                }
            } catch (IllegalArgumentException ex) {
                dispose();
                System.err.println("Test Failed due to the following exception");
                ex.printStackTrace();
                throw new RuntimeException("Test Failed due to " + ex);
            }
        } else {
            System.out.println("No suitable display mode available, test considered passed.");
            dispose();
            return;
        }

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }

        gd.setDisplayMode(origMode);
        dispose();
        System.out.println("Test Passed.");
    }

    public DisplayMode getNoRefreshDisplayMode(DisplayMode[] dm) {
        DisplayMode mode = new DisplayMode(640, 480, 32, DisplayMode.REFRESH_RATE_UNKNOWN);
        for (DisplayMode displayMode : dm) {
            if (mode.getWidth() == displayMode.getWidth()
                    && mode.getHeight() == displayMode.getHeight()
                    && mode.getBitDepth() == displayMode.getBitDepth()) {
                return mode;
            }
        }
        if (dm.length > 0) {
            return
                    new DisplayMode(dm[0].getWidth(), dm[0].getHeight(),
                            dm[0].getBitDepth(),
                            DisplayMode.REFRESH_RATE_UNKNOWN);
        }

        return null;
    }

    public static void main(String[] args) {
        System.setProperty("sun.java2d.noddraw", "true");
        DisplayModeNoRefreshTest fs =
                new DisplayModeNoRefreshTest();
    }
}
