
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.ArrayList;

public class MultiResolutionIconTest {

    private static final int W = 150, H = 75, X = 400, Y = 100;

    private static ArrayList<BaseMultiResolutionImage> ICONS = new ArrayList<>();
    static {
        ICONS.add(createIcon(8));
        for (int i = 1; i <= 5; i++) { ICONS.add(createIcon(16 * i)); }
    }

    private static BufferedImage generateImage(int size, int scale, Color c) {

        int x = size * scale;
        BufferedImage img = new BufferedImage(x, x, BufferedImage.TYPE_INT_RGB);
        Graphics g = img.getGraphics();
        g.setColor(c);
        g.fillRect(0, 0, x, x);
        g.setColor(Color.WHITE);
        g.fillRect(x / 3, x / 3, x / 3, x / 3);
        return img;
    }

    private static BaseMultiResolutionImage createIcon(int size) {
        return new BaseMultiResolutionImage(
                new BufferedImage[]{generateImage(size, 1, Color.RED),
                                    generateImage(size, 2, Color.GREEN)});
    }

    private static class TestFrame extends Frame {

        public TestFrame() { SwingUtilities.invokeLater(this::UI); }

        private void UI() {
            setTitle("Frame");
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) { dispose(); }
            });

            setIconImages(ICONS);
            setSize(W, H);
            setLocation(X, Y);
            setResizable(false);
            setVisible(true);
        }
    }

    private static class TestDialog extends Dialog {

        public TestDialog(Frame dummy) {
            super((Frame) null);
            SwingUtilities.invokeLater(this::UI);
        }

        private void UI() {
            setTitle("Dialog");
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) { dispose(); }
            });
            setIconImages(ICONS);
            setSize(W, H);
            setLocation(X, 2 * Y);
            setResizable(false);
            setVisible(true);
        }
    }

    private static class TestJFrame extends JFrame {

        public TestJFrame() { SwingUtilities.invokeLater(this::UI); }

        private void UI() {
            setTitle("JFrame");
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            setIconImages(ICONS);
            setSize(W, H);
            setLocation(X, 3 * Y);
            setResizable(false);
            setVisible(true);
        }
    }

    private static class TestJDialog extends JDialog {
        public TestJDialog() { SwingUtilities.invokeLater(this::UI); }

        private void UI() {
            setTitle("JDialog");
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            setIconImages(ICONS);
            setSize(W, H);
            setLocation(X, 4 * Y);
            setResizable(false);
            setVisible(true);
        }
    }


    //--------------------------------------------------------------------------
    private static class MultiRes extends Frame {

        private static final int W = 200, H = 200;

        private static final BaseMultiResolutionImage IMG =
                createIcon(W);

        public MultiRes() { EventQueue.invokeLater(this::CreateUI); }

        private void CreateUI() {

            setIconImages(ICONS);
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) { dispose(); }
            });
            setSize(W, H);
            setLocation(100, 100);
            setResizable(false);
            setVisible(true);
        }

        @Override
        public void paint(Graphics gr) { gr.drawImage(IMG, 0, 0, this); }
    }
    //--------------------------------------------------------------------------


    public static void main(String[] args) {

        new TestFrame();
        new TestDialog(null);
        new TestJFrame();
        new TestJDialog();
        new MultiRes();
    }
}
