// -*- Mode: Jde -*-
//
// File           : Piirto.java
//
// Author         : Esko Nuutila <Esko.Nuutila@hut.fi>
//
// Created        : Mon Sep 24 14:20:31 2001 by enu
// Last modified  : Mon Sep 24 14:22:00 2001 by enu
//

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

// Tämä luokka toteuttaa piirtotaulun.
// Kotitehtävien tekemiseksi ei tarvi tutustua tähän koodiin tai ymmärtää sitä.
// Jos käännettäessä tulee jokin virhe, älä muuta tätä luokkaa vaan omaa koodiasi.
public class Piirto extends JFrame implements ActionListener {
    private JPanel napit;
    private JButton lopeta;
    private JButton pysäytä;
    private Paperi paperi;
    private Timer ajastin;
    private boolean pysäytetty = false;

    public Piirto(double leveys, double korkeus) {
	this("Piirto", leveys, korkeus, 50, false);
    }

    public Piirto(String nimi, double leveys, double korkeus, int fps,
		  boolean pysäytettävissä) {
	super(nimi);
        int viive = (fps > 0) ? (1000 / fps) : 100;

        ajastin = new Timer(viive, this);
        ajastin.setInitialDelay(0);
        ajastin.setCoalesce(true);

        addWindowListener(new WindowAdapter() {
            public void windowIconified(WindowEvent e) {
                pysäytä();
            }
            public void windowDeiconified(WindowEvent e) {
                käynnistä();
            }
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }  
        });

	napit = new JPanel();
	
	lopeta = new JButton("Lopeta");

        lopeta.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
		System.exit(0);
            }
        });

	napit.add(lopeta);

	if (pysäytettävissä) {
	    pysäytä = new JButton("Pysäytä");

	    pysäytä.addMouseListener(new MouseAdapter() {
		    public void mousePressed(MouseEvent e) {
			if (pysäytetty) {
			    pysäytetty = false;
			    pysäytä.setText("Pysäytä");
			    käynnistä();
			} else {
			    pysäytetty = true;
			    pysäytä.setText("Jatka");
			    pysäytä();
			}
		    }
		});

	    napit.add(pysäytä);
	}

	paperi = new Paperi(leveys, korkeus);

	Container paneeli = this.getContentPane();
	paneeli.add(paperi, BorderLayout.CENTER);
	paneeli.add(napit, BorderLayout.SOUTH);

	this.pack();
	this.setVisible(true);
    }

    public void käynnistä() {
        if (pysäytetty) {
        } else {
            //Käynnistä animaatio!
            if (!ajastin.isRunning()) {
                ajastin.start();
            }
        }
    }

    public void pysäytä() {
        // Pysäytä animaatiosäie
        if (ajastin.isRunning()) {
            ajastin.stop();
        }
    }

    public void actionPerformed(ActionEvent e) {
        // Varsinainen piirto.
	piirräKaikki();
 	paperi.repaint(0L);
    }


    public void piirräKaikki() {
	// Määritä tämä uudestaan, ja laita kaikki piirto-operaatiot tänne.
    }

    public void piirräViiva(double x1, double y1, double x2, double y2) {
	paperi.lisääViiva(x1, y1, x2, y2);
    }

    public void vaihdaVäri(Color väri) {
	paperi.asetaVäri(väri);
    }

    public void pyyhiKaikki() {
	paperi.pyyhiKaikki();
    }

    public void odota(double sec) {
// 	try {
// 	    Thread.sleep((int)(sec*1000));
// 	} catch(Exception e) {
// 	    System.err.println(e);
// 	}
    }

    public static void main(String[] args) {
	Piirto p = new Piirto(400, 400);
	p.piirräViiva(100, 100, 200, 100);
	p.piirräViiva(200, 100, 200, 200);
	p.piirräViiva(200, 200, 100, 200);
	p.piirräViiva(100, 200, 100, 100);
	p.vaihdaVäri(Color.red);
	p.piirräViiva(100, 100, 200, 200);
	p.vaihdaVäri(Color.green);
	p.piirräViiva(200, 100, 100, 200);
    }
}
