import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

/**
 * Grafische Anwendung zur Demonstration von Insertion Sort.
 */
public class SortAnw extends JFrame
{
    private Liste zahlen;

    // Nummer des nächsten Sortierschritts
    private int schritt = 1;

    // Timer für die Animation
    private Timer timer;

    /**
     * Konstruktor der Anwendung.
     */
    public SortAnw()
    {
        zahlen = new Liste();
        zahlen.erzeugen();

        setTitle("Insertion Sort");
        setSize(600, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        /*
         * Gezeichnet wird nicht direkt auf dem JFrame,
         * sondern auf einer eigenen Zeichenfläche.
         */
        JPanel zeichenflaeche = new JPanel()
        {
            @Override
            protected void paintComponent(Graphics g)
            {
                // Zuerst löscht Swing die alte Zeichnung.
                super.paintComponent(g);

                // Danach werden die Balken gezeichnet.
                zahlen.paint(g, getWidth(), getHeight());
            }
        };

        add(zeichenflaeche);

        /*
         * Alle 200 Millisekunden wird ein weiterer
         * Sortierschritt ausgeführt.
         */
        timer = new Timer(200, e ->
        {
            if (schritt < Liste.MAX)
            {
                zahlen.insertionsortNextStep(schritt);
                schritt++;

                // Die Zeichenfläche wird neu gezeichnet.
                zeichenflaeche.repaint();
            }
            else
            {
                // Das Array ist vollständig sortiert.
                timer.stop();
            }
        });

        setVisible(true);

        // Animation starten
        timer.start();
    }

    /**
     * Startpunkt des Programms.
     */
    public static void main(String[] args)
    {
        /*
         * Swing-Anwendungen sollten auf dem sogenannten
         * Event Dispatch Thread gestartet werden.
         */
        SwingUtilities.invokeLater(() -> new SortAnw());
    }
}